@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.
- package/CHANGELOG.md +53 -0
- package/README.md +85 -15
- package/consumer-ai/SKILL.md +12 -0
- package/consumer-ai/api-index.json +103754 -0
- package/consumer-ai/package-context.json +409 -0
- package/dist/ai/action/ExecutionHistory.cjs.map +1 -1
- package/dist/ai/action/ExecutionHistory.d.cts +32 -2
- package/dist/ai/action/ExecutionHistory.d.ts +32 -2
- package/dist/ai/action/ExecutionHistory.js.map +1 -1
- package/dist/ai/action/ScreenActionContext.cjs.map +1 -1
- package/dist/ai/action/ScreenActionContext.d.cts +15 -2
- package/dist/ai/action/ScreenActionContext.d.ts +15 -2
- package/dist/ai/action/ScreenActionContext.js.map +1 -1
- package/dist/ai/action/context.cjs.map +1 -1
- package/dist/ai/action/context.d.cts +19 -3
- package/dist/ai/action/context.d.ts +19 -3
- package/dist/ai/action/context.js.map +1 -1
- package/dist/ai/action/types.d.cts +35 -3
- package/dist/ai/action/types.d.ts +35 -3
- package/dist/ai/action/use-execution-session.cjs.map +1 -1
- package/dist/ai/action/use-execution-session.d.cts +17 -1
- package/dist/ai/action/use-execution-session.d.ts +17 -1
- package/dist/ai/action/use-execution-session.js.map +1 -1
- package/dist/ai/action/use-screen-action-registry.cjs.map +1 -1
- package/dist/ai/action/use-screen-action-registry.d.cts +77 -8
- package/dist/ai/action/use-screen-action-registry.d.ts +77 -8
- package/dist/ai/action/use-screen-action-registry.js.map +1 -1
- package/dist/ai/action/use-screen-action.cjs.map +1 -1
- package/dist/ai/action/use-screen-action.d.cts +23 -6
- package/dist/ai/action/use-screen-action.d.ts +23 -6
- package/dist/ai/action/use-screen-action.js.map +1 -1
- package/dist/ai/action/use-screen-context.cjs.map +1 -1
- package/dist/ai/action/use-screen-context.d.cts +42 -5
- package/dist/ai/action/use-screen-context.d.ts +42 -5
- package/dist/ai/action/use-screen-context.js.map +1 -1
- package/dist/ai/ai-chat/transport.cjs.map +1 -1
- package/dist/ai/ai-chat/transport.d.cts +35 -8
- package/dist/ai/ai-chat/transport.d.ts +35 -8
- package/dist/ai/ai-chat/transport.js.map +1 -1
- package/dist/ai/generative-ui/GenerativeUIRenderer.cjs.map +1 -1
- package/dist/ai/generative-ui/GenerativeUIRenderer.d.cts +21 -3
- package/dist/ai/generative-ui/GenerativeUIRenderer.d.ts +21 -3
- package/dist/ai/generative-ui/GenerativeUIRenderer.js.map +1 -1
- package/dist/ai/generative-ui/error-boundary.cjs.map +1 -1
- package/dist/ai/generative-ui/error-boundary.d.cts +98 -2
- package/dist/ai/generative-ui/error-boundary.d.ts +98 -2
- package/dist/ai/generative-ui/error-boundary.js.map +1 -1
- package/dist/ai/generative-ui/registry.cjs.map +1 -1
- package/dist/ai/generative-ui/registry.d.cts +96 -7
- package/dist/ai/generative-ui/registry.d.ts +96 -7
- package/dist/ai/generative-ui/registry.js.map +1 -1
- package/dist/ai/proposal/ProposalFieldReview.cjs.map +1 -1
- package/dist/ai/proposal/ProposalFieldReview.d.cts +170 -8
- package/dist/ai/proposal/ProposalFieldReview.d.ts +170 -8
- package/dist/ai/proposal/ProposalFieldReview.js.map +1 -1
- package/dist/ai/proposal/types.d.cts +97 -26
- package/dist/ai/proposal/types.d.ts +97 -26
- package/dist/ai/proposal/use-proposal-batch-review.cjs.map +1 -1
- package/dist/ai/proposal/use-proposal-batch-review.d.cts +133 -7
- package/dist/ai/proposal/use-proposal-batch-review.d.ts +133 -7
- package/dist/ai/proposal/use-proposal-batch-review.js.map +1 -1
- package/dist/ai/proposal/use-proposal-review.cjs.map +1 -1
- package/dist/ai/proposal/use-proposal-review.d.cts +47 -5
- package/dist/ai/proposal/use-proposal-review.d.ts +47 -5
- package/dist/ai/proposal/use-proposal-review.js.map +1 -1
- package/dist/avatar.svg +1 -0
- package/dist/consumer-ai/SKILL.md +6 -0
- package/dist/consumer-ai/api-index.json +103754 -0
- package/dist/consumer-ai/package-context.json +5 -3
- package/dist/mockServiceWorker.js +361 -0
- package/dist/styles.css +1 -1
- package/dist/tools/components/auth/AuthForms.cjs.map +1 -1
- package/dist/tools/components/auth/AuthForms.d.cts +131 -81
- package/dist/tools/components/auth/AuthForms.d.ts +131 -81
- package/dist/tools/components/auth/AuthForms.js.map +1 -1
- package/dist/tools/components/auth/AuthGuard.cjs.map +1 -1
- package/dist/tools/components/auth/AuthGuard.d.cts +31 -4
- package/dist/tools/components/auth/AuthGuard.d.ts +31 -4
- package/dist/tools/components/auth/AuthGuard.js.map +1 -1
- package/dist/tools/components/auth/AuthProvider.cjs.map +1 -1
- package/dist/tools/components/auth/AuthProvider.d.cts +39 -42
- package/dist/tools/components/auth/AuthProvider.d.ts +39 -42
- package/dist/tools/components/auth/AuthProvider.js.map +1 -1
- package/dist/tools/components/auth/ProtectedRoute.cjs.map +1 -1
- package/dist/tools/components/auth/ProtectedRoute.d.cts +75 -60
- package/dist/tools/components/auth/ProtectedRoute.d.ts +75 -60
- package/dist/tools/components/auth/ProtectedRoute.js.map +1 -1
- package/dist/tools/components/auth/SignInButton.cjs.map +1 -1
- package/dist/tools/components/auth/SignInButton.d.cts +26 -18
- package/dist/tools/components/auth/SignInButton.d.ts +26 -18
- package/dist/tools/components/auth/SignInButton.js.map +1 -1
- package/dist/tools/components/auth/UserProfileProvider.cjs.map +1 -1
- package/dist/tools/components/auth/UserProfileProvider.d.cts +48 -20
- package/dist/tools/components/auth/UserProfileProvider.d.ts +48 -20
- package/dist/tools/components/auth/UserProfileProvider.js.map +1 -1
- package/dist/tools/components/auth/adapters/better-auth-adapter.cjs.map +1 -1
- package/dist/tools/components/auth/adapters/better-auth-adapter.d.cts +371 -51
- package/dist/tools/components/auth/adapters/better-auth-adapter.d.ts +371 -51
- package/dist/tools/components/auth/adapters/better-auth-adapter.js.map +1 -1
- package/dist/tools/components/auth/adapters/mock-adapter.cjs.map +1 -1
- package/dist/tools/components/auth/adapters/mock-adapter.d.cts +149 -28
- package/dist/tools/components/auth/adapters/mock-adapter.d.ts +149 -28
- package/dist/tools/components/auth/adapters/mock-adapter.js.map +1 -1
- package/dist/tools/components/auth/auth-session.cjs.map +1 -1
- package/dist/tools/components/auth/auth-session.d.cts +147 -1
- package/dist/tools/components/auth/auth-session.d.ts +147 -1
- package/dist/tools/components/auth/auth-session.js.map +1 -1
- package/dist/tools/components/auth/session-cache.cjs.map +1 -1
- package/dist/tools/components/auth/session-cache.d.cts +88 -24
- package/dist/tools/components/auth/session-cache.d.ts +88 -24
- package/dist/tools/components/auth/session-cache.js.map +1 -1
- package/dist/tools/components/auth/types.cjs.map +1 -1
- package/dist/tools/components/auth/types.d.cts +329 -106
- package/dist/tools/components/auth/types.d.ts +329 -106
- package/dist/tools/components/auth/types.js.map +1 -1
- package/dist/tools/components/auth/useAuth.cjs.map +1 -1
- package/dist/tools/components/auth/useAuth.d.cts +110 -17
- package/dist/tools/components/auth/useAuth.d.ts +110 -17
- package/dist/tools/components/auth/useAuth.js.map +1 -1
- package/dist/tools/components/auth/useAuthGuard.cjs.map +1 -1
- package/dist/tools/components/auth/useAuthGuard.d.cts +49 -38
- package/dist/tools/components/auth/useAuthGuard.d.ts +49 -38
- package/dist/tools/components/auth/useAuthGuard.js.map +1 -1
- package/dist/tools/components/auth/useRoleCheck.cjs.map +1 -1
- package/dist/tools/components/auth/useRoleCheck.d.cts +48 -1
- package/dist/tools/components/auth/useRoleCheck.d.ts +48 -1
- package/dist/tools/components/auth/useRoleCheck.js.map +1 -1
- package/dist/tools/components/auth/useUserProfile.cjs.map +1 -1
- package/dist/tools/components/auth/useUserProfile.d.cts +66 -1
- package/dist/tools/components/auth/useUserProfile.d.ts +66 -1
- package/dist/tools/components/auth/useUserProfile.js.map +1 -1
- package/dist/tools/components/barcode/BarcodeGenerator.cjs.map +1 -1
- package/dist/tools/components/barcode/BarcodeGenerator.d.cts +32 -18
- package/dist/tools/components/barcode/BarcodeGenerator.d.ts +32 -18
- package/dist/tools/components/barcode/BarcodeGenerator.js.map +1 -1
- package/dist/tools/components/barcode/QRCodeGenerator.cjs +1 -1
- package/dist/tools/components/barcode/QRCodeGenerator.cjs.map +1 -1
- package/dist/tools/components/barcode/QRCodeGenerator.d.cts +20 -13
- package/dist/tools/components/barcode/QRCodeGenerator.d.ts +20 -13
- package/dist/tools/components/barcode/QRCodeGenerator.js +1 -1
- package/dist/tools/components/barcode/QRCodeGenerator.js.map +1 -1
- package/dist/tools/components/barcode/QRCodeScanner.cjs.map +1 -1
- package/dist/tools/components/barcode/QRCodeScanner.d.cts +32 -1
- package/dist/tools/components/barcode/QRCodeScanner.d.ts +32 -1
- package/dist/tools/components/barcode/QRCodeScanner.js.map +1 -1
- package/dist/tools/components/calendar/ResourceCalendar.cjs.map +1 -1
- package/dist/tools/components/calendar/ResourceCalendar.d.cts +17 -42
- package/dist/tools/components/calendar/ResourceCalendar.d.ts +17 -42
- package/dist/tools/components/calendar/ResourceCalendar.js.map +1 -1
- package/dist/tools/components/calendar/views/ResourceView.cjs +1 -1
- package/dist/tools/components/calendar/views/ResourceView.cjs.map +1 -1
- package/dist/tools/components/calendar/views/ResourceView.js +2 -2
- package/dist/tools/components/calendar/views/ResourceView.js.map +1 -1
- package/dist/tools/components/chart/ComposedChart.cjs.map +1 -1
- package/dist/tools/components/chart/ComposedChart.d.cts +54 -1
- package/dist/tools/components/chart/ComposedChart.d.ts +54 -1
- package/dist/tools/components/chart/ComposedChart.js.map +1 -1
- package/dist/tools/components/chart/SimpleAreaChart.cjs.map +1 -1
- package/dist/tools/components/chart/SimpleAreaChart.d.cts +41 -1
- package/dist/tools/components/chart/SimpleAreaChart.d.ts +41 -1
- package/dist/tools/components/chart/SimpleAreaChart.js.map +1 -1
- package/dist/tools/components/chart/SimpleBarChart.cjs.map +1 -1
- package/dist/tools/components/chart/SimpleBarChart.d.cts +34 -24
- package/dist/tools/components/chart/SimpleBarChart.d.ts +34 -24
- package/dist/tools/components/chart/SimpleBarChart.js.map +1 -1
- package/dist/tools/components/chart/SimpleLineChart.cjs.map +1 -1
- package/dist/tools/components/chart/SimpleLineChart.d.cts +31 -28
- package/dist/tools/components/chart/SimpleLineChart.d.ts +31 -28
- package/dist/tools/components/chart/SimpleLineChart.js.map +1 -1
- package/dist/tools/components/chart/SimplePieChart.cjs.map +1 -1
- package/dist/tools/components/chart/SimplePieChart.d.cts +28 -22
- package/dist/tools/components/chart/SimplePieChart.d.ts +28 -22
- package/dist/tools/components/chart/SimplePieChart.js.map +1 -1
- package/dist/tools/components/chart/SimpleRadarChart.cjs.map +1 -1
- package/dist/tools/components/chart/SimpleRadarChart.d.cts +38 -1
- package/dist/tools/components/chart/SimpleRadarChart.d.ts +38 -1
- package/dist/tools/components/chart/SimpleRadarChart.js.map +1 -1
- package/dist/tools/components/chart/SimpleScatterChart.cjs.map +1 -1
- package/dist/tools/components/chart/SimpleScatterChart.d.cts +44 -1
- package/dist/tools/components/chart/SimpleScatterChart.d.ts +44 -1
- package/dist/tools/components/chart/SimpleScatterChart.js.map +1 -1
- package/dist/tools/components/chart/StackedBarChart.cjs.map +1 -1
- package/dist/tools/components/chart/StackedBarChart.d.cts +38 -1
- package/dist/tools/components/chart/StackedBarChart.d.ts +38 -1
- package/dist/tools/components/chart/StackedBarChart.js.map +1 -1
- package/dist/tools/components/data-table/data-table.cjs +1 -1
- package/dist/tools/components/data-table/data-table.cjs.map +1 -1
- package/dist/tools/components/data-table/data-table.js +286 -263
- package/dist/tools/components/data-table/data-table.js.map +1 -1
- package/dist/tools/components/data-table/table-utils.cjs.map +1 -1
- package/dist/tools/components/data-table/table-utils.d.cts +45 -35
- package/dist/tools/components/data-table/table-utils.d.ts +45 -35
- package/dist/tools/components/data-table/table-utils.js.map +1 -1
- package/dist/tools/components/editable-table/editable-table.cjs +1 -1
- package/dist/tools/components/editable-table/editable-table.cjs.map +1 -1
- package/dist/tools/components/editable-table/editable-table.js +15 -2
- package/dist/tools/components/editable-table/editable-table.js.map +1 -1
- package/dist/tools/components/error/ErrorDialog.cjs +1 -1
- package/dist/tools/components/error/ErrorDialog.cjs.map +1 -1
- package/dist/tools/components/error/ErrorDialog.js +1 -1
- package/dist/tools/components/error/ErrorDialog.js.map +1 -1
- package/dist/tools/components/error/ErrorInline.cjs +1 -1
- package/dist/tools/components/error/ErrorInline.cjs.map +1 -1
- package/dist/tools/components/error/ErrorInline.js +1 -1
- package/dist/tools/components/error/ErrorInline.js.map +1 -1
- package/dist/tools/components/error/ErrorNotification.cjs +1 -1
- package/dist/tools/components/error/ErrorNotification.cjs.map +1 -1
- package/dist/tools/components/error/ErrorNotification.js +10 -10
- package/dist/tools/components/error/ErrorNotification.js.map +1 -1
- package/dist/tools/components/file-browser/FilePreview.cjs +1 -1
- package/dist/tools/components/file-browser/FilePreview.cjs.map +1 -1
- package/dist/tools/components/file-browser/FilePreview.js +28 -26
- package/dist/tools/components/file-browser/FilePreview.js.map +1 -1
- package/dist/tools/components/filter/filter.cjs.map +1 -1
- package/dist/tools/components/filter/filter.d.cts +23 -34
- package/dist/tools/components/filter/filter.d.ts +23 -34
- package/dist/tools/components/filter/filter.js.map +1 -1
- package/dist/tools/components/form/EnhancedDetailPage.cjs.map +1 -1
- package/dist/tools/components/form/EnhancedDetailPage.d.cts +47 -42
- package/dist/tools/components/form/EnhancedDetailPage.d.ts +47 -42
- package/dist/tools/components/form/EnhancedDetailPage.js.map +1 -1
- package/dist/tools/components/form/form-grid.cjs.map +1 -1
- package/dist/tools/components/form/form-grid.d.cts +44 -22
- package/dist/tools/components/form/form-grid.d.ts +44 -22
- package/dist/tools/components/form/form-grid.js.map +1 -1
- package/dist/tools/components/gantt/GanttChart.cjs +1 -1
- package/dist/tools/components/gantt/GanttChart.cjs.map +1 -1
- package/dist/tools/components/gantt/GanttChart.d.cts +20 -1
- package/dist/tools/components/gantt/GanttChart.d.ts +20 -1
- package/dist/tools/components/gantt/GanttChart.js +3 -0
- package/dist/tools/components/gantt/GanttChart.js.map +1 -1
- package/dist/tools/components/gantt/components/GanttTaskBar.cjs +1 -1
- package/dist/tools/components/gantt/components/GanttTaskBar.cjs.map +1 -1
- package/dist/tools/components/gantt/components/GanttTaskBar.js +2 -1
- package/dist/tools/components/gantt/components/GanttTaskBar.js.map +1 -1
- package/dist/tools/components/header/header.cjs +1 -1
- package/dist/tools/components/header/header.cjs.map +1 -1
- package/dist/tools/components/header/header.d.cts +103 -40
- package/dist/tools/components/header/header.d.ts +103 -40
- package/dist/tools/components/header/header.js +1 -1
- package/dist/tools/components/header/header.js.map +1 -1
- package/dist/tools/components/i18n/LanguageSwitcher.cjs.map +1 -1
- package/dist/tools/components/i18n/LanguageSwitcher.d.cts +18 -14
- package/dist/tools/components/i18n/LanguageSwitcher.d.ts +18 -14
- package/dist/tools/components/i18n/LanguageSwitcher.js.map +1 -1
- package/dist/tools/components/kanban/KanbanBoard.cjs +1 -1
- package/dist/tools/components/kanban/KanbanBoard.cjs.map +1 -1
- package/dist/tools/components/kanban/KanbanBoard.d.cts +16 -34
- package/dist/tools/components/kanban/KanbanBoard.d.ts +16 -34
- package/dist/tools/components/kanban/KanbanBoard.js +3 -0
- package/dist/tools/components/kanban/KanbanBoard.js.map +1 -1
- package/dist/tools/components/kanban/KanbanColumn.cjs +1 -1
- package/dist/tools/components/kanban/KanbanColumn.cjs.map +1 -1
- package/dist/tools/components/kanban/KanbanColumn.js +1 -1
- package/dist/tools/components/kanban/KanbanColumn.js.map +1 -1
- package/dist/tools/components/kanban/kanban-compound.cjs +1 -1
- package/dist/tools/components/kanban/kanban-compound.cjs.map +1 -1
- package/dist/tools/components/kanban/kanban-compound.js +4 -1
- package/dist/tools/components/kanban/kanban-compound.js.map +1 -1
- package/dist/tools/components/kanban/kanban-primitives.cjs +1 -1
- package/dist/tools/components/kanban/kanban-primitives.cjs.map +1 -1
- package/dist/tools/components/kanban/kanban-primitives.js +0 -1
- package/dist/tools/components/kanban/kanban-primitives.js.map +1 -1
- package/dist/tools/components/priority-queue/PriorityCard.cjs +1 -1
- package/dist/tools/components/priority-queue/PriorityCard.cjs.map +1 -1
- package/dist/tools/components/priority-queue/PriorityCard.js +3 -1
- package/dist/tools/components/priority-queue/PriorityCard.js.map +1 -1
- package/dist/tools/components/sidebar/SmartSidebar.cjs.map +1 -1
- package/dist/tools/components/sidebar/SmartSidebar.d.cts +41 -43
- package/dist/tools/components/sidebar/SmartSidebar.d.ts +41 -43
- package/dist/tools/components/sidebar/SmartSidebar.js.map +1 -1
- package/dist/tools/components/splash/SplashScreen.cjs.map +1 -1
- package/dist/tools/components/splash/SplashScreen.d.cts +43 -68
- package/dist/tools/components/splash/SplashScreen.d.ts +43 -68
- package/dist/tools/components/splash/SplashScreen.js.map +1 -1
- package/dist/tools/components/workflow/WorkflowStatusPanel.cjs +1 -1
- package/dist/tools/components/workflow/WorkflowStatusPanel.cjs.map +1 -1
- package/dist/tools/components/workflow/WorkflowStatusPanel.js +2 -2
- package/dist/tools/components/workflow/WorkflowStatusPanel.js.map +1 -1
- package/dist/tools/lib/data-access/data-access-context.cjs.map +1 -1
- package/dist/tools/lib/data-access/data-access-context.d.cts +15 -6
- package/dist/tools/lib/data-access/data-access-context.d.ts +15 -6
- package/dist/tools/lib/data-access/data-access-context.js.map +1 -1
- package/dist/tools/lib/data-access/react-query-provider.cjs.map +1 -1
- package/dist/tools/lib/data-access/react-query-provider.d.cts +19 -2
- package/dist/tools/lib/data-access/react-query-provider.d.ts +19 -2
- package/dist/tools/lib/data-access/react-query-provider.js.map +1 -1
- package/dist/tools/lib/data-access/react-query.cjs.map +1 -1
- package/dist/tools/lib/data-access/react-query.d.cts +365 -90
- package/dist/tools/lib/data-access/react-query.d.ts +365 -90
- package/dist/tools/lib/data-access/react-query.js.map +1 -1
- package/dist/tools/lib/error/AppError.cjs.map +1 -1
- package/dist/tools/lib/error/AppError.d.cts +157 -63
- package/dist/tools/lib/error/AppError.d.ts +157 -63
- package/dist/tools/lib/error/AppError.js.map +1 -1
- package/dist/tools/lib/hooks/useAsyncWithTimeout.cjs.map +1 -1
- package/dist/tools/lib/hooks/useAsyncWithTimeout.d.cts +79 -26
- package/dist/tools/lib/hooks/useAsyncWithTimeout.d.ts +79 -26
- package/dist/tools/lib/hooks/useAsyncWithTimeout.js.map +1 -1
- package/dist/tools/lib/hooks/useError.cjs.map +1 -1
- package/dist/tools/lib/hooks/useError.d.cts +51 -16
- package/dist/tools/lib/hooks/useError.d.ts +51 -16
- package/dist/tools/lib/hooks/useError.js.map +1 -1
- package/dist/tools/lib/schema/ajv.cjs +1 -1
- package/dist/tools/lib/schema/ajv.cjs.map +1 -1
- package/dist/tools/lib/schema/ajv.d.cts +19 -8
- package/dist/tools/lib/schema/ajv.d.ts +19 -8
- package/dist/tools/lib/schema/ajv.js +2 -1
- package/dist/tools/lib/schema/ajv.js.map +1 -1
- package/dist/tools/lib/state/error-store.cjs.map +1 -1
- package/dist/tools/lib/state/error-store.d.cts +61 -10
- package/dist/tools/lib/state/error-store.d.ts +61 -10
- package/dist/tools/lib/state/error-store.js.map +1 -1
- package/dist/tools/lib/state/store-factory.cjs.map +1 -1
- package/dist/tools/lib/state/store-factory.d.cts +25 -4
- package/dist/tools/lib/state/store-factory.d.ts +25 -4
- package/dist/tools/lib/state/store-factory.js.map +1 -1
- package/dist/tools/lib/state/ui-store.cjs.map +1 -1
- package/dist/tools/lib/state/ui-store.d.cts +39 -0
- package/dist/tools/lib/state/ui-store.d.ts +39 -0
- package/dist/tools/lib/state/ui-store.js.map +1 -1
- package/dist/ui/components/theme/theme-context.cjs.map +1 -1
- package/dist/ui/components/theme/theme-context.d.cts +171 -1
- package/dist/ui/components/theme/theme-context.d.ts +171 -1
- package/dist/ui/components/theme/theme-context.js.map +1 -1
- package/dist/ui/components/theme/theme-provider.cjs.map +1 -1
- package/dist/ui/components/theme/theme-provider.d.cts +31 -19
- package/dist/ui/components/theme/theme-provider.d.ts +31 -19
- package/dist/ui/components/theme/theme-provider.js.map +1 -1
- package/dist/ui/components/theme/theme-script.cjs.map +1 -1
- package/dist/ui/components/theme/theme-script.d.cts +16 -1
- package/dist/ui/components/theme/theme-script.d.ts +16 -1
- package/dist/ui/components/theme/theme-script.js.map +1 -1
- package/dist/ui/components/theme/theme-switcher.cjs +1 -1
- package/dist/ui/components/theme/theme-switcher.cjs.map +1 -1
- package/dist/ui/components/theme/theme-switcher.d.cts +82 -13
- package/dist/ui/components/theme/theme-switcher.d.ts +82 -13
- package/dist/ui/components/theme/theme-switcher.js +8 -0
- package/dist/ui/components/theme/theme-switcher.js.map +1 -1
- package/dist/ui/components/ui/accordion.cjs.map +1 -1
- package/dist/ui/components/ui/accordion.d.cts +60 -0
- package/dist/ui/components/ui/accordion.d.ts +60 -0
- package/dist/ui/components/ui/accordion.js.map +1 -1
- package/dist/ui/components/ui/adjustable-pane.cjs.map +1 -1
- package/dist/ui/components/ui/adjustable-pane.d.cts +44 -26
- package/dist/ui/components/ui/adjustable-pane.d.ts +44 -26
- package/dist/ui/components/ui/adjustable-pane.js.map +1 -1
- package/dist/ui/components/ui/alert-dialog.cjs.map +1 -1
- package/dist/ui/components/ui/alert-dialog.d.cts +179 -2
- package/dist/ui/components/ui/alert-dialog.d.ts +179 -2
- package/dist/ui/components/ui/alert-dialog.js.map +1 -1
- package/dist/ui/components/ui/alert.cjs.map +1 -1
- package/dist/ui/components/ui/alert.d.cts +52 -4
- package/dist/ui/components/ui/alert.d.ts +52 -4
- package/dist/ui/components/ui/alert.js.map +1 -1
- package/dist/ui/components/ui/aspect-ratio.cjs.map +1 -1
- package/dist/ui/components/ui/aspect-ratio.d.cts +16 -1
- package/dist/ui/components/ui/aspect-ratio.d.ts +16 -1
- package/dist/ui/components/ui/aspect-ratio.js.map +1 -1
- package/dist/ui/components/ui/avatar.cjs.map +1 -1
- package/dist/ui/components/ui/avatar.d.cts +87 -3
- package/dist/ui/components/ui/avatar.d.ts +87 -3
- package/dist/ui/components/ui/avatar.js.map +1 -1
- package/dist/ui/components/ui/badge-components.cjs.map +1 -1
- package/dist/ui/components/ui/badge-components.d.cts +13 -1
- package/dist/ui/components/ui/badge-components.d.ts +13 -1
- package/dist/ui/components/ui/badge-components.js.map +1 -1
- package/dist/ui/components/ui/badge-variants.cjs.map +1 -1
- package/dist/ui/components/ui/badge-variants.d.cts +15 -0
- package/dist/ui/components/ui/badge-variants.d.ts +15 -0
- package/dist/ui/components/ui/badge-variants.js.map +1 -1
- package/dist/ui/components/ui/breadcrumb.cjs.map +1 -1
- package/dist/ui/components/ui/breadcrumb.d.cts +91 -7
- package/dist/ui/components/ui/breadcrumb.d.ts +91 -7
- package/dist/ui/components/ui/breadcrumb.js.map +1 -1
- package/dist/ui/components/ui/button-components.cjs.map +1 -1
- package/dist/ui/components/ui/button-components.d.cts +18 -6
- package/dist/ui/components/ui/button-components.d.ts +18 -6
- package/dist/ui/components/ui/button-components.js.map +1 -1
- package/dist/ui/components/ui/button-group-components.cjs.map +1 -1
- package/dist/ui/components/ui/button-group-components.d.cts +39 -3
- package/dist/ui/components/ui/button-group-components.d.ts +39 -3
- package/dist/ui/components/ui/button-group-components.js.map +1 -1
- package/dist/ui/components/ui/button-group-variants.cjs.map +1 -1
- package/dist/ui/components/ui/button-group-variants.d.cts +15 -0
- package/dist/ui/components/ui/button-group-variants.d.ts +15 -0
- package/dist/ui/components/ui/button-group-variants.js.map +1 -1
- package/dist/ui/components/ui/button-variants.cjs.map +1 -1
- package/dist/ui/components/ui/button-variants.d.cts +13 -2
- package/dist/ui/components/ui/button-variants.d.ts +13 -2
- package/dist/ui/components/ui/button-variants.js.map +1 -1
- package/dist/ui/components/ui/card.cjs.map +1 -1
- package/dist/ui/components/ui/card.d.cts +106 -2
- package/dist/ui/components/ui/card.d.ts +106 -2
- package/dist/ui/components/ui/card.js.map +1 -1
- package/dist/ui/components/ui/checkbox-group.cjs.map +1 -1
- package/dist/ui/components/ui/checkbox-group.d.cts +13 -1
- package/dist/ui/components/ui/checkbox-group.d.ts +13 -1
- package/dist/ui/components/ui/checkbox-group.js.map +1 -1
- package/dist/ui/components/ui/checkbox.cjs.map +1 -1
- package/dist/ui/components/ui/checkbox.d.cts +17 -6
- package/dist/ui/components/ui/checkbox.d.ts +17 -6
- package/dist/ui/components/ui/checkbox.js.map +1 -1
- package/dist/ui/components/ui/collapsible.cjs.map +1 -1
- package/dist/ui/components/ui/collapsible.d.cts +39 -3
- package/dist/ui/components/ui/collapsible.d.ts +39 -3
- package/dist/ui/components/ui/collapsible.js.map +1 -1
- package/dist/ui/components/ui/combobox-components.cjs.map +1 -1
- package/dist/ui/components/ui/combobox-components.d.cts +209 -14
- package/dist/ui/components/ui/combobox-components.d.ts +209 -14
- package/dist/ui/components/ui/combobox-components.js.map +1 -1
- package/dist/ui/components/ui/combobox-hooks.cjs.map +1 -1
- package/dist/ui/components/ui/combobox-hooks.d.cts +13 -1
- package/dist/ui/components/ui/combobox-hooks.d.ts +13 -1
- package/dist/ui/components/ui/combobox-hooks.js.map +1 -1
- package/dist/ui/components/ui/command.cjs.map +1 -1
- package/dist/ui/components/ui/command.d.cts +132 -9
- package/dist/ui/components/ui/command.d.ts +132 -9
- package/dist/ui/components/ui/command.js.map +1 -1
- package/dist/ui/components/ui/context-menu.cjs.map +1 -1
- package/dist/ui/components/ui/context-menu.d.cts +233 -2
- package/dist/ui/components/ui/context-menu.d.ts +233 -2
- package/dist/ui/components/ui/context-menu.js.map +1 -1
- package/dist/ui/components/ui/dialog.cjs.map +1 -1
- package/dist/ui/components/ui/dialog.d.cts +157 -5
- package/dist/ui/components/ui/dialog.d.ts +157 -5
- package/dist/ui/components/ui/dialog.js.map +1 -1
- package/dist/ui/components/ui/drawer.cjs.map +1 -1
- package/dist/ui/components/ui/drawer.d.cts +130 -10
- package/dist/ui/components/ui/drawer.d.ts +130 -10
- package/dist/ui/components/ui/drawer.js.map +1 -1
- package/dist/ui/components/ui/dropdown-menu.cjs.map +1 -1
- package/dist/ui/components/ui/dropdown-menu.d.cts +225 -6
- package/dist/ui/components/ui/dropdown-menu.d.ts +225 -6
- package/dist/ui/components/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/components/ui/empty.cjs.map +1 -1
- package/dist/ui/components/ui/empty.d.cts +78 -6
- package/dist/ui/components/ui/empty.d.ts +78 -6
- package/dist/ui/components/ui/empty.js.map +1 -1
- package/dist/ui/components/ui/field.cjs.map +1 -1
- package/dist/ui/components/ui/field.d.cts +180 -6
- package/dist/ui/components/ui/field.d.ts +180 -6
- package/dist/ui/components/ui/field.js.map +1 -1
- package/dist/ui/components/ui/file-icon.cjs.map +1 -1
- package/dist/ui/components/ui/file-icon.d.cts +32 -4
- package/dist/ui/components/ui/file-icon.d.ts +32 -4
- package/dist/ui/components/ui/file-icon.js.map +1 -1
- package/dist/ui/components/ui/hover-card.cjs.map +1 -1
- package/dist/ui/components/ui/hover-card.d.cts +39 -3
- package/dist/ui/components/ui/hover-card.d.ts +39 -3
- package/dist/ui/components/ui/hover-card.js.map +1 -1
- package/dist/ui/components/ui/input-group.cjs.map +1 -1
- package/dist/ui/components/ui/input-group.d.cts +84 -6
- package/dist/ui/components/ui/input-group.d.ts +84 -6
- package/dist/ui/components/ui/input-group.js.map +1 -1
- package/dist/ui/components/ui/input-otp.cjs.map +1 -1
- package/dist/ui/components/ui/input-otp.d.cts +58 -4
- package/dist/ui/components/ui/input-otp.d.ts +58 -4
- package/dist/ui/components/ui/input-otp.js.map +1 -1
- package/dist/ui/components/ui/input.cjs.map +1 -1
- package/dist/ui/components/ui/input.d.cts +18 -10
- package/dist/ui/components/ui/input.d.ts +18 -10
- package/dist/ui/components/ui/input.js.map +1 -1
- package/dist/ui/components/ui/item.cjs.map +1 -1
- package/dist/ui/components/ui/item.d.cts +130 -10
- package/dist/ui/components/ui/item.d.ts +130 -10
- package/dist/ui/components/ui/item.js.map +1 -1
- package/dist/ui/components/ui/kbd.cjs.map +1 -1
- package/dist/ui/components/ui/kbd.d.cts +26 -2
- package/dist/ui/components/ui/kbd.d.ts +26 -2
- package/dist/ui/components/ui/kbd.js.map +1 -1
- package/dist/ui/components/ui/label.cjs.map +1 -1
- package/dist/ui/components/ui/label.d.cts +15 -0
- package/dist/ui/components/ui/label.d.ts +15 -0
- package/dist/ui/components/ui/label.js.map +1 -1
- package/dist/ui/components/ui/layout.cjs +1 -1
- package/dist/ui/components/ui/layout.cjs.map +1 -1
- package/dist/ui/components/ui/layout.d.cts +45 -11
- package/dist/ui/components/ui/layout.d.ts +45 -11
- package/dist/ui/components/ui/layout.js +22 -20
- package/dist/ui/components/ui/layout.js.map +1 -1
- package/dist/ui/components/ui/menubar.cjs.map +1 -1
- package/dist/ui/components/ui/menubar.d.cts +220 -16
- package/dist/ui/components/ui/menubar.d.ts +220 -16
- package/dist/ui/components/ui/menubar.js.map +1 -1
- package/dist/ui/components/ui/meter.cjs.map +1 -1
- package/dist/ui/components/ui/meter.d.cts +52 -4
- package/dist/ui/components/ui/meter.d.ts +52 -4
- package/dist/ui/components/ui/meter.js.map +1 -1
- package/dist/ui/components/ui/mobile-form-variants.cjs.map +1 -1
- package/dist/ui/components/ui/mobile-form-variants.d.cts +30 -0
- package/dist/ui/components/ui/mobile-form-variants.d.ts +30 -0
- package/dist/ui/components/ui/mobile-form-variants.js.map +1 -1
- package/dist/ui/components/ui/mobile-form.cjs.map +1 -1
- package/dist/ui/components/ui/mobile-form.d.cts +186 -9
- package/dist/ui/components/ui/mobile-form.d.ts +186 -9
- package/dist/ui/components/ui/mobile-form.js.map +1 -1
- package/dist/ui/components/ui/navigation-menu-components.cjs.map +1 -1
- package/dist/ui/components/ui/navigation-menu-components.d.cts +104 -8
- package/dist/ui/components/ui/navigation-menu-components.d.ts +104 -8
- package/dist/ui/components/ui/navigation-menu-components.js.map +1 -1
- package/dist/ui/components/ui/navigation-menu-variants.cjs.map +1 -1
- package/dist/ui/components/ui/navigation-menu-variants.d.cts +15 -0
- package/dist/ui/components/ui/navigation-menu-variants.d.ts +15 -0
- package/dist/ui/components/ui/navigation-menu-variants.js.map +1 -1
- package/dist/ui/components/ui/number-field.cjs.map +1 -1
- package/dist/ui/components/ui/number-field.d.cts +78 -6
- package/dist/ui/components/ui/number-field.d.ts +78 -6
- package/dist/ui/components/ui/number-field.js.map +1 -1
- package/dist/ui/components/ui/pagination.cjs.map +1 -1
- package/dist/ui/components/ui/pagination.d.cts +99 -7
- package/dist/ui/components/ui/pagination.d.ts +99 -7
- package/dist/ui/components/ui/pagination.js.map +1 -1
- package/dist/ui/components/ui/password-input.cjs.map +1 -1
- package/dist/ui/components/ui/password-input.d.cts +10 -7
- package/dist/ui/components/ui/password-input.d.ts +10 -7
- package/dist/ui/components/ui/password-input.js.map +1 -1
- package/dist/ui/components/ui/popover.cjs.map +1 -1
- package/dist/ui/components/ui/popover.d.cts +86 -2
- package/dist/ui/components/ui/popover.d.ts +86 -2
- package/dist/ui/components/ui/popover.js.map +1 -1
- package/dist/ui/components/ui/progress.cjs.map +1 -1
- package/dist/ui/components/ui/progress.d.cts +72 -2
- package/dist/ui/components/ui/progress.d.ts +72 -2
- package/dist/ui/components/ui/progress.js.map +1 -1
- package/dist/ui/components/ui/radio-card.cjs.map +1 -1
- package/dist/ui/components/ui/radio-card.d.cts +32 -4
- package/dist/ui/components/ui/radio-card.d.ts +32 -4
- package/dist/ui/components/ui/radio-card.js.map +1 -1
- package/dist/ui/components/ui/radio-group.cjs.map +1 -1
- package/dist/ui/components/ui/radio-group.d.cts +28 -2
- package/dist/ui/components/ui/radio-group.d.ts +28 -2
- package/dist/ui/components/ui/radio-group.js.map +1 -1
- package/dist/ui/components/ui/resizable.cjs.map +1 -1
- package/dist/ui/components/ui/resizable.d.cts +42 -3
- package/dist/ui/components/ui/resizable.d.ts +42 -3
- package/dist/ui/components/ui/resizable.js.map +1 -1
- package/dist/ui/components/ui/responsive-list.cjs.map +1 -1
- package/dist/ui/components/ui/responsive-list.d.cts +176 -13
- package/dist/ui/components/ui/responsive-list.d.ts +176 -13
- package/dist/ui/components/ui/responsive-list.js.map +1 -1
- package/dist/ui/components/ui/scroll-area.cjs.map +1 -1
- package/dist/ui/components/ui/scroll-area.d.cts +28 -1
- package/dist/ui/components/ui/scroll-area.d.ts +28 -1
- package/dist/ui/components/ui/scroll-area.js.map +1 -1
- package/dist/ui/components/ui/searchable-select-input.cjs.map +1 -1
- package/dist/ui/components/ui/searchable-select-input.d.cts +199 -49
- package/dist/ui/components/ui/searchable-select-input.d.ts +199 -49
- package/dist/ui/components/ui/searchable-select-input.js.map +1 -1
- package/dist/ui/components/ui/select.cjs.map +1 -1
- package/dist/ui/components/ui/select.d.cts +205 -40
- package/dist/ui/components/ui/select.d.ts +205 -40
- package/dist/ui/components/ui/select.js.map +1 -1
- package/dist/ui/components/ui/separator.cjs.map +1 -1
- package/dist/ui/components/ui/separator.d.cts +13 -2
- package/dist/ui/components/ui/separator.d.ts +13 -2
- package/dist/ui/components/ui/separator.js.map +1 -1
- package/dist/ui/components/ui/sheet.cjs.map +1 -1
- package/dist/ui/components/ui/sheet.d.cts +128 -3
- package/dist/ui/components/ui/sheet.d.ts +128 -3
- package/dist/ui/components/ui/sheet.js.map +1 -1
- package/dist/ui/components/ui/skeleton.cjs.map +1 -1
- package/dist/ui/components/ui/skeleton.d.cts +13 -1
- package/dist/ui/components/ui/skeleton.d.ts +13 -1
- package/dist/ui/components/ui/skeleton.js.map +1 -1
- package/dist/ui/components/ui/slider.cjs.map +1 -1
- package/dist/ui/components/ui/slider.d.cts +13 -7
- package/dist/ui/components/ui/slider.d.ts +13 -7
- package/dist/ui/components/ui/slider.js.map +1 -1
- package/dist/ui/components/ui/spinner.cjs.map +1 -1
- package/dist/ui/components/ui/spinner.d.cts +13 -1
- package/dist/ui/components/ui/spinner.d.ts +13 -1
- package/dist/ui/components/ui/spinner.js.map +1 -1
- package/dist/ui/components/ui/switch.cjs.map +1 -1
- package/dist/ui/components/ui/switch.d.cts +26 -0
- package/dist/ui/components/ui/switch.d.ts +26 -0
- package/dist/ui/components/ui/switch.js.map +1 -1
- package/dist/ui/components/ui/table.cjs.map +1 -1
- package/dist/ui/components/ui/table.d.cts +118 -2
- package/dist/ui/components/ui/table.d.ts +118 -2
- package/dist/ui/components/ui/table.js.map +1 -1
- package/dist/ui/components/ui/tabs-components.cjs.map +1 -1
- package/dist/ui/components/ui/tabs-components.d.cts +52 -5
- package/dist/ui/components/ui/tabs-components.d.ts +52 -5
- package/dist/ui/components/ui/tabs-components.js.map +1 -1
- package/dist/ui/components/ui/tabs-variants.cjs.map +1 -1
- package/dist/ui/components/ui/tabs-variants.d.cts +15 -0
- package/dist/ui/components/ui/tabs-variants.d.ts +15 -0
- package/dist/ui/components/ui/tabs-variants.js.map +1 -1
- package/dist/ui/components/ui/textarea.cjs.map +1 -1
- package/dist/ui/components/ui/textarea.d.cts +23 -0
- package/dist/ui/components/ui/textarea.d.ts +23 -0
- package/dist/ui/components/ui/textarea.js.map +1 -1
- package/dist/ui/components/ui/toast.cjs.map +1 -1
- package/dist/ui/components/ui/toast.d.cts +136 -0
- package/dist/ui/components/ui/toast.d.ts +136 -0
- package/dist/ui/components/ui/toast.js.map +1 -1
- package/dist/ui/components/ui/toaster.cjs.map +1 -1
- package/dist/ui/components/ui/toaster.d.cts +12 -3
- package/dist/ui/components/ui/toaster.d.ts +12 -3
- package/dist/ui/components/ui/toaster.js.map +1 -1
- package/dist/ui/components/ui/toggle-components.cjs.map +1 -1
- package/dist/ui/components/ui/toggle-components.d.cts +15 -0
- package/dist/ui/components/ui/toggle-components.d.ts +15 -0
- package/dist/ui/components/ui/toggle-components.js.map +1 -1
- package/dist/ui/components/ui/toggle-group.cjs.map +1 -1
- package/dist/ui/components/ui/toggle-group.d.cts +33 -0
- package/dist/ui/components/ui/toggle-group.d.ts +33 -0
- package/dist/ui/components/ui/toggle-group.js.map +1 -1
- package/dist/ui/components/ui/toggle-variants.cjs.map +1 -1
- package/dist/ui/components/ui/toggle-variants.d.cts +15 -0
- package/dist/ui/components/ui/toggle-variants.d.ts +15 -0
- package/dist/ui/components/ui/toggle-variants.js.map +1 -1
- package/dist/ui/components/ui/toolbar.cjs.map +1 -1
- package/dist/ui/components/ui/toolbar.d.cts +94 -7
- package/dist/ui/components/ui/toolbar.d.ts +94 -7
- package/dist/ui/components/ui/toolbar.js.map +1 -1
- package/dist/ui/components/ui/tooltip.cjs.map +1 -1
- package/dist/ui/components/ui/tooltip.d.cts +54 -3
- package/dist/ui/components/ui/tooltip.d.ts +54 -3
- package/dist/ui/components/ui/tooltip.js.map +1 -1
- package/dist/ui/lib/hooks/use-gps.cjs.map +1 -1
- package/dist/ui/lib/hooks/use-gps.d.cts +29 -4
- package/dist/ui/lib/hooks/use-gps.d.ts +29 -4
- package/dist/ui/lib/hooks/use-gps.js.map +1 -1
- package/dist/ui/lib/hooks/use-is-client.cjs.map +1 -1
- package/dist/ui/lib/hooks/use-is-client.d.cts +11 -2
- package/dist/ui/lib/hooks/use-is-client.d.ts +11 -2
- package/dist/ui/lib/hooks/use-is-client.js.map +1 -1
- package/dist/ui/lib/hooks/use-keyboard-shortcut.cjs.map +1 -1
- package/dist/ui/lib/hooks/use-keyboard-shortcut.d.cts +48 -18
- package/dist/ui/lib/hooks/use-keyboard-shortcut.d.ts +48 -18
- package/dist/ui/lib/hooks/use-keyboard-shortcut.js.map +1 -1
- package/dist/ui/lib/hooks/use-mobile.cjs.map +1 -1
- package/dist/ui/lib/hooks/use-mobile.d.cts +11 -3
- package/dist/ui/lib/hooks/use-mobile.d.ts +11 -3
- package/dist/ui/lib/hooks/use-mobile.js.map +1 -1
- package/dist/ui/lib/hooks/use-toast.cjs.map +1 -1
- package/dist/ui/lib/hooks/use-toast.d.cts +184 -15
- package/dist/ui/lib/hooks/use-toast.d.ts +184 -15
- package/dist/ui/lib/hooks/use-toast.js.map +1 -1
- package/dist/ui/lib/ime-utils.cjs.map +1 -1
- package/dist/ui/lib/ime-utils.d.cts +40 -13
- package/dist/ui/lib/ime-utils.d.ts +40 -13
- package/dist/ui/lib/ime-utils.js.map +1 -1
- package/dist/ui/lib/utils.cjs.map +1 -1
- package/dist/ui/lib/utils.d.cts +9 -6
- package/dist/ui/lib/utils.d.ts +9 -6
- package/dist/ui/lib/utils.js.map +1 -1
- package/docs/ai.md +34 -1
- package/docs/exports.md +5 -1
- package/docs/index.md +89 -16
- package/docs/migration.md +268 -0
- package/docs/request-form.md +4 -1
- package/docs/tools.md +4 -1
- package/docs/ui.md +4 -1
- package/llms-full.txt +499 -36
- package/llms.txt +4 -0
- package/package.json +35 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-grid.cjs","names":["React","cn","require_runtime","require_ui_lib_utils","react_jsx_runtime","react","widthToSpan","gapClasses","columnClasses","FormGrid","props","columns","gap","className","FormGridItem","width"],"sources":["../../../../src/tools/components/form/form-grid.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from \"../../lib/utils\";\nimport type { FieldWidth } from \"../../lib/schema\";\n\n/**\n * フィールド幅に対応するグリッドスパン\n * - short: 1列 (最小幅)\n * - medium: 1列 (デフォルト)\n * - long: 2列にスパン\n * - full: 全列にスパン\n */\nconst widthToSpan: Record<FieldWidth, string> = {\n short: 'col-span-1',\n medium: 'col-span-1',\n long: 'md:col-span-2',\n full: 'col-span-full',\n};\n\nexport type GridColumns = 1 | 2 | 3;\n\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n *
|
|
1
|
+
{"version":3,"file":"form-grid.cjs","names":["React","cn","require_runtime","require_ui_lib_utils","react_jsx_runtime","react","widthToSpan","gapClasses","columnClasses","FormGrid","props","columns","gap","className","FormGridItem","width"],"sources":["../../../../src/tools/components/form/form-grid.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from \"../../lib/utils\";\nimport type { FieldWidth } from \"../../lib/schema\";\n\n/**\n * フィールド幅に対応するグリッドスパン\n * - short: 1列 (最小幅)\n * - medium: 1列 (デフォルト)\n * - long: 2列にスパン\n * - full: 全列にスパン\n */\nconst widthToSpan: Record<FieldWidth, string> = {\n short: 'col-span-1',\n medium: 'col-span-1',\n long: 'md:col-span-2',\n full: 'col-span-full',\n};\n\n/**\n * Supported maximum column counts for {@link FormGrid}; smaller screens use fewer columns.\n */\nexport type GridColumns = 1 | 2 | 3;\n\n/**\n * Grid layout options and native div attributes for {@link FormGrid}.\n */\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Maximum columns: 1 always; 2 from md; 3 from lg (two from md).\n * @defaultValue 2\n */\n columns?: GridColumns;\n /**\n * Responsive gap preset: sm uses gap-3, md uses gap-4/md:gap-6, lg uses gap-6/md:gap-8.\n * @defaultValue \"md\"\n */\n gap?: 'sm' | 'md' | 'lg';\n}\n\nconst gapClasses = {\n sm: 'gap-3',\n md: 'gap-4 md:gap-6',\n lg: 'gap-6 md:gap-8',\n};\n\nconst columnClasses = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n};\n\n/**\n * Renders a responsive form layout with configurable column and gap presets.\n * @param props - Grid settings and native div attributes, including children; see {@link FormGridProps}.\n * @returns A div containing the supplied children; fields and labels are owned by the caller.\n * @remarks The ref prop forwards to the rendered div. Import Appkit CSS. Pair controls with explicit labels; Input and Textarea do not accept a label prop.\n * @example\n * ```tsx\n * import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';\n * import { Input, Textarea } from '@alneas/appkit-react/ui';\n * import '@alneas/appkit-react/styles';\n *\n * export function AddressFields() {\n * return <FormGrid columns={2} gap=\"md\">\n * <FormGridItem width=\"short\"><label htmlFor=\"postal-code\">Postal code</label>\n * <Input id=\"postal-code\" /></FormGridItem>\n * <FormGridItem width=\"full\"><label htmlFor=\"notes\">Notes</label>\n * <Textarea id=\"notes\" /></FormGridItem>\n * </FormGrid>;\n * }\n * ```\n */\nexport const FormGrid = React.forwardRef<HTMLDivElement, FormGridProps>(\n ({ className, columns = 2, gap = 'md', children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('grid', columnClasses[columns], gapClasses[gap], className)}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nFormGrid.displayName = 'FormGrid';\n\n/**\n * Width hints and native div attributes for {@link FormGridItem}.\n */\nexport interface FormGridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Span hint: short/medium use one column, long spans two from md, full spans all columns.\n * @defaultValue \"medium\"\n */\n width?: FieldWidth;\n}\n\n/**\n * Applies a field-width span hint to one child of {@link FormGrid}.\n * @param props - Width (default medium), children and native div attributes; see {@link FormGridItemProps}.\n * @returns A div with responsive span classes wrapping the supplied children.\n * @remarks The ref prop forwards to the rendered div. Import Appkit CSS. A long item can create implicit columns in a one-column grid at md;\n * choose width hints consistent with the parent grid. See the FormGrid example for labeled controls.\n * @example\n * ```tsx\n * import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';\n * import '@alneas/appkit-react/styles';\n * export function FullWidthContent() {\n * return <FormGrid><FormGridItem width=\"full\">Additional details</FormGridItem></FormGrid>;\n * }\n * ```\n */\nexport const FormGridItem = React.forwardRef<HTMLDivElement, FormGridItemProps>(\n ({ className, width = 'medium', children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(widthToSpan[width], className)} {...props}>\n {children}\n </div>\n );\n },\n);\nFormGridItem.displayName = 'FormGridItem';\n"],"mappings":"A,yPAWA,IAAMM,EAA0C,CAC9C,MAAO,aACP,OAAQ,aACR,KAAM,gBACN,KAAM,eACR,EAuBMC,EAAa,CACjB,GAAI,QACJ,GAAI,iBACJ,GAAI,gBACN,EAEMC,EAAgB,CACpB,EAAG,cACH,EAAG,6BACH,EAAG,2CACL,EAuBaC,EAAWT,EAAM,YAC3B,CAAE,YAAW,UAAU,EAAG,MAAM,KAAM,WAAU,GAAGU,GAAS,KAEzD,EAAAN,EAAA,IAAA,CAAC,MAAD,CACO,MACL,UAAWH,EAAAA,GAAG,OAAQO,EAAcG,GAAUJ,EAAWK,GAAMC,CAAS,EACxE,GAAIH,EAEH,UACE,CAAA,CAGX,EACA,EAAS,YAAc,WA4BvB,IAAaI,EAAed,EAAM,YAC/B,CAAE,YAAW,QAAQ,SAAU,WAAU,GAAGU,GAAS,KAElD,EAAAN,EAAA,IAAA,CAAC,MAAD,CAAU,MAAK,UAAWH,EAAAA,GAAGK,EAAYS,GAAQF,CAAS,EAAG,GAAIH,EAC9D,UACE,CAAA,CAGX,EACA,EAAa,YAAc,e"}
|
|
@@ -1,47 +1,69 @@
|
|
|
1
1
|
import { FieldWidth } from '../../lib/schema/index.cjs';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Supported maximum column counts for {@link FormGrid}; smaller screens use fewer columns.
|
|
5
|
+
*/
|
|
3
6
|
export type GridColumns = 1 | 2 | 3;
|
|
7
|
+
/**
|
|
8
|
+
* Grid layout options and native div attributes for {@link FormGrid}.
|
|
9
|
+
*/
|
|
4
10
|
export interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
11
|
/**
|
|
6
|
-
*
|
|
7
|
-
* @
|
|
12
|
+
* Maximum columns: 1 always; 2 from md; 3 from lg (two from md).
|
|
13
|
+
* @defaultValue 2
|
|
8
14
|
*/
|
|
9
15
|
columns?: GridColumns;
|
|
10
16
|
/**
|
|
11
|
-
*
|
|
12
|
-
* @
|
|
17
|
+
* Responsive gap preset: sm uses gap-3, md uses gap-4/md:gap-6, lg uses gap-6/md:gap-8.
|
|
18
|
+
* @defaultValue "md"
|
|
13
19
|
*/
|
|
14
20
|
gap?: 'sm' | 'md' | 'lg';
|
|
15
21
|
}
|
|
16
22
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
23
|
+
* Renders a responsive form layout with configurable column and gap presets.
|
|
24
|
+
* @param props - Grid settings and native div attributes, including children; see {@link FormGridProps}.
|
|
25
|
+
* @returns A div containing the supplied children; fields and labels are owned by the caller.
|
|
26
|
+
* @remarks The ref prop forwards to the rendered div. Import Appkit CSS. Pair controls with explicit labels; Input and Textarea do not accept a label prop.
|
|
22
27
|
* @example
|
|
23
28
|
* ```tsx
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';
|
|
30
|
+
* import { Input, Textarea } from '@alneas/appkit-react/ui';
|
|
31
|
+
* import '@alneas/appkit-react/styles';
|
|
32
|
+
*
|
|
33
|
+
* export function AddressFields() {
|
|
34
|
+
* return <FormGrid columns={2} gap="md">
|
|
35
|
+
* <FormGridItem width="short"><label htmlFor="postal-code">Postal code</label>
|
|
36
|
+
* <Input id="postal-code" /></FormGridItem>
|
|
37
|
+
* <FormGridItem width="full"><label htmlFor="notes">Notes</label>
|
|
38
|
+
* <Textarea id="notes" /></FormGridItem>
|
|
39
|
+
* </FormGrid>;
|
|
40
|
+
* }
|
|
32
41
|
* ```
|
|
33
42
|
*/
|
|
34
43
|
export declare const FormGrid: React.ForwardRefExoticComponent<FormGridProps & React.RefAttributes<HTMLDivElement>>;
|
|
44
|
+
/**
|
|
45
|
+
* Width hints and native div attributes for {@link FormGridItem}.
|
|
46
|
+
*/
|
|
35
47
|
export interface FormGridItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
36
48
|
/**
|
|
37
|
-
*
|
|
38
|
-
* @
|
|
49
|
+
* Span hint: short/medium use one column, long spans two from md, full spans all columns.
|
|
50
|
+
* @defaultValue "medium"
|
|
39
51
|
*/
|
|
40
52
|
width?: FieldWidth;
|
|
41
53
|
}
|
|
42
54
|
/**
|
|
43
|
-
* FormGrid
|
|
44
|
-
*
|
|
45
|
-
*
|
|
55
|
+
* Applies a field-width span hint to one child of {@link FormGrid}.
|
|
56
|
+
* @param props - Width (default medium), children and native div attributes; see {@link FormGridItemProps}.
|
|
57
|
+
* @returns A div with responsive span classes wrapping the supplied children.
|
|
58
|
+
* @remarks The ref prop forwards to the rendered div. Import Appkit CSS. A long item can create implicit columns in a one-column grid at md;
|
|
59
|
+
* choose width hints consistent with the parent grid. See the FormGrid example for labeled controls.
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';
|
|
63
|
+
* import '@alneas/appkit-react/styles';
|
|
64
|
+
* export function FullWidthContent() {
|
|
65
|
+
* return <FormGrid><FormGridItem width="full">Additional details</FormGridItem></FormGrid>;
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
46
68
|
*/
|
|
47
69
|
export declare const FormGridItem: React.ForwardRefExoticComponent<FormGridItemProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,47 +1,69 @@
|
|
|
1
1
|
import { FieldWidth } from '../../lib/schema/index.js';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Supported maximum column counts for {@link FormGrid}; smaller screens use fewer columns.
|
|
5
|
+
*/
|
|
3
6
|
export type GridColumns = 1 | 2 | 3;
|
|
7
|
+
/**
|
|
8
|
+
* Grid layout options and native div attributes for {@link FormGrid}.
|
|
9
|
+
*/
|
|
4
10
|
export interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
11
|
/**
|
|
6
|
-
*
|
|
7
|
-
* @
|
|
12
|
+
* Maximum columns: 1 always; 2 from md; 3 from lg (two from md).
|
|
13
|
+
* @defaultValue 2
|
|
8
14
|
*/
|
|
9
15
|
columns?: GridColumns;
|
|
10
16
|
/**
|
|
11
|
-
*
|
|
12
|
-
* @
|
|
17
|
+
* Responsive gap preset: sm uses gap-3, md uses gap-4/md:gap-6, lg uses gap-6/md:gap-8.
|
|
18
|
+
* @defaultValue "md"
|
|
13
19
|
*/
|
|
14
20
|
gap?: 'sm' | 'md' | 'lg';
|
|
15
21
|
}
|
|
16
22
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
23
|
+
* Renders a responsive form layout with configurable column and gap presets.
|
|
24
|
+
* @param props - Grid settings and native div attributes, including children; see {@link FormGridProps}.
|
|
25
|
+
* @returns A div containing the supplied children; fields and labels are owned by the caller.
|
|
26
|
+
* @remarks The ref prop forwards to the rendered div. Import Appkit CSS. Pair controls with explicit labels; Input and Textarea do not accept a label prop.
|
|
22
27
|
* @example
|
|
23
28
|
* ```tsx
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';
|
|
30
|
+
* import { Input, Textarea } from '@alneas/appkit-react/ui';
|
|
31
|
+
* import '@alneas/appkit-react/styles';
|
|
32
|
+
*
|
|
33
|
+
* export function AddressFields() {
|
|
34
|
+
* return <FormGrid columns={2} gap="md">
|
|
35
|
+
* <FormGridItem width="short"><label htmlFor="postal-code">Postal code</label>
|
|
36
|
+
* <Input id="postal-code" /></FormGridItem>
|
|
37
|
+
* <FormGridItem width="full"><label htmlFor="notes">Notes</label>
|
|
38
|
+
* <Textarea id="notes" /></FormGridItem>
|
|
39
|
+
* </FormGrid>;
|
|
40
|
+
* }
|
|
32
41
|
* ```
|
|
33
42
|
*/
|
|
34
43
|
export declare const FormGrid: React.ForwardRefExoticComponent<FormGridProps & React.RefAttributes<HTMLDivElement>>;
|
|
44
|
+
/**
|
|
45
|
+
* Width hints and native div attributes for {@link FormGridItem}.
|
|
46
|
+
*/
|
|
35
47
|
export interface FormGridItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
36
48
|
/**
|
|
37
|
-
*
|
|
38
|
-
* @
|
|
49
|
+
* Span hint: short/medium use one column, long spans two from md, full spans all columns.
|
|
50
|
+
* @defaultValue "medium"
|
|
39
51
|
*/
|
|
40
52
|
width?: FieldWidth;
|
|
41
53
|
}
|
|
42
54
|
/**
|
|
43
|
-
* FormGrid
|
|
44
|
-
*
|
|
45
|
-
*
|
|
55
|
+
* Applies a field-width span hint to one child of {@link FormGrid}.
|
|
56
|
+
* @param props - Width (default medium), children and native div attributes; see {@link FormGridItemProps}.
|
|
57
|
+
* @returns A div with responsive span classes wrapping the supplied children.
|
|
58
|
+
* @remarks The ref prop forwards to the rendered div. Import Appkit CSS. A long item can create implicit columns in a one-column grid at md;
|
|
59
|
+
* choose width hints consistent with the parent grid. See the FormGrid example for labeled controls.
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';
|
|
63
|
+
* import '@alneas/appkit-react/styles';
|
|
64
|
+
* export function FullWidthContent() {
|
|
65
|
+
* return <FormGrid><FormGridItem width="full">Additional details</FormGridItem></FormGrid>;
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
46
68
|
*/
|
|
47
69
|
export declare const FormGridItem: React.ForwardRefExoticComponent<FormGridItemProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-grid.js","names":["React","React$1","widthToSpan","gapClasses","columnClasses","FormGrid","props","cn","columns","gap","className","FormGridItem","width"],"sources":["../../../../src/tools/components/form/form-grid.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from \"../../lib/utils\";\nimport type { FieldWidth } from \"../../lib/schema\";\n\n/**\n * フィールド幅に対応するグリッドスパン\n * - short: 1列 (最小幅)\n * - medium: 1列 (デフォルト)\n * - long: 2列にスパン\n * - full: 全列にスパン\n */\nconst widthToSpan: Record<FieldWidth, string> = {\n short: 'col-span-1',\n medium: 'col-span-1',\n long: 'md:col-span-2',\n full: 'col-span-full',\n};\n\nexport type GridColumns = 1 | 2 | 3;\n\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n *
|
|
1
|
+
{"version":3,"file":"form-grid.js","names":["React","React$1","widthToSpan","gapClasses","columnClasses","FormGrid","props","cn","columns","gap","className","FormGridItem","width"],"sources":["../../../../src/tools/components/form/form-grid.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from \"../../lib/utils\";\nimport type { FieldWidth } from \"../../lib/schema\";\n\n/**\n * フィールド幅に対応するグリッドスパン\n * - short: 1列 (最小幅)\n * - medium: 1列 (デフォルト)\n * - long: 2列にスパン\n * - full: 全列にスパン\n */\nconst widthToSpan: Record<FieldWidth, string> = {\n short: 'col-span-1',\n medium: 'col-span-1',\n long: 'md:col-span-2',\n full: 'col-span-full',\n};\n\n/**\n * Supported maximum column counts for {@link FormGrid}; smaller screens use fewer columns.\n */\nexport type GridColumns = 1 | 2 | 3;\n\n/**\n * Grid layout options and native div attributes for {@link FormGrid}.\n */\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Maximum columns: 1 always; 2 from md; 3 from lg (two from md).\n * @defaultValue 2\n */\n columns?: GridColumns;\n /**\n * Responsive gap preset: sm uses gap-3, md uses gap-4/md:gap-6, lg uses gap-6/md:gap-8.\n * @defaultValue \"md\"\n */\n gap?: 'sm' | 'md' | 'lg';\n}\n\nconst gapClasses = {\n sm: 'gap-3',\n md: 'gap-4 md:gap-6',\n lg: 'gap-6 md:gap-8',\n};\n\nconst columnClasses = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n};\n\n/**\n * Renders a responsive form layout with configurable column and gap presets.\n * @param props - Grid settings and native div attributes, including children; see {@link FormGridProps}.\n * @returns A div containing the supplied children; fields and labels are owned by the caller.\n * @remarks The ref prop forwards to the rendered div. Import Appkit CSS. Pair controls with explicit labels; Input and Textarea do not accept a label prop.\n * @example\n * ```tsx\n * import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';\n * import { Input, Textarea } from '@alneas/appkit-react/ui';\n * import '@alneas/appkit-react/styles';\n *\n * export function AddressFields() {\n * return <FormGrid columns={2} gap=\"md\">\n * <FormGridItem width=\"short\"><label htmlFor=\"postal-code\">Postal code</label>\n * <Input id=\"postal-code\" /></FormGridItem>\n * <FormGridItem width=\"full\"><label htmlFor=\"notes\">Notes</label>\n * <Textarea id=\"notes\" /></FormGridItem>\n * </FormGrid>;\n * }\n * ```\n */\nexport const FormGrid = React.forwardRef<HTMLDivElement, FormGridProps>(\n ({ className, columns = 2, gap = 'md', children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('grid', columnClasses[columns], gapClasses[gap], className)}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nFormGrid.displayName = 'FormGrid';\n\n/**\n * Width hints and native div attributes for {@link FormGridItem}.\n */\nexport interface FormGridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Span hint: short/medium use one column, long spans two from md, full spans all columns.\n * @defaultValue \"medium\"\n */\n width?: FieldWidth;\n}\n\n/**\n * Applies a field-width span hint to one child of {@link FormGrid}.\n * @param props - Width (default medium), children and native div attributes; see {@link FormGridItemProps}.\n * @returns A div with responsive span classes wrapping the supplied children.\n * @remarks The ref prop forwards to the rendered div. Import Appkit CSS. A long item can create implicit columns in a one-column grid at md;\n * choose width hints consistent with the parent grid. See the FormGrid example for labeled controls.\n * @example\n * ```tsx\n * import { FormGrid, FormGridItem } from '@alneas/appkit-react/tools/form';\n * import '@alneas/appkit-react/styles';\n * export function FullWidthContent() {\n * return <FormGrid><FormGridItem width=\"full\">Additional details</FormGridItem></FormGrid>;\n * }\n * ```\n */\nexport const FormGridItem = React.forwardRef<HTMLDivElement, FormGridItemProps>(\n ({ className, width = 'medium', children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(widthToSpan[width], className)} {...props}>\n {children}\n </div>\n );\n },\n);\nFormGridItem.displayName = 'FormGridItem';\n"],"mappings":";;;;;AAWA,IAAME,IAA0C;CAC9C,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;AACR,GAuBMC,IAAa;CACjB,IAAI;CACJ,IAAI;CACJ,IAAI;AACN,GAEMC,IAAgB;CACpB,GAAG;CACH,GAAG;CACH,GAAG;AACL,GAuBaC,IAAWL,EAAM,YAC3B,EAAE,cAAW,aAAU,GAAG,SAAM,MAAM,aAAU,GAAGM,KAAS,MAEzD,kBAAC,OAAD;CACO;CACL,WAAWC,EAAG,QAAQH,EAAcI,IAAUL,EAAWM,IAAMC,CAAS;CACxE,GAAIJ;CAEH;AACE,CAAA,CAGX;AACA,EAAS,cAAc;AA4BvB,IAAaK,IAAeX,EAAM,YAC/B,EAAE,cAAW,WAAQ,UAAU,aAAU,GAAGM,KAAS,MAElD,kBAAC,OAAD;CAAU;CAAK,WAAWC,EAAGL,EAAYU,IAAQF,CAAS;CAAG,GAAIJ;CAC9D;AACE,CAAA,CAGX;AACA,EAAa,cAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../ui/lib/utils.cjs"),t=require("../../../ui/components/ui/button-components.cjs"),n=require("../../../ui/components/ui/avatar.cjs"),r=require("./hooks/useGanttState.cjs"),i=require("./components/GanttToolbar.cjs"),a=require("./components/GanttTaskBar.cjs"),o=require("./dialogs/TaskEditDialog.cjs"),s=require("./components/GanttDependencyLayer.cjs"),c=require("./hooks/use-gantt-row-window.cjs");let l=require("react/jsx-runtime"),u=require("react"),d=require("lucide-react"),ee=require("date-fns/locale"),f=require("date-fns"),p=require("@alneas/appkit-core/graph/planning");var te=(0,u.memo)(a.GanttTaskBar),ne=[];function m({tasks:a,milestones:m=[],markers:ie=[],onTaskClick:ae,onTaskUpdate:h,onTasksChange:g,dependencies:_=ne,autoSchedule:v=!1,schedulingOptions:y,showCriticalPath:b=!1,dateEditing:oe,onTaskDelete:x,onAddTask:S,onMilestoneClick:se,className:ce,initialViewMode:le=`Week`,taskBarDisplay:ue=`none`,displayConfig:C,scaleConfig:w,gridConfig:T,baselineConfig:de,progressConfig:fe,hierarchyConfig:E,filterConfig:pe,editMode:D=`dialog`,editableFields:me,showAddButton:he,showRowAddButton:ge,disableOptimisticUpdates:O=!1}){let k=ee.enUS,[A,j]=(0,u.useState)(null),[_e,ve]=(0,u.useState)(a);a!==_e&&(ve(a),j(null));let M=O||!A?a:A,[ye,be]=(0,u.useState)(!1),[N,P]=(0,u.useState)(null),F=(0,u.useRef)(!1),xe=(0,u.useRef)(a),I=(0,u.useRef)(0);(0,u.useEffect)(()=>{xe.current=a},[a]),(0,u.useEffect)(()=>()=>{I.current++},[]);let Se=(0,u.useMemo)(()=>_.length?(0,p.dependencyError)(M,_):null,[M,_]),L=(0,u.useMemo)(()=>{try{return{isWorking:y?.calendar?(0,p.workingDayPredicate)(y.calendar):void 0,plan:b||v&&y?(0,p.planGanttTasks)(M,_,{...y,resourceLeveling:v?y?.resourceLeveling:void 0}):void 0,error:null}}catch(e){return{error:e instanceof Error?e.message:`Invalid schedule.`}}},[M,_,y,b,v]),Ce=(0,u.useMemo)(()=>new Map(b?L.plan?.criticalPath.tasks.map(e=>[e.taskId,e]):[]),[b,L.plan]),R=v&&!g?`Automatic scheduling requires onTasksChange for atomic updates.`:Se??L.error,we=(0,u.useMemo)(()=>{if(!y&&!b)return M;let e=e=>typeof e==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(e)?(0,f.parseISO)(e):e;return M.map(t=>({...t,start_date:e(t.start_date),due_date:e(t.due_date),created_at:e(t.created_at)}))},[M,y,b]),{state:z,visibleTasks:B,allDays:Te,startDate:Ee,totalDays:De,setViewMode:Oe,selectTask:ke,toggleTaskExpand:Ae,setCellWidth:je,goToToday:Me,goToPrevious:Ne,goToNext:Pe,getXPosition:V,getWidth:H}=r.useGanttState({tasks:we,initialViewMode:le,hierarchyConfig:E,scaleConfig:w}),{viewMode:U,currentDate:Fe,cellWidth:W,rowHeight:G,selectedTaskId:Ie}=z,[Le,K]=(0,u.useState)(!1),[q,J]=(0,u.useState)(null),Re=C?.showTaskList??!0,ze=C?.showChart??!0,Be=C?.taskListWidth??256,Ve=T?.showHorizontalBorders??!0,Y=T?.showVerticalBorders??!0,He=T?.showWeekendHighlight??!0,Ue=T?.showTodayHighlight??!0,We=(0,u.useMemo)(()=>B.map(e=>e.id),[B]),X=C?.virtualizeRows!==!1&&B.length>100,{chartRef:Z,listRef:Ge,start:Ke,end:qe,indices:Je,bottomInset:Ye,onScroll:Xe,onFocusCapture:Ze,onBlurCapture:Qe,onKeyDownCapture:$e,onPointerDownCapture:et,onPointerUpCapture:tt,onPointerCancelCapture:nt,onLostPointerCapture:rt}=c.useGanttRowWindow(We,G,X,Le?q?.id:void 0,`${Re}:${ze}`),it={onScroll:Xe,onFocusCapture:Ze,onBlurCapture:Qe,onKeyDownCapture:$e,onPointerDownCapture:et,onPointerUpCapture:tt,onPointerCancelCapture:nt,onLostPointerCapture:rt},at=Je.map(e=>({task:B[e],index:e}));(0,u.useEffect)(()=>{if(Z.current){let e=V(new Date),t=Z.current.clientWidth;Z.current.scrollLeft=e-t/2}},[U,V,Z]);let Q=(0,u.useCallback)(e=>{F.current||(ke(e.id),ae?.(e),D===`dialog`&&(J(M.find(t=>t.id===e.id)??e),K(!0)))},[ke,ae,D,M]),$=(0,u.useCallback)(async(e,t)=>{if(F.current)return!1;let n=++I.current,r=a,i=A;F.current=!0,be(!0),P(null);try{if(t&&v&&!g)throw Error(`Automatic scheduling requires onTasksChange for atomic updates.`);let r=M.map(t=>t.id===e.id?e:t);return t&&v&&(r=(0,p.scheduleGanttTasks)(r,_,y)),O||j(r),g?await g(r):await h?.(e),n===I.current}catch(e){return n===I.current&&(xe.current===r&&j(i),P(e instanceof Error?e.message:`Unable to save task changes.`)),!1}finally{n===I.current&&(F.current=!1,be(!1))}},[a,A,v,g,M,_,y,O,h]),ot=async e=>{let t=q&&(String(e.start_date)!==String(q.start_date)||String(e.due_date)!==String(q.due_date)),n=await $(v&&y&&t?{...e,durationDays:void 0}:e,!0);return n&&(K(!1),J(null)),n},st=(0,u.useCallback)((e,t,n)=>{let r=M.find(t=>t.id===e);if(!r)return;let i={...r,start_date:t,due_date:n};if(v&&y)try{let e=(0,p.planningDate)(r.start_date??r.created_at),a=r.due_date==null?(0,f.addDays)(e,1):(0,p.planningDate)(r.due_date),o=(0,f.differenceInCalendarDays)(t,e)===(0,f.differenceInCalendarDays)(n,a);i={...i,durationDays:(0,p.getGanttWorkingDuration)(o?r:{...i,durationDays:void 0},y.calendar)}}catch(e){P(e instanceof Error?e.message:`Invalid task dates.`);return}$(i,!0)},[M,v,y,$]),ct=(0,u.useCallback)((e,t)=>{let n=M.find(t=>t.id===e);n&&$({...n,progress:t},!1)},[M,$]),lt=e=>{if(!F.current){if(!O){let t=M.filter(t=>t.id!==e);j(t)}x?.(e),K(!1),J(null)}},ut=e=>{S?.(e)},dt=()=>{let e=w?.maxCellWidth??100;je(Math.min(W*1.5,e))},ft=()=>{let e=w?.minCellWidth??5;je(Math.max(W/1.5,e))},pt=e=>({today:`Today`,day:`Day`,week:`Week`,month:`Month`,tasks:`Tasks`,milestones:`Milestones`})[e.toLowerCase()]||e;return(0,l.jsxs)(`div`,{"aria-busy":ye,"data-task-count":B.length,"data-virtualized":X||void 0,className:e.cn(`flex flex-col h-full bg-background border overflow-hidden [border-radius:var(--radius-lg)] [box-shadow:var(--shadow-sm)]`,ce),children:[b&&L.plan&&(0,l.jsxs)(`div`,{className:`px-2 py-1 text-xs text-muted-foreground`,role:`status`,children:[`Critical path (dependencies only): `,L.plan.criticalPath.taskIds.length,` tasks; resource contention is excluded from float.`]}),v&&y?.resourceLeveling?.enabled&&L.plan&&(0,l.jsxs)(`details`,{className:`px-2 py-1 text-xs text-muted-foreground`,"data-resource-leveling":!0,children:[(0,l.jsxs)(`summary`,{children:[`Resource leveling preview: `,L.plan.resourceDelays.length,` delayed tasks (not applied until save)`]}),(0,l.jsx)(`ul`,{children:L.plan.resourceDelays.map(e=>(0,l.jsxs)(`li`,{children:[M.find(t=>t.id===e.taskId)?.title??e.taskId,`: capacity +`,e.directDays,`d, predecessors +`,e.propagatedDays,`d`]},e.taskId))})]}),(N||R)&&(0,l.jsx)(`div`,{role:`alert`,className:`p-2 text-sm text-destructive`,children:N||R}),(0,l.jsx)(i.GanttToolbar,{currentDate:Fe,viewMode:U,scaleConfig:w,filterConfig:pe,onViewModeChange:Oe,onPrevious:Ne,onNext:Pe,onToday:Me,onZoomIn:w?.zoomControls?dt:void 0,onZoomOut:w?.zoomControls?ft:void 0}),(0,l.jsxs)(`div`,{className:`flex flex-1 min-h-0 overflow-hidden`,children:[Re&&(0,l.jsxs)(`div`,{className:`flex-shrink-0 border-r bg-background flex flex-col z-20 [box-shadow:var(--shadow-sm)]`,style:{width:Be},children:[(0,l.jsxs)(`div`,{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)]`,style:{height:G,flexShrink:0},children:[(0,l.jsx)(`span`,{children:pt(`tasks`)}),he&&S&&(0,l.jsx)(t.Button,{variant:`ghost`,size:`icon`,className:`h-6 w-6`,onClick:()=>ut(),children:(0,l.jsx)(d.Plus,{className:`h-4 w-4`})})]}),(0,l.jsx)(`div`,{ref:Ge,...it,"data-gantt-list-viewport":!0,className:`flex-1 min-h-0 overflow-auto`,children:(0,l.jsxs)(`div`,{style:{paddingBottom:Ye},children:[(0,l.jsx)(`div`,{style:{height:B.length*G,position:`relative`},children:at.map(({task:r,index:i})=>(0,l.jsxs)(`div`,{"data-gantt-row-id":r.id,className:e.cn(`border-b flex items-center px-2 text-sm font-medium hover:bg-muted/50 cursor-pointer transition-colors group`,Ie===r.id&&`bg-muted`),style:{height:G,position:`absolute`,top:i*G,left:0,right:0,paddingLeft:r.computedLevel*(E?.indentWidth??16)+8},onClick:()=>Q(r),children:[r.hasChildren?(0,l.jsx)(t.Button,{"aria-label":`${r.title}: expand/collapse`,"aria-expanded":z.expandedTaskIds.has(r.id),variant:`ghost`,size:`icon`,className:`h-4 w-4 p-0 mr-1 hover:bg-muted rounded-sm`,onClick:e=>{e.stopPropagation(),Ae(r.id)},children:z.expandedTaskIds.has(r.id)?(0,l.jsx)(d.ChevronDown,{className:`h-3 w-3`}):(0,l.jsx)(d.ChevronRight,{className:`h-3 w-3`})}):(0,l.jsx)(`div`,{className:`w-4`}),(0,l.jsx)(`div`,{className:e.cn(`w-2 h-2 rounded-full mr-2 flex-shrink-0`,r.status===`done`?`bg-green-500`:r.status===`review`?`bg-primary`:r.status===`doing`?`bg-blue-500`:r.status===`blocked`?`bg-red-500`:`bg-muted`)}),(0,l.jsx)(`button`,{type:`button`,className:`truncate flex-1 text-left`,onClick:e=>{e.stopPropagation(),Q(r)},children:r.title}),fe?.showProgress&&r.computedProgress>0&&(0,l.jsxs)(`span`,{className:`text-xs text-muted-foreground mr-2`,children:[Math.round(r.computedProgress),`%`]}),r.assignee_id&&(0,l.jsx)(n.Avatar,{className:`h-5 w-5 ml-1 border opacity-70 group-hover:opacity-100`,children:(0,l.jsx)(n.AvatarFallback,{className:`text-[9px]`,children:r.assignee_name?.[0]?.toUpperCase()??r.priority?.[0]?.toUpperCase()??`?`})}),ge&&S&&(0,l.jsx)(t.Button,{variant:`ghost`,size:`icon`,className:`h-5 w-5 opacity-0 group-hover:opacity-100`,onClick:e=>{e.stopPropagation(),ut(r.id)},children:(0,l.jsx)(d.Plus,{className:`h-3 w-3`})})]},r.id))}),m.length>0&&(0,l.jsx)(`div`,{className:`border-b bg-muted/5 flex items-center px-4 text-xs font-semibold text-muted-foreground uppercase`,style:{height:G},children:pt(`milestones`)}),m.map(e=>(0,l.jsxs)(`div`,{className:`border-b flex items-center px-4 text-sm hover:bg-muted/50 cursor-pointer`,style:{height:G},onClick:()=>se?.(e),children:[(0,l.jsx)(`div`,{className:`w-2 h-2 rotate-45 bg-amber-500 mr-2 flex-shrink-0`}),(0,l.jsx)(`span`,{className:`truncate`,children:e.name})]},e.id))]})})]}),ze&&(0,l.jsx)(`div`,{ref:Z,...it,"data-gantt-chart-viewport":!0,className:`flex-1 min-w-0 overflow-auto bg-muted/5 relative`,children:(0,l.jsxs)(`div`,{style:{width:`${De*W}px`,minWidth:`100%`},children:[(0,l.jsx)(`div`,{className:`sticky top-0 z-10 bg-background border-b flex relative`,style:{height:G},children:Te.map(t=>{let n=t.getDate()===1,r=t.getDate()<=7&&t.getDay()===1,i=t.getMonth()===0&&t.getDate()===1,a=t.getDay()===1,o=!1,s=``,c=!1,u=``,d=Y?`border-r`:``;return U===`Day`?(o=n,s=(0,f.format)(t,`yyyy MMMM`,{locale:k}),c=!0,u=(0,f.format)(t,`d`,{locale:k})):U===`Week`?(o=r||n&&t.getDay()===1,s=(0,f.format)(t,`yyyy MMM`,{locale:k}),c=a,u=(0,f.format)(t,`d`,{locale:k}),d=a&&Y?`border-l border-border`:``):U===`Month`&&(o=i,s=(0,f.format)(t,`yyyy`,{locale:k}),c=n,d=n&&Y?`border-l border-border`:``,c&&(u=(0,f.format)(t,`MMM`,{locale:k}))),(0,l.jsxs)(`div`,{className:e.cn(`flex-shrink-0 flex flex-col justify-end pb-1 text-[10px] text-muted-foreground select-none text-center relative`,d,(L.isWorking?!L.isWorking(t):He&&(0,f.isWeekend)(t))&&U===`Day`&&`bg-muted/10`,Ue&&(0,f.isToday)(t)&&`bg-primary/10 font-semibold text-primary`),style:{width:W},children:[o&&(0,l.jsx)(`span`,{className:`absolute top-1 left-1 text-xs font-bold text-foreground pl-1 whitespace-nowrap z-10`,children:s}),c&&(0,l.jsx)(`span`,{className:e.cn(U!==`Day`&&`absolute bottom-1 left-1`,`whitespace-nowrap tracking-tighter`),children:u})]},t.toISOString())})}),(0,l.jsxs)(`div`,{className:`relative`,children:[(0,l.jsxs)(`div`,{className:`absolute inset-0 flex pointer-events-none`,children:[Te.map(t=>{let n=``;return Y&&(U===`Day`?n=`border-r`:(U===`Week`&&t.getDay()===1||U===`Month`&&t.getDate()===1)&&(n=`border-l`)),(0,l.jsx)(`div`,{className:e.cn(`flex-shrink-0 h-full`,n,(L.isWorking?!L.isWorking(t):He&&(0,f.isWeekend)(t))&&U===`Day`?`bg-muted/20`:`bg-transparent`,Ue&&(0,f.isToday)(t)&&`bg-primary/5`),style:{width:W}},`grid-${t.toISOString()}`)}),((0,f.isSameDay)(new Date,Ee)||new Date>Ee)&&U!==`Month`&&(0,l.jsx)(`div`,{className:`absolute top-0 bottom-0 border-l-2 border-red-500/50 z-30 pointer-events-none`,style:{left:V(new Date)+W/2},children:(0,l.jsx)(`div`,{className:`w-2 h-2 bg-red-500 rounded-full -ml-[5px] mt-[-4px]`})}),ie.map(e=>re(e,V))]}),!Se&&_.length>0&&(0,l.jsx)(s.GanttDependencyLayer,{tasks:B,dependencies:_,criticalDependencyIds:b?new Set(L.plan?.criticalPath.dependencyIds):void 0,rowHeight:G,width:De*W,getXPosition:V,getWidth:H,rowWindow:X?{start:Ke,end:qe}:void 0}),(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`div`,{style:{height:B.length*G,position:`relative`},children:at.map(({task:t,index:n})=>{let r=V(t.computedStart),i=H(t.computedStart,t.computedEnd),a,o;return de?.showBaseline&&t.baseline_start&&t.baseline_end&&(a=V(new Date(t.baseline_start)),o=H(new Date(t.baseline_start),new Date(t.baseline_end))),(0,l.jsx)(`div`,{"data-gantt-row-id":t.id,className:e.cn(`relative`,Ve&&`border-b`),style:{height:G,position:`absolute`,top:n*G,left:0,right:0},children:(0,l.jsx)(te,{task:t,critical:Ce.get(t.id)?.critical,totalFloatDays:Ce.get(t.id)?.totalFloatDays,left:r,width:i,rowHeight:G,taskBarDisplay:ue,progressConfig:fe,baselineConfig:de,baselineLeft:a,baselineWidth:o,onClick:Q,dateEditing:oe,cellWidth:W,editingDisabled:ye,onDateChange:D!==`none`&&(g||h)&&!t.hasChildren&&!(v&&R)?st:void 0,onProgressChange:D!==`none`&&(g||h)&&!(t.hasChildren&&E?.autoRollupProgress)?ct:void 0})},t.id)})}),m.length>0&&(0,l.jsx)(`div`,{"aria-hidden":!0,style:{height:G}}),m.map(t=>{let n=t.due_date?new Date(t.due_date):new Date,r=V(n);return(0,l.jsxs)(`div`,{className:e.cn(`relative`,Ve&&`border-b`),style:{height:G},children:[(0,l.jsx)(`div`,{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`,style:{left:r-10},title:`${t.name} - ${(0,f.format)(n,`MMM d`)}`}),(0,l.jsx)(`span`,{className:`absolute top-3 text-xs text-muted-foreground whitespace-nowrap ml-2 pointer-events-none font-medium`,style:{left:r+14},children:t.name})]},t.id)})]})]})]})})]}),D===`dialog`&&(0,l.jsx)(o.TaskEditDialog,{task:q,open:Le,onOpenChange:K,onSave:ot,error:N,onDelete:x?lt:void 0,editableFields:me})]})}function re(e,t){let n=t(new Date(e.date)),r=e.color||`var(--primary)`;if(e.type===`range`&&e.endDate){let i=t(new Date(e.endDate))-n;return(0,l.jsx)(`div`,{className:`absolute top-0 bottom-0 opacity-20 pointer-events-none z-5`,style:{left:n,width:i,backgroundColor:r},title:e.label},e.id)}return(0,l.jsx)(`div`,{className:`absolute top-0 bottom-0 border-l-2 border-dashed z-20 pointer-events-none`,style:{left:n,borderColor:r},title:e.label,children:e.label&&(0,l.jsx)(`span`,{className:`absolute top-0 left-1 text-[10px] font-semibold whitespace-nowrap px-1 rounded`,style:{color:r,backgroundColor:`color-mix(in srgb, ${r} 20%, transparent)`},children:e.label})},e.id)}exports.GanttChart=m;
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../ui/lib/utils.cjs"),t=require("../../../ui/components/ui/button-components.cjs"),n=require("../../../ui/components/ui/avatar.cjs"),r=require("./hooks/useGanttState.cjs"),i=require("./components/GanttToolbar.cjs"),a=require("./components/GanttTaskBar.cjs"),o=require("./dialogs/TaskEditDialog.cjs"),s=require("./components/GanttDependencyLayer.cjs"),c=require("./hooks/use-gantt-row-window.cjs");let l=require("react/jsx-runtime"),u=require("react"),d=require("lucide-react"),ee=require("date-fns/locale"),f=require("date-fns"),p=require("@alneas/appkit-core/graph/planning");var te=(0,u.memo)(a.GanttTaskBar),ne=[];function m({tasks:a,milestones:m=[],markers:ie=[],onTaskClick:ae,onTaskUpdate:h,onTasksChange:g,dependencies:_=ne,autoSchedule:v=!1,schedulingOptions:y,showCriticalPath:b=!1,dateEditing:oe,onTaskDelete:x,onAddTask:S,onMilestoneClick:se,className:ce,initialViewMode:le=`Week`,taskBarDisplay:ue=`none`,displayConfig:C,scaleConfig:w,gridConfig:T,baselineConfig:de,progressConfig:fe,hierarchyConfig:E,filterConfig:pe,editMode:D=`dialog`,editableFields:me,showAddButton:he,showRowAddButton:ge,disableOptimisticUpdates:O=!1}){let k=ee.enUS,[A,j]=(0,u.useState)(null),[_e,ve]=(0,u.useState)(a);a!==_e&&(ve(a),j(null));let M=O||!A?a:A,[ye,be]=(0,u.useState)(!1),[N,P]=(0,u.useState)(null),F=(0,u.useRef)(!1),xe=(0,u.useRef)(a),I=(0,u.useRef)(0);(0,u.useEffect)(()=>{xe.current=a},[a]),(0,u.useEffect)(()=>()=>{I.current++},[]);let Se=(0,u.useMemo)(()=>_.length?(0,p.dependencyError)(M,_):null,[M,_]),L=(0,u.useMemo)(()=>{try{return{isWorking:y?.calendar?(0,p.workingDayPredicate)(y.calendar):void 0,plan:b||v&&y?(0,p.planGanttTasks)(M,_,{...y,resourceLeveling:v?y?.resourceLeveling:void 0}):void 0,error:null}}catch(e){return{error:e instanceof Error?e.message:`Invalid schedule.`}}},[M,_,y,b,v]),Ce=(0,u.useMemo)(()=>new Map(b?L.plan?.criticalPath.tasks.map(e=>[e.taskId,e]):[]),[b,L.plan]),R=v&&!g?`Automatic scheduling requires onTasksChange for atomic updates.`:Se??L.error,we=(0,u.useMemo)(()=>{if(!y&&!b)return M;let e=e=>typeof e==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(e)?(0,f.parseISO)(e):e;return M.map(t=>({...t,start_date:e(t.start_date),due_date:e(t.due_date),created_at:e(t.created_at)}))},[M,y,b]),{state:z,visibleTasks:B,allDays:Te,startDate:Ee,totalDays:De,setViewMode:Oe,selectTask:ke,toggleTaskExpand:Ae,setCellWidth:je,goToToday:Me,goToPrevious:Ne,goToNext:Pe,getXPosition:V,getWidth:H}=r.useGanttState({tasks:we,initialViewMode:le,hierarchyConfig:E,scaleConfig:w}),{viewMode:U,currentDate:Fe,cellWidth:W,rowHeight:G,selectedTaskId:Ie}=z,[Le,K]=(0,u.useState)(!1),[q,J]=(0,u.useState)(null),Re=C?.showTaskList??!0,ze=C?.showChart??!0,Be=C?.taskListWidth??256,Ve=T?.showHorizontalBorders??!0,Y=T?.showVerticalBorders??!0,He=T?.showWeekendHighlight??!0,Ue=T?.showTodayHighlight??!0,We=(0,u.useMemo)(()=>B.map(e=>e.id),[B]),X=C?.virtualizeRows!==!1&&B.length>100,{chartRef:Z,listRef:Ge,start:Ke,end:qe,indices:Je,bottomInset:Ye,onScroll:Xe,onFocusCapture:Ze,onBlurCapture:Qe,onKeyDownCapture:$e,onPointerDownCapture:et,onPointerUpCapture:tt,onPointerCancelCapture:nt,onLostPointerCapture:rt}=c.useGanttRowWindow(We,G,X,Le?q?.id:void 0,`${Re}:${ze}`),it={onScroll:Xe,onFocusCapture:Ze,onBlurCapture:Qe,onKeyDownCapture:$e,onPointerDownCapture:et,onPointerUpCapture:tt,onPointerCancelCapture:nt,onLostPointerCapture:rt},at=Je.map(e=>({task:B[e],index:e}));(0,u.useEffect)(()=>{if(Z.current){let e=V(new Date),t=Z.current.clientWidth;Z.current.scrollLeft=e-t/2}},[U,V,Z]);let Q=(0,u.useCallback)(e=>{F.current||(ke(e.id),ae?.(e),D===`dialog`&&(J(M.find(t=>t.id===e.id)??e),K(!0)))},[ke,ae,D,M]),$=(0,u.useCallback)(async(e,t)=>{if(F.current)return!1;let n=++I.current,r=a,i=A;F.current=!0,be(!0),P(null);try{if(t&&v&&!g)throw Error(`Automatic scheduling requires onTasksChange for atomic updates.`);let r=M.map(t=>t.id===e.id?e:t);return t&&v&&(r=(0,p.scheduleGanttTasks)(r,_,y)),O||j(r),g?await g(r):await h?.(e),n===I.current}catch(e){return n===I.current&&(xe.current===r&&j(i),P(e instanceof Error?e.message:`Unable to save task changes.`)),!1}finally{n===I.current&&(F.current=!1,be(!1))}},[a,A,v,g,M,_,y,O,h]),ot=async e=>{let t=q&&(String(e.start_date)!==String(q.start_date)||String(e.due_date)!==String(q.due_date)),n=await $(v&&y&&t?{...e,durationDays:void 0}:e,!0);return n&&(K(!1),J(null)),n},st=(0,u.useCallback)((e,t,n)=>{let r=M.find(t=>t.id===e);if(!r)return;let i={...r,start_date:t,due_date:n};if(v&&y)try{let e=(0,p.planningDate)(r.start_date??r.created_at),a=r.due_date==null?(0,f.addDays)(e,1):(0,p.planningDate)(r.due_date),o=(0,f.differenceInCalendarDays)(t,e)===(0,f.differenceInCalendarDays)(n,a);i={...i,durationDays:(0,p.getGanttWorkingDuration)(o?r:{...i,durationDays:void 0},y.calendar)}}catch(e){P(e instanceof Error?e.message:`Invalid task dates.`);return}$(i,!0)},[M,v,y,$]),ct=(0,u.useCallback)((e,t)=>{let n=M.find(t=>t.id===e);n&&$({...n,progress:t},!1)},[M,$]),lt=e=>{if(!F.current){if(!O){let t=M.filter(t=>t.id!==e);j(t)}x?.(e),K(!1),J(null)}},ut=e=>{S?.(e)},dt=()=>{let e=w?.maxCellWidth??100;je(Math.min(W*1.5,e))},ft=()=>{let e=w?.minCellWidth??5;je(Math.max(W/1.5,e))},pt=e=>({today:`Today`,day:`Day`,week:`Week`,month:`Month`,tasks:`Tasks`,milestones:`Milestones`})[e.toLowerCase()]||e;return(0,l.jsxs)(`div`,{"aria-busy":ye,"data-task-count":B.length,"data-virtualized":X||void 0,className:e.cn(`flex flex-col h-full bg-background border overflow-hidden [border-radius:var(--radius-lg)] [box-shadow:var(--shadow-sm)]`,ce),children:[b&&L.plan&&(0,l.jsxs)(`div`,{className:`px-2 py-1 text-xs text-muted-foreground`,role:`status`,children:[`Critical path (dependencies only): `,L.plan.criticalPath.taskIds.length,` tasks; resource contention is excluded from float.`]}),v&&y?.resourceLeveling?.enabled&&L.plan&&(0,l.jsxs)(`details`,{className:`px-2 py-1 text-xs text-muted-foreground`,"data-resource-leveling":!0,children:[(0,l.jsxs)(`summary`,{children:[`Resource leveling preview: `,L.plan.resourceDelays.length,` delayed tasks (not applied until save)`]}),(0,l.jsx)(`ul`,{children:L.plan.resourceDelays.map(e=>(0,l.jsxs)(`li`,{children:[M.find(t=>t.id===e.taskId)?.title??e.taskId,`: capacity +`,e.directDays,`d, predecessors +`,e.propagatedDays,`d`]},e.taskId))})]}),(N||R)&&(0,l.jsx)(`div`,{role:`alert`,className:`p-2 text-sm text-destructive`,children:N||R}),(0,l.jsx)(i.GanttToolbar,{currentDate:Fe,viewMode:U,scaleConfig:w,filterConfig:pe,onViewModeChange:Oe,onPrevious:Ne,onNext:Pe,onToday:Me,onZoomIn:w?.zoomControls?dt:void 0,onZoomOut:w?.zoomControls?ft:void 0}),(0,l.jsxs)(`div`,{className:`flex flex-1 min-h-0 overflow-hidden`,children:[Re&&(0,l.jsxs)(`div`,{className:`flex-shrink-0 border-r bg-background flex flex-col z-20 [box-shadow:var(--shadow-sm)]`,style:{width:Be},children:[(0,l.jsxs)(`div`,{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)]`,style:{height:G,flexShrink:0},children:[(0,l.jsx)(`span`,{children:pt(`tasks`)}),he&&S&&(0,l.jsx)(t.Button,{variant:`ghost`,size:`icon`,className:`h-6 w-6`,onClick:()=>ut(),children:(0,l.jsx)(d.Plus,{className:`h-4 w-4`})})]}),(0,l.jsx)(`div`,{ref:Ge,...it,"data-gantt-list-viewport":!0,className:`flex-1 min-h-0 overflow-auto`,children:(0,l.jsxs)(`div`,{style:{paddingBottom:Ye},children:[(0,l.jsx)(`div`,{style:{height:B.length*G,position:`relative`},children:at.map(({task:r,index:i})=>(0,l.jsxs)(`div`,{"data-gantt-row-id":r.id,className:e.cn(`border-b flex items-center px-2 text-sm font-medium hover:bg-muted/50 cursor-pointer transition-colors group`,Ie===r.id&&`bg-muted`),style:{height:G,position:`absolute`,top:i*G,left:0,right:0,paddingLeft:r.computedLevel*(E?.indentWidth??16)+8},onClick:()=>Q(r),children:[r.hasChildren?(0,l.jsx)(t.Button,{"aria-label":`${r.title}: expand/collapse`,"aria-expanded":z.expandedTaskIds.has(r.id),variant:`ghost`,size:`icon`,className:`h-4 w-4 p-0 mr-1 hover:bg-muted rounded-sm`,onClick:e=>{e.stopPropagation(),Ae(r.id)},children:z.expandedTaskIds.has(r.id)?(0,l.jsx)(d.ChevronDown,{className:`h-3 w-3`}):(0,l.jsx)(d.ChevronRight,{className:`h-3 w-3`})}):(0,l.jsx)(`div`,{className:`w-4`}),(0,l.jsx)(`div`,{className:e.cn(`w-2 h-2 rounded-full mr-2 flex-shrink-0`,r.status===`done`?`bg-green-500`:r.status===`review`?`bg-primary`:r.status===`doing`?`bg-blue-500`:r.status===`blocked`?`bg-red-500`:`bg-muted`)}),(0,l.jsx)(`button`,{type:`button`,className:`truncate flex-1 text-left`,onClick:e=>{e.stopPropagation(),Q(r)},children:r.title}),fe?.showProgress&&r.computedProgress>0&&(0,l.jsxs)(`span`,{className:`text-xs text-muted-foreground mr-2`,children:[Math.round(r.computedProgress),`%`]}),r.assignee_id&&(0,l.jsx)(n.Avatar,{className:`h-5 w-5 ml-1 border opacity-70 group-hover:opacity-100`,children:(0,l.jsx)(n.AvatarFallback,{className:`text-[9px]`,children:r.assignee_name?.[0]?.toUpperCase()??r.priority?.[0]?.toUpperCase()??`?`})}),ge&&S&&(0,l.jsx)(t.Button,{variant:`ghost`,size:`icon`,className:`h-5 w-5 opacity-0 group-hover:opacity-100`,onClick:e=>{e.stopPropagation(),ut(r.id)},children:(0,l.jsx)(d.Plus,{className:`h-3 w-3`})})]},r.id))}),m.length>0&&(0,l.jsx)(`div`,{className:`border-b bg-muted/5 flex items-center px-4 text-xs font-semibold text-muted-foreground uppercase`,style:{height:G},children:pt(`milestones`)}),m.map(e=>(0,l.jsxs)(`div`,{className:`border-b flex items-center px-4 text-sm hover:bg-muted/50 cursor-pointer`,style:{height:G},onClick:()=>se?.(e),children:[(0,l.jsx)(`div`,{className:`w-2 h-2 rotate-45 bg-amber-500 mr-2 flex-shrink-0`}),(0,l.jsx)(`span`,{className:`truncate`,children:e.name})]},e.id))]})})]}),ze&&(0,l.jsx)(`div`,{ref:Z,...it,"data-gantt-chart-viewport":!0,role:`region`,"aria-label":`Gantt timeline`,tabIndex:0,className:`flex-1 min-w-0 overflow-auto bg-muted/5 relative`,children:(0,l.jsxs)(`div`,{style:{width:`${De*W}px`,minWidth:`100%`},children:[(0,l.jsx)(`div`,{className:`sticky top-0 z-10 bg-background border-b flex relative`,style:{height:G},children:Te.map(t=>{let n=t.getDate()===1,r=t.getDate()<=7&&t.getDay()===1,i=t.getMonth()===0&&t.getDate()===1,a=t.getDay()===1,o=!1,s=``,c=!1,u=``,d=Y?`border-r`:``;return U===`Day`?(o=n,s=(0,f.format)(t,`yyyy MMMM`,{locale:k}),c=!0,u=(0,f.format)(t,`d`,{locale:k})):U===`Week`?(o=r||n&&t.getDay()===1,s=(0,f.format)(t,`yyyy MMM`,{locale:k}),c=a,u=(0,f.format)(t,`d`,{locale:k}),d=a&&Y?`border-l border-border`:``):U===`Month`&&(o=i,s=(0,f.format)(t,`yyyy`,{locale:k}),c=n,d=n&&Y?`border-l border-border`:``,c&&(u=(0,f.format)(t,`MMM`,{locale:k}))),(0,l.jsxs)(`div`,{className:e.cn(`flex-shrink-0 flex flex-col justify-end pb-1 text-[10px] text-muted-foreground select-none text-center relative`,d,(L.isWorking?!L.isWorking(t):He&&(0,f.isWeekend)(t))&&U===`Day`&&`bg-muted/10`,Ue&&(0,f.isToday)(t)&&`bg-primary/10 font-semibold text-primary`),style:{width:W},children:[o&&(0,l.jsx)(`span`,{className:`absolute top-1 left-1 text-xs font-bold text-foreground pl-1 whitespace-nowrap z-10`,children:s}),c&&(0,l.jsx)(`span`,{className:e.cn(U!==`Day`&&`absolute bottom-1 left-1`,`whitespace-nowrap tracking-tighter`),children:u})]},t.toISOString())})}),(0,l.jsxs)(`div`,{className:`relative`,children:[(0,l.jsxs)(`div`,{className:`absolute inset-0 flex pointer-events-none`,children:[Te.map(t=>{let n=``;return Y&&(U===`Day`?n=`border-r`:(U===`Week`&&t.getDay()===1||U===`Month`&&t.getDate()===1)&&(n=`border-l`)),(0,l.jsx)(`div`,{className:e.cn(`flex-shrink-0 h-full`,n,(L.isWorking?!L.isWorking(t):He&&(0,f.isWeekend)(t))&&U===`Day`?`bg-muted/20`:`bg-transparent`,Ue&&(0,f.isToday)(t)&&`bg-primary/5`),style:{width:W}},`grid-${t.toISOString()}`)}),((0,f.isSameDay)(new Date,Ee)||new Date>Ee)&&U!==`Month`&&(0,l.jsx)(`div`,{className:`absolute top-0 bottom-0 border-l-2 border-red-500/50 z-30 pointer-events-none`,style:{left:V(new Date)+W/2},children:(0,l.jsx)(`div`,{className:`w-2 h-2 bg-red-500 rounded-full -ml-[5px] mt-[-4px]`})}),ie.map(e=>re(e,V))]}),!Se&&_.length>0&&(0,l.jsx)(s.GanttDependencyLayer,{tasks:B,dependencies:_,criticalDependencyIds:b?new Set(L.plan?.criticalPath.dependencyIds):void 0,rowHeight:G,width:De*W,getXPosition:V,getWidth:H,rowWindow:X?{start:Ke,end:qe}:void 0}),(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`div`,{style:{height:B.length*G,position:`relative`},children:at.map(({task:t,index:n})=>{let r=V(t.computedStart),i=H(t.computedStart,t.computedEnd),a,o;return de?.showBaseline&&t.baseline_start&&t.baseline_end&&(a=V(new Date(t.baseline_start)),o=H(new Date(t.baseline_start),new Date(t.baseline_end))),(0,l.jsx)(`div`,{"data-gantt-row-id":t.id,className:e.cn(`relative`,Ve&&`border-b`),style:{height:G,position:`absolute`,top:n*G,left:0,right:0},children:(0,l.jsx)(te,{task:t,critical:Ce.get(t.id)?.critical,totalFloatDays:Ce.get(t.id)?.totalFloatDays,left:r,width:i,rowHeight:G,taskBarDisplay:ue,progressConfig:fe,baselineConfig:de,baselineLeft:a,baselineWidth:o,onClick:Q,dateEditing:oe,cellWidth:W,editingDisabled:ye,onDateChange:D!==`none`&&(g||h)&&!t.hasChildren&&!(v&&R)?st:void 0,onProgressChange:D!==`none`&&(g||h)&&!(t.hasChildren&&E?.autoRollupProgress)?ct:void 0})},t.id)})}),m.length>0&&(0,l.jsx)(`div`,{"aria-hidden":!0,style:{height:G}}),m.map(t=>{let n=t.due_date?new Date(t.due_date):new Date,r=V(n);return(0,l.jsxs)(`div`,{className:e.cn(`relative`,Ve&&`border-b`),style:{height:G},children:[(0,l.jsx)(`div`,{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`,style:{left:r-10},title:`${t.name} - ${(0,f.format)(n,`MMM d`)}`}),(0,l.jsx)(`span`,{className:`absolute top-3 text-xs text-muted-foreground whitespace-nowrap ml-2 pointer-events-none font-medium`,style:{left:r+14},children:t.name})]},t.id)})]})]})]})})]}),D===`dialog`&&(0,l.jsx)(o.TaskEditDialog,{task:q,open:Le,onOpenChange:K,onSave:ot,error:N,onDelete:x?lt:void 0,editableFields:me})]})}function re(e,t){let n=t(new Date(e.date)),r=e.color||`var(--primary)`;if(e.type===`range`&&e.endDate){let i=t(new Date(e.endDate))-n;return(0,l.jsx)(`div`,{className:`absolute top-0 bottom-0 opacity-20 pointer-events-none z-5`,style:{left:n,width:i,backgroundColor:r},title:e.label},e.id)}return(0,l.jsx)(`div`,{className:`absolute top-0 bottom-0 border-l-2 border-dashed z-20 pointer-events-none`,style:{left:n,borderColor:r},title:e.label,children:e.label&&(0,l.jsx)(`span`,{className:`absolute top-0 left-1 text-[10px] font-semibold whitespace-nowrap px-1 rounded`,style:{color:r,backgroundColor:`color-mix(in srgb, ${r} 20%, transparent)`},children:e.label})},e.id)}exports.GanttChart=m;
|
|
2
2
|
//# sourceMappingURL=GanttChart.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GanttChart.cjs","names":["memo","GanttTaskBar","enUS","useState","useRef","useMemo","dependencyError","workingDayPredicate","planGanttTasks","parseISO","useGanttState","useGanttRowWindow","useCallback","scheduleGanttTasks","planningDate","addDays","differenceInCalendarDays","getGanttWorkingDuration","cn","GanttToolbar","Button","Plus","ChevronDown","ChevronRight","Avatar","AvatarFallback","format","isWeekend","isToday","isSameDay","GanttDependencyLayer","TaskEditDialog","require_ui_lib_utils","require_ui_components_ui_button_components","require_ui_components_ui_avatar","require_tools_components_gantt_hooks_useGanttState","require_tools_components_gantt_components_GanttToolbar","require_tools_components_gantt_components_GanttTaskBar","require_tools_components_gantt_dialogs_TaskEditDialog","require_tools_components_gantt_components_GanttDependencyLayer","require_tools_components_gantt_hooks_use_gantt_row_window","react_jsx_runtime","react","lucide_react","date_fns_locale","date_fns","_alneas_appkit_core_graph_planning","MemoTaskBar","EMPTY_DEPENDENCIES","GanttChart","locale","optimisticTasks","setOptimisticTasks","prevTasks","setPrevTasks","tasks","currentTasks","disableOptimisticUpdates","saving","setSaving","saveError","setSaveError","saveLock","sourceTasks","requestId","graphError","dependencies","planningView","schedulingOptions","showCriticalPath","autoSchedule","error","criticalTasks","task","schedulingError","onTasksChange","displayTasks","localDate","value","state","editDialogOpen","setEditDialogOpen","editingTask","setEditingTask","showTaskList","displayConfig","showChart","taskListWidth","showHorizontalBorders","gridConfig","showVerticalBorders","showWeekendHighlight","showTodayHighlight","rowIds","visibleTasks","virtualized","scrollContainerRef","windowStart","windowEnd","rowIndices","rowHeight","rowEvents","mountedTasks","index","todayX","getXPosition","containerWidth","viewMode","handleTaskClick","selectTask","onTaskClick","editMode","item","publishTask","token","source","previousOptimistic","schedule","next","updatedTask","onTaskUpdate","handleTaskSave","datesChanged","saved","handleDateChange","original","taskId","updated","start","end","oldStart","oldEnd","moving","handleProgressChange","handleTaskDelete","nextOptimistic","onTaskDelete","handleAddTask","onAddTask","parentId","handleZoomIn","maxWidth","scaleConfig","setCellWidth","cellWidth","handleZoomOut","minWidth","t","key","className","delay","setViewMode","goToPrevious","goToNext","goToToday","showAddButton","listRef","bottomInset","selectedTaskId","hierarchyConfig","toggleTaskExpand","event","progressConfig","showRowAddButton","milestones","onMilestoneClick","ms","totalDays","allDays","isMonthStart","day","isFirstMonday","isYearStart","isMonday","showUpperLabel","upperLabelText","showLowerLabel","lowerLabelText","borderClass","startDate","markers","renderMarker","marker","left","width","getWidth","baselineLeft","baselineWidth","baselineConfig","date","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.cjs","names":["memo","GanttTaskBar","enUS","useState","useRef","useMemo","dependencyError","workingDayPredicate","planGanttTasks","parseISO","useGanttState","useGanttRowWindow","useCallback","scheduleGanttTasks","planningDate","addDays","differenceInCalendarDays","getGanttWorkingDuration","cn","GanttToolbar","Button","Plus","ChevronDown","ChevronRight","Avatar","AvatarFallback","format","isWeekend","isToday","isSameDay","GanttDependencyLayer","TaskEditDialog","require_ui_lib_utils","require_ui_components_ui_button_components","require_ui_components_ui_avatar","require_tools_components_gantt_hooks_useGanttState","require_tools_components_gantt_components_GanttToolbar","require_tools_components_gantt_components_GanttTaskBar","require_tools_components_gantt_dialogs_TaskEditDialog","require_tools_components_gantt_components_GanttDependencyLayer","require_tools_components_gantt_hooks_use_gantt_row_window","react_jsx_runtime","react","lucide_react","date_fns_locale","date_fns","_alneas_appkit_core_graph_planning","MemoTaskBar","EMPTY_DEPENDENCIES","GanttChart","locale","optimisticTasks","setOptimisticTasks","prevTasks","setPrevTasks","tasks","currentTasks","disableOptimisticUpdates","saving","setSaving","saveError","setSaveError","saveLock","sourceTasks","requestId","graphError","dependencies","planningView","schedulingOptions","showCriticalPath","autoSchedule","error","criticalTasks","task","schedulingError","onTasksChange","displayTasks","localDate","value","state","editDialogOpen","setEditDialogOpen","editingTask","setEditingTask","showTaskList","displayConfig","showChart","taskListWidth","showHorizontalBorders","gridConfig","showVerticalBorders","showWeekendHighlight","showTodayHighlight","rowIds","visibleTasks","virtualized","scrollContainerRef","windowStart","windowEnd","rowIndices","rowHeight","rowEvents","mountedTasks","index","todayX","getXPosition","containerWidth","viewMode","handleTaskClick","selectTask","onTaskClick","editMode","item","publishTask","token","source","previousOptimistic","schedule","next","updatedTask","onTaskUpdate","handleTaskSave","datesChanged","saved","handleDateChange","original","taskId","updated","start","end","oldStart","oldEnd","moving","handleProgressChange","handleTaskDelete","nextOptimistic","onTaskDelete","handleAddTask","onAddTask","parentId","handleZoomIn","maxWidth","scaleConfig","setCellWidth","cellWidth","handleZoomOut","minWidth","t","key","className","delay","setViewMode","goToPrevious","goToNext","goToToday","showAddButton","listRef","bottomInset","selectedTaskId","hierarchyConfig","toggleTaskExpand","event","progressConfig","showRowAddButton","milestones","onMilestoneClick","ms","totalDays","allDays","isMonthStart","day","isFirstMonday","isYearStart","isMonday","showUpperLabel","upperLabelText","showLowerLabel","lowerLabelText","borderClass","startDate","markers","renderMarker","marker","left","width","getWidth","baselineLeft","baselineWidth","baselineConfig","date","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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"}
|