@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,35 +1,39 @@
|
|
|
1
1
|
import { Locale } from '../../paraglide/runtime.cjs';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Host inputs and presentation settings for LanguageSwitcher.
|
|
4
|
+
* @see LanguageSwitcher
|
|
4
5
|
*/
|
|
5
6
|
export interface LanguageSwitcherProps {
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Called with en when the current locale is ja, otherwise ja. When supplied, suppresses the built-in global setLocale call; the host must update controlled state.
|
|
9
|
+
* @param lang - Host callback input described above.
|
|
10
|
+
* @returns No value; complete the host callback action.
|
|
10
11
|
*/
|
|
11
12
|
onLanguageChange?: (lang: Locale) => void;
|
|
12
13
|
/**
|
|
13
|
-
* Current
|
|
14
|
-
* Defaults to global paraglide state if not provided.
|
|
14
|
+
* Current locale; omitted reads getLocale from the configured Paraglide runtime.
|
|
15
15
|
*/
|
|
16
16
|
currentLanguage?: Locale;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Additional classes on the language toggle button.
|
|
19
19
|
*/
|
|
20
20
|
className?: string;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* SSR also reads currentLanguage or the host runtime. Hosts must isolate request
|
|
28
|
-
* locale state and initialize the same locale before hydration.
|
|
23
|
+
* Displays the current locale and toggles Japanese to English or any other locale to Japanese.
|
|
24
|
+
* @param props - Optional controlled locale, change callback and button classes; see LanguageSwitcherProps.
|
|
25
|
+
* @returns The rendered LanguageSwitcher composition.
|
|
26
|
+
* @remarks Import @alneas/appkit-react/styles in the rendering host. Import Appkit CSS. currentLanguage overrides getLocale; onLanguageChange suppresses the built-in setLocale call, so the host must update controlled locale state. Without the callback the Paraglide runtime performs its configured locale update/navigation. Locale state during SSR is host-owned and must be isolated per request and initialized consistently before hydration. The label displays Japanese/Chinese/English, but the toggle does not cycle through Chinese.
|
|
29
27
|
* @example
|
|
30
28
|
* ```tsx
|
|
29
|
+
* import { useState } from 'react';
|
|
31
30
|
* import { LanguageSwitcher } from '@alneas/appkit-react/tools/i18n';
|
|
32
|
-
*
|
|
31
|
+
* import '@alneas/appkit-react/styles';
|
|
32
|
+
*
|
|
33
|
+
* export function Example() {
|
|
34
|
+
* const [locale, setLocale] = useState<"en" | "ja" | "zh">("en");
|
|
35
|
+
* return (<LanguageSwitcher currentLanguage={locale} onLanguageChange={setLocale} />);
|
|
36
|
+
* }
|
|
33
37
|
* ```
|
|
34
38
|
*/
|
|
35
39
|
export declare function LanguageSwitcher({ onLanguageChange, currentLanguage, className, }: LanguageSwitcherProps): import('react').JSX.Element;
|
|
@@ -1,35 +1,39 @@
|
|
|
1
1
|
import { Locale } from '../../paraglide/runtime.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Host inputs and presentation settings for LanguageSwitcher.
|
|
4
|
+
* @see LanguageSwitcher
|
|
4
5
|
*/
|
|
5
6
|
export interface LanguageSwitcherProps {
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Called with en when the current locale is ja, otherwise ja. When supplied, suppresses the built-in global setLocale call; the host must update controlled state.
|
|
9
|
+
* @param lang - Host callback input described above.
|
|
10
|
+
* @returns No value; complete the host callback action.
|
|
10
11
|
*/
|
|
11
12
|
onLanguageChange?: (lang: Locale) => void;
|
|
12
13
|
/**
|
|
13
|
-
* Current
|
|
14
|
-
* Defaults to global paraglide state if not provided.
|
|
14
|
+
* Current locale; omitted reads getLocale from the configured Paraglide runtime.
|
|
15
15
|
*/
|
|
16
16
|
currentLanguage?: Locale;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Additional classes on the language toggle button.
|
|
19
19
|
*/
|
|
20
20
|
className?: string;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* SSR also reads currentLanguage or the host runtime. Hosts must isolate request
|
|
28
|
-
* locale state and initialize the same locale before hydration.
|
|
23
|
+
* Displays the current locale and toggles Japanese to English or any other locale to Japanese.
|
|
24
|
+
* @param props - Optional controlled locale, change callback and button classes; see LanguageSwitcherProps.
|
|
25
|
+
* @returns The rendered LanguageSwitcher composition.
|
|
26
|
+
* @remarks Import @alneas/appkit-react/styles in the rendering host. Import Appkit CSS. currentLanguage overrides getLocale; onLanguageChange suppresses the built-in setLocale call, so the host must update controlled locale state. Without the callback the Paraglide runtime performs its configured locale update/navigation. Locale state during SSR is host-owned and must be isolated per request and initialized consistently before hydration. The label displays Japanese/Chinese/English, but the toggle does not cycle through Chinese.
|
|
29
27
|
* @example
|
|
30
28
|
* ```tsx
|
|
29
|
+
* import { useState } from 'react';
|
|
31
30
|
* import { LanguageSwitcher } from '@alneas/appkit-react/tools/i18n';
|
|
32
|
-
*
|
|
31
|
+
* import '@alneas/appkit-react/styles';
|
|
32
|
+
*
|
|
33
|
+
* export function Example() {
|
|
34
|
+
* const [locale, setLocale] = useState<"en" | "ja" | "zh">("en");
|
|
35
|
+
* return (<LanguageSwitcher currentLanguage={locale} onLanguageChange={setLocale} />);
|
|
36
|
+
* }
|
|
33
37
|
* ```
|
|
34
38
|
*/
|
|
35
39
|
export declare function LanguageSwitcher({ onLanguageChange, currentLanguage, className, }: LanguageSwitcherProps): import('react').JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LanguageSwitcher.js","names":["LanguageSwitcher","activeLang","currentLanguage","getLocale","displayLang","Button","newLang","onLanguageChange","setLocale","Globe"],"sources":["../../../../src/tools/components/i18n/LanguageSwitcher.tsx"],"sourcesContent":["import { Button } from '../ui/button';\nimport { Globe } from 'lucide-react';\nimport { getLocale, setLocale, Locale } from '../../paraglide/runtime.js';\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"LanguageSwitcher.js","names":["LanguageSwitcher","activeLang","currentLanguage","getLocale","displayLang","Button","newLang","onLanguageChange","setLocale","Globe"],"sources":["../../../../src/tools/components/i18n/LanguageSwitcher.tsx"],"sourcesContent":["import { Button } from '../ui/button';\nimport { Globe } from 'lucide-react';\nimport { getLocale, setLocale, Locale } from '../../paraglide/runtime.js';\n\n/**\n * Host inputs and presentation settings for LanguageSwitcher.\n * @see LanguageSwitcher\n */\nexport interface LanguageSwitcherProps {\n /**\n * Called with en when the current locale is ja, otherwise ja. When supplied, suppresses the built-in global setLocale call; the host must update controlled state.\n * @param lang - Host callback input described above.\n * @returns No value; complete the host callback action.\n */\n onLanguageChange?: (lang: Locale) => void;\n\n /**\n * Current locale; omitted reads getLocale from the configured Paraglide runtime.\n */\n currentLanguage?: Locale;\n\n /**\n * Additional classes on the language toggle button.\n */\n className?: string;\n}\n\n/**\n * Displays the current locale and toggles Japanese to English or any other locale to Japanese.\n * @param props - Optional controlled locale, change callback and button classes; see LanguageSwitcherProps.\n * @returns The rendered LanguageSwitcher composition.\n * @remarks Import @alneas/appkit-react/styles in the rendering host. Import Appkit CSS. currentLanguage overrides getLocale; onLanguageChange suppresses the built-in setLocale call, so the host must update controlled locale state. Without the callback the Paraglide runtime performs its configured locale update/navigation. Locale state during SSR is host-owned and must be isolated per request and initialized consistently before hydration. The label displays Japanese/Chinese/English, but the toggle does not cycle through Chinese.\n * @example\n * ```tsx\n * import { useState } from 'react';\n * import { LanguageSwitcher } from '@alneas/appkit-react/tools/i18n';\n * import '@alneas/appkit-react/styles';\n *\n * export function Example() {\n * const [locale, setLocale] = useState<\"en\" | \"ja\" | \"zh\">(\"en\");\n * return (<LanguageSwitcher currentLanguage={locale} onLanguageChange={setLocale} />);\n * }\n * ```\n */\nexport function LanguageSwitcher({\n onLanguageChange,\n currentLanguage,\n className,\n}: LanguageSwitcherProps) {\n const activeLang = currentLanguage ?? getLocale();\n const displayLang = activeLang;\n\n const toggleLanguage = () => {\n const newLang: Locale = activeLang === 'ja' ? 'en' : 'ja';\n\n if (onLanguageChange) {\n onLanguageChange(newLang);\n } else {\n setLocale(newLang);\n }\n };\n\n return (\n <Button\n variant='ghost'\n size='sm'\n className={className}\n onClick={toggleLanguage}\n title={displayLang === 'ja' ? 'Switch to English' : '日本語に切り替え'}\n >\n <Globe className='w-4 h-4 mr-2' />\n {displayLang === 'ja' ? '日本語' : displayLang === 'zh' ? '中文' : 'English'}\n </Button>\n );\n}\n"],"mappings":";;;;;;AA4CA,SAAgBA,EAAiB,EAC/B,qBACA,oBACA,gBACwB;CACxB,IAAMC,IAAaC,KAAmBC,EAAU,GAC1CC,IAAcH;CAYpB,OACE,kBAACI,GAAD;EACE,SAAQ;EACR,MAAK;EACM;EACX,eAfyB;GAC3B,IAAMC,IAAkBL,MAAe,OAAO,OAAO;GAErD,AAAIM,IACFA,EAAiBD,CAAO,IAExBE,EAAUF,CAAO;EAErB;EAQI,OAAOF,MAAgB,OAAO,sBAAsB;EALtD,UAAA,CAOE,kBAACK,GAAD,EAAO,WAAU,eAAgB,CAAA,GAChCL,MAAgB,OAAO,QAAQA,MAAgB,OAAO,OAAO,SACxD;;AAEZ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../../ui/components/ui/select.cjs"),r=require("../../paraglide/messages/kanban_sort_default.cjs"),i=require("../../paraglide/messages/kanban_sort_dueasc1.cjs"),a=require("../../paraglide/messages/kanban_sort_duedesc1.cjs"),o=require("../../paraglide/messages/kanban_sort_priorityasc1.cjs"),s=require("../../paraglide/messages/kanban_sort_prioritydesc1.cjs"),c=require("../../paraglide/messages/kanban_sort_titleasc1.cjs"),l=require("../../paraglide/messages/kanban_sort_titledesc1.cjs"),u=require("./kanban-primitives.cjs"),d=require("./KanbanColumn.cjs"),f=require("./use-kanban-drag.cjs");let p=require("react/jsx-runtime"),m=require("react");m=e.__toESM(m,1);let h=require("lucide-react");function g(){return[{value:`default`,label:r.kanban_sort_default({defaultValue:`Default`})},{value:`priority-desc`,label:s.kanban_sort_priorityDesc({defaultValue:`Priority (High → Low)`})},{value:`priority-asc`,label:o.kanban_sort_priorityAsc({defaultValue:`Priority (Low → High)`})},{value:`due-asc`,label:i.kanban_sort_dueAsc({defaultValue:`Due Date (Nearest)`})},{value:`due-desc`,label:a.kanban_sort_dueDesc({defaultValue:`Due Date (Farthest)`})},{value:`title-asc`,label:c.kanban_sort_titleAsc({defaultValue:`Title (A → Z)`})},{value:`title-desc`,label:l.kanban_sort_titleDesc({defaultValue:`Title (Z → A)`})}]}var _={urgent:4,high:3,medium:2,low:1},v=m.forwardRef(({tasks:e,columns:r,statusField:i=`status`,onTaskClick:a,onStatusChange:o,className:s,testId:c,showSort:l=!0,initialSort:v=`default`,readOnly:y=!1,disableOptimisticUpdates:b=!1,renderCard:x},S)=>{let[C,w]=m.useState(v),[T,E]=m.useState(null),[D,O]=m.useState(e);e!==D&&(O(e),E(null));let k=b||!T?e:T,A=m.useMemo(()=>{let e=[...k];switch(C){case`priority-desc`:e.sort((e,t)=>(_[t.priority||`medium`]||2)-(_[e.priority||`medium`]||2));break;case`priority-asc`:e.sort((e,t)=>(_[e.priority||`medium`]||2)-(_[t.priority||`medium`]||2));break;case`due-asc`:e.sort((e,t)=>new Date(e.due_date||`9999`).getTime()-new Date(t.due_date||`9999`).getTime());break;case`due-desc`:e.sort((e,t)=>new Date(t.due_date||`1970`).getTime()-new Date(e.due_date||`1970`).getTime());break;case`title-asc`:e.sort((e,t)=>e.title.localeCompare(t.title));break;case`title-desc`:e.sort((e,t)=>t.title.localeCompare(e.title))}return e},[k,C]),j=m.useCallback((e,t)=>{b||E(k.map(n=>n.id===e?{...n,[i]:t}:n)),o?.(e,t)},[k,b,i,o]),M=f.useKanbanDrag({tasks:k,columns:r,statusField:i,readOnly:y,onStatusChange:j}),N=m.useMemo(()=>{let e={};return r.forEach(t=>{e[t.id]=[]}),A.forEach(t=>{let n=t[i];e[n]&&e[n].push(t)}),e},[A,r,i]);return(0,p.jsx)(u.KanbanDragSurface,{controller:M,children:(0,p.jsxs)(`div`,{ref:S,"data-slot":`kanban-board`,"data-testid":c,className:t.cn(`flex flex-col h-full`,s),children:[l&&(0,p.jsx)(`div`,{"data-slot":`kanban-toolbar`,className:`px-4 py-2 flex justify-end border-b border-border`,children:(0,p.jsx)(n.SelectInput,{"aria-label":`Sort tasks`,value:C,onValueChange:e=>e&&w(e),options:g(),className:`w-[180px] h-8 text-xs`,testId:c?`${c}-sort`:void 0,icon:(0,p.jsx)(h.ArrowUpDown,{className:`w-3 h-3 mr-2`})})}),(0,p.jsx)(`div`,{"data-slot":`kanban-columns`,className:`flex h-full gap-4 p-4 overflow-x-auto items-start`,children:r.map(e=>(0,p.jsx)(d.KanbanColumn,{column:e,tasks:N[e.id]||[],testId:c?`${c}-column-${e.id}`:void 0,onTaskClick:a,renderCard:x,readOnly:y},e.id))})]})})});v.displayName=`KanbanBoard`,exports.KanbanBoard=v;
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../../ui/components/ui/select.cjs"),r=require("../../paraglide/messages/kanban_sort_default.cjs"),i=require("../../paraglide/messages/kanban_sort_dueasc1.cjs"),a=require("../../paraglide/messages/kanban_sort_duedesc1.cjs"),o=require("../../paraglide/messages/kanban_sort_priorityasc1.cjs"),s=require("../../paraglide/messages/kanban_sort_prioritydesc1.cjs"),c=require("../../paraglide/messages/kanban_sort_titleasc1.cjs"),l=require("../../paraglide/messages/kanban_sort_titledesc1.cjs"),u=require("./kanban-primitives.cjs"),d=require("./KanbanColumn.cjs"),f=require("./use-kanban-drag.cjs");let p=require("react/jsx-runtime"),m=require("react");m=e.__toESM(m,1);let h=require("lucide-react");function g(){return[{value:`default`,label:r.kanban_sort_default({defaultValue:`Default`})},{value:`priority-desc`,label:s.kanban_sort_priorityDesc({defaultValue:`Priority (High → Low)`})},{value:`priority-asc`,label:o.kanban_sort_priorityAsc({defaultValue:`Priority (Low → High)`})},{value:`due-asc`,label:i.kanban_sort_dueAsc({defaultValue:`Due Date (Nearest)`})},{value:`due-desc`,label:a.kanban_sort_dueDesc({defaultValue:`Due Date (Farthest)`})},{value:`title-asc`,label:c.kanban_sort_titleAsc({defaultValue:`Title (A → Z)`})},{value:`title-desc`,label:l.kanban_sort_titleDesc({defaultValue:`Title (Z → A)`})}]}var _={urgent:4,high:3,medium:2,low:1},v=m.forwardRef(({tasks:e,columns:r,statusField:i=`status`,onTaskClick:a,onStatusChange:o,className:s,testId:c,showSort:l=!0,initialSort:v=`default`,readOnly:y=!1,disableOptimisticUpdates:b=!1,renderCard:x},S)=>{let[C,w]=m.useState(v),[T,E]=m.useState(null),[D,O]=m.useState(e);e!==D&&(O(e),E(null));let k=b||!T?e:T,A=m.useMemo(()=>{let e=[...k];switch(C){case`priority-desc`:e.sort((e,t)=>(_[t.priority||`medium`]||2)-(_[e.priority||`medium`]||2));break;case`priority-asc`:e.sort((e,t)=>(_[e.priority||`medium`]||2)-(_[t.priority||`medium`]||2));break;case`due-asc`:e.sort((e,t)=>new Date(e.due_date||`9999`).getTime()-new Date(t.due_date||`9999`).getTime());break;case`due-desc`:e.sort((e,t)=>new Date(t.due_date||`1970`).getTime()-new Date(e.due_date||`1970`).getTime());break;case`title-asc`:e.sort((e,t)=>e.title.localeCompare(t.title));break;case`title-desc`:e.sort((e,t)=>t.title.localeCompare(e.title))}return e},[k,C]),j=m.useCallback((e,t)=>{b||E(k.map(n=>n.id===e?{...n,[i]:t}:n)),o?.(e,t)},[k,b,i,o]),M=f.useKanbanDrag({tasks:k,columns:r,statusField:i,readOnly:y,onStatusChange:j}),N=m.useMemo(()=>{let e={};return r.forEach(t=>{e[t.id]=[]}),A.forEach(t=>{let n=t[i];e[n]&&e[n].push(t)}),e},[A,r,i]);return(0,p.jsx)(u.KanbanDragSurface,{controller:M,children:(0,p.jsxs)(`div`,{ref:S,"data-slot":`kanban-board`,"data-testid":c,className:t.cn(`flex flex-col h-full`,s),children:[l&&(0,p.jsx)(`div`,{"data-slot":`kanban-toolbar`,className:`px-4 py-2 flex justify-end border-b border-border`,children:(0,p.jsx)(n.SelectInput,{"aria-label":`Sort tasks`,value:C,onValueChange:e=>e&&w(e),options:g(),className:`w-[180px] h-8 text-xs`,testId:c?`${c}-sort`:void 0,icon:(0,p.jsx)(h.ArrowUpDown,{className:`w-3 h-3 mr-2`})})}),(0,p.jsx)(`div`,{"data-slot":`kanban-columns`,role:`region`,"aria-label":`Kanban columns`,tabIndex:0,className:`flex h-full gap-4 p-4 overflow-x-auto items-start`,children:r.map(e=>(0,p.jsx)(d.KanbanColumn,{column:e,tasks:N[e.id]||[],testId:c?`${c}-column-${e.id}`:void 0,onTaskClick:a,renderCard:x,readOnly:y},e.id))})]})})});v.displayName=`KanbanBoard`,exports.KanbanBoard=v;
|
|
2
2
|
//# sourceMappingURL=KanbanBoard.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KanbanBoard.cjs","names":["React","useKanbanDrag","KanbanDragSurface","cn","SelectInput","ArrowUpDown","KanbanColumn","require_runtime","require_ui_lib_utils","require_ui_components_ui_select","require_kanban_sort_default","require_kanban_sort_dueasc1","require_kanban_sort_duedesc1","require_kanban_sort_priorityasc1","require_kanban_sort_prioritydesc1","require_kanban_sort_titleasc1","require_kanban_sort_titledesc1","require_tools_components_kanban_kanban_primitives","require_tools_components_kanban_KanbanColumn","require_tools_components_kanban_use_kanban_drag","react_jsx_runtime","react","lucide_react","getSortOptions","PRIORITY_MAP","KanbanBoard","initialTasks","sortBy","setSortBy","initialSort","optimisticTasks","setOptimisticTasks","prevInitialTasks","setPrevInitialTasks","currentTasks","disableOptimisticUpdates","tasks","sorted","b","a","handleStatusChange","task","taskId","statusField","targetStatus","onStatusChange","drag","tasksByColumn","result","columns","col","status","testId","className","showSort","v"],"sources":["../../../../src/tools/components/kanban/KanbanBoard.tsx"],"sourcesContent":["/**\n * Kanban Board Component\n *\n * カンバンボードメインコンポーネント。@dnd-kit を使用したドラッグ&ドロップ対応。\n *\n * ## Features\n * - ドラッグ&ドロップによるタスク移動\n * - カラムごとのWIP制限\n * - ソート機能(優先度、期限、タイトル)\n * - 楽観的UIアップデート\n * - カスタムカードレンダラー\n *\n * ## AI/Automation Attributes\n * - `data-testid`: Container element\n * - `data-task-count`: Number of tasks\n *\n * @example\n * ```tsx\n * import { KanbanBoard, DEFAULT_KANBAN_COLUMNS } from '@alneas/appkit-react/tools/kanban';\n *\n * const tasks = [\n * { id: '1', title: 'Task 1', status: 'todo', priority: 'high' },\n * { id: '2', title: 'Task 2', status: 'in_progress', priority: 'medium' },\n * ];\n *\n * <KanbanBoard\n * tasks={tasks}\n * columns={DEFAULT_KANBAN_COLUMNS}\n * onTaskClick={(task) => openDetail(task.id)}\n * onStatusChange={(taskId, newStatus) => updateTaskStatus(taskId, newStatus)}\n * />\n * ```\n *\n * @param props - {@link KanbanBoardProps}\n * @returns カンバンボードコンポーネント\n */\n\nimport * as React from 'react';\nimport { ArrowUpDown } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { SelectInput } from '../ui/select';\nimport { KanbanColumn } from './KanbanColumn';\nimport { KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanBoardProps, KanbanTask, KanbanSortOption } from './types';\nimport * as m from '../../paraglide/messages.js';\n\n/**\n * ソートオプション定義(レンダー時に評価してロケールを反映)\n */\nfunction getSortOptions(): { value: KanbanSortOption; label: string }[] {\n return [\n { value: 'default', label: m.kanban_sort_default({ defaultValue: 'Default' }) },\n {\n value: 'priority-desc',\n label: m.kanban_sort_priorityDesc({ defaultValue: 'Priority (High → Low)' }),\n },\n {\n value: 'priority-asc',\n label: m.kanban_sort_priorityAsc({ defaultValue: 'Priority (Low → High)' }),\n },\n { value: 'due-asc', label: m.kanban_sort_dueAsc({ defaultValue: 'Due Date (Nearest)' }) },\n { value: 'due-desc', label: m.kanban_sort_dueDesc({ defaultValue: 'Due Date (Farthest)' }) },\n { value: 'title-asc', label: m.kanban_sort_titleAsc({ defaultValue: 'Title (A → Z)' }) },\n { value: 'title-desc', label: m.kanban_sort_titleDesc({ defaultValue: 'Title (Z → A)' }) },\n ];\n}\n\nconst PRIORITY_MAP: Record<string, number> = {\n urgent: 4,\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * カンバンボード。Compound版とD&D処理を共有し、ソートと楽観的更新を追加します。\n */\nexport const KanbanBoard = React.forwardRef<HTMLDivElement, KanbanBoardProps>(\n (\n {\n tasks: initialTasks,\n columns,\n statusField = 'status',\n onTaskClick,\n onStatusChange,\n className,\n testId,\n showSort = true,\n initialSort = 'default',\n readOnly = false,\n disableOptimisticUpdates = false,\n renderCard,\n },\n ref,\n ) => {\n const [sortBy, setSortBy] = React.useState<KanbanSortOption>(initialSort);\n const [optimisticTasks, setOptimisticTasks] = React.useState<KanbanTask[] | null>(null);\n\n // Reset optimistic state during render when original tasks prop changes\n const [prevInitialTasks, setPrevInitialTasks] = React.useState<KanbanTask[]>(initialTasks);\n if (initialTasks !== prevInitialTasks) {\n setPrevInitialTasks(initialTasks);\n setOptimisticTasks(null);\n }\n\n const currentTasks =\n disableOptimisticUpdates || !optimisticTasks ? initialTasks : optimisticTasks;\n\n // ソート処理\n const tasks = React.useMemo(() => {\n const sorted = [...currentTasks];\n switch (sortBy) {\n case 'priority-desc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[b.priority || 'medium'] || 2) -\n (PRIORITY_MAP[a.priority || 'medium'] || 2),\n );\n break;\n case 'priority-asc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[a.priority || 'medium'] || 2) -\n (PRIORITY_MAP[b.priority || 'medium'] || 2),\n );\n break;\n case 'due-asc':\n sorted.sort(\n (a, b) =>\n new Date(a.due_date || '9999').getTime() - new Date(b.due_date || '9999').getTime(),\n );\n break;\n case 'due-desc':\n sorted.sort(\n (a, b) =>\n new Date(b.due_date || '1970').getTime() - new Date(a.due_date || '1970').getTime(),\n );\n break;\n case 'title-asc':\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n break;\n case 'title-desc':\n sorted.sort((a, b) => b.title.localeCompare(a.title));\n break;\n }\n return sorted;\n }, [currentTasks, sortBy]);\n\n const handleStatusChange = React.useCallback(\n (taskId: string, targetStatus: string) => {\n if (!disableOptimisticUpdates) {\n setOptimisticTasks(\n currentTasks.map((task) =>\n task.id === taskId ? { ...task, [statusField]: targetStatus } : task,\n ),\n );\n }\n onStatusChange?.(taskId, targetStatus);\n },\n [currentTasks, disableOptimisticUpdates, statusField, onStatusChange],\n );\n const drag = useKanbanDrag({\n tasks: currentTasks,\n columns,\n statusField,\n readOnly,\n onStatusChange: handleStatusChange,\n });\n\n // カラムごとにタスクをグループ化\n const tasksByColumn = React.useMemo(() => {\n const result: Record<string, KanbanTask[]> = {};\n columns.forEach((col) => {\n result[col.id] = [];\n });\n tasks.forEach((task) => {\n const status = (task as Record<string, unknown>)[statusField] as string;\n if (result[status]) {\n result[status].push(task);\n }\n });\n return result;\n }, [tasks, columns, statusField]);\n\n return (\n <KanbanDragSurface controller={drag}>\n <div\n ref={ref}\n data-slot='kanban-board'\n data-testid={testId}\n className={cn('flex flex-col h-full', className)}\n >\n {/* ツールバー */}\n {showSort && (\n <div\n data-slot='kanban-toolbar'\n className='px-4 py-2 flex justify-end border-b border-border'\n >\n <SelectInput\n aria-label=\"Sort tasks\"\n value={sortBy}\n onValueChange={(v) => v && setSortBy(v as KanbanSortOption)}\n options={getSortOptions()}\n className='w-[180px] h-8 text-xs'\n testId={testId ? `${testId}-sort` : undefined}\n icon={<ArrowUpDown className='w-3 h-3 mr-2' />}\n />\n </div>\n )}\n\n {/* カラム */}\n <div\n data-slot='kanban-columns'\n className='flex h-full gap-4 p-4 overflow-x-auto items-start'\n >\n {columns.map((col) => (\n <KanbanColumn\n key={col.id}\n column={col}\n tasks={tasksByColumn[col.id] || []}\n testId={testId ? `${testId}-column-${col.id}` : undefined}\n onTaskClick={onTaskClick}\n renderCard={renderCard}\n readOnly={readOnly}\n />\n ))}\n </div>\n </div>\n </KanbanDragSurface>\n );\n },\n);\n\nKanbanBoard.displayName = 'KanbanBoard';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KanbanBoard.cjs","names":["React","useKanbanDrag","KanbanDragSurface","cn","SelectInput","ArrowUpDown","KanbanColumn","require_runtime","require_ui_lib_utils","require_ui_components_ui_select","require_kanban_sort_default","require_kanban_sort_dueasc1","require_kanban_sort_duedesc1","require_kanban_sort_priorityasc1","require_kanban_sort_prioritydesc1","require_kanban_sort_titleasc1","require_kanban_sort_titledesc1","require_tools_components_kanban_kanban_primitives","require_tools_components_kanban_KanbanColumn","require_tools_components_kanban_use_kanban_drag","react_jsx_runtime","react","lucide_react","getSortOptions","PRIORITY_MAP","KanbanBoard","initialTasks","sortBy","setSortBy","initialSort","optimisticTasks","setOptimisticTasks","prevInitialTasks","setPrevInitialTasks","currentTasks","disableOptimisticUpdates","tasks","sorted","b","a","handleStatusChange","task","taskId","statusField","targetStatus","onStatusChange","drag","tasksByColumn","result","columns","col","status","testId","className","showSort","v"],"sources":["../../../../src/tools/components/kanban/KanbanBoard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ArrowUpDown } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { SelectInput } from '../ui/select';\nimport { KanbanColumn } from './KanbanColumn';\nimport { KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanBoardProps, KanbanTask, KanbanSortOption } from './types';\nimport * as m from '../../paraglide/messages.js';\n\n/**\n * ソートオプション定義(レンダー時に評価してロケールを反映)\n */\nfunction getSortOptions(): { value: KanbanSortOption; label: string }[] {\n return [\n { value: 'default', label: m.kanban_sort_default({ defaultValue: 'Default' }) },\n {\n value: 'priority-desc',\n label: m.kanban_sort_priorityDesc({ defaultValue: 'Priority (High → Low)' }),\n },\n {\n value: 'priority-asc',\n label: m.kanban_sort_priorityAsc({ defaultValue: 'Priority (Low → High)' }),\n },\n { value: 'due-asc', label: m.kanban_sort_dueAsc({ defaultValue: 'Due Date (Nearest)' }) },\n { value: 'due-desc', label: m.kanban_sort_dueDesc({ defaultValue: 'Due Date (Farthest)' }) },\n { value: 'title-asc', label: m.kanban_sort_titleAsc({ defaultValue: 'Title (A → Z)' }) },\n { value: 'title-desc', label: m.kanban_sort_titleDesc({ defaultValue: 'Title (Z → A)' }) },\n ];\n}\n\nconst PRIORITY_MAP: Record<string, number> = {\n urgent: 4,\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Renders sortable task columns with optional drag-and-drop status changes and optimistic state.\n * @param props - Task/column arrays and callbacks; see {@link KanbanBoardProps}.\n * @returns The board with optional sorting controls and one column per supplied column definition.\n * @remarks The ref prop forwards to the rendered div. Import Appkit CSS. statusField defaults to status, showSort to true, initialSort to\n * default and readOnly to false. Local optimistic status changes are enabled unless\n * disableOptimisticUpdates is true; receiving a different tasks array resets optimistic state.\n * onStatusChange receives the task ID and target column status; the host owns persistence.\n * The root exposes data-slot=\"kanban-board\" and data-testid only when testId is supplied.\n * It does not render data-task-count. No external drag-and-drop provider is required.\n * @example\n * ```tsx\n * import { KanbanBoard, DEFAULT_KANBAN_COLUMNS, type KanbanTask } from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n *\n * const tasks: KanbanTask[] = [{ id: 'task-1', title: 'Review', status: 'todo', priority: 'high' }];\n * export function ReviewBoard() {\n * return <KanbanBoard testId=\"review-board\" tasks={tasks} columns={DEFAULT_KANBAN_COLUMNS} readOnly />;\n * }\n * ```\n */\nexport const KanbanBoard = React.forwardRef<HTMLDivElement, KanbanBoardProps>(\n (\n {\n tasks: initialTasks,\n columns,\n statusField = 'status',\n onTaskClick,\n onStatusChange,\n className,\n testId,\n showSort = true,\n initialSort = 'default',\n readOnly = false,\n disableOptimisticUpdates = false,\n renderCard,\n },\n ref,\n ) => {\n const [sortBy, setSortBy] = React.useState<KanbanSortOption>(initialSort);\n const [optimisticTasks, setOptimisticTasks] = React.useState<KanbanTask[] | null>(null);\n\n // Reset optimistic state during render when original tasks prop changes\n const [prevInitialTasks, setPrevInitialTasks] = React.useState<KanbanTask[]>(initialTasks);\n if (initialTasks !== prevInitialTasks) {\n setPrevInitialTasks(initialTasks);\n setOptimisticTasks(null);\n }\n\n const currentTasks =\n disableOptimisticUpdates || !optimisticTasks ? initialTasks : optimisticTasks;\n\n // ソート処理\n const tasks = React.useMemo(() => {\n const sorted = [...currentTasks];\n switch (sortBy) {\n case 'priority-desc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[b.priority || 'medium'] || 2) -\n (PRIORITY_MAP[a.priority || 'medium'] || 2),\n );\n break;\n case 'priority-asc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[a.priority || 'medium'] || 2) -\n (PRIORITY_MAP[b.priority || 'medium'] || 2),\n );\n break;\n case 'due-asc':\n sorted.sort(\n (a, b) =>\n new Date(a.due_date || '9999').getTime() - new Date(b.due_date || '9999').getTime(),\n );\n break;\n case 'due-desc':\n sorted.sort(\n (a, b) =>\n new Date(b.due_date || '1970').getTime() - new Date(a.due_date || '1970').getTime(),\n );\n break;\n case 'title-asc':\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n break;\n case 'title-desc':\n sorted.sort((a, b) => b.title.localeCompare(a.title));\n break;\n }\n return sorted;\n }, [currentTasks, sortBy]);\n\n const handleStatusChange = React.useCallback(\n (taskId: string, targetStatus: string) => {\n if (!disableOptimisticUpdates) {\n setOptimisticTasks(\n currentTasks.map((task) =>\n task.id === taskId ? { ...task, [statusField]: targetStatus } : task,\n ),\n );\n }\n onStatusChange?.(taskId, targetStatus);\n },\n [currentTasks, disableOptimisticUpdates, statusField, onStatusChange],\n );\n const drag = useKanbanDrag({\n tasks: currentTasks,\n columns,\n statusField,\n readOnly,\n onStatusChange: handleStatusChange,\n });\n\n // カラムごとにタスクをグループ化\n const tasksByColumn = React.useMemo(() => {\n const result: Record<string, KanbanTask[]> = {};\n columns.forEach((col) => {\n result[col.id] = [];\n });\n tasks.forEach((task) => {\n const status = (task as Record<string, unknown>)[statusField] as string;\n if (result[status]) {\n result[status].push(task);\n }\n });\n return result;\n }, [tasks, columns, statusField]);\n\n return (\n <KanbanDragSurface controller={drag}>\n <div\n ref={ref}\n data-slot='kanban-board'\n data-testid={testId}\n className={cn('flex flex-col h-full', className)}\n >\n {/* ツールバー */}\n {showSort && (\n <div\n data-slot='kanban-toolbar'\n className='px-4 py-2 flex justify-end border-b border-border'\n >\n <SelectInput\n aria-label=\"Sort tasks\"\n value={sortBy}\n onValueChange={(v) => v && setSortBy(v as KanbanSortOption)}\n options={getSortOptions()}\n className='w-[180px] h-8 text-xs'\n testId={testId ? `${testId}-sort` : undefined}\n icon={<ArrowUpDown className='w-3 h-3 mr-2' />}\n />\n </div>\n )}\n\n {/* カラム */}\n <div\n data-slot='kanban-columns'\n role='region'\n aria-label='Kanban columns'\n tabIndex={0}\n className='flex h-full gap-4 p-4 overflow-x-auto items-start'\n >\n {columns.map((col) => (\n <KanbanColumn\n key={col.id}\n column={col}\n tasks={tasksByColumn[col.id] || []}\n testId={testId ? `${testId}-column-${col.id}` : undefined}\n onTaskClick={onTaskClick}\n renderCard={renderCard}\n readOnly={readOnly}\n />\n ))}\n </div>\n </div>\n </KanbanDragSurface>\n );\n },\n);\n\nKanbanBoard.displayName = 'KanbanBoard';\n"],"mappings":"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"}
|
|
@@ -1,42 +1,24 @@
|
|
|
1
1
|
import { KanbanBoardProps } from './types.cjs';
|
|
2
|
+
import * as React from 'react';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
* - カスタムカードレンダラー
|
|
13
|
-
*
|
|
14
|
-
* ## AI/Automation Attributes
|
|
15
|
-
* - `data-testid`: Container element
|
|
16
|
-
* - `data-task-count`: Number of tasks
|
|
17
|
-
*
|
|
4
|
+
* Renders sortable task columns with optional drag-and-drop status changes and optimistic state.
|
|
5
|
+
* @param props - Task/column arrays and callbacks; see {@link KanbanBoardProps}.
|
|
6
|
+
* @returns The board with optional sorting controls and one column per supplied column definition.
|
|
7
|
+
* @remarks The ref prop forwards to the rendered div. Import Appkit CSS. statusField defaults to status, showSort to true, initialSort to
|
|
8
|
+
* default and readOnly to false. Local optimistic status changes are enabled unless
|
|
9
|
+
* disableOptimisticUpdates is true; receiving a different tasks array resets optimistic state.
|
|
10
|
+
* onStatusChange receives the task ID and target column status; the host owns persistence.
|
|
11
|
+
* The root exposes data-slot="kanban-board" and data-testid only when testId is supplied.
|
|
12
|
+
* It does not render data-task-count. No external drag-and-drop provider is required.
|
|
18
13
|
* @example
|
|
19
14
|
* ```tsx
|
|
20
|
-
* import { KanbanBoard, DEFAULT_KANBAN_COLUMNS } from '@alneas/appkit-react/tools/kanban';
|
|
15
|
+
* import { KanbanBoard, DEFAULT_KANBAN_COLUMNS, type KanbanTask } from '@alneas/appkit-react/tools/kanban';
|
|
16
|
+
* import '@alneas/appkit-react/styles';
|
|
21
17
|
*
|
|
22
|
-
* const tasks = [
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* <KanbanBoard
|
|
28
|
-
* tasks={tasks}
|
|
29
|
-
* columns={DEFAULT_KANBAN_COLUMNS}
|
|
30
|
-
* onTaskClick={(task) => openDetail(task.id)}
|
|
31
|
-
* onStatusChange={(taskId, newStatus) => updateTaskStatus(taskId, newStatus)}
|
|
32
|
-
* />
|
|
18
|
+
* const tasks: KanbanTask[] = [{ id: 'task-1', title: 'Review', status: 'todo', priority: 'high' }];
|
|
19
|
+
* export function ReviewBoard() {
|
|
20
|
+
* return <KanbanBoard testId="review-board" tasks={tasks} columns={DEFAULT_KANBAN_COLUMNS} readOnly />;
|
|
21
|
+
* }
|
|
33
22
|
* ```
|
|
34
|
-
*
|
|
35
|
-
* @param props - {@link KanbanBoardProps}
|
|
36
|
-
* @returns カンバンボードコンポーネント
|
|
37
|
-
*/
|
|
38
|
-
import * as React from 'react';
|
|
39
|
-
/**
|
|
40
|
-
* カンバンボード。Compound版とD&D処理を共有し、ソートと楽観的更新を追加します。
|
|
41
23
|
*/
|
|
42
24
|
export declare const KanbanBoard: React.ForwardRefExoticComponent<KanbanBoardProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,42 +1,24 @@
|
|
|
1
1
|
import { KanbanBoardProps } from './types.js';
|
|
2
|
+
import * as React from 'react';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
* - カスタムカードレンダラー
|
|
13
|
-
*
|
|
14
|
-
* ## AI/Automation Attributes
|
|
15
|
-
* - `data-testid`: Container element
|
|
16
|
-
* - `data-task-count`: Number of tasks
|
|
17
|
-
*
|
|
4
|
+
* Renders sortable task columns with optional drag-and-drop status changes and optimistic state.
|
|
5
|
+
* @param props - Task/column arrays and callbacks; see {@link KanbanBoardProps}.
|
|
6
|
+
* @returns The board with optional sorting controls and one column per supplied column definition.
|
|
7
|
+
* @remarks The ref prop forwards to the rendered div. Import Appkit CSS. statusField defaults to status, showSort to true, initialSort to
|
|
8
|
+
* default and readOnly to false. Local optimistic status changes are enabled unless
|
|
9
|
+
* disableOptimisticUpdates is true; receiving a different tasks array resets optimistic state.
|
|
10
|
+
* onStatusChange receives the task ID and target column status; the host owns persistence.
|
|
11
|
+
* The root exposes data-slot="kanban-board" and data-testid only when testId is supplied.
|
|
12
|
+
* It does not render data-task-count. No external drag-and-drop provider is required.
|
|
18
13
|
* @example
|
|
19
14
|
* ```tsx
|
|
20
|
-
* import { KanbanBoard, DEFAULT_KANBAN_COLUMNS } from '@alneas/appkit-react/tools/kanban';
|
|
15
|
+
* import { KanbanBoard, DEFAULT_KANBAN_COLUMNS, type KanbanTask } from '@alneas/appkit-react/tools/kanban';
|
|
16
|
+
* import '@alneas/appkit-react/styles';
|
|
21
17
|
*
|
|
22
|
-
* const tasks = [
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* <KanbanBoard
|
|
28
|
-
* tasks={tasks}
|
|
29
|
-
* columns={DEFAULT_KANBAN_COLUMNS}
|
|
30
|
-
* onTaskClick={(task) => openDetail(task.id)}
|
|
31
|
-
* onStatusChange={(taskId, newStatus) => updateTaskStatus(taskId, newStatus)}
|
|
32
|
-
* />
|
|
18
|
+
* const tasks: KanbanTask[] = [{ id: 'task-1', title: 'Review', status: 'todo', priority: 'high' }];
|
|
19
|
+
* export function ReviewBoard() {
|
|
20
|
+
* return <KanbanBoard testId="review-board" tasks={tasks} columns={DEFAULT_KANBAN_COLUMNS} readOnly />;
|
|
21
|
+
* }
|
|
33
22
|
* ```
|
|
34
|
-
*
|
|
35
|
-
* @param props - {@link KanbanBoardProps}
|
|
36
|
-
* @returns カンバンボードコンポーネント
|
|
37
|
-
*/
|
|
38
|
-
import * as React from 'react';
|
|
39
|
-
/**
|
|
40
|
-
* カンバンボード。Compound版とD&D処理を共有し、ソートと楽観的更新を追加します。
|
|
41
23
|
*/
|
|
42
24
|
export declare const KanbanBoard: React.ForwardRefExoticComponent<KanbanBoardProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -126,6 +126,9 @@ var _ = {
|
|
|
126
126
|
})
|
|
127
127
|
}), /* @__PURE__ */ f("div", {
|
|
128
128
|
"data-slot": "kanban-columns",
|
|
129
|
+
role: "region",
|
|
130
|
+
"aria-label": "Kanban columns",
|
|
131
|
+
tabIndex: 0,
|
|
129
132
|
className: "flex h-full gap-4 p-4 overflow-x-auto items-start",
|
|
130
133
|
children: r.map((e) => /* @__PURE__ */ f(u, {
|
|
131
134
|
column: e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KanbanBoard.js","names":["m.kanban_sort_default","m.kanban_sort_priorityDesc","m.kanban_sort_priorityAsc","m.kanban_sort_dueAsc","m.kanban_sort_dueDesc","m.kanban_sort_titleAsc","m.kanban_sort_titleDesc","React","kanban_sort_dueasc1","kanban_sort_duedesc1","kanban_sort_priorityasc1","kanban_sort_prioritydesc1","kanban_sort_titleasc1","kanban_sort_titledesc1","React$1","getSortOptions","kanban_sort_default","PRIORITY_MAP","KanbanBoard","initialTasks","sortBy","setSortBy","initialSort","optimisticTasks","setOptimisticTasks","prevInitialTasks","setPrevInitialTasks","currentTasks","disableOptimisticUpdates","tasks","sorted","b","a","handleStatusChange","task","taskId","statusField","targetStatus","onStatusChange","drag","useKanbanDrag","tasksByColumn","result","columns","col","status","KanbanDragSurface","testId","cn","className","showSort","SelectInput","v","ArrowUpDown","KanbanColumn"],"sources":["../../../../src/tools/components/kanban/KanbanBoard.tsx"],"sourcesContent":["/**\n * Kanban Board Component\n *\n * カンバンボードメインコンポーネント。@dnd-kit を使用したドラッグ&ドロップ対応。\n *\n * ## Features\n * - ドラッグ&ドロップによるタスク移動\n * - カラムごとのWIP制限\n * - ソート機能(優先度、期限、タイトル)\n * - 楽観的UIアップデート\n * - カスタムカードレンダラー\n *\n * ## AI/Automation Attributes\n * - `data-testid`: Container element\n * - `data-task-count`: Number of tasks\n *\n * @example\n * ```tsx\n * import { KanbanBoard, DEFAULT_KANBAN_COLUMNS } from '@alneas/appkit-react/tools/kanban';\n *\n * const tasks = [\n * { id: '1', title: 'Task 1', status: 'todo', priority: 'high' },\n * { id: '2', title: 'Task 2', status: 'in_progress', priority: 'medium' },\n * ];\n *\n * <KanbanBoard\n * tasks={tasks}\n * columns={DEFAULT_KANBAN_COLUMNS}\n * onTaskClick={(task) => openDetail(task.id)}\n * onStatusChange={(taskId, newStatus) => updateTaskStatus(taskId, newStatus)}\n * />\n * ```\n *\n * @param props - {@link KanbanBoardProps}\n * @returns カンバンボードコンポーネント\n */\n\nimport * as React from 'react';\nimport { ArrowUpDown } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { SelectInput } from '../ui/select';\nimport { KanbanColumn } from './KanbanColumn';\nimport { KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanBoardProps, KanbanTask, KanbanSortOption } from './types';\nimport * as m from '../../paraglide/messages.js';\n\n/**\n * ソートオプション定義(レンダー時に評価してロケールを反映)\n */\nfunction getSortOptions(): { value: KanbanSortOption; label: string }[] {\n return [\n { value: 'default', label: m.kanban_sort_default({ defaultValue: 'Default' }) },\n {\n value: 'priority-desc',\n label: m.kanban_sort_priorityDesc({ defaultValue: 'Priority (High → Low)' }),\n },\n {\n value: 'priority-asc',\n label: m.kanban_sort_priorityAsc({ defaultValue: 'Priority (Low → High)' }),\n },\n { value: 'due-asc', label: m.kanban_sort_dueAsc({ defaultValue: 'Due Date (Nearest)' }) },\n { value: 'due-desc', label: m.kanban_sort_dueDesc({ defaultValue: 'Due Date (Farthest)' }) },\n { value: 'title-asc', label: m.kanban_sort_titleAsc({ defaultValue: 'Title (A → Z)' }) },\n { value: 'title-desc', label: m.kanban_sort_titleDesc({ defaultValue: 'Title (Z → A)' }) },\n ];\n}\n\nconst PRIORITY_MAP: Record<string, number> = {\n urgent: 4,\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * カンバンボード。Compound版とD&D処理を共有し、ソートと楽観的更新を追加します。\n */\nexport const KanbanBoard = React.forwardRef<HTMLDivElement, KanbanBoardProps>(\n (\n {\n tasks: initialTasks,\n columns,\n statusField = 'status',\n onTaskClick,\n onStatusChange,\n className,\n testId,\n showSort = true,\n initialSort = 'default',\n readOnly = false,\n disableOptimisticUpdates = false,\n renderCard,\n },\n ref,\n ) => {\n const [sortBy, setSortBy] = React.useState<KanbanSortOption>(initialSort);\n const [optimisticTasks, setOptimisticTasks] = React.useState<KanbanTask[] | null>(null);\n\n // Reset optimistic state during render when original tasks prop changes\n const [prevInitialTasks, setPrevInitialTasks] = React.useState<KanbanTask[]>(initialTasks);\n if (initialTasks !== prevInitialTasks) {\n setPrevInitialTasks(initialTasks);\n setOptimisticTasks(null);\n }\n\n const currentTasks =\n disableOptimisticUpdates || !optimisticTasks ? initialTasks : optimisticTasks;\n\n // ソート処理\n const tasks = React.useMemo(() => {\n const sorted = [...currentTasks];\n switch (sortBy) {\n case 'priority-desc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[b.priority || 'medium'] || 2) -\n (PRIORITY_MAP[a.priority || 'medium'] || 2),\n );\n break;\n case 'priority-asc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[a.priority || 'medium'] || 2) -\n (PRIORITY_MAP[b.priority || 'medium'] || 2),\n );\n break;\n case 'due-asc':\n sorted.sort(\n (a, b) =>\n new Date(a.due_date || '9999').getTime() - new Date(b.due_date || '9999').getTime(),\n );\n break;\n case 'due-desc':\n sorted.sort(\n (a, b) =>\n new Date(b.due_date || '1970').getTime() - new Date(a.due_date || '1970').getTime(),\n );\n break;\n case 'title-asc':\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n break;\n case 'title-desc':\n sorted.sort((a, b) => b.title.localeCompare(a.title));\n break;\n }\n return sorted;\n }, [currentTasks, sortBy]);\n\n const handleStatusChange = React.useCallback(\n (taskId: string, targetStatus: string) => {\n if (!disableOptimisticUpdates) {\n setOptimisticTasks(\n currentTasks.map((task) =>\n task.id === taskId ? { ...task, [statusField]: targetStatus } : task,\n ),\n );\n }\n onStatusChange?.(taskId, targetStatus);\n },\n [currentTasks, disableOptimisticUpdates, statusField, onStatusChange],\n );\n const drag = useKanbanDrag({\n tasks: currentTasks,\n columns,\n statusField,\n readOnly,\n onStatusChange: handleStatusChange,\n });\n\n // カラムごとにタスクをグループ化\n const tasksByColumn = React.useMemo(() => {\n const result: Record<string, KanbanTask[]> = {};\n columns.forEach((col) => {\n result[col.id] = [];\n });\n tasks.forEach((task) => {\n const status = (task as Record<string, unknown>)[statusField] as string;\n if (result[status]) {\n result[status].push(task);\n }\n });\n return result;\n }, [tasks, columns, statusField]);\n\n return (\n <KanbanDragSurface controller={drag}>\n <div\n ref={ref}\n data-slot='kanban-board'\n data-testid={testId}\n className={cn('flex flex-col h-full', className)}\n >\n {/* ツールバー */}\n {showSort && (\n <div\n data-slot='kanban-toolbar'\n className='px-4 py-2 flex justify-end border-b border-border'\n >\n <SelectInput\n aria-label=\"Sort tasks\"\n value={sortBy}\n onValueChange={(v) => v && setSortBy(v as KanbanSortOption)}\n options={getSortOptions()}\n className='w-[180px] h-8 text-xs'\n testId={testId ? `${testId}-sort` : undefined}\n icon={<ArrowUpDown className='w-3 h-3 mr-2' />}\n />\n </div>\n )}\n\n {/* カラム */}\n <div\n data-slot='kanban-columns'\n className='flex h-full gap-4 p-4 overflow-x-auto items-start'\n >\n {columns.map((col) => (\n <KanbanColumn\n key={col.id}\n column={col}\n tasks={tasksByColumn[col.id] || []}\n testId={testId ? `${testId}-column-${col.id}` : undefined}\n onTaskClick={onTaskClick}\n renderCard={renderCard}\n readOnly={readOnly}\n />\n ))}\n </div>\n </div>\n </KanbanDragSurface>\n );\n },\n);\n\nKanbanBoard.displayName = 'KanbanBoard';\n"],"mappings":";;;;;;;;;;;;;;;;;AAmDA,SAASe,IAA+D;CACtE,OAAO;EACL;GAAE,OAAO;GAAW,OAAOf,EAAsB,EAAE,cAAc,UAAU,CAAC;EAAE;EAC9E;GACE,OAAO;GACP,OAAOC,EAA2B,EAAE,cAAc,wBAAwB,CAAC;EAC7E;EACA;GACE,OAAO;GACP,OAAOC,EAA0B,EAAE,cAAc,wBAAwB,CAAC;EAC5E;EACA;GAAE,OAAO;GAAW,OAAOC,EAAqB,EAAE,cAAc,qBAAqB,CAAC;EAAE;EACxF;GAAE,OAAO;GAAY,OAAOC,EAAsB,EAAE,cAAc,sBAAsB,CAAC;EAAE;EAC3F;GAAE,OAAO;GAAa,OAAOC,EAAuB,EAAE,cAAc,gBAAgB,CAAC;EAAE;EACvF;GAAE,OAAO;GAAc,OAAOC,EAAwB,EAAE,cAAc,gBAAgB,CAAC;EAAE;CAC3F;AACF;AAEA,IAAMW,IAAuC;CAC3C,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,KAAK;AACP,GAKaC,IAAcX,EAAM,YAE7B,EACE,OAAOY,GACP,YACA,iBAAc,UACd,gBACA,mBACA,cACA,WACA,cAAW,IACX,iBAAc,WACd,cAAW,IACX,8BAA2B,IAC3B,iBAEF,MACG;CACH,IAAM,CAACC,GAAQC,KAAad,EAAM,SAA2Be,CAAW,GAClE,CAACC,GAAiBC,KAAsBjB,EAAM,SAA8B,IAAI,GAGhF,CAACkB,GAAkBC,KAAuBnB,EAAM,SAAuBY,CAAY;CACzF,AAAIA,MAAiBM,MACnBC,EAAoBP,CAAY,GAChCK,EAAmB,IAAI;CAGzB,IAAMG,IACJC,KAA4B,CAACL,IAAkBJ,IAAeI,GAG1DM,IAAQtB,EAAM,cAAc;EAChC,IAAMuB,IAAS,CAAC,GAAGH,CAAY;EAC/B,QAAQP,GAAR;GACE,KAAK;IACH,EAAO,MACJ,GAAG,OACDH,EAAac,EAAE,YAAY,aAAa,MACxCd,EAAae,EAAE,YAAY,aAAa,EAC7C;IACA;GACF,KAAK;IACH,EAAO,MACJ,GAAG,OACDf,EAAae,EAAE,YAAY,aAAa,MACxCf,EAAac,EAAE,YAAY,aAAa,EAC7C;IACA;GACF,KAAK;IACH,EAAO,MACJ,GAAG,MACF,IAAI,KAAKC,EAAE,YAAY,MAAM,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAKD,EAAE,YAAY,MAAM,CAAC,CAAC,QAAQ,CACtF;IACA;GACF,KAAK;IACH,EAAO,MACJ,GAAG,MACF,IAAI,KAAKA,EAAE,YAAY,MAAM,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAKC,EAAE,YAAY,MAAM,CAAC,CAAC,QAAQ,CACtF;IACA;GACF,KAAK;IACH,EAAO,MAAM,GAAG,MAAMA,EAAE,MAAM,cAAcD,EAAE,KAAK,CAAC;IACpD;GACF,KAAK,cACH,EAAO,MAAM,GAAG,MAAMA,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC;EAExD;EACA,OAAOF;CACT,GAAG,CAACH,GAAcP,CAAM,CAAC,GAEnBa,IAAqB1B,EAAM,aAC9B,GAAgB,MAAyB;EAQxC,AAPKqB,KACHJ,EACEG,EAAa,KAAK,MAChBO,EAAK,OAAOC,IAAS;GAAE,GAAGD;IAAOE,IAAcC;EAAa,IAAIH,CAClE,CACF,GAEFI,IAAiBH,GAAQE,CAAY;CACvC,GACA;EAACV;EAAcC;EAA0BQ;EAAaE;CAAc,CACtE,GACMC,IAAOC,EAAc;EACzB,OAAOb;EACP;EACA;EACA;EACA,gBAAgBM;CAClB,CAAC,GAGKQ,IAAgBlC,EAAM,cAAc;EACxC,IAAMmC,IAAuC,CAAC;EAU9C,OATAC,EAAQ,SAAS,MAAQ;GACvB,EAAOC,EAAI,MAAM,CAAC;EACpB,CAAC,GACDf,EAAM,SAAS,MAAS;GACtB,IAAMgB,IAAUX,EAAiCE;GACjD,AAAIM,EAAOG,MACTH,EAAOG,EAAO,CAAC,KAAKX,CAAI;EAE5B,CAAC,GACMQ;CACT,GAAG;EAACb;EAAOc;EAASP;CAAW,CAAC;CAEhC,OACE,kBAACU,GAAD;EAAmB,YAAYP;EAC7B,UAAA,kBAAC,OAAD;GACO;GACL,aAAU;GACV,eAAaQ;GACb,WAAWC,EAAG,wBAAwBC,CAAS;GAJjD,UAAA,CAOGC,KACC,kBAAC,OAAD;IACE,aAAU;IACV,WAAU;IAEV,UAAA,kBAACC,GAAD;KACE,cAAW;KACX,OAAO/B;KACP,gBAAgB,MAAMgC,KAAK/B,EAAU+B,CAAqB;KAC1D,SAASrC,EAAe;KACxB,WAAU;KACV,QAAQgC,IAAS,GAAGA,EAAO,SAAS,KAAA;KACpC,MAAM,kBAACM,GAAD,EAAa,WAAU,eAAgB,CAAA;IAC9C,CAAA;GACE,CAAA,GAIP,kBAAC,OAAD;IACE,aAAU;IACV,WAAU;IAET,UAAAV,EAAQ,KAAK,MACZ,kBAACW,GAAD;KAEE,QAAQV;KACR,OAAOH,EAAcG,EAAI,OAAO,CAAC;KACjC,QAAQG,IAAS,GAAGA,EAAO,UAAUH,EAAI,OAAO,KAAA;KACnC;KACD;KACF;IACX,GAPMA,EAAI,EAOV,CACF;GACE,CAAA,CACF;;CACY,CAAA;AAEvB,CACF;AAEA,EAAY,cAAc"}
|
|
1
|
+
{"version":3,"file":"KanbanBoard.js","names":["m.kanban_sort_default","m.kanban_sort_priorityDesc","m.kanban_sort_priorityAsc","m.kanban_sort_dueAsc","m.kanban_sort_dueDesc","m.kanban_sort_titleAsc","m.kanban_sort_titleDesc","React","kanban_sort_dueasc1","kanban_sort_duedesc1","kanban_sort_priorityasc1","kanban_sort_prioritydesc1","kanban_sort_titleasc1","kanban_sort_titledesc1","React$1","getSortOptions","kanban_sort_default","PRIORITY_MAP","KanbanBoard","initialTasks","sortBy","setSortBy","initialSort","optimisticTasks","setOptimisticTasks","prevInitialTasks","setPrevInitialTasks","currentTasks","disableOptimisticUpdates","tasks","sorted","b","a","handleStatusChange","task","taskId","statusField","targetStatus","onStatusChange","drag","useKanbanDrag","tasksByColumn","result","columns","col","status","KanbanDragSurface","testId","cn","className","showSort","SelectInput","v","ArrowUpDown","KanbanColumn"],"sources":["../../../../src/tools/components/kanban/KanbanBoard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ArrowUpDown } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { SelectInput } from '../ui/select';\nimport { KanbanColumn } from './KanbanColumn';\nimport { KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanBoardProps, KanbanTask, KanbanSortOption } from './types';\nimport * as m from '../../paraglide/messages.js';\n\n/**\n * ソートオプション定義(レンダー時に評価してロケールを反映)\n */\nfunction getSortOptions(): { value: KanbanSortOption; label: string }[] {\n return [\n { value: 'default', label: m.kanban_sort_default({ defaultValue: 'Default' }) },\n {\n value: 'priority-desc',\n label: m.kanban_sort_priorityDesc({ defaultValue: 'Priority (High → Low)' }),\n },\n {\n value: 'priority-asc',\n label: m.kanban_sort_priorityAsc({ defaultValue: 'Priority (Low → High)' }),\n },\n { value: 'due-asc', label: m.kanban_sort_dueAsc({ defaultValue: 'Due Date (Nearest)' }) },\n { value: 'due-desc', label: m.kanban_sort_dueDesc({ defaultValue: 'Due Date (Farthest)' }) },\n { value: 'title-asc', label: m.kanban_sort_titleAsc({ defaultValue: 'Title (A → Z)' }) },\n { value: 'title-desc', label: m.kanban_sort_titleDesc({ defaultValue: 'Title (Z → A)' }) },\n ];\n}\n\nconst PRIORITY_MAP: Record<string, number> = {\n urgent: 4,\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Renders sortable task columns with optional drag-and-drop status changes and optimistic state.\n * @param props - Task/column arrays and callbacks; see {@link KanbanBoardProps}.\n * @returns The board with optional sorting controls and one column per supplied column definition.\n * @remarks The ref prop forwards to the rendered div. Import Appkit CSS. statusField defaults to status, showSort to true, initialSort to\n * default and readOnly to false. Local optimistic status changes are enabled unless\n * disableOptimisticUpdates is true; receiving a different tasks array resets optimistic state.\n * onStatusChange receives the task ID and target column status; the host owns persistence.\n * The root exposes data-slot=\"kanban-board\" and data-testid only when testId is supplied.\n * It does not render data-task-count. No external drag-and-drop provider is required.\n * @example\n * ```tsx\n * import { KanbanBoard, DEFAULT_KANBAN_COLUMNS, type KanbanTask } from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n *\n * const tasks: KanbanTask[] = [{ id: 'task-1', title: 'Review', status: 'todo', priority: 'high' }];\n * export function ReviewBoard() {\n * return <KanbanBoard testId=\"review-board\" tasks={tasks} columns={DEFAULT_KANBAN_COLUMNS} readOnly />;\n * }\n * ```\n */\nexport const KanbanBoard = React.forwardRef<HTMLDivElement, KanbanBoardProps>(\n (\n {\n tasks: initialTasks,\n columns,\n statusField = 'status',\n onTaskClick,\n onStatusChange,\n className,\n testId,\n showSort = true,\n initialSort = 'default',\n readOnly = false,\n disableOptimisticUpdates = false,\n renderCard,\n },\n ref,\n ) => {\n const [sortBy, setSortBy] = React.useState<KanbanSortOption>(initialSort);\n const [optimisticTasks, setOptimisticTasks] = React.useState<KanbanTask[] | null>(null);\n\n // Reset optimistic state during render when original tasks prop changes\n const [prevInitialTasks, setPrevInitialTasks] = React.useState<KanbanTask[]>(initialTasks);\n if (initialTasks !== prevInitialTasks) {\n setPrevInitialTasks(initialTasks);\n setOptimisticTasks(null);\n }\n\n const currentTasks =\n disableOptimisticUpdates || !optimisticTasks ? initialTasks : optimisticTasks;\n\n // ソート処理\n const tasks = React.useMemo(() => {\n const sorted = [...currentTasks];\n switch (sortBy) {\n case 'priority-desc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[b.priority || 'medium'] || 2) -\n (PRIORITY_MAP[a.priority || 'medium'] || 2),\n );\n break;\n case 'priority-asc':\n sorted.sort(\n (a, b) =>\n (PRIORITY_MAP[a.priority || 'medium'] || 2) -\n (PRIORITY_MAP[b.priority || 'medium'] || 2),\n );\n break;\n case 'due-asc':\n sorted.sort(\n (a, b) =>\n new Date(a.due_date || '9999').getTime() - new Date(b.due_date || '9999').getTime(),\n );\n break;\n case 'due-desc':\n sorted.sort(\n (a, b) =>\n new Date(b.due_date || '1970').getTime() - new Date(a.due_date || '1970').getTime(),\n );\n break;\n case 'title-asc':\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n break;\n case 'title-desc':\n sorted.sort((a, b) => b.title.localeCompare(a.title));\n break;\n }\n return sorted;\n }, [currentTasks, sortBy]);\n\n const handleStatusChange = React.useCallback(\n (taskId: string, targetStatus: string) => {\n if (!disableOptimisticUpdates) {\n setOptimisticTasks(\n currentTasks.map((task) =>\n task.id === taskId ? { ...task, [statusField]: targetStatus } : task,\n ),\n );\n }\n onStatusChange?.(taskId, targetStatus);\n },\n [currentTasks, disableOptimisticUpdates, statusField, onStatusChange],\n );\n const drag = useKanbanDrag({\n tasks: currentTasks,\n columns,\n statusField,\n readOnly,\n onStatusChange: handleStatusChange,\n });\n\n // カラムごとにタスクをグループ化\n const tasksByColumn = React.useMemo(() => {\n const result: Record<string, KanbanTask[]> = {};\n columns.forEach((col) => {\n result[col.id] = [];\n });\n tasks.forEach((task) => {\n const status = (task as Record<string, unknown>)[statusField] as string;\n if (result[status]) {\n result[status].push(task);\n }\n });\n return result;\n }, [tasks, columns, statusField]);\n\n return (\n <KanbanDragSurface controller={drag}>\n <div\n ref={ref}\n data-slot='kanban-board'\n data-testid={testId}\n className={cn('flex flex-col h-full', className)}\n >\n {/* ツールバー */}\n {showSort && (\n <div\n data-slot='kanban-toolbar'\n className='px-4 py-2 flex justify-end border-b border-border'\n >\n <SelectInput\n aria-label=\"Sort tasks\"\n value={sortBy}\n onValueChange={(v) => v && setSortBy(v as KanbanSortOption)}\n options={getSortOptions()}\n className='w-[180px] h-8 text-xs'\n testId={testId ? `${testId}-sort` : undefined}\n icon={<ArrowUpDown className='w-3 h-3 mr-2' />}\n />\n </div>\n )}\n\n {/* カラム */}\n <div\n data-slot='kanban-columns'\n role='region'\n aria-label='Kanban columns'\n tabIndex={0}\n className='flex h-full gap-4 p-4 overflow-x-auto items-start'\n >\n {columns.map((col) => (\n <KanbanColumn\n key={col.id}\n column={col}\n tasks={tasksByColumn[col.id] || []}\n testId={testId ? `${testId}-column-${col.id}` : undefined}\n onTaskClick={onTaskClick}\n renderCard={renderCard}\n readOnly={readOnly}\n />\n ))}\n </div>\n </div>\n </KanbanDragSurface>\n );\n },\n);\n\nKanbanBoard.displayName = 'KanbanBoard';\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/components/ui/badge-components.cjs"),n=require("./kanban-primitives.cjs"),r=require("./KanbanCard.cjs");let i=require("react/jsx-runtime"),a=require("react");a=e.__toESM(a,1);let o=require("@dnd-kit/sortable");var s=a.forwardRef(({column:e,tasks:s,onTaskClick:c,testId:l,renderCard:u,readOnly:d},f)=>{let p=e.limit?s.length>=e.limit:!1;return(0,i.jsxs)(n.KanbanColumnFrame,{ref:f,column:e,isOverLimit:p,"data-testid":l,children:[(0,i.jsxs)(`div`,{"data-slot":`kanban-column-header`,className:`flex items-center justify-between mb-3 px-1`,children:[(0,i.jsxs)(`div`,{className:`flex items-center gap-2`,children:[e.color&&(0,i.jsx)(`div`,{className:`w-2 h-2 rounded-full`,style:{backgroundColor:e.color}}),(0,i.jsx)(`
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/components/ui/badge-components.cjs"),n=require("./kanban-primitives.cjs"),r=require("./KanbanCard.cjs");let i=require("react/jsx-runtime"),a=require("react");a=e.__toESM(a,1);let o=require("@dnd-kit/sortable");var s=a.forwardRef(({column:e,tasks:s,onTaskClick:c,testId:l,renderCard:u,readOnly:d},f)=>{let p=e.limit?s.length>=e.limit:!1;return(0,i.jsxs)(n.KanbanColumnFrame,{ref:f,column:e,isOverLimit:p,"data-testid":l,children:[(0,i.jsxs)(`div`,{"data-slot":`kanban-column-header`,className:`flex items-center justify-between mb-3 px-1`,children:[(0,i.jsxs)(`div`,{className:`flex items-center gap-2`,children:[e.color&&(0,i.jsx)(`div`,{className:`w-2 h-2 rounded-full`,style:{backgroundColor:e.color}}),(0,i.jsx)(`h2`,{className:`font-semibold text-sm text-foreground`,children:e.title})]}),(0,i.jsxs)(t.Badge,{variant:p?`destructive`:`secondary`,className:`text-xs px-2 py-0.5`,children:[s.length,e.limit&&` / ${e.limit}`]})]}),(0,i.jsxs)(`div`,{"data-slot":`kanban-column-content`,className:`flex flex-1 flex-col gap-2 overflow-y-auto`,children:[(0,i.jsx)(o.SortableContext,{items:s.map(e=>e.id),strategy:o.verticalListSortingStrategy,children:s.map(e=>(0,i.jsx)(a.Fragment,{children:u?u({task:e,testId:l?`${l}-task-${e.id}`:void 0,onClick:()=>c?.(e),disableDrag:d}):(0,i.jsx)(r.KanbanCard,{task:e,testId:l?`${l}-task-${e.id}`:void 0,onClick:()=>c?.(e),disableDrag:d})},e.id))}),s.length===0&&(0,i.jsx)(`div`,{"data-slot":`kanban-column-empty`,className:`flex-1 flex items-center justify-center text-muted-foreground text-xs py-8`,children:`No tasks`})]})]})});s.displayName=`KanbanColumn`,exports.KanbanColumn=s;
|
|
2
2
|
//# sourceMappingURL=KanbanColumn.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KanbanColumn.cjs","names":["React","KanbanColumnFrame","Badge","SortableContext","verticalListSortingStrategy","KanbanCard","require_runtime","require_ui_components_ui_badge_components","require_tools_components_kanban_kanban_primitives","require_tools_components_kanban_KanbanCard","react_jsx_runtime","react","_dnd_kit_sortable","KanbanColumn","isOverLimit","column","tasks","testId","t","renderCard","task","onTaskClick","readOnly"],"sources":["../../../../src/tools/components/kanban/KanbanColumn.tsx"],"sourcesContent":["/**\n * Kanban Column Component\n *\n * カンバンボードの1列(ドロップゾーン)\n */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\n\nimport { Badge } from '../ui/badge';\nimport { KanbanCard } from './KanbanCard';\nimport { KanbanColumnFrame } from './kanban-primitives';\nimport type { KanbanColumnProps } from './types';\n\n/**\n * カンバンカラム\n */\nexport const KanbanColumn = React.forwardRef<HTMLDivElement, KanbanColumnProps>(\n ({ column, tasks, onTaskClick, testId, renderCard, readOnly }, ref) => {\n const isOverLimit = column.limit ? tasks.length >= column.limit : false;\n\n return (\n <KanbanColumnFrame ref={ref} column={column} isOverLimit={isOverLimit} data-testid={testId}>\n {/* ヘッダー */}\n <div\n data-slot='kanban-column-header'\n className='flex items-center justify-between mb-3 px-1'\n >\n <div className='flex items-center gap-2'>\n {column.color && (\n <div className='w-2 h-2 rounded-full' style={{ backgroundColor: column.color }} />\n )}\n <
|
|
1
|
+
{"version":3,"file":"KanbanColumn.cjs","names":["React","KanbanColumnFrame","Badge","SortableContext","verticalListSortingStrategy","KanbanCard","require_runtime","require_ui_components_ui_badge_components","require_tools_components_kanban_kanban_primitives","require_tools_components_kanban_KanbanCard","react_jsx_runtime","react","_dnd_kit_sortable","KanbanColumn","isOverLimit","column","tasks","testId","t","renderCard","task","onTaskClick","readOnly"],"sources":["../../../../src/tools/components/kanban/KanbanColumn.tsx"],"sourcesContent":["/**\n * Kanban Column Component\n *\n * カンバンボードの1列(ドロップゾーン)\n */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\n\nimport { Badge } from '../ui/badge';\nimport { KanbanCard } from './KanbanCard';\nimport { KanbanColumnFrame } from './kanban-primitives';\nimport type { KanbanColumnProps } from './types';\n\n/**\n * カンバンカラム\n */\nexport const KanbanColumn = React.forwardRef<HTMLDivElement, KanbanColumnProps>(\n ({ column, tasks, onTaskClick, testId, renderCard, readOnly }, ref) => {\n const isOverLimit = column.limit ? tasks.length >= column.limit : false;\n\n return (\n <KanbanColumnFrame ref={ref} column={column} isOverLimit={isOverLimit} data-testid={testId}>\n {/* ヘッダー */}\n <div\n data-slot='kanban-column-header'\n className='flex items-center justify-between mb-3 px-1'\n >\n <div className='flex items-center gap-2'>\n {column.color && (\n <div className='w-2 h-2 rounded-full' style={{ backgroundColor: column.color }} />\n )}\n <h2 className='font-semibold text-sm text-foreground'>{column.title}</h2>\n </div>\n <Badge\n variant={isOverLimit ? 'destructive' : 'secondary'}\n className='text-xs px-2 py-0.5'\n >\n {tasks.length}\n {column.limit && ` / ${column.limit}`}\n </Badge>\n </div>\n\n {/* タスクリスト */}\n <div\n data-slot='kanban-column-content'\n className='flex flex-1 flex-col gap-2 overflow-y-auto'\n >\n <SortableContext items={tasks.map((t) => t.id)} strategy={verticalListSortingStrategy}>\n {tasks.map((task) => (\n <React.Fragment key={task.id}>\n {renderCard ? (\n renderCard({\n task,\n testId: testId ? `${testId}-task-${task.id}` : undefined,\n onClick: () => onTaskClick?.(task),\n disableDrag: readOnly,\n })\n ) : (\n <KanbanCard\n task={task}\n testId={testId ? `${testId}-task-${task.id}` : undefined}\n onClick={() => onTaskClick?.(task)}\n disableDrag={readOnly}\n />\n )}\n </React.Fragment>\n ))}\n </SortableContext>\n\n {/* 空状態 */}\n {tasks.length === 0 && (\n <div\n data-slot='kanban-column-empty'\n className='flex-1 flex items-center justify-center text-muted-foreground text-xs py-8'\n >\n No tasks\n </div>\n )}\n </div>\n </KanbanColumnFrame>\n );\n },\n);\n\nKanbanColumn.displayName = 'KanbanColumn';\n"],"mappings":"A,oXAiBA,IAAaa,EAAeb,EAAM,YAC/B,CAAE,SAAQ,QAAO,cAAa,SAAQ,aAAY,YAAY,IAAQ,CACrE,IAAMc,EAAcC,EAAO,MAAQC,EAAM,QAAUD,EAAO,MAAQ,GAElE,OACE,EAAAL,EAAA,KAAA,CAACT,EAAAA,kBAAD,CAAwB,MAAa,SAAqB,cAAa,cAAagB,EAApF,SAAA,EAEE,EAAAP,EAAA,KAAA,CAAC,MAAD,CACE,YAAU,uBACV,UAAU,8CAFZ,SAAA,EAIE,EAAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,0BAAf,SAAA,CACGK,EAAO,QACN,EAAAL,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,uBAAuB,MAAO,CAAE,gBAAiBK,EAAO,KAAM,CAAI,CAAA,GAEnF,EAAAL,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,wCAAyC,SAAAK,EAAO,KAAU,CAAA,CACrE,CACL,CAAA,GAAA,EAAAL,EAAA,KAAA,CAACR,EAAAA,MAAD,CACE,QAASY,EAAc,cAAgB,YACvC,UAAU,sBAFZ,SAAA,CAIGE,EAAM,OACND,EAAO,OAAS,MAAMA,EAAO,OACzB,CACJ,CAAA,CAAA,CAGL,CAAA,GAAA,EAAAL,EAAA,KAAA,CAAC,MAAD,CACE,YAAU,wBACV,UAAU,6CAFZ,SAAA,EAIE,EAAAA,EAAA,IAAA,CAACP,EAAAA,gBAAD,CAAiB,MAAOa,EAAM,IAAK,GAAME,EAAE,EAAE,EAAG,SAAUd,EAAAA,4BACvD,SAAAY,EAAM,IAAK,IACV,EAAAN,EAAA,IAAA,CAACV,EAAM,SAAP,CAAA,SACGmB,EACCA,EAAW,CACT,OACA,OAAQF,EAAS,GAAGA,EAAO,QAAQG,EAAK,KAAO,IAAA,GAC/C,YAAeC,IAAcD,CAAI,EACjC,YAAaE,CACf,CAAC,GAED,EAAAZ,EAAA,IAAA,CAACL,EAAAA,WAAD,CACQ,OACN,OAAQY,EAAS,GAAGA,EAAO,QAAQG,EAAK,KAAO,IAAA,GAC/C,YAAeC,IAAcD,CAAI,EACjC,YAAaE,CACd,CAAA,CAEW,EAhBKF,EAAK,EAgBV,CACjB,CACc,CAAA,EAGhBJ,EAAM,SAAW,IAChB,EAAAN,EAAA,IAAA,CAAC,MAAD,CACE,YAAU,sBACV,UAAU,6EACX,SAAA,UAEI,CAAA,CAEJ,CACY,CAAA,CAAA,C,EAEvB,CACF,EAEA,EAAa,YAAc,e"}
|
|
@@ -21,7 +21,7 @@ var c = a.forwardRef(({ column: c, tasks: l, onTaskClick: u, testId: d, renderCa
|
|
|
21
21
|
children: [c.color && /* @__PURE__ */ r("div", {
|
|
22
22
|
className: "w-2 h-2 rounded-full",
|
|
23
23
|
style: { backgroundColor: c.color }
|
|
24
|
-
}), /* @__PURE__ */ r("
|
|
24
|
+
}), /* @__PURE__ */ r("h2", {
|
|
25
25
|
className: "font-semibold text-sm text-foreground",
|
|
26
26
|
children: c.title
|
|
27
27
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KanbanColumn.js","names":["React","React$1","KanbanColumn","isOverLimit","column","tasks","KanbanColumnFrame","testId","Badge","SortableContext","t","verticalListSortingStrategy","renderCard","task","onTaskClick","readOnly","KanbanCard"],"sources":["../../../../src/tools/components/kanban/KanbanColumn.tsx"],"sourcesContent":["/**\n * Kanban Column Component\n *\n * カンバンボードの1列(ドロップゾーン)\n */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\n\nimport { Badge } from '../ui/badge';\nimport { KanbanCard } from './KanbanCard';\nimport { KanbanColumnFrame } from './kanban-primitives';\nimport type { KanbanColumnProps } from './types';\n\n/**\n * カンバンカラム\n */\nexport const KanbanColumn = React.forwardRef<HTMLDivElement, KanbanColumnProps>(\n ({ column, tasks, onTaskClick, testId, renderCard, readOnly }, ref) => {\n const isOverLimit = column.limit ? tasks.length >= column.limit : false;\n\n return (\n <KanbanColumnFrame ref={ref} column={column} isOverLimit={isOverLimit} data-testid={testId}>\n {/* ヘッダー */}\n <div\n data-slot='kanban-column-header'\n className='flex items-center justify-between mb-3 px-1'\n >\n <div className='flex items-center gap-2'>\n {column.color && (\n <div className='w-2 h-2 rounded-full' style={{ backgroundColor: column.color }} />\n )}\n <
|
|
1
|
+
{"version":3,"file":"KanbanColumn.js","names":["React","React$1","KanbanColumn","isOverLimit","column","tasks","KanbanColumnFrame","testId","Badge","SortableContext","t","verticalListSortingStrategy","renderCard","task","onTaskClick","readOnly","KanbanCard"],"sources":["../../../../src/tools/components/kanban/KanbanColumn.tsx"],"sourcesContent":["/**\n * Kanban Column Component\n *\n * カンバンボードの1列(ドロップゾーン)\n */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\n\nimport { Badge } from '../ui/badge';\nimport { KanbanCard } from './KanbanCard';\nimport { KanbanColumnFrame } from './kanban-primitives';\nimport type { KanbanColumnProps } from './types';\n\n/**\n * カンバンカラム\n */\nexport const KanbanColumn = React.forwardRef<HTMLDivElement, KanbanColumnProps>(\n ({ column, tasks, onTaskClick, testId, renderCard, readOnly }, ref) => {\n const isOverLimit = column.limit ? tasks.length >= column.limit : false;\n\n return (\n <KanbanColumnFrame ref={ref} column={column} isOverLimit={isOverLimit} data-testid={testId}>\n {/* ヘッダー */}\n <div\n data-slot='kanban-column-header'\n className='flex items-center justify-between mb-3 px-1'\n >\n <div className='flex items-center gap-2'>\n {column.color && (\n <div className='w-2 h-2 rounded-full' style={{ backgroundColor: column.color }} />\n )}\n <h2 className='font-semibold text-sm text-foreground'>{column.title}</h2>\n </div>\n <Badge\n variant={isOverLimit ? 'destructive' : 'secondary'}\n className='text-xs px-2 py-0.5'\n >\n {tasks.length}\n {column.limit && ` / ${column.limit}`}\n </Badge>\n </div>\n\n {/* タスクリスト */}\n <div\n data-slot='kanban-column-content'\n className='flex flex-1 flex-col gap-2 overflow-y-auto'\n >\n <SortableContext items={tasks.map((t) => t.id)} strategy={verticalListSortingStrategy}>\n {tasks.map((task) => (\n <React.Fragment key={task.id}>\n {renderCard ? (\n renderCard({\n task,\n testId: testId ? `${testId}-task-${task.id}` : undefined,\n onClick: () => onTaskClick?.(task),\n disableDrag: readOnly,\n })\n ) : (\n <KanbanCard\n task={task}\n testId={testId ? `${testId}-task-${task.id}` : undefined}\n onClick={() => onTaskClick?.(task)}\n disableDrag={readOnly}\n />\n )}\n </React.Fragment>\n ))}\n </SortableContext>\n\n {/* 空状態 */}\n {tasks.length === 0 && (\n <div\n data-slot='kanban-column-empty'\n className='flex-1 flex items-center justify-center text-muted-foreground text-xs py-8'\n >\n No tasks\n </div>\n )}\n </div>\n </KanbanColumnFrame>\n );\n },\n);\n\nKanbanColumn.displayName = 'KanbanColumn';\n"],"mappings":";;;;;;;;AAiBA,IAAaE,IAAeF,EAAM,YAC/B,EAAE,WAAQ,UAAO,gBAAa,WAAQ,eAAY,eAAY,MAAQ;CACrE,IAAMG,IAAcC,EAAO,QAAQC,EAAM,UAAUD,EAAO,QAAQ;CAElE,OACE,kBAACE,GAAD;EAAwB;EAAa;EAAqB;EAAa,eAAaC;EAApF,UAAA,CAEE,kBAAC,OAAD;GACE,aAAU;GACV,WAAU;GAFZ,UAAA,CAIE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACGH,EAAO,SACN,kBAAC,OAAD;KAAK,WAAU;KAAuB,OAAO,EAAE,iBAAiBA,EAAO,MAAM;IAAI,CAAA,GAEnF,kBAAC,MAAD;KAAI,WAAU;KAAyC,UAAAA,EAAO;IAAU,CAAA,CACrE;GACL,CAAA,GAAA,kBAACI,GAAD;IACE,SAASL,IAAc,gBAAgB;IACvC,WAAU;IAFZ,UAAA,CAIGE,EAAM,QACND,EAAO,SAAS,MAAMA,EAAO,OACzB;GACJ,CAAA,CAAA;EAGL,CAAA,GAAA,kBAAC,OAAD;GACE,aAAU;GACV,WAAU;GAFZ,UAAA,CAIE,kBAACK,GAAD;IAAiB,OAAOJ,EAAM,KAAK,MAAMK,EAAE,EAAE;IAAG,UAAUC;IACvD,UAAAN,EAAM,KAAK,MACV,kBAACL,EAAM,UAAP,EAAA,UACGY,IACCA,EAAW;KACT;KACA,QAAQL,IAAS,GAAGA,EAAO,QAAQM,EAAK,OAAO,KAAA;KAC/C,eAAeC,IAAcD,CAAI;KACjC,aAAaE;IACf,CAAC,IAED,kBAACC,GAAD;KACQ;KACN,QAAQT,IAAS,GAAGA,EAAO,QAAQM,EAAK,OAAO,KAAA;KAC/C,eAAeC,IAAcD,CAAI;KACjC,aAAaE;IACd,CAAA,EAEW,GAhBKF,EAAK,EAgBV,CACjB;GACc,CAAA,GAGhBR,EAAM,WAAW,KAChB,kBAAC,OAAD;IACE,aAAU;IACV,WAAU;IACX,UAAA;GAEI,CAAA,CAEJ;EACY,CAAA,CAAA;;AAEvB,CACF;AAEA,EAAa,cAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../../ui/components/ui/badge-components.cjs"),r=require("./KanbanCardView.cjs"),i=require("./kanban-primitives.cjs"),a=require("./use-kanban-drag.cjs");let o=require("react/jsx-runtime"),s=require("react");s=e.__toESM(s,1);let c=require("@dnd-kit/sortable");var l=s.createContext(null);function u(){let e=s.useContext(l);if(!e)throw Error(`Kanban compound components must be used within <Kanban.Root>`);return e}function d({tasks:e,onStatusChange:n,onTaskClick:r,statusField:c=`status`,readOnly:u=!1,children:d,className:f,...p}){let m=a.useKanbanDrag({tasks:e,onStatusChange:n,statusField:c,readOnly:u}),{activeTask:h}=m,g=s.useMemo(()=>({activeTask:h,onTaskClick:r,statusField:c,readOnly:u}),[h,r,c,u]);return(0,o.jsx)(i.KanbanDragSurface,{controller:m,overlayClassName:`rotate-2 scale-105 opacity-90 shadow-2xl`,children:(0,o.jsx)(l.Provider,{value:g,children:(0,o.jsx)(`div`,{className:t.cn(`flex h-full w-full gap-4 overflow-x-auto pb-4`,f),...p,children:d})})})}function f({column:e,children:t,className:n,...r}){return(0,o.jsx)(i.KanbanColumnFrame,{column:e,className:n,...r,children:t})}function p({title:e,count:r,limit:i,color:a,action:s,className:c,children:l,...u}){let d=i&&r!==void 0?r>=i:!1;return(0,o.jsxs)(`div`,{className:t.cn(`flex items-center justify-between mb-3 px-1`,c),...u,children:[(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[a&&(0,o.jsx)(`div`,{className:`w-2.5 h-2.5 rounded-full`,style:{backgroundColor:a}}),e&&(0,o.jsx)(`
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../../ui/components/ui/badge-components.cjs"),r=require("./KanbanCardView.cjs"),i=require("./kanban-primitives.cjs"),a=require("./use-kanban-drag.cjs");let o=require("react/jsx-runtime"),s=require("react");s=e.__toESM(s,1);let c=require("@dnd-kit/sortable");var l=s.createContext(null);function u(){let e=s.useContext(l);if(!e)throw Error(`Kanban compound components must be used within <Kanban.Root>`);return e}function d({tasks:e,onStatusChange:n,onTaskClick:r,statusField:c=`status`,readOnly:u=!1,children:d,className:f,...p}){let m=a.useKanbanDrag({tasks:e,onStatusChange:n,statusField:c,readOnly:u}),{activeTask:h}=m,g=s.useMemo(()=>({activeTask:h,onTaskClick:r,statusField:c,readOnly:u}),[h,r,c,u]);return(0,o.jsx)(i.KanbanDragSurface,{controller:m,overlayClassName:`rotate-2 scale-105 opacity-90 shadow-2xl`,children:(0,o.jsx)(l.Provider,{value:g,children:(0,o.jsx)(`div`,{role:`region`,"aria-label":`Kanban columns`,tabIndex:0,className:t.cn(`flex h-full w-full gap-4 overflow-x-auto pb-4`,f),...p,children:d})})})}function f({column:e,children:t,className:n,...r}){return(0,o.jsx)(i.KanbanColumnFrame,{column:e,className:n,...r,children:t})}function p({title:e,count:r,limit:i,color:a,action:s,className:c,children:l,...u}){let d=i&&r!==void 0?r>=i:!1;return(0,o.jsxs)(`div`,{className:t.cn(`flex items-center justify-between mb-3 px-1`,c),...u,children:[(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[a&&(0,o.jsx)(`div`,{className:`w-2.5 h-2.5 rounded-full`,style:{backgroundColor:a}}),e&&(0,o.jsx)(`h2`,{className:`font-semibold text-sm text-foreground`,children:e}),l]}),(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[r!==void 0&&(0,o.jsxs)(n.Badge,{variant:d?`destructive`:`secondary`,className:`text-xs px-2 py-0.5`,children:[r,i&&` / ${i}`]}),s]})]})}function m({tasks:e,emptyMessage:n=`No tasks`,className:r,children:i,...a}){return(0,o.jsx)(`div`,{"data-slot":`kanban-column-content`,className:t.cn(`flex flex-1 flex-col gap-2 overflow-y-auto`,r),...a,children:(0,o.jsx)(c.SortableContext,{items:e.map(e=>e.id),strategy:c.verticalListSortingStrategy,children:i||(e.length>0?e.map(e=>(0,o.jsx)(h,{task:e},e.id)):(0,o.jsx)(`div`,{className:`flex-1 flex items-center justify-center text-muted-foreground text-xs py-8`,children:n}))})})}function h({task:e,children:n,className:a,...s}){let{onTaskClick:c,readOnly:l}=u();return(0,o.jsx)(i.KanbanDraggableCard,{task:e,disabled:l,onClick:()=>c?.(e),...s,className:t.cn(n&&`rounded-lg border border-border bg-card p-3 shadow-sm hover:shadow transition-shadow`,a),children:n||(0,o.jsx)(r.KanbanCardView,{task:e})})}var g={Root:d,Column:f,ColumnHeader:p,ColumnBody:m,Card:h};exports.Kanban=g,exports.KanbanCardSlot=h,exports.KanbanColumnBodySlot=m,exports.KanbanColumnHeaderSlot=p,exports.KanbanColumnSlot=f,exports.KanbanRoot=d,exports.useKanbanCompoundContext=u;
|
|
2
2
|
//# sourceMappingURL=kanban-compound.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban-compound.cjs","names":["React","useKanbanDrag","KanbanDragSurface","cn","KanbanColumnFrame","Badge","SortableContext","verticalListSortingStrategy","KanbanDraggableCard","KanbanCardView","require_runtime","require_ui_lib_utils","require_ui_components_ui_badge_components","require_tools_components_kanban_KanbanCardView","require_tools_components_kanban_kanban_primitives","require_tools_components_kanban_use_kanban_drag","react_jsx_runtime","react","_dnd_kit_sortable","KanbanCompoundContext","useKanbanCompoundContext","context","KanbanRoot","props","drag","contextValue","activeTask","onTaskClick","statusField","readOnly","className","KanbanColumnSlot","KanbanColumnHeaderSlot","isOverLimit","limit","count","color","title","children","action","KanbanColumnBodySlot","tasks","t","KanbanCardSlot","task","emptyMessage","Kanban"],"sources":["../../../../src/tools/components/kanban/kanban-compound.tsx"],"sourcesContent":["/**\n * @fileoverview Kanban Compound Components (Kanban)\n *\n * 合成可能なカンバンボードUIコンポーネント群。\n * プリセットの `<KanbanBoard>` では対応しきれないカラムヘッダーへのカスタムボタン配置や\n * カード内の独自スロット挿入を可能にします。\n *\n * @module kanban/kanban-compound\n */\n\n/* eslint-disable react-refresh/only-export-components */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from '../ui/badge';\nimport { KanbanCardView } from './KanbanCardView';\nimport { KanbanColumnFrame, KanbanDraggableCard, KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanTask, KanbanColumn as KanbanColumnType } from './types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport interface KanbanCompoundContextValue {\n /** 読み取り専用 */\n readOnly?: boolean;\n activeTask: KanbanTask | null;\n onTaskClick?: (task: KanbanTask) => void;\n statusField: string;\n}\n\nconst KanbanCompoundContext = React.createContext<KanbanCompoundContextValue | null>(null);\n\n/**\n * KanbanCompound のコンテキストを取得するフック\n */\nexport function useKanbanCompoundContext() {\n const context = React.useContext(KanbanCompoundContext);\n if (!context) {\n throw new Error('Kanban compound components must be used within <Kanban.Root>');\n }\n return context;\n}\n\n// =============================================================================\n// Kanban Root\n// =============================================================================\n\nexport interface KanbanRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 読み取り専用。ドラッグを開始しません。 */\n readOnly?: boolean;\n tasks: KanbanTask[];\n onStatusChange?: (taskId: string, newStatus: string) => void;\n onTaskClick?: (task: KanbanTask) => void;\n statusField?: string;\n children: React.ReactNode;\n}\n\n/**\n * プリセット版とD&D処理を共有するルート。tasksと列への振り分けは親が更新します(楽観的更新なし)。\n */\nexport function KanbanRoot({\n tasks,\n onStatusChange,\n onTaskClick,\n statusField = 'status',\n readOnly = false,\n children,\n className,\n ...props\n}: KanbanRootProps) {\n const drag = useKanbanDrag({ tasks, onStatusChange, statusField, readOnly });\n const { activeTask } = drag;\n\n const contextValue = React.useMemo<KanbanCompoundContextValue>(\n () => ({ activeTask, onTaskClick, statusField, readOnly }),\n [activeTask, onTaskClick, statusField, readOnly],\n );\n\n return (\n <KanbanDragSurface\n controller={drag}\n overlayClassName='rotate-2 scale-105 opacity-90 shadow-2xl'\n >\n <KanbanCompoundContext.Provider value={contextValue}>\n <div className={cn('flex h-full w-full gap-4 overflow-x-auto pb-4', className)} {...props}>\n {children}\n </div>\n </KanbanCompoundContext.Provider>\n </KanbanDragSurface>\n );\n}\n\n// =============================================================================\n// Kanban Column\n// =============================================================================\n\nexport interface KanbanColumnProps extends React.HTMLAttributes<HTMLDivElement> {\n column: KanbanColumnType;\n children: React.ReactNode;\n}\n\n/**\n * カンバンボードのカラムコンテナ\n */\nexport function KanbanColumnSlot({ column, children, className, ...props }: KanbanColumnProps) {\n return (\n <KanbanColumnFrame column={column} className={className} {...props}>\n {children}\n </KanbanColumnFrame>\n );\n}\n\n// =============================================================================\n// Kanban Column Header\n// =============================================================================\n\nexport interface KanbanColumnHeaderProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n title?: React.ReactNode;\n count?: number;\n limit?: number;\n color?: string;\n action?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのヘッダー\n */\nexport function KanbanColumnHeaderSlot({\n title,\n count,\n limit,\n color,\n action,\n className,\n children,\n ...props\n}: KanbanColumnHeaderProps) {\n const isOverLimit = limit && count !== undefined ? count >= limit : false;\n\n return (\n <div className={cn('flex items-center justify-between mb-3 px-1', className)} {...props}>\n <div className='flex items-center gap-2'>\n {color && <div className='w-2.5 h-2.5 rounded-full' style={{ backgroundColor: color }} />}\n {title && <h3 className='font-semibold text-sm text-foreground'>{title}</h3>}\n {children}\n </div>\n <div className='flex items-center gap-2'>\n {count !== undefined && (\n <Badge\n variant={isOverLimit ? 'destructive' : 'secondary'}\n className='text-xs px-2 py-0.5'\n >\n {count}\n {limit && ` / ${limit}`}\n </Badge>\n )}\n {action}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Column Body\n// =============================================================================\n\nexport interface KanbanColumnBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n tasks: KanbanTask[];\n emptyMessage?: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのタスク一覧領域\n */\nexport function KanbanColumnBodySlot({\n tasks,\n emptyMessage = 'No tasks',\n className,\n children,\n ...props\n}: KanbanColumnBodyProps) {\n return (\n <div\n data-slot='kanban-column-content'\n className={cn('flex flex-1 flex-col gap-2 overflow-y-auto', className)}\n {...props}\n >\n <SortableContext items={tasks.map((t) => t.id)} strategy={verticalListSortingStrategy}>\n {children ? (\n children\n ) : tasks.length > 0 ? (\n tasks.map((task) => <KanbanCardSlot key={task.id} task={task} />)\n ) : (\n <div className='flex-1 flex items-center justify-center text-muted-foreground text-xs py-8'>\n {emptyMessage}\n </div>\n )}\n </SortableContext>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Card Slot\n// =============================================================================\n\nexport interface KanbanCardSlotProps extends React.HTMLAttributes<HTMLDivElement> {\n task: KanbanTask;\n children?: React.ReactNode;\n}\n\n/**\n * ドラッグ&ドロップ対応のカンバンカード\n */\nexport function KanbanCardSlot({ task, children, className, ...props }: KanbanCardSlotProps) {\n const { onTaskClick, readOnly } = useKanbanCompoundContext();\n return (\n <KanbanDraggableCard\n task={task}\n disabled={readOnly}\n onClick={() => onTaskClick?.(task)}\n {...props}\n className={cn(\n children &&\n 'rounded-lg border border-border bg-card p-3 shadow-sm hover:shadow transition-shadow',\n className,\n )}\n >\n {children || <KanbanCardView task={task} />}\n </KanbanDraggableCard>\n );\n}\n\n// =============================================================================\n// Export Object\n// =============================================================================\n\nexport const Kanban = {\n Root: KanbanRoot,\n Column: KanbanColumnSlot,\n ColumnHeader: KanbanColumnHeaderSlot,\n ColumnBody: KanbanColumnBodySlot,\n Card: KanbanCardSlot,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kanban-compound.cjs","names":["React","useKanbanDrag","KanbanDragSurface","cn","KanbanColumnFrame","Badge","SortableContext","verticalListSortingStrategy","KanbanDraggableCard","KanbanCardView","require_runtime","require_ui_lib_utils","require_ui_components_ui_badge_components","require_tools_components_kanban_KanbanCardView","require_tools_components_kanban_kanban_primitives","require_tools_components_kanban_use_kanban_drag","react_jsx_runtime","react","_dnd_kit_sortable","KanbanCompoundContext","useKanbanCompoundContext","context","KanbanRoot","props","drag","contextValue","activeTask","onTaskClick","statusField","readOnly","className","KanbanColumnSlot","KanbanColumnHeaderSlot","isOverLimit","limit","count","color","title","children","action","KanbanColumnBodySlot","tasks","t","KanbanCardSlot","task","emptyMessage","Kanban"],"sources":["../../../../src/tools/components/kanban/kanban-compound.tsx"],"sourcesContent":["/**\n * @fileoverview Kanban Compound Components (Kanban)\n *\n * 合成可能なカンバンボードUIコンポーネント群。\n * プリセットの `<KanbanBoard>` では対応しきれないカラムヘッダーへのカスタムボタン配置や\n * カード内の独自スロット挿入を可能にします。\n *\n * @module kanban/kanban-compound\n */\n\n/* eslint-disable react-refresh/only-export-components */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from '../ui/badge';\nimport { KanbanCardView } from './KanbanCardView';\nimport { KanbanColumnFrame, KanbanDraggableCard, KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanTask, KanbanColumn as KanbanColumnType } from './types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport interface KanbanCompoundContextValue {\n /** 読み取り専用 */\n readOnly?: boolean;\n activeTask: KanbanTask | null;\n onTaskClick?: (task: KanbanTask) => void;\n statusField: string;\n}\n\nconst KanbanCompoundContext = React.createContext<KanbanCompoundContextValue | null>(null);\n\n/**\n * KanbanCompound のコンテキストを取得するフック\n */\nexport function useKanbanCompoundContext() {\n const context = React.useContext(KanbanCompoundContext);\n if (!context) {\n throw new Error('Kanban compound components must be used within <Kanban.Root>');\n }\n return context;\n}\n\n// =============================================================================\n// Kanban Root\n// =============================================================================\n\nexport interface KanbanRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 読み取り専用。ドラッグを開始しません。 */\n readOnly?: boolean;\n tasks: KanbanTask[];\n onStatusChange?: (taskId: string, newStatus: string) => void;\n onTaskClick?: (task: KanbanTask) => void;\n statusField?: string;\n children: React.ReactNode;\n}\n\n/**\n * プリセット版とD&D処理を共有するルート。tasksと列への振り分けは親が更新します(楽観的更新なし)。\n */\nexport function KanbanRoot({\n tasks,\n onStatusChange,\n onTaskClick,\n statusField = 'status',\n readOnly = false,\n children,\n className,\n ...props\n}: KanbanRootProps) {\n const drag = useKanbanDrag({ tasks, onStatusChange, statusField, readOnly });\n const { activeTask } = drag;\n\n const contextValue = React.useMemo<KanbanCompoundContextValue>(\n () => ({ activeTask, onTaskClick, statusField, readOnly }),\n [activeTask, onTaskClick, statusField, readOnly],\n );\n\n return (\n <KanbanDragSurface\n controller={drag}\n overlayClassName='rotate-2 scale-105 opacity-90 shadow-2xl'\n >\n <KanbanCompoundContext.Provider value={contextValue}>\n <div role='region' aria-label='Kanban columns' tabIndex={0} className={cn('flex h-full w-full gap-4 overflow-x-auto pb-4', className)} {...props}>\n {children}\n </div>\n </KanbanCompoundContext.Provider>\n </KanbanDragSurface>\n );\n}\n\n// =============================================================================\n// Kanban Column\n// =============================================================================\n\nexport interface KanbanColumnProps extends React.HTMLAttributes<HTMLDivElement> {\n column: KanbanColumnType;\n children: React.ReactNode;\n}\n\n/**\n * カンバンボードのカラムコンテナ\n */\nexport function KanbanColumnSlot({ column, children, className, ...props }: KanbanColumnProps) {\n return (\n <KanbanColumnFrame column={column} className={className} {...props}>\n {children}\n </KanbanColumnFrame>\n );\n}\n\n// =============================================================================\n// Kanban Column Header\n// =============================================================================\n\nexport interface KanbanColumnHeaderProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n title?: React.ReactNode;\n count?: number;\n limit?: number;\n color?: string;\n action?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのヘッダー\n */\nexport function KanbanColumnHeaderSlot({\n title,\n count,\n limit,\n color,\n action,\n className,\n children,\n ...props\n}: KanbanColumnHeaderProps) {\n const isOverLimit = limit && count !== undefined ? count >= limit : false;\n\n return (\n <div className={cn('flex items-center justify-between mb-3 px-1', className)} {...props}>\n <div className='flex items-center gap-2'>\n {color && <div className='w-2.5 h-2.5 rounded-full' style={{ backgroundColor: color }} />}\n {title && <h2 className='font-semibold text-sm text-foreground'>{title}</h2>}\n {children}\n </div>\n <div className='flex items-center gap-2'>\n {count !== undefined && (\n <Badge\n variant={isOverLimit ? 'destructive' : 'secondary'}\n className='text-xs px-2 py-0.5'\n >\n {count}\n {limit && ` / ${limit}`}\n </Badge>\n )}\n {action}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Column Body\n// =============================================================================\n\nexport interface KanbanColumnBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n tasks: KanbanTask[];\n emptyMessage?: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのタスク一覧領域\n */\nexport function KanbanColumnBodySlot({\n tasks,\n emptyMessage = 'No tasks',\n className,\n children,\n ...props\n}: KanbanColumnBodyProps) {\n return (\n <div\n data-slot='kanban-column-content'\n className={cn('flex flex-1 flex-col gap-2 overflow-y-auto', className)}\n {...props}\n >\n <SortableContext items={tasks.map((t) => t.id)} strategy={verticalListSortingStrategy}>\n {children ? (\n children\n ) : tasks.length > 0 ? (\n tasks.map((task) => <KanbanCardSlot key={task.id} task={task} />)\n ) : (\n <div className='flex-1 flex items-center justify-center text-muted-foreground text-xs py-8'>\n {emptyMessage}\n </div>\n )}\n </SortableContext>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Card Slot\n// =============================================================================\n\nexport interface KanbanCardSlotProps extends React.HTMLAttributes<HTMLDivElement> {\n task: KanbanTask;\n children?: React.ReactNode;\n}\n\n/**\n * ドラッグ&ドロップ対応のカンバンカード\n */\nexport function KanbanCardSlot({ task, children, className, ...props }: KanbanCardSlotProps) {\n const { onTaskClick, readOnly } = useKanbanCompoundContext();\n return (\n <KanbanDraggableCard\n task={task}\n disabled={readOnly}\n onClick={() => onTaskClick?.(task)}\n {...props}\n className={cn(\n children &&\n 'rounded-lg border border-border bg-card p-3 shadow-sm hover:shadow transition-shadow',\n className,\n )}\n >\n {children || <KanbanCardView task={task} />}\n </KanbanDraggableCard>\n );\n}\n\n// =============================================================================\n// Export Object\n// =============================================================================\n\nexport const Kanban = {\n Root: KanbanRoot,\n Column: KanbanColumnSlot,\n ColumnHeader: KanbanColumnHeaderSlot,\n ColumnBody: KanbanColumnBodySlot,\n Card: KanbanCardSlot,\n};\n"],"mappings":"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"}
|
|
@@ -37,6 +37,9 @@ function m({ tasks: t, onStatusChange: n, onTaskClick: r, statusField: a = "stat
|
|
|
37
37
|
children: /* @__PURE__ */ s(f.Provider, {
|
|
38
38
|
value: g,
|
|
39
39
|
children: /* @__PURE__ */ s("div", {
|
|
40
|
+
role: "region",
|
|
41
|
+
"aria-label": "Kanban columns",
|
|
42
|
+
tabIndex: 0,
|
|
40
43
|
className: e("flex h-full w-full gap-4 overflow-x-auto pb-4", d),
|
|
41
44
|
...p,
|
|
42
45
|
children: u
|
|
@@ -64,7 +67,7 @@ function g({ title: n, count: r, limit: i, color: a, action: o, className: l, ch
|
|
|
64
67
|
className: "w-2.5 h-2.5 rounded-full",
|
|
65
68
|
style: { backgroundColor: a }
|
|
66
69
|
}),
|
|
67
|
-
n && /* @__PURE__ */ s("
|
|
70
|
+
n && /* @__PURE__ */ s("h2", {
|
|
68
71
|
className: "font-semibold text-sm text-foreground",
|
|
69
72
|
children: n
|
|
70
73
|
}),
|