@polderlabs/bizar 7.0.2 → 8.0.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/.claude/settings.local.json +8 -0
- package/bizar-dash/DESIGN.md +729 -969
- package/bizar-dash/GLYPH.md +418 -0
- package/bizar-dash/PLAN.md +1135 -0
- package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js +6 -0
- package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js.map +1 -0
- package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js +1 -0
- package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js.map +1 -0
- package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js +1 -0
- package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js.map +1 -0
- package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js +8 -0
- package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js.map +1 -0
- package/bizar-dash/dist/assets/Badge-Cd61wsBa.js +1 -0
- package/bizar-dash/dist/assets/Badge-Cd61wsBa.js.map +1 -0
- package/bizar-dash/dist/assets/Card-C_bvqXdQ.js +1 -0
- package/bizar-dash/dist/assets/Card-C_bvqXdQ.js.map +1 -0
- package/bizar-dash/dist/assets/EmptyState-BWQuKnk9.js +1 -0
- package/bizar-dash/dist/assets/EmptyState-BWQuKnk9.js.map +1 -0
- package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js +11 -0
- package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js.map +1 -0
- package/bizar-dash/dist/assets/Grid-C62gCPqt.js +1 -0
- package/bizar-dash/dist/assets/Grid-C62gCPqt.js.map +1 -0
- package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js +21 -0
- package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js.map +1 -0
- package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js +67 -0
- package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js.map +1 -0
- package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js +13 -0
- package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js.map +1 -0
- package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js +1 -0
- package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js.map +1 -0
- package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js +1 -0
- package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js +30 -0
- package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js +48 -0
- package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js.map +1 -0
- package/bizar-dash/dist/assets/StatTile-BkIP32gG.js +11 -0
- package/bizar-dash/dist/assets/StatTile-BkIP32gG.js.map +1 -0
- package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js +1 -0
- package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js.map +1 -0
- package/bizar-dash/dist/assets/ViewHeader-D6c2cw1b.js +6 -0
- package/bizar-dash/dist/assets/ViewHeader-D6c2cw1b.js.map +1 -0
- package/bizar-dash/dist/assets/brain-DeoXNDE2.js +6 -0
- package/bizar-dash/dist/assets/brain-DeoXNDE2.js.map +1 -0
- package/bizar-dash/dist/assets/calendar-DRlQkGJc.js +6 -0
- package/bizar-dash/dist/assets/calendar-DRlQkGJc.js.map +1 -0
- package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js +6 -0
- package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js.map +1 -0
- package/bizar-dash/dist/assets/cmdk-BwN8hcKQ.js +80 -0
- package/bizar-dash/dist/assets/cmdk-BwN8hcKQ.js.map +1 -0
- package/bizar-dash/dist/assets/dnd-kit-DR2Qzzxk.js +5 -0
- package/bizar-dash/dist/assets/dnd-kit-DR2Qzzxk.js.map +1 -0
- package/bizar-dash/dist/assets/git-merge-OoqBKQer.js +6 -0
- package/bizar-dash/dist/assets/git-merge-OoqBKQer.js.map +1 -0
- package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js +6 -0
- package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js.map +1 -0
- package/bizar-dash/dist/assets/main-COdgjqbZ.css +1 -0
- package/bizar-dash/dist/assets/main-Cw6gybzS.js +109 -0
- package/bizar-dash/dist/assets/main-Cw6gybzS.js.map +1 -0
- package/bizar-dash/dist/assets/message-square-DUTeIQAR.js +6 -0
- package/bizar-dash/dist/assets/message-square-DUTeIQAR.js.map +1 -0
- package/bizar-dash/dist/assets/minus-CrStJTZ7.js +6 -0
- package/bizar-dash/dist/assets/minus-CrStJTZ7.js.map +1 -0
- package/bizar-dash/dist/assets/wrench-BJ1WIC4u.js +6 -0
- package/bizar-dash/dist/assets/wrench-BJ1WIC4u.js.map +1 -0
- package/bizar-dash/dist/{mobile.html → v8.html} +6 -9
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/bizar-dash/src/server/server.mjs +1 -57
- package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/bizar-dash/src/web/v8/App.tsx +188 -0
- package/bizar-dash/src/web/v8/__tests__/App.test.tsx +102 -0
- package/bizar-dash/src/web/v8/__tests__/AppShell.test.tsx +79 -0
- package/bizar-dash/src/web/v8/__tests__/PageSkeleton.test.tsx +12 -0
- package/bizar-dash/src/web/v8/__tests__/SettingsView.test.tsx +84 -0
- package/bizar-dash/src/web/v8/__tests__/Sidebar.test.tsx +95 -0
- package/bizar-dash/src/web/v8/__tests__/activity.test.tsx +63 -0
- package/bizar-dash/src/web/v8/__tests__/agents.test.tsx +90 -0
- package/bizar-dash/src/web/v8/__tests__/controls.test.tsx +135 -0
- package/bizar-dash/src/web/v8/__tests__/cx.test.ts +25 -0
- package/bizar-dash/src/web/v8/__tests__/data.test.tsx +293 -0
- package/bizar-dash/src/web/v8/__tests__/feedback.test.tsx +213 -0
- package/bizar-dash/src/web/v8/__tests__/goals.test.tsx +105 -0
- package/bizar-dash/src/web/v8/__tests__/kanban.test.tsx +176 -0
- package/bizar-dash/src/web/v8/__tests__/libraries.test.tsx +70 -0
- package/bizar-dash/src/web/v8/__tests__/memory.test.tsx +60 -0
- package/bizar-dash/src/web/v8/__tests__/navigation.test.tsx +137 -0
- package/bizar-dash/src/web/v8/__tests__/settings.test.tsx +104 -0
- package/bizar-dash/src/web/v8/__tests__/theme.test.tsx +98 -0
- package/bizar-dash/src/web/v8/__tests__/views.test.tsx +112 -0
- package/bizar-dash/src/web/v8/main.tsx +28 -0
- package/bizar-dash/src/web/v8/shell/AppShell.tsx +90 -0
- package/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +29 -0
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +361 -0
- package/bizar-dash/src/web/v8/shell/StatusBar.tsx +63 -0
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +113 -0
- package/bizar-dash/src/web/v8/shell/index.ts +15 -0
- package/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +137 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +101 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +158 -0
- package/bizar-dash/src/web/v8/ui/controls/Button.tsx +141 -0
- package/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +32 -0
- package/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +49 -0
- package/bizar-dash/src/web/v8/ui/controls/Field.tsx +78 -0
- package/bizar-dash/src/web/v8/ui/controls/Form.tsx +23 -0
- package/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +112 -0
- package/bizar-dash/src/web/v8/ui/controls/Input.tsx +94 -0
- package/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +74 -0
- package/bizar-dash/src/web/v8/ui/controls/Select.tsx +171 -0
- package/bizar-dash/src/web/v8/ui/controls/Slider.tsx +68 -0
- package/bizar-dash/src/web/v8/ui/controls/Switch.tsx +56 -0
- package/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +64 -0
- package/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +36 -0
- package/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +85 -0
- package/bizar-dash/src/web/v8/ui/data/Accordion.tsx +134 -0
- package/bizar-dash/src/web/v8/ui/data/Avatar.tsx +175 -0
- package/bizar-dash/src/web/v8/ui/data/Badge.tsx +93 -0
- package/bizar-dash/src/web/v8/ui/data/BarList.tsx +101 -0
- package/bizar-dash/src/web/v8/ui/data/Card.tsx +140 -0
- package/bizar-dash/src/web/v8/ui/data/Chip.tsx +96 -0
- package/bizar-dash/src/web/v8/ui/data/Kbd.tsx +42 -0
- package/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +93 -0
- package/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +98 -0
- package/bizar-dash/src/web/v8/ui/data/StatTile.tsx +150 -0
- package/bizar-dash/src/web/v8/ui/data/Table.tsx +170 -0
- package/bizar-dash/src/web/v8/ui/data/Timeline.tsx +130 -0
- package/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +122 -0
- package/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +95 -0
- package/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +39 -0
- package/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +143 -0
- package/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +149 -0
- package/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +8 -0
- package/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +231 -0
- package/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +48 -0
- package/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +56 -0
- package/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +103 -0
- package/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +67 -0
- package/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +30 -0
- package/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +66 -0
- package/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +89 -0
- package/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +176 -0
- package/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +115 -0
- package/bizar-dash/src/web/v8/ui/index.ts +322 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +80 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +247 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +181 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +122 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +141 -0
- package/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +30 -0
- package/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +161 -0
- package/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +144 -0
- package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +224 -0
- package/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +81 -0
- package/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +164 -0
- package/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +128 -0
- package/bizar-dash/src/web/v8/ui/navigation/useCommandPaletteHotkey.test.ts +79 -0
- package/bizar-dash/src/web/v8/ui/primitives/Box.tsx +144 -0
- package/bizar-dash/src/web/v8/ui/primitives/Center.tsx +40 -0
- package/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +67 -0
- package/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +104 -0
- package/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +77 -0
- package/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +33 -0
- package/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +62 -0
- package/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +42 -0
- package/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +73 -0
- package/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +49 -0
- package/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +91 -0
- package/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +88 -0
- package/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +109 -0
- package/bizar-dash/src/web/v8/ui/styles/globals.css +220 -0
- package/bizar-dash/src/web/v8/ui/styles/reset.css +57 -0
- package/bizar-dash/src/web/v8/ui/styles/tokens.css +217 -0
- package/bizar-dash/src/web/v8/ui/theme/DensityProvider.test.tsx +74 -0
- package/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +66 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.test.tsx +86 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +94 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +88 -0
- package/bizar-dash/src/web/v8/ui/theme/useDensity.ts +15 -0
- package/bizar-dash/src/web/v8/ui/theme/useTheme.ts +16 -0
- package/bizar-dash/src/web/v8/ui/utils/cx.ts +19 -0
- package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +33 -0
- package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +108 -0
- package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +142 -0
- package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +144 -0
- package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +84 -0
- package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +41 -0
- package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +61 -0
- package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +92 -0
- package/bizar-dash/src/web/v8/views/Router.tsx +96 -0
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +305 -0
- package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +106 -0
- package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +62 -0
- package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +74 -0
- package/bizar-dash/src/web/v8/vite-env.d.ts +15 -0
- package/bizar-dash/src/web/{mobile.html → v8.html} +4 -7
- package/bizar-dash/tests/settings-layout.test.tsx +2 -2
- package/bizar-dash/tests/settings-nav.test.tsx +6 -6
- package/bizar-dash/tests/setup.ts +26 -0
- package/bizar-dash/vite.config.ts +26 -2
- package/bizar-dash/vitest.config.ts +5 -3
- package/cli/provision-claude.mjs +108 -5
- package/package.json +36 -3
- package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js +0 -114
- package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js.map +0 -1
- package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js +0 -1
- package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js.map +0 -1
- package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js +0 -1
- package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js.map +0 -1
- package/bizar-dash/dist/assets/Toast-ATSAmbdi.js +0 -26
- package/bizar-dash/dist/assets/Toast-ATSAmbdi.js.map +0 -1
- package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
- package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js.map +0 -1
- package/bizar-dash/dist/assets/main-306CZfn6.js +0 -430
- package/bizar-dash/dist/assets/main-306CZfn6.js.map +0 -1
- package/bizar-dash/dist/assets/main-G3bNDpY3.css +0 -1
- package/bizar-dash/dist/assets/mobile-C_naUN91.js +0 -1
- package/bizar-dash/dist/assets/mobile-C_naUN91.js.map +0 -1
- package/bizar-dash/dist/assets/mobile-layout-BWLtwtfQ.css +0 -1
- package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js +0 -211
- package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js.map +0 -1
- package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js +0 -65
- package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js.map +0 -1
- package/bizar-dash/dist/index.html +0 -43
- package/bizar-dash/src/web/App.tsx +0 -915
- package/bizar-dash/src/web/MobileApp.tsx +0 -414
- package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +0 -95
- package/bizar-dash/src/web/components/ArtifactListDialog.tsx +0 -55
- package/bizar-dash/src/web/components/ArtifactViewer.tsx +0 -144
- package/bizar-dash/src/web/components/AuditDialog.tsx +0 -79
- package/bizar-dash/src/web/components/AutosaveField.tsx +0 -50
- package/bizar-dash/src/web/components/BackupRestore.tsx +0 -330
- package/bizar-dash/src/web/components/BgStatusBadge.tsx +0 -32
- package/bizar-dash/src/web/components/Button.tsx +0 -56
- package/bizar-dash/src/web/components/CanvasContextMenu.tsx +0 -68
- package/bizar-dash/src/web/components/Card.tsx +0 -40
- package/bizar-dash/src/web/components/CollapsibleSection.tsx +0 -72
- package/bizar-dash/src/web/components/CommandDialog.tsx +0 -66
- package/bizar-dash/src/web/components/DoctorPanel.tsx +0 -160
- package/bizar-dash/src/web/components/EmptyState.tsx +0 -30
- package/bizar-dash/src/web/components/EnvVarManager.tsx +0 -430
- package/bizar-dash/src/web/components/EvalDiff.tsx +0 -157
- package/bizar-dash/src/web/components/EvalExportButton.tsx +0 -27
- package/bizar-dash/src/web/components/EvalRunCard.tsx +0 -78
- package/bizar-dash/src/web/components/FileBrowser.tsx +0 -633
- package/bizar-dash/src/web/components/HeadroomSettings.tsx +0 -418
- package/bizar-dash/src/web/components/HeadroomStatus.tsx +0 -158
- package/bizar-dash/src/web/components/HelpDialog.tsx +0 -55
- package/bizar-dash/src/web/components/InviteDialog.tsx +0 -205
- package/bizar-dash/src/web/components/KillConfirmDialog.tsx +0 -88
- package/bizar-dash/src/web/components/MobileBottomNav.tsx +0 -38
- package/bizar-dash/src/web/components/MobileDrawer.tsx +0 -68
- package/bizar-dash/src/web/components/MobileHeader.tsx +0 -50
- package/bizar-dash/src/web/components/MobileLayout.tsx +0 -63
- package/bizar-dash/src/web/components/Modal.tsx +0 -215
- package/bizar-dash/src/web/components/Notifications.tsx +0 -242
- package/bizar-dash/src/web/components/ScheduleTemplateCard.tsx +0 -72
- package/bizar-dash/src/web/components/ScreenshotCapture.tsx +0 -138
- package/bizar-dash/src/web/components/ScreenshotOCR.tsx +0 -42
- package/bizar-dash/src/web/components/SearchModal.tsx +0 -227
- package/bizar-dash/src/web/components/SettingsNav.tsx +0 -112
- package/bizar-dash/src/web/components/SettingsSearch.tsx +0 -328
- package/bizar-dash/src/web/components/Sidebar.tsx +0 -89
- package/bizar-dash/src/web/components/Spinner.tsx +0 -19
- package/bizar-dash/src/web/components/StatusBadge.tsx +0 -56
- package/bizar-dash/src/web/components/Tag.tsx +0 -41
- package/bizar-dash/src/web/components/TailscaleSettings.tsx +0 -161
- package/bizar-dash/src/web/components/TaskCard.tsx +0 -69
- package/bizar-dash/src/web/components/TaskCreateSheet.tsx +0 -76
- package/bizar-dash/src/web/components/Toast.tsx +0 -150
- package/bizar-dash/src/web/components/Toggle.tsx +0 -31
- package/bizar-dash/src/web/components/Topbar.tsx +0 -410
- package/bizar-dash/src/web/components/UsageChart.tsx +0 -250
- package/bizar-dash/src/web/components/UsageTable.tsx +0 -90
- package/bizar-dash/src/web/components/VirtualList.tsx +0 -53
- package/bizar-dash/src/web/components/VisualPlanDialog.tsx +0 -58
- package/bizar-dash/src/web/components/VoiceNotesPanel.tsx +0 -211
- package/bizar-dash/src/web/components/VoiceRecorder.tsx +0 -105
- package/bizar-dash/src/web/components/WorkspaceSelector.tsx +0 -158
- package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +0 -126
- package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +0 -163
- package/bizar-dash/src/web/components/agents/QualityGates.tsx +0 -123
- package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +0 -127
- package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +0 -148
- package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +0 -160
- package/bizar-dash/src/web/components/background/AttachButton.tsx +0 -96
- package/bizar-dash/src/web/components/background/TmuxAttachCard.tsx +0 -122
- package/bizar-dash/src/web/components/chat/AgentChip.tsx +0 -68
- package/bizar-dash/src/web/components/chat/AgentNode.tsx +0 -127
- package/bizar-dash/src/web/components/chat/AgentTree.tsx +0 -80
- package/bizar-dash/src/web/components/chat/ChatBubble.tsx +0 -60
- package/bizar-dash/src/web/components/chat/ChatComposer.tsx +0 -72
- package/bizar-dash/src/web/components/chat/ChatInfoPanel.tsx +0 -370
- package/bizar-dash/src/web/components/chat/ChatRail.tsx +0 -387
- package/bizar-dash/src/web/components/chat/ChatThread.tsx +0 -127
- package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +0 -50
- package/bizar-dash/src/web/components/chat/Composer.tsx +0 -166
- package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +0 -54
- package/bizar-dash/src/web/components/chat/EmptyState.tsx +0 -21
- package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +0 -18
- package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +0 -38
- package/bizar-dash/src/web/components/chat/InfoPanel.tsx +0 -184
- package/bizar-dash/src/web/components/chat/JumpToLatest.tsx +0 -58
- package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +0 -19
- package/bizar-dash/src/web/components/chat/MessageBlock.tsx +0 -260
- package/bizar-dash/src/web/components/chat/MessageBubble.tsx +0 -60
- package/bizar-dash/src/web/components/chat/SessionList.tsx +0 -163
- package/bizar-dash/src/web/components/chat/SessionRowMenu.tsx +0 -206
- package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +0 -37
- package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +0 -55
- package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +0 -36
- package/bizar-dash/src/web/components/chat/_legacy.ts +0 -30
- package/bizar-dash/src/web/components/chat/index.ts +0 -31
- package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +0 -18
- package/bizar-dash/src/web/components/chat/useChat.ts +0 -1190
- package/bizar-dash/src/web/components/chat/useSlashCommands.ts +0 -47
- package/bizar-dash/src/web/components/goals/GoalInput.tsx +0 -86
- package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +0 -111
- package/bizar-dash/src/web/components/tasks/BacklogPanel.css +0 -109
- package/bizar-dash/src/web/components/tasks/BacklogPanel.tsx +0 -209
- package/bizar-dash/src/web/hooks/useAutosave.ts +0 -107
- package/bizar-dash/src/web/hooks/useI18n.ts +0 -13
- package/bizar-dash/src/web/index.html +0 -37
- package/bizar-dash/src/web/lib/api.ts +0 -237
- package/bizar-dash/src/web/lib/goapPlanner.ts +0 -614
- package/bizar-dash/src/web/lib/i18n.ts +0 -25
- package/bizar-dash/src/web/lib/logger.ts +0 -30
- package/bizar-dash/src/web/lib/markdown.tsx +0 -59
- package/bizar-dash/src/web/lib/search.ts +0 -115
- package/bizar-dash/src/web/lib/types.ts +0 -894
- package/bizar-dash/src/web/lib/utils.ts +0 -114
- package/bizar-dash/src/web/lib/ws.ts +0 -177
- package/bizar-dash/src/web/locales/en.json +0 -52
- package/bizar-dash/src/web/main.tsx +0 -43
- package/bizar-dash/src/web/mobile/MobileApp.tsx +0 -309
- package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +0 -38
- package/bizar-dash/src/web/mobile/MobileChat.tsx +0 -138
- package/bizar-dash/src/web/mobile/MobileDoctor.tsx +0 -80
- package/bizar-dash/src/web/mobile/MobileEval.tsx +0 -167
- package/bizar-dash/src/web/mobile/MobileMemory.tsx +0 -108
- package/bizar-dash/src/web/mobile/MobileOverview.tsx +0 -213
- package/bizar-dash/src/web/mobile/MobileSettings.tsx +0 -251
- package/bizar-dash/src/web/mobile/MobileTasks.tsx +0 -94
- package/bizar-dash/src/web/mobile/MobileTopbar.tsx +0 -115
- package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +0 -182
- package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +0 -64
- package/bizar-dash/src/web/mobile/components/MobileModal.tsx +0 -123
- package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +0 -273
- package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +0 -374
- package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +0 -439
- package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +0 -143
- package/bizar-dash/src/web/mobile/views/MobileChat.tsx +0 -257
- package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +0 -175
- package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +0 -191
- package/bizar-dash/src/web/mobile/views/MobileMods.tsx +0 -149
- package/bizar-dash/src/web/mobile/views/MobileMore.tsx +0 -121
- package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +0 -137
- package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +0 -26
- package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +0 -685
- package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +0 -172
- package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +0 -363
- package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +0 -153
- package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +0 -564
- package/bizar-dash/src/web/mobile/views/QrCodePanel.tsx +0 -69
- package/bizar-dash/src/web/mobile.tsx +0 -14
- package/bizar-dash/src/web/styles/agents-redesign.css +0 -311
- package/bizar-dash/src/web/styles/chat.css +0 -1740
- package/bizar-dash/src/web/styles/glyphs.css +0 -960
- package/bizar-dash/src/web/styles/main.css +0 -10391
- package/bizar-dash/src/web/styles/memory.css +0 -1182
- package/bizar-dash/src/web/styles/minimax-usage.css +0 -842
- package/bizar-dash/src/web/styles/mobile-chat.css +0 -5
- package/bizar-dash/src/web/styles/mobile-layout.css +0 -233
- package/bizar-dash/src/web/styles/mobile.css +0 -2181
- package/bizar-dash/src/web/styles/settings.css +0 -795
- package/bizar-dash/src/web/styles/skills.css +0 -302
- package/bizar-dash/src/web/styles/tasks-redesign.css +0 -253
- package/bizar-dash/src/web/styles/tasks.css +0 -605
- package/bizar-dash/src/web/ui/controls/Button.tsx +0 -77
- package/bizar-dash/src/web/ui/controls/Checkbox.tsx +0 -95
- package/bizar-dash/src/web/ui/controls/IconButton.tsx +0 -66
- package/bizar-dash/src/web/ui/controls/Kbd.tsx +0 -24
- package/bizar-dash/src/web/ui/controls/NumberInput.tsx +0 -77
- package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +0 -109
- package/bizar-dash/src/web/ui/controls/SearchInput.tsx +0 -91
- package/bizar-dash/src/web/ui/controls/Select.tsx +0 -92
- package/bizar-dash/src/web/ui/controls/Slider.tsx +0 -70
- package/bizar-dash/src/web/ui/controls/TextInput.tsx +0 -67
- package/bizar-dash/src/web/ui/controls/Textarea.tsx +0 -56
- package/bizar-dash/src/web/ui/controls/Toggle.tsx +0 -79
- package/bizar-dash/src/web/ui/controls/controls.css +0 -476
- package/bizar-dash/src/web/ui/controls/index.ts +0 -35
- package/bizar-dash/src/web/ui/data/BarChart.tsx +0 -60
- package/bizar-dash/src/web/ui/data/DataTable.tsx +0 -216
- package/bizar-dash/src/web/ui/data/EmptyState.tsx +0 -60
- package/bizar-dash/src/web/ui/data/ErrorState.tsx +0 -56
- package/bizar-dash/src/web/ui/data/KeyValueList.tsx +0 -106
- package/bizar-dash/src/web/ui/data/LoadingState.tsx +0 -65
- package/bizar-dash/src/web/ui/data/Sparkline.tsx +0 -87
- package/bizar-dash/src/web/ui/data/StatTile.tsx +0 -87
- package/bizar-dash/src/web/ui/data/data.css +0 -535
- package/bizar-dash/src/web/ui/data/index.ts +0 -31
- package/bizar-dash/src/web/ui/feedback/Badge.tsx +0 -49
- package/bizar-dash/src/web/ui/feedback/Dialog.tsx +0 -209
- package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +0 -69
- package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +0 -50
- package/bizar-dash/src/web/ui/feedback/Toast.tsx +0 -200
- package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +0 -126
- package/bizar-dash/src/web/ui/feedback/feedback.css +0 -314
- package/bizar-dash/src/web/ui/feedback/index.ts +0 -43
- package/bizar-dash/src/web/ui/index.ts +0 -56
- package/bizar-dash/src/web/ui/layout/AppShell.tsx +0 -51
- package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +0 -97
- package/bizar-dash/src/web/ui/layout/Panel.tsx +0 -73
- package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +0 -39
- package/bizar-dash/src/web/ui/layout/Sidebar.tsx +0 -131
- package/bizar-dash/src/web/ui/layout/Tabs.tsx +0 -133
- package/bizar-dash/src/web/ui/layout/Topbar.tsx +0 -42
- package/bizar-dash/src/web/ui/layout/ViewHeader.tsx +0 -48
- package/bizar-dash/src/web/ui/layout/index.ts +0 -34
- package/bizar-dash/src/web/ui/layout/layout.css +0 -464
- package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +0 -199
- package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +0 -95
- package/bizar-dash/src/web/ui/navigation/NavLink.tsx +0 -93
- package/bizar-dash/src/web/ui/navigation/index.ts +0 -17
- package/bizar-dash/src/web/ui/navigation/navigation.css +0 -343
- package/bizar-dash/src/web/ui/primitives/Box.tsx +0 -91
- package/bizar-dash/src/web/ui/primitives/Grid.tsx +0 -49
- package/bizar-dash/src/web/ui/primitives/Inline.tsx +0 -55
- package/bizar-dash/src/web/ui/primitives/Separator.tsx +0 -46
- package/bizar-dash/src/web/ui/primitives/Stack.tsx +0 -54
- package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +0 -26
- package/bizar-dash/src/web/ui/primitives/index.ts +0 -23
- package/bizar-dash/src/web/ui/primitives/primitives.css +0 -183
- package/bizar-dash/src/web/ui/styles/globals.css +0 -86
- package/bizar-dash/src/web/ui/styles/reset.css +0 -125
- package/bizar-dash/src/web/ui/styles/tokens.css +0 -208
- package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +0 -142
- package/bizar-dash/src/web/ui/theme/tokens.ts +0 -131
- package/bizar-dash/src/web/ui/theme/useTheme.ts +0 -22
- package/bizar-dash/src/web/ui/utils/cx.ts +0 -42
- package/bizar-dash/src/web/views/Activity.tsx +0 -1221
- package/bizar-dash/src/web/views/Agents.tsx +0 -964
- package/bizar-dash/src/web/views/Artifacts.tsx +0 -1494
- package/bizar-dash/src/web/views/BackgroundAgents.tsx +0 -822
- package/bizar-dash/src/web/views/Chat.tsx +0 -532
- package/bizar-dash/src/web/views/Config.tsx +0 -3
- package/bizar-dash/src/web/views/Doctor.tsx +0 -317
- package/bizar-dash/src/web/views/Eval.tsx +0 -372
- package/bizar-dash/src/web/views/EvalReport.tsx +0 -353
- package/bizar-dash/src/web/views/GoalPlanner.tsx +0 -158
- package/bizar-dash/src/web/views/Harness.tsx +0 -306
- package/bizar-dash/src/web/views/History.tsx +0 -353
- package/bizar-dash/src/web/views/Memory.tsx +0 -161
- package/bizar-dash/src/web/views/MiniMaxUsage.tsx +0 -942
- package/bizar-dash/src/web/views/ModView.tsx +0 -207
- package/bizar-dash/src/web/views/Mods.tsx +0 -706
- package/bizar-dash/src/web/views/Overview.tsx +0 -1364
- package/bizar-dash/src/web/views/Providers.tsx +0 -302
- package/bizar-dash/src/web/views/Schedules.tsx +0 -902
- package/bizar-dash/src/web/views/Settings.tsx +0 -308
- package/bizar-dash/src/web/views/Skills.tsx +0 -383
- package/bizar-dash/src/web/views/SpawnAgentModal.tsx +0 -221
- package/bizar-dash/src/web/views/Tasks.tsx +0 -789
- package/bizar-dash/src/web/views/Workspace.tsx +0 -294
- package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +0 -844
- package/bizar-dash/src/web/views/glyphs/components.tsx +0 -1098
- package/bizar-dash/src/web/views/memory/ConfigPanel.tsx +0 -426
- package/bizar-dash/src/web/views/memory/FromScreenshotPanel.tsx +0 -23
- package/bizar-dash/src/web/views/memory/GitSyncPanel.tsx +0 -220
- package/bizar-dash/src/web/views/memory/LightragPanel.tsx +0 -310
- package/bizar-dash/src/web/views/memory/MemoryGraphLegend.tsx +0 -29
- package/bizar-dash/src/web/views/memory/MemoryGraphPanel.tsx +0 -192
- package/bizar-dash/src/web/views/memory/MemoryGraphView.tsx +0 -336
- package/bizar-dash/src/web/views/memory/MemoryOverview.tsx +0 -367
- package/bizar-dash/src/web/views/memory/MemoryStatusCard.tsx +0 -160
- package/bizar-dash/src/web/views/memory/ObsidianPanel.tsx +0 -650
- package/bizar-dash/src/web/views/memory/SemanticSearchPanel.tsx +0 -197
- package/bizar-dash/src/web/views/memory/VaultFromClipboardPanel.tsx +0 -101
- package/bizar-dash/src/web/views/settings/ActivitySection.tsx +0 -205
- package/bizar-dash/src/web/views/settings/AgentSection.tsx +0 -305
- package/bizar-dash/src/web/views/settings/AuthSection.tsx +0 -159
- package/bizar-dash/src/web/views/settings/EnvVarsSection.tsx +0 -15
- package/bizar-dash/src/web/views/settings/GeneralSection.tsx +0 -128
- package/bizar-dash/src/web/views/settings/HeadroomSection.tsx +0 -39
- package/bizar-dash/src/web/views/settings/MemorySection.tsx +0 -154
- package/bizar-dash/src/web/views/settings/NetworkSection.tsx +0 -87
- package/bizar-dash/src/web/views/settings/NotificationsSection.tsx +0 -34
- package/bizar-dash/src/web/views/settings/SystemLlmSection.tsx +0 -81
- package/bizar-dash/src/web/views/settings/ThemeSection.tsx +0 -168
- package/bizar-dash/src/web/views/settings/UpdatesSection.tsx +0 -256
- package/bizar-dash/src/web/views/settings/WorkspacesSection.tsx +0 -189
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{a as c,c as p}from"./main-Cw6gybzS.js";import{r as f,j as e}from"./cmdk-BwN8hcKQ.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const g=c("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]),s={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},x=f.forwardRef(function(t,l){const{items:a,empty:i,className:o,...d}=t;return a.length===0&&i!==void 0?e.jsx(e.Fragment,{children:i}):e.jsx("ol",{ref:l,className:p("v8-activity-feed",o),style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:"var(--space-2)"},...d,children:a.map(r=>{const n=r.tone??"neutral";return e.jsxs("li",{style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:"var(--radius-sm)",background:`color-mix(in oklch, ${s[n]} 14%, transparent)`,color:s[n],flexShrink:0},children:r.icon}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:500,color:"var(--fg)",minWidth:0},children:r.title}),r.meta!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",flexShrink:0,fontVariantNumeric:"tabular-nums"},children:r.meta})]}),r.description!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:r.description})]})]},r.id)})})});export{x as A,g as T};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityFeed-BRBtQOHB.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../../src/web/v8/ui/activity/ActivityFeed.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TriangleAlert = createLucideIcon(\"TriangleAlert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ActivityFeed — vertical feed of recent events (the home/dashboard view).\n *\n * Each item: icon + title + optional description + meta (relative time).\n * Tone colors the leading icon chip (mirrors the tone vocabulary used in\n * the rest of the v8 library).\n *\n * Renders as `<ol>` so screen readers announce item count.\n */\n\nexport type ActivityTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport interface ActivityItem {\n id: string;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: ActivityTone;\n}\n\nexport interface ActivityFeedProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly ActivityItem[];\n /** Optional empty-state node when `items` is empty. */\n empty?: ReactNode;\n}\n\nconst TONE_BG: Record<ActivityTone, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ActivityFeed = forwardRef<HTMLOListElement, ActivityFeedProps>(function ActivityFeed(\n props,\n ref,\n) {\n const { items, empty, className, ...rest } = props;\n if (items.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n return (\n <ol\n ref={ref}\n className={cx('v8-activity-feed', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)', minWidth: 0 }}>\n {item.title}\n </div>\n {item.meta !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {item.meta}\n </div>\n )}\n </div>\n {item.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["TriangleAlert","createLucideIcon","TONE_BG","ActivityFeed","forwardRef","props","ref","items","empty","className","rest","jsx","cx","item","tone","jsxs"],"mappings":"4FAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAgBC,EAAiB,gBAAiB,CACtD,CACE,OACA,CACE,EAAG,2EACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC,ECWKC,EAAwC,CAC5C,QAAS,mBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEaC,EAAeC,EAAAA,WAAgD,SAC1EC,EACAC,EACA,CACA,KAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,UAAAC,EAAW,GAAGC,GAASL,EAC7C,OAAIE,EAAM,SAAW,GAAKC,IAAU,yBACxB,SAAAA,CAAA,CAAM,EAGhBG,EAAAA,IAAC,KAAA,CACC,IAAAL,EACA,UAAWM,EAAG,mBAAoBH,CAAS,EAC3C,MAAO,CACL,UAAW,OACX,OAAQ,EACR,QAAS,EACT,QAAS,OACT,cAAe,SACf,IAAK,gBAAA,EAEN,GAAGC,EAEH,SAAAH,EAAM,IAAKM,GAAS,CACnB,MAAMC,EAAOD,EAAK,MAAQ,UAC1B,OACEE,EAAAA,KAAC,KAAA,CAEC,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,QAAS,iBACT,WAAY,mBACZ,OAAQ,0BACR,aAAc,eAAA,EAGhB,SAAA,CAAAJ,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,mBACd,WAAY,uBAAuBT,EAAQY,CAAI,CAAC,qBAChD,MAAOZ,EAAQY,CAAI,EACnB,WAAY,CAAA,EAGb,SAAAD,EAAK,IAAA,CAAA,EAERE,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,WACZ,eAAgB,gBAChB,IAAK,gBAAA,EAGP,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,YAAa,SAAU,CAAA,EACpF,WAAK,MACR,EACCE,EAAK,OAAS,QACbF,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,mBACP,WAAY,EACZ,mBAAoB,cAAA,EAGrB,SAAAE,EAAK,IAAA,CAAA,CACR,CAAA,CAAA,EAGHA,EAAK,cAAgB,QACpBF,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,kBACP,UAAW,EACX,WAAY,SACZ,SAAU,SACV,aAAc,UAAA,EAGf,SAAAE,EAAK,WAAA,CAAA,CACR,CAAA,CAEJ,CAAA,CAAA,EAlEKA,EAAK,EAAA,CAqEhB,CAAC,CAAA,CAAA,CAGP,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e}from"./cmdk-BwN8hcKQ.js";import{S as a,B as s}from"./main-Cw6gybzS.js";import{V as o}from"./ViewHeader-D6c2cw1b.js";import{A as r,T as n}from"./ActivityFeed-BRBtQOHB.js";import{G as i}from"./git-merge-OoqBKQer.js";import{G as t}from"./git-pull-request-CXBQTR2f.js";import{C as d}from"./circle-check-DmYQ3vGp.js";import{W as c}from"./wrench-BJ1WIC4u.js";const m=[{id:"a1",icon:e.jsx(i,{size:14,"aria-hidden":"true"}),title:"Merged PR #42 — OKLch token system",meta:"2m ago",tone:"success"},{id:"a2",icon:e.jsx(t,{size:14,"aria-hidden":"true"}),title:"Opened PR #43 — Kanban centerpiece",meta:"12m ago",tone:"info"},{id:"a3",icon:e.jsx(s,{size:14,"aria-hidden":"true"}),title:'Atlas — "Wire TanStack Router"',meta:"34m ago",tone:"info"},{id:"a4",icon:e.jsx(d,{size:14,"aria-hidden":"true"}),title:'Goal "Ship v8 dashboard" advanced to 62%',meta:"52m ago",tone:"success"},{id:"a5",icon:e.jsx(c,{size:14,"aria-hidden":"true"}),title:"Borealis — Edited src/web/v8/ui/index.ts",meta:"1h ago"},{id:"a6",icon:e.jsx(n,{size:14,"aria-hidden":"true"}),title:"CI failed on tests/a11y/forms.test.tsx",meta:"1h ago",tone:"warning"},{id:"a7",icon:e.jsx(i,{size:14,"aria-hidden":"true"}),title:"Merged PR #41 — Sprint S4 (Navigation)",meta:"2h ago",tone:"success"},{id:"a8",icon:e.jsx(t,{size:14,"aria-hidden":"true"}),title:"Opened PR #40 — Sprint S3 (Data display)",meta:"3h ago",tone:"info"}];function S(){return e.jsxs(a,{gap:5,children:[e.jsx(o,{title:"Activity",description:"Full event history across the harness."}),e.jsx(r,{items:m})]})}export{S as ActivityView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityView-CwqhxBfh.js","sources":["../../src/web/v8/views/Activity/ActivityView.tsx"],"sourcesContent":["import { GitMerge, GitPullRequest, AlertTriangle, CheckCircle2, Bot, Wrench } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ActivityFeed, type ActivityItem } from '../../ui/activity/ActivityFeed.js';\n\n/**\n * ActivityView — full history of events.\n *\n * Same shape as the Overview feed, but unbounded — the full stream.\n */\n\nconst ITEMS: ActivityItem[] = [\n { id: 'a1', icon: <GitMerge size={14} aria-hidden=\"true\" />, title: 'Merged PR #42 — OKLch token system', meta: '2m ago', tone: 'success' },\n { id: 'a2', icon: <GitPullRequest size={14} aria-hidden=\"true\" />, title: 'Opened PR #43 — Kanban centerpiece', meta: '12m ago', tone: 'info' },\n { id: 'a3', icon: <Bot size={14} aria-hidden=\"true\" />, title: 'Atlas — \"Wire TanStack Router\"', meta: '34m ago', tone: 'info' },\n { id: 'a4', icon: <CheckCircle2 size={14} aria-hidden=\"true\" />, title: 'Goal \"Ship v8 dashboard\" advanced to 62%', meta: '52m ago', tone: 'success' },\n { id: 'a5', icon: <Wrench size={14} aria-hidden=\"true\" />, title: 'Borealis — Edited src/web/v8/ui/index.ts', meta: '1h ago' },\n { id: 'a6', icon: <AlertTriangle size={14} aria-hidden=\"true\" />, title: 'CI failed on tests/a11y/forms.test.tsx', meta: '1h ago', tone: 'warning' },\n { id: 'a7', icon: <GitMerge size={14} aria-hidden=\"true\" />, title: 'Merged PR #41 — Sprint S4 (Navigation)', meta: '2h ago', tone: 'success' },\n { id: 'a8', icon: <GitPullRequest size={14} aria-hidden=\"true\" />, title: 'Opened PR #40 — Sprint S3 (Data display)', meta: '3h ago', tone: 'info' },\n];\n\nexport function ActivityView(): JSX.Element {\n return (\n <Stack gap={5}>\n <ViewHeader\n title=\"Activity\"\n description=\"Full event history across the harness.\"\n />\n <ActivityFeed items={ITEMS} />\n </Stack>\n );\n}"],"names":["ITEMS","jsx","GitMerge","GitPullRequest","Bot","CheckCircle2","Wrench","AlertTriangle","ActivityView","jsxs","Stack","ViewHeader","ActivityFeed"],"mappings":"+WAWA,MAAMA,EAAwB,CAC5B,CAAE,GAAI,KAAM,KAAMC,EAAAA,IAACC,GAAS,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,qCAAsC,KAAM,SAAU,KAAM,SAAA,EAChI,CAAE,GAAI,KAAM,KAAMD,EAAAA,IAACE,GAAe,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,qCAAsC,KAAM,UAAW,KAAM,MAAA,EACvI,CAAE,GAAI,KAAM,KAAMF,EAAAA,IAACG,GAAI,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,iCAAkC,KAAM,UAAW,KAAM,MAAA,EACxH,CAAE,GAAI,KAAM,KAAMH,EAAAA,IAACI,GAAa,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,2CAA4C,KAAM,UAAW,KAAM,SAAA,EAC3I,CAAE,GAAI,KAAM,WAAOC,EAAA,CAAO,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,2CAA4C,KAAM,QAAA,EACpH,CAAE,GAAI,KAAM,KAAML,EAAAA,IAACM,GAAc,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,yCAA0C,KAAM,SAAU,KAAM,SAAA,EACzI,CAAE,GAAI,KAAM,KAAMN,EAAAA,IAACC,GAAS,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,yCAA0C,KAAM,SAAU,KAAM,SAAA,EACpI,CAAE,GAAI,KAAM,KAAMD,EAAAA,IAACE,GAAe,KAAM,GAAI,cAAY,MAAA,CAAO,EAAI,MAAO,2CAA4C,KAAM,SAAU,KAAM,MAAA,CAC9I,EAEO,SAASK,GAA4B,CAC1C,OACEC,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAT,EAAAA,IAACU,EAAA,CACC,MAAM,WACN,YAAY,wCAAA,CAAA,EAEdV,EAAAA,IAACW,EAAA,CAAa,MAAOZ,CAAA,CAAO,CAAA,EAC9B,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as y,j as e}from"./cmdk-BwN8hcKQ.js";import{c as v}from"./main-Cw6gybzS.js";const F={xs:20,sm:24,md:32,lg:40,xl:56},I={xs:"var(--fs-12)",sm:"var(--fs-12)",md:"var(--fs-13)",lg:"var(--fs-14)",xl:"var(--fs-18)"},E={online:"var(--success)",offline:"var(--fg-subtle)",busy:"var(--danger)",away:"var(--warning)"};function z(o){var r,s;const t=o.trim().split(/\s+/);if(t.length===0||t[0]===void 0)return"?";if(t.length===1)return(t[0]??"").slice(0,2).toUpperCase();const n=((r=t[0])==null?void 0:r[0])??"",a=((s=t[t.length-1])==null?void 0:s[0])??"";return`${n}${a}`.toUpperCase()}function T(o){let t=0;for(let n=0;n<o.length;n++)t=t*31+o.charCodeAt(n)|0;return Math.abs(t)}const $=["oklch(0.65 0.15 240)","oklch(0.65 0.15 30)","oklch(0.65 0.15 140)","oklch(0.65 0.15 320)","oklch(0.65 0.15 80)","oklch(0.65 0.15 200)"],U=y.forwardRef(function(t,n){const{name:a,src:r,size:s="md",initials:i,status:c,className:x,style:h,...u}=t,d=F[s],p=i??z(a),f=$[T(a)%$.length];return e.jsxs("span",{ref:n,className:v("v8-avatar",`v8-avatar--${s}`,x),style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:d,height:d,borderRadius:"var(--radius-pill)",overflow:"hidden",background:f,color:"white",fontSize:I[s],fontWeight:600,flexShrink:0,userSelect:"none",...h},"aria-label":a,...u,children:[r!==void 0?e.jsx("img",{src:r,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):p,c!==void 0&&e.jsx("span",{"aria-hidden":"true",style:{position:"absolute",bottom:0,right:0,width:Math.max(6,Math.floor(d*.28)),height:Math.max(6,Math.floor(d*.28)),borderRadius:"var(--radius-pill)",background:E[c],border:"2px solid var(--surface-0)"}})]})});y.forwardRef(function(t,n){const{children:a,size:r="sm",className:s,style:i,...c}=t;return e.jsx("div",{ref:n,className:v("v8-avatar-stack",s),style:{display:"inline-flex",alignItems:"center",...i},...c,children:e.jsx(B,{size:r,children:a})})});function B({children:o,size:t}){const n=F[t];return e.jsx(e.Fragment,{children:Array.isArray(o)?o.map((a,r)=>e.jsx("span",{style:{marginLeft:r===0?0:-Math.floor(n*.3),border:"2px solid var(--surface-0)",borderRadius:"var(--radius-pill)",display:"inline-flex"},children:a},r)):e.jsx("span",{style:{border:"2px solid var(--surface-0)",borderRadius:"var(--radius-pill)"},children:o})})}const Z=y.forwardRef(function(t,n){var S,w;const{data:a,width:r=120,height:s=32,stroke:i="var(--accent)",fill:c,area:x=!0,goal:h,className:u,style:d,...p}=t;if(a.length<2)return e.jsx("svg",{ref:n,width:r,height:s,viewBox:`0 0 ${r} ${s}`,className:v("v8-sparkline",u),style:d,"aria-hidden":"true",...p});const f=Math.min(...a),k=Math.max(...a)-f||1,l=2,N=(r-l*2)/(a.length-1),g=a.map((m,j)=>{const L=l+N*j,M=l+(s-l*2)*(1-(m-f)/k);return{x:L,y:M}}),b=g.map((m,j)=>`${j===0?"M":"L"}${m.x.toFixed(1)},${m.y.toFixed(1)}`).join(" "),R=x?`${b} L${((S=g[g.length-1])==null?void 0:S.x.toFixed(1))??"0"},${(s-l).toFixed(1)} L${((w=g[0])==null?void 0:w.x.toFixed(1))??"0"},${(s-l).toFixed(1)} Z`:"",C=c??`color-mix(in oklch, ${i} 14%, transparent)`;return e.jsxs("svg",{ref:n,width:r,height:s,viewBox:`0 0 ${r} ${s}`,className:v("v8-sparkline",u),style:d,"aria-hidden":"true",...p,children:[x===!0&&e.jsx("path",{d:R,fill:C,stroke:"none"}),e.jsx("path",{d:b,fill:"none",stroke:i,strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"}),h!==void 0&&e.jsx("line",{x1:l,x2:r-l,y1:l+(s-l*2)*(1-(h-f)/k),y2:l+(s-l*2)*(1-(h-f)/k),stroke:"var(--fg-subtle)",strokeWidth:1,strokeDasharray:"2 2"})]})}),A={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},D=y.forwardRef(function(t,n){const{items:a,className:r,...s}=t;return e.jsx("ol",{ref:n,className:v("v8-agent-activity",r),style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:"var(--space-2)"},...s,children:a.map(i=>{const c=i.tone??"neutral";return e.jsxs("li",{style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:22,height:22,borderRadius:"var(--radius-sm)",background:`color-mix(in oklch, ${A[c]} 14%, transparent)`,color:A[c],flexShrink:0},children:i.icon}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:500,color:"var(--fg)"},children:i.title}),i.meta!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",flexShrink:0},children:i.meta})]}),i.description!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:i.description})]})]},i.id)})})});export{U as A,Z as S,D as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentActivity-6MxU-a9F.js","sources":["../../src/web/v8/ui/data/Avatar.tsx","../../src/web/v8/ui/data/Sparkline.tsx","../../src/web/v8/ui/agents/AgentActivity.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Avatar — user/agent representation. Falls back to initials when no image.\n *\n * Sizes: xs (20) | sm (24) | md (32) | lg (40) | xl (56).\n * Renders a <span> by default; use `asChild` to swap for a button/link.\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n name: string;\n src?: string;\n size?: AvatarSize;\n /** Override the generated initials. */\n initials?: string;\n /** Optional status dot (online/offline/busy). */\n status?: 'online' | 'offline' | 'busy' | 'away';\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = { xs: 20, sm: 24, md: 32, lg: 40, xl: 56 };\nconst SIZE_FS: Record<AvatarSize, string> = {\n xs: 'var(--fs-12)',\n sm: 'var(--fs-12)',\n md: 'var(--fs-13)',\n lg: 'var(--fs-14)',\n xl: 'var(--fs-18)',\n};\n\nconst STATUS_FG = {\n online: 'var(--success)',\n offline: 'var(--fg-subtle)',\n busy: 'var(--danger)',\n away: 'var(--warning)',\n} as const;\n\nfunction deriveInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0 || parts[0] === undefined) return '?';\n if (parts.length === 1) {\n const first = parts[0] ?? '';\n return first.slice(0, 2).toUpperCase();\n }\n const first = parts[0]?.[0] ?? '';\n const last = parts[parts.length - 1]?.[0] ?? '';\n return `${first}${last}`.toUpperCase();\n}\n\n// Deterministic color from name — used as fallback when no image.\nfunction hashName(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return Math.abs(h);\n}\n\nconst FALLBACK_PALETTE = [\n 'oklch(0.65 0.15 240)',\n 'oklch(0.65 0.15 30)',\n 'oklch(0.65 0.15 140)',\n 'oklch(0.65 0.15 320)',\n 'oklch(0.65 0.15 80)',\n 'oklch(0.65 0.15 200)',\n];\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(props, ref) {\n const { name, src, size = 'md', initials, status, className, style, ...rest } = props;\n const px = SIZE_PX[size];\n const init = initials ?? deriveInitials(name);\n const fallbackBg = FALLBACK_PALETTE[hashName(name) % FALLBACK_PALETTE.length];\n\n return (\n <span\n ref={ref}\n className={cx('v8-avatar', `v8-avatar--${size}`, className)}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: px,\n height: px,\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n background: fallbackBg,\n color: 'white',\n fontSize: SIZE_FS[size],\n fontWeight: 600,\n flexShrink: 0,\n userSelect: 'none',\n ...style,\n }}\n aria-label={name}\n {...rest}\n >\n {src !== undefined ? (\n <img\n src={src}\n alt=\"\"\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n init\n )}\n {status !== undefined && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: Math.max(6, Math.floor(px * 0.28)),\n height: Math.max(6, Math.floor(px * 0.28)),\n borderRadius: 'var(--radius-pill)',\n background: STATUS_FG[status],\n border: '2px solid var(--surface-0)',\n }}\n />\n )}\n </span>\n );\n});\n\n/**\n * AvatarStack — overlapping avatars. Use for \"assigned to N people\" lists.\n */\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: AvatarSize;\n max?: number;\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n props,\n ref,\n) {\n const { children, size = 'sm', className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-avatar-stack', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n {...rest}\n >\n <StackedChildren size={size}>{children}</StackedChildren>\n </div>\n );\n});\n\nfunction StackedChildren({ children, size }: { children: ReactNode; size: AvatarSize }) {\n const px = SIZE_PX[size];\n return (\n <>\n {Array.isArray(children)\n ? children.map((child, i) => (\n <span\n key={i}\n style={{\n marginLeft: i === 0 ? 0 : -Math.floor(px * 0.3),\n border: '2px solid var(--surface-0)',\n borderRadius: 'var(--radius-pill)',\n display: 'inline-flex',\n }}\n >\n {child}\n </span>\n ))\n : <span style={{ border: '2px solid var(--surface-0)', borderRadius: 'var(--radius-pill)' }}>{children}</span>}\n </>\n );\n}","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Sparkline — tiny inline line chart.\n *\n * Pure SVG so it composes inside StatTile, Table cells, Card headers\n * without bringing in a chart library dependency.\n */\nexport interface SparklineProps extends Omit<HTMLAttributes<SVGSVGElement>, 'children'> {\n data: readonly number[];\n width?: number;\n height?: number;\n /** Stroke color (defaults to --accent). */\n stroke?: string;\n /** Optional fill color (defaults to a 14% mix of stroke). */\n fill?: string;\n /** Show the area under the line. */\n area?: boolean;\n /** Goal/expected value rendered as a dashed horizontal line. */\n goal?: number;\n}\n\nexport const Sparkline = forwardRef<SVGSVGElement, SparklineProps>(function Sparkline(props, ref) {\n const {\n data,\n width = 120,\n height = 32,\n stroke = 'var(--accent)',\n fill,\n area = true,\n goal,\n className,\n style,\n ...rest\n } = props;\n\n if (data.length < 2) {\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx('v8-sparkline', className)}\n style={style}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n }\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n const pad = 2;\n const stepX = (width - pad * 2) / (data.length - 1);\n\n const points = data.map((v, i) => {\n const x = pad + stepX * i;\n const y = pad + (height - pad * 2) * (1 - (v - min) / range);\n return { x, y };\n });\n\n const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');\n const areaPath = area\n ? `${linePath} L${points[points.length - 1]?.x.toFixed(1) ?? '0'},${(height - pad).toFixed(1)} L${points[0]?.x.toFixed(1) ?? '0'},${(height - pad).toFixed(1)} Z`\n : '';\n\n const fillColor = fill ?? `color-mix(in oklch, ${stroke} 14%, transparent)`;\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx('v8-sparkline', className)}\n style={style}\n aria-hidden=\"true\"\n {...rest}\n >\n {area === true && <path d={areaPath} fill={fillColor} stroke=\"none\" />}\n <path d={linePath} fill=\"none\" stroke={stroke} strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n {goal !== undefined && (\n <line\n x1={pad}\n x2={width - pad}\n y1={pad + (height - pad * 2) * (1 - (goal - min) / range)}\n y2={pad + (height - pad * 2) * (1 - (goal - min) / range)}\n stroke=\"var(--fg-subtle)\"\n strokeWidth={1}\n strokeDasharray=\"2 2\"\n />\n )}\n </svg>\n );\n});","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * AgentActivity — per-agent feed of recent actions (run started, tool\n * called, message received, etc).\n *\n * Used inside the Agent detail view.\n */\n\nexport interface AgentActivityItem {\n id: string;\n /** Icon (lucide). */\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n}\n\nexport interface AgentActivityProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly AgentActivityItem[];\n}\n\nconst TONE_BG = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n} as const;\n\nexport const AgentActivity = forwardRef<HTMLOListElement, AgentActivityProps>(function AgentActivity(\n props,\n ref,\n) {\n const { items, className, ...rest } = props;\n return (\n <ol\n ref={ref}\n className={cx('v8-agent-activity', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n height: 22,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)' }}>{item.title}</div>\n {item.meta !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)', flexShrink: 0 }}>{item.meta}</div>\n )}\n </div>\n {item.description !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["SIZE_PX","SIZE_FS","STATUS_FG","deriveInitials","name","parts","first","_a","last","_b","hashName","h","i","FALLBACK_PALETTE","Avatar","forwardRef","props","ref","src","size","initials","status","className","style","rest","px","init","fallbackBg","jsxs","cx","jsx","children","StackedChildren","Fragment","child","Sparkline","data","width","height","stroke","fill","area","goal","min","range","pad","stepX","points","v","x","y","linePath","p","areaPath","fillColor","TONE_BG","AgentActivity","items","item","tone"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{j as e}from"./cmdk-BwN8hcKQ.js";import{a as m,A as y,c as g,S as f,B as h}from"./main-Cw6gybzS.js";import{G as x}from"./Grid-C62gCPqt.js";import{V as A}from"./ViewHeader-D6c2cw1b.js";import{A as j,S as T,a as b}from"./AgentActivity-6MxU-a9F.js";import{B as k}from"./Badge-Cd61wsBa.js";import{C as S,a as w,b as z}from"./Card-C_bvqXdQ.js";import{W as B}from"./wrench-BJ1WIC4u.js";import{M as C}from"./message-square-DUTeIQAR.js";import{G as H}from"./git-merge-OoqBKQer.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const E=m("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),I={idle:"Idle",busy:"Busy",error:"Error",paused:"Paused"},R={idle:"neutral",busy:"info",error:"danger",paused:"neutral"},l={idle:"var(--fg-subtle)",busy:"var(--info)",error:"var(--danger)",paused:"var(--warning)"};function G(t){const{name:r,role:p,status:a,lastActivity:o,tpmHistory:s,currentTask:i,tasksToday:n,onOpen:v,badges:d,className:u}=t;return e.jsxs("button",{type:"button",onClick:v,className:g("v8-agent-card",`v8-agent-card--${a}`,u),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[e.jsx(j,{name:r,status:a==="busy"||a==="error"?"busy":a==="idle"?"online":"away"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:r}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:p})]}),e.jsx(k,{tone:R[a],dot:!0,children:I[a]})]}),i!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-2) var(--space-3)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},title:i,children:i}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[o!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(y,{size:12,"aria-hidden":"true",style:{color:l[a]}}),o]}),n!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(E,{size:12,"aria-hidden":"true"}),n," today"]})]}),s!==void 0&&s.length>1&&e.jsx("div",{style:{marginTop:"var(--space-1)"},children:e.jsx(T,{data:s,width:240,height:28,stroke:l[a]})}),d!==void 0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:d}),e.jsx("style",{children:`
|
|
7
|
+
.v8-agent-card:hover { border-color: var(--accent); }
|
|
8
|
+
`})]})}const c=[{id:"a1",name:"Atlas",role:"Lead researcher",status:"busy",currentTask:"Wire TanStack Router in v8 App",lastActivity:"2m ago",tasksToday:7,tpmHistory:[120,200,340,280,410,480,360,290,220,180,160,140,200,260,320,380]},{id:"a2",name:"Borealis",role:"Frontend specialist",status:"busy",currentTask:"Polish Settings nav rail",lastActivity:"8m ago",tasksToday:4,tpmHistory:[60,90,120,150,180,200,220,240,260,230,210,190,170,150]},{id:"a3",name:"Cassini",role:"QA + review",status:"idle",currentTask:void 0,lastActivity:"32m ago",tasksToday:12,tpmHistory:[10,5,8,0,0,0,0,0,0,0,0]},{id:"a4",name:"Drift",role:"Migration sweeper",status:"error",currentTask:"Bulk-rename `var(--token)` to literals",lastActivity:"1h ago",tasksToday:2,tpmHistory:[200,220,240,260,0,0,0,0]},{id:"a5",name:"Ember",role:"Memory curator",status:"paused",lastActivity:"2h ago",tasksToday:1,tpmHistory:[40,60,80,100,80,60,40,20]},{id:"a6",name:"Ferro",role:"Build + test",status:"idle",lastActivity:"15m ago",tasksToday:9,tpmHistory:[30,40,50,60,50,40,30,20,10]}],M="a1",W=[{id:"ev1",icon:e.jsx(h,{size:14,"aria-hidden":"true"}),title:"Run started",description:'Picked up "Wire TanStack Router in v8 App"',meta:"12:04",tone:"info"},{id:"ev2",icon:e.jsx(B,{size:14,"aria-hidden":"true"}),title:"Tool call",description:"Read src/web/v8/App.tsx",meta:"12:05"},{id:"ev3",icon:e.jsx(C,{size:14,"aria-hidden":"true"}),title:"Message received",description:'"Use the state-based router"',meta:"12:06",tone:"info"},{id:"ev4",icon:e.jsx(H,{size:14,"aria-hidden":"true"}),title:"Committed",description:"feat(v8-dash): wire app-level router",meta:"12:08",tone:"success"}];function Z(){var t;return e.jsxs(f,{gap:5,children:[e.jsx(A,{title:"Agents",description:"The orchestrator's running entities. Click a card to drill into one."}),e.jsx(x,{cols:3,children:c.map(r=>e.jsx(G,{...r},r.id))}),e.jsxs(S,{children:[e.jsx(w,{title:`Activity — ${((t=c.find(r=>r.id===M))==null?void 0:t.name)??""}`}),e.jsx(z,{children:e.jsx(b,{items:W})})]})]})}export{Z as AgentsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentsView-BYrOFdwl.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/zap.js","../../src/web/v8/ui/agents/AgentCard.tsx","../../src/web/v8/views/Agents/AgentsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","import { type ReactNode } from 'react';\nimport { Activity, Zap } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { Sparkline } from '../data/Sparkline.js';\n\n/**\n * AgentCard — agent tile for the Agents roster.\n *\n * Per PLAN.md, agents are the orchestrator's running entities. Each card\n * shows: name, status (idle/busy/error), role (description), last activity,\n * token usage sparkline, current task title.\n */\n\nexport type AgentStatus = 'idle' | 'busy' | 'error' | 'paused';\n\nexport interface AgentCardProps {\n id: string;\n name: string;\n role: string;\n status: AgentStatus;\n /** Last activity label (\"2m ago\", \"Just now\"). */\n lastActivity?: string;\n /** Tokens-per-minute sparkline data (last 20 buckets). */\n tpmHistory?: readonly number[];\n /** Current task the agent is working on. */\n currentTask?: string;\n /** Number of tasks completed in the last 24h. */\n tasksToday?: number;\n /** Click handler — opens agent detail. */\n onOpen?: () => void;\n /** Custom badges row (model, owner). */\n badges?: ReactNode;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<AgentStatus, string> = {\n idle: 'Idle',\n busy: 'Busy',\n error: 'Error',\n paused: 'Paused',\n};\n\nconst STATUS_TONE: Record<AgentStatus, 'success' | 'info' | 'danger' | 'neutral'> = {\n idle: 'neutral',\n busy: 'info',\n error: 'danger',\n paused: 'neutral',\n};\n\nconst STATUS_FG: Record<AgentStatus, string> = {\n idle: 'var(--fg-subtle)',\n busy: 'var(--info)',\n error: 'var(--danger)',\n paused: 'var(--warning)',\n};\n\nexport function AgentCard(props: AgentCardProps) {\n const {\n name,\n role,\n status,\n lastActivity,\n tpmHistory,\n currentTask,\n tasksToday,\n onOpen,\n badges,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-agent-card', `v8-agent-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : status === 'idle' ? 'online' : 'away'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {name}\n </div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {role}\n </div>\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n {currentTask !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-2) var(--space-3)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={currentTask}\n >\n {currentTask}\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {lastActivity !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Activity size={12} aria-hidden=\"true\" style={{ color: STATUS_FG[status] }} />\n {lastActivity}\n </span>\n )}\n {tasksToday !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Zap size={12} aria-hidden=\"true\" />\n {tasksToday} today\n </span>\n )}\n </div>\n {tpmHistory !== undefined && tpmHistory.length > 1 && (\n <div style={{ marginTop: 'var(--space-1)' }}>\n <Sparkline\n data={tpmHistory}\n width={240}\n height={28}\n stroke={STATUS_FG[status]}\n />\n </div>\n )}\n {badges !== undefined && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>{badges}</div>\n )}\n <style>{`\n .v8-agent-card:hover { border-color: var(--accent); }\n `}</style>\n </button>\n );\n}","import { Stack } from '../../ui/primitives/Stack.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { AgentCard, type AgentCardProps } from '../../ui/agents/AgentCard.js';\nimport { AgentActivity, type AgentActivityItem } from '../../ui/agents/AgentActivity.js';\nimport { Card, CardBody, CardHeader } from '../../ui/data/Card.js';\nimport { Wrench, Bot, GitMerge, MessageSquare } from 'lucide-react';\n\n/**\n * AgentsView — orchestrator agents (PLAN.md \"Agents page\").\n *\n * Each card shows status + current task + token sparkline. Click a card\n * to see per-agent activity (sample feed below).\n */\n\nconst AGENTS: AgentCardProps[] = [\n {\n id: 'a1',\n name: 'Atlas',\n role: 'Lead researcher',\n status: 'busy',\n currentTask: 'Wire TanStack Router in v8 App',\n lastActivity: '2m ago',\n tasksToday: 7,\n tpmHistory: [120, 200, 340, 280, 410, 480, 360, 290, 220, 180, 160, 140, 200, 260, 320, 380],\n },\n {\n id: 'a2',\n name: 'Borealis',\n role: 'Frontend specialist',\n status: 'busy',\n currentTask: 'Polish Settings nav rail',\n lastActivity: '8m ago',\n tasksToday: 4,\n tpmHistory: [60, 90, 120, 150, 180, 200, 220, 240, 260, 230, 210, 190, 170, 150],\n },\n {\n id: 'a3',\n name: 'Cassini',\n role: 'QA + review',\n status: 'idle',\n currentTask: undefined,\n lastActivity: '32m ago',\n tasksToday: 12,\n tpmHistory: [10, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n {\n id: 'a4',\n name: 'Drift',\n role: 'Migration sweeper',\n status: 'error',\n currentTask: 'Bulk-rename `var(--token)` to literals',\n lastActivity: '1h ago',\n tasksToday: 2,\n tpmHistory: [200, 220, 240, 260, 0, 0, 0, 0],\n },\n {\n id: 'a5',\n name: 'Ember',\n role: 'Memory curator',\n status: 'paused',\n lastActivity: '2h ago',\n tasksToday: 1,\n tpmHistory: [40, 60, 80, 100, 80, 60, 40, 20],\n },\n {\n id: 'a6',\n name: 'Ferro',\n role: 'Build + test',\n status: 'idle',\n lastActivity: '15m ago',\n tasksToday: 9,\n tpmHistory: [30, 40, 50, 60, 50, 40, 30, 20, 10],\n },\n];\n\nconst FEATURED_AGENT_ID = 'a1';\n\nconst ACTIVITY: AgentActivityItem[] = [\n { id: 'ev1', icon: <Bot size={14} aria-hidden=\"true\" />, title: 'Run started', description: 'Picked up \"Wire TanStack Router in v8 App\"', meta: '12:04', tone: 'info' },\n { id: 'ev2', icon: <Wrench size={14} aria-hidden=\"true\" />, title: 'Tool call', description: 'Read src/web/v8/App.tsx', meta: '12:05' },\n { id: 'ev3', icon: <MessageSquare size={14} aria-hidden=\"true\" />, title: 'Message received', description: '\"Use the state-based router\"', meta: '12:06', tone: 'info' },\n { id: 'ev4', icon: <GitMerge size={14} aria-hidden=\"true\" />, title: 'Committed', description: 'feat(v8-dash): wire app-level router', meta: '12:08', tone: 'success' },\n];\n\nexport function AgentsView(): JSX.Element {\n return (\n <Stack gap={5}>\n <ViewHeader\n title=\"Agents\"\n description=\"The orchestrator's running entities. Click a card to drill into one.\"\n />\n <Grid cols={3}>\n {AGENTS.map((agent) => (\n <AgentCard key={agent.id} {...agent} />\n ))}\n </Grid>\n <Card>\n <CardHeader\n title={`Activity — ${AGENTS.find((a) => a.id === FEATURED_AGENT_ID)?.name ?? ''}`}\n />\n <CardBody>\n <AgentActivity items={ACTIVITY} />\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["Zap","createLucideIcon","STATUS_LABEL","STATUS_TONE","STATUS_FG","AgentCard","props","name","role","status","lastActivity","tpmHistory","currentTask","tasksToday","onOpen","badges","className","jsxs","cx","jsx","Avatar","Badge","Activity","Sparkline","AGENTS","FEATURED_AGENT_ID","ACTIVITY","Bot","Wrench","MessageSquare","GitMerge","AgentsView","Stack","ViewHeader","Grid","agent","Card","CardHeader","_a","a","CardBody","AgentActivity"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as g,j as n}from"./cmdk-BwN8hcKQ.js";import{c as v}from"./main-Cw6gybzS.js";const u={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},p={neutral:"color-mix(in oklch, var(--fg-muted) 12%, transparent)",info:"color-mix(in oklch, var(--info) 14%, transparent)",success:"color-mix(in oklch, var(--success) 14%, transparent)",warning:"color-mix(in oklch, var(--warning) 14%, transparent)",danger:"color-mix(in oklch, var(--danger) 14%, transparent)",accent:"color-mix(in oklch, var(--accent) 14%, transparent)"},f={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},w=g.forwardRef(function(e,s){const{tone:a="neutral",size:r="md",dot:t,children:c,className:i,style:o,...l}=e,d=r==="sm"?18:22;return n.jsxs("span",{ref:s,className:v("v8-badge",`v8-badge--${a}`,`v8-badge--${r}`,i),style:{display:"inline-flex",alignItems:"center",gap:"var(--space-1)",height:d,padding:"0 8px",borderRadius:"var(--radius-pill)",background:p[a],color:u[a],fontSize:r==="sm"?"var(--fs-12)":"var(--fs-13)",fontWeight:500,lineHeight:1,whiteSpace:"nowrap",...o},...l,children:[t===!0&&n.jsx("span",{"aria-hidden":"true",style:{width:6,height:6,borderRadius:"var(--radius-pill)",background:f[a],flexShrink:0}}),c]})});export{w as B};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Badge-Cd61wsBa.js","sources":["../../src/web/v8/ui/data/Badge.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Badge — small status pill.\n *\n * Tones: neutral | info | success | warning | danger | accent.\n * Sizes: sm (16px) | md (20px).\n * Optional `dot` renders a leading colored dot.\n */\nexport type BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\nexport type BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone;\n size?: BadgeSize;\n dot?: boolean;\n children: ReactNode;\n}\n\nconst TONE_FG: Record<BadgeTone, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nconst TONE_BG: Record<BadgeTone, string> = {\n neutral: 'color-mix(in oklch, var(--fg-muted) 12%, transparent)',\n info: 'color-mix(in oklch, var(--info) 14%, transparent)',\n success: 'color-mix(in oklch, var(--success) 14%, transparent)',\n warning: 'color-mix(in oklch, var(--warning) 14%, transparent)',\n danger: 'color-mix(in oklch, var(--danger) 14%, transparent)',\n accent: 'color-mix(in oklch, var(--accent) 14%, transparent)',\n};\n\nconst TONE_DOT: Record<BadgeTone, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(props, ref) {\n const { tone = 'neutral', size = 'md', dot, children, className, style, ...rest } = props;\n const height = size === 'sm' ? 18 : 22;\n return (\n <span\n ref={ref}\n className={cx('v8-badge', `v8-badge--${tone}`, `v8-badge--${size}`, className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n height,\n padding: '0 8px',\n borderRadius: 'var(--radius-pill)',\n background: TONE_BG[tone],\n color: TONE_FG[tone],\n fontSize: size === 'sm' ? 'var(--fs-12)' : 'var(--fs-13)',\n fontWeight: 500,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...rest}\n >\n {dot === true && (\n <span\n aria-hidden=\"true\"\n style={{\n width: 6,\n height: 6,\n borderRadius: 'var(--radius-pill)',\n background: TONE_DOT[tone],\n flexShrink: 0,\n }}\n />\n )}\n {children}\n </span>\n );\n});"],"names":["TONE_FG","TONE_BG","TONE_DOT","Badge","forwardRef","props","ref","tone","size","dot","children","className","style","rest","height","jsxs","cx","jsx"],"mappings":"qFA0BA,MAAMA,EAAqC,CACzC,QAAS,kBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,gBACR,OAAQ,eACV,EAEMC,EAAqC,CACzC,QAAS,wDACT,KAAM,oDACN,QAAS,uDACT,QAAS,uDACT,OAAQ,sDACR,OAAQ,qDACV,EAEMC,EAAsC,CAC1C,QAAS,kBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,gBACR,OAAQ,eACV,EAEaC,EAAQC,EAAAA,WAAwC,SAAeC,EAAOC,EAAK,CACtF,KAAM,CAAE,KAAAC,EAAO,UAAW,KAAAC,EAAO,KAAM,IAAAC,EAAK,SAAAC,EAAU,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASR,EAC9ES,EAASN,IAAS,KAAO,GAAK,GACpC,OACEO,EAAAA,KAAC,OAAA,CACC,IAAAT,EACA,UAAWU,EAAG,WAAY,aAAaT,CAAI,GAAI,aAAaC,CAAI,GAAIG,CAAS,EAC7E,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,OAAAG,EACA,QAAS,QACT,aAAc,qBACd,WAAYb,EAAQM,CAAI,EACxB,MAAOP,EAAQO,CAAI,EACnB,SAAUC,IAAS,KAAO,eAAiB,eAC3C,WAAY,IACZ,WAAY,EACZ,WAAY,SACZ,GAAGI,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAJ,IAAQ,IACPQ,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,MAAO,EACP,OAAQ,EACR,aAAc,qBACd,WAAYf,EAASK,CAAI,EACzB,WAAY,CAAA,CACd,CAAA,EAGHG,CAAA,CAAA,CAAA,CAGP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as d,j as o}from"./cmdk-BwN8hcKQ.js";import{c as n}from"./main-Cw6gybzS.js";const f={default:{background:"var(--surface-1)",border:"1px solid var(--border)",boxShadow:"none"},elevated:{background:"var(--surface-1)",border:"1px solid var(--border)",boxShadow:"var(--shadow-2)"},ghost:{background:"transparent",border:"1px solid transparent",boxShadow:"none"},outlined:{background:"var(--surface-0)",border:"1px solid var(--border)",boxShadow:"none"}},x=d.forwardRef(function(s,t){const{variant:r="default",flush:a,interactive:e,className:c,style:l,...v}=s;return o.jsx("div",{ref:t,className:n("v8-card",`v8-card--${r}`,e&&"is-interactive",c),style:{borderRadius:"var(--radius-lg)",padding:a===!0?0:"var(--density-card-pad)",cursor:e===!0?"pointer":void 0,transition:e===!0?"border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out)":void 0,...f[r],...l},...v})}),m=d.forwardRef(function(s,t){const{title:r,description:a,action:e,className:c,style:l,...v}=s;return o.jsxs("div",{ref:t,className:n("v8-card__header",c),style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-3)",marginBottom:"var(--space-3)",...l},...v,children:[o.jsxs("div",{style:{flex:1,minWidth:0},children:[o.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)"},children:r}),a!==void 0&&o.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:2},children:a})]}),e!==void 0&&o.jsx("div",{style:{flexShrink:0},children:e})]})}),b=d.forwardRef(function(s,t){const{className:r,...a}=s;return o.jsx("div",{ref:t,className:n("v8-card__body",r),...a})});d.forwardRef(function(s,t){const{className:r,style:a,...e}=s;return o.jsx("div",{ref:t,className:n("v8-card__footer",r),style:{display:"flex",alignItems:"center",justifyContent:"flex-end",gap:"var(--space-2)",marginTop:"var(--space-3)",paddingTop:"var(--space-3)",borderTop:"1px solid var(--border)",...a},...e})});export{x as C,m as a,b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-C_bvqXdQ.js","sources":["../../src/web/v8/ui/data/Card.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Card — the v8 surface primitive.\n *\n * Variants:\n * - default: bordered, --surface-1 background, used for kanban cards, settings groups.\n * - elevated: --surface-1 background + shadow, used for popovers/dropdowns hovering over content.\n * - ghost: no border, transparent background, used inside other Cards (nested).\n * - outlined: thicker border, --surface-0 background, used for group containers.\n *\n * All variants have a consistent --radius-lg corner and pad via --density-card-pad.\n * The header / body / footer slots are conventions — pass any children you want.\n */\nexport type CardVariant = 'default' | 'elevated' | 'ghost' | 'outlined';\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n variant?: CardVariant;\n /** Removes padding so the child fills the card edge-to-edge. */\n flush?: boolean;\n /** Adds hover lift + cursor pointer for clickable cards. */\n interactive?: boolean;\n children?: ReactNode;\n}\n\nconst VARIANT_STYLE: Record<CardVariant, React.CSSProperties> = {\n default: {\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n boxShadow: 'none',\n },\n elevated: {\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n boxShadow: 'var(--shadow-2)',\n },\n ghost: {\n background: 'transparent',\n border: '1px solid transparent',\n boxShadow: 'none',\n },\n outlined: {\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n boxShadow: 'none',\n },\n};\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(props, ref) {\n const { variant = 'default', flush, interactive, className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card', `v8-card--${variant}`, interactive && 'is-interactive', className)}\n style={{\n borderRadius: 'var(--radius-lg)',\n padding: flush === true ? 0 : 'var(--density-card-pad)',\n cursor: interactive === true ? 'pointer' : undefined,\n transition: interactive === true\n ? 'border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out)'\n : undefined,\n ...VARIANT_STYLE[variant],\n ...style,\n }}\n {...rest}\n />\n );\n});\n\n/** Card header — title row + optional actions. */\nexport interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(\n props,\n ref,\n) {\n const { title, description, action, className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card__header', className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 'var(--space-3)',\n marginBottom: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {description}\n </div>\n )}\n </div>\n {action !== undefined && <div style={{ flexShrink: 0 }}>{action}</div>}\n </div>\n );\n});\n\n/** Card body — main content slot. */\nexport const CardBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function CardBody(props, ref) {\n const { className, ...rest } = props;\n return <div ref={ref} className={cx('v8-card__body', className)} {...rest} />;\n },\n);\n\n/** Card footer — typically action buttons right-aligned. */\nexport const CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function CardFooter(props, ref) {\n const { className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card__footer', className)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 'var(--space-2)',\n marginTop: 'var(--space-3)',\n paddingTop: 'var(--space-3)',\n borderTop: '1px solid var(--border)',\n ...style,\n }}\n {...rest}\n />\n );\n },\n);"],"names":["VARIANT_STYLE","Card","forwardRef","props","ref","variant","flush","interactive","className","style","rest","jsx","cx","CardHeader","title","description","action","jsxs","CardBody"],"mappings":"qFA0BA,MAAMA,EAA0D,CAC9D,QAAS,CACP,WAAY,mBACZ,OAAQ,0BACR,UAAW,MAAA,EAEb,SAAU,CACR,WAAY,mBACZ,OAAQ,0BACR,UAAW,iBAAA,EAEb,MAAO,CACL,WAAY,cACZ,OAAQ,wBACR,UAAW,MAAA,EAEb,SAAU,CACR,WAAY,mBACZ,OAAQ,0BACR,UAAW,MAAA,CAEf,EAEaC,EAAOC,EAAAA,WAAsC,SAAcC,EAAOC,EAAK,CAClF,KAAM,CAAE,QAAAC,EAAU,UAAW,MAAAC,EAAO,YAAAC,EAAa,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASP,EAC/E,OACEQ,EAAAA,IAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,UAAW,YAAYP,CAAO,GAAIE,GAAe,iBAAkBC,CAAS,EAC1F,MAAO,CACL,aAAc,mBACd,QAASF,IAAU,GAAO,EAAI,0BAC9B,OAAQC,IAAgB,GAAO,UAAY,OAC3C,WAAYA,IAAgB,GACxB,+IACA,OACJ,GAAGP,EAAcK,CAAO,EACxB,GAAGI,CAAA,EAEJ,GAAGC,CAAA,CAAA,CAGV,CAAC,EASYG,EAAaX,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,MAAAU,EAAO,YAAAC,EAAa,OAAAC,EAAQ,UAAAR,EAAW,MAAAC,EAAO,GAAGC,GAASP,EAClE,OACEc,EAAAA,KAAC,MAAA,CACC,IAAAb,EACA,UAAWQ,EAAG,kBAAmBJ,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,WAAY,aACZ,eAAgB,gBAChB,IAAK,iBACL,aAAc,iBACd,GAAGC,CAAA,EAEJ,GAAGC,EAEJ,SAAA,CAAAO,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAN,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAG,CAAA,CAAM,EACrFC,IAAgB,QACfJ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,UAAW,CAAA,EAC1E,SAAAI,CAAA,CACH,CAAA,EAEJ,EACCC,IAAW,QAAaL,MAAC,MAAA,CAAI,MAAO,CAAE,WAAY,CAAA,EAAM,SAAAK,CAAA,CAAO,CAAA,CAAA,CAAA,CAGtE,CAAC,EAGYE,EAAWhB,EAAAA,WACtB,SAAkBC,EAAOC,EAAK,CAC5B,KAAM,CAAE,UAAAI,EAAW,GAAGE,CAAA,EAASP,EAC/B,OAAOQ,MAAC,OAAI,IAAAP,EAAU,UAAWQ,EAAG,gBAAiBJ,CAAS,EAAI,GAAGE,EAAM,CAC7E,CACF,EAG0BR,EAAAA,WACxB,SAAoBC,EAAOC,EAAK,CAC9B,KAAM,CAAE,UAAAI,EAAW,MAAAC,EAAO,GAAGC,GAASP,EACtC,OACEQ,EAAAA,IAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,kBAAmBJ,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,IAAK,iBACL,UAAW,iBACX,WAAY,iBACZ,UAAW,0BACX,GAAGC,CAAA,EAEJ,GAAGC,CAAA,CAAA,CAGV,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as l,j as e}from"./cmdk-BwN8hcKQ.js";import{c as d}from"./main-Cw6gybzS.js";const m=l.forwardRef(function(r,a){const{icon:t,title:n,description:s,action:i,className:o,...c}=r;return e.jsxs("div",{ref:a,className:d("v8-empty-state",o),style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",padding:"var(--space-12) var(--space-6)",textAlign:"center",color:"var(--fg-muted)"},...c,children:[t!==void 0&&e.jsx("div",{style:{color:"var(--fg-subtle)",display:"inline-flex"},children:t}),e.jsx("div",{style:{fontSize:"var(--fs-16)",fontWeight:600,color:"var(--fg)"},children:n}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",maxWidth:480},children:s}),i!==void 0&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:i})]})});export{m as E};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState-BWQuKnk9.js","sources":["../../src/web/v8/ui/feedback/EmptyState.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * EmptyState — placeholder for empty lists / zero-data views.\n *\n * Use when a view has no rows. Never use a spinner; the data is\n * genuinely empty.\n */\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n props,\n ref,\n) {\n const { icon, title, description, action, className, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-empty-state', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-12) var(--space-6)',\n textAlign: 'center',\n color: 'var(--fg-muted)',\n }}\n {...rest}\n >\n {icon !== undefined && (\n <div style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</div>\n )}\n <div style={{ fontSize: 'var(--fs-16)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', maxWidth: 480 }}>{description}</div>\n )}\n {action !== undefined && <div style={{ marginTop: 'var(--space-2)' }}>{action}</div>}\n </div>\n );\n});"],"names":["EmptyState","forwardRef","props","ref","icon","title","description","action","className","rest","jsxs","cx","jsx"],"mappings":"qFAgBO,MAAMA,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,KAAAC,EAAM,MAAAC,EAAO,YAAAC,EAAa,OAAAC,EAAQ,UAAAC,EAAW,GAAGC,GAASP,EACjE,OACEQ,EAAAA,KAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,iBAAkBH,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,iBACL,QAAS,iCACT,UAAW,SACX,MAAO,iBAAA,EAER,GAAGC,EAEH,SAAA,CAAAL,IAAS,QACRQ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO,mBAAoB,QAAS,aAAA,EAAkB,SAAAR,CAAA,CAAK,EAE3EQ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAP,CAAA,CAAM,EACrFC,IAAgB,QACfM,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,SAAU,GAAA,EAAQ,SAAAN,CAAA,CAAY,EAEvEC,IAAW,QAAaK,MAAC,MAAA,CAAI,MAAO,CAAE,UAAW,gBAAA,EAAqB,SAAAL,CAAA,CAAO,CAAA,CAAA,CAAA,CAGpF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{j as e}from"./cmdk-BwN8hcKQ.js";import{a as m,c as u,S as p}from"./main-Cw6gybzS.js";import{G as x}from"./Grid-C62gCPqt.js";import{C as y,V as k}from"./ViewHeader-D6c2cw1b.js";import{P as g}from"./ProgressBar-CpvDeq9F.js";import{B as b}from"./Badge-Cd61wsBa.js";import{C as j}from"./calendar-DRlQkGJc.js";import{M as S}from"./minus-CrStJTZ7.js";import{C}from"./circle-check-DmYQ3vGp.js";import{C as w,a as T,b as R}from"./Card-C_bvqXdQ.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const A=m("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),I={"on-track":"On track","at-risk":"At risk","off-track":"Off track",done:"Done"},N={"on-track":"success","at-risk":"warning","off-track":"danger",done:"neutral"};function z(r){const{title:d,description:s,status:t,progress:a,due:i,ownerName:n,ownerAvatarUrl:o,keyResultsDone:l,keyResultsTotal:c,badges:v,onOpen:f,className:h}=r;return e.jsxs("button",{type:"button",onClick:f,className:u("v8-goal-card",`v8-goal-card--${t}`,h),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:d}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:4,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:s})]}),e.jsx(b,{tone:N[t],dot:!0,children:I[t]})]}),e.jsxs("div",{children:[e.jsx(g,{value:a,tone:t==="on-track"?"success":t==="at-risk"?"warning":t==="off-track"?"danger":"accent"}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:6,fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[e.jsxs("span",{children:[Math.round(a*100),"% complete"]}),l!==void 0&&c!==void 0&&e.jsxs("span",{children:[l," / ",c," key results"]})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[i!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(j,{size:12,"aria-hidden":"true"}),i]}),n!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{"aria-hidden":"true",style:{width:16,height:16,borderRadius:"var(--radius-pill)",background:o!==void 0?`url(${o}) center/cover`:"var(--accent)",display:"inline-block"}}),n]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[v,e.jsx(y,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]}),e.jsx("style",{children:`
|
|
7
|
+
.v8-goal-card:hover {
|
|
8
|
+
border-color: var(--accent);
|
|
9
|
+
background: var(--surface-2);
|
|
10
|
+
}
|
|
11
|
+
`})]})}const G={done:C,"in-progress":S,"not-started":A},D={done:"var(--success)","in-progress":"var(--info)","not-started":"var(--fg-subtle)"};function L(r){const{title:d,status:s,progress:t,metric:a,assignee:i,onToggle:n,className:o}=r,l=G[s];return e.jsxs("div",{className:u("v8-key-result",`v8-key-result--${s}`,o),style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e.jsx("button",{type:"button",onClick:n,"aria-label":s==="done"?"Mark as not done":"Mark as done",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:20,height:20,marginTop:2,padding:0,background:"transparent",border:0,borderRadius:"var(--radius-sm)",color:D[s],cursor:"pointer",flexShrink:0},children:e.jsx(l,{size:18,"aria-hidden":"true"})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:s==="done"?"var(--fg-muted)":"var(--fg)",fontWeight:500,textDecoration:s==="done"?"line-through":"none",lineHeight:"var(--lh-snug)"},children:d}),s!=="not-started"&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:e.jsx(g,{value:t,tone:s==="done"?"success":"accent",height:4})}),(a!==void 0||i!==void 0)&&e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",marginTop:6,fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:[a!==void 0&&e.jsx("span",{style:{fontVariantNumeric:"tabular-nums"},children:a}),i!==void 0&&e.jsxs("span",{children:["@",i]})]})]})]})}const M=[{id:"g1",title:"Ship v8 dashboard",description:"Replace the v7 dashboard with a fully-token-driven component library.",status:"on-track",progress:.62,due:"Q3 2026",ownerName:"alex",keyResultsDone:5,keyResultsTotal:8},{id:"g2",title:"Cut S9 polish in half",description:"Reduce polish + views-wiring sprint from 10 days to 5.",status:"at-risk",progress:.3,due:"Aug 1",ownerName:"sam",keyResultsDone:1,keyResultsTotal:4},{id:"g3",title:"Make every page keyboard-navigable",description:"A11y pass across Tasks, Goals, Agents, Memory, Settings.",status:"done",progress:1,due:"Q2 2026",ownerName:"jordan",keyResultsDone:6,keyResultsTotal:6}],O=[{id:"k1",title:"Publish Plan.md with 17 sections",status:"done",progress:1,metric:"17 / 17"},{id:"k2",title:"Ship Sprint S1 (Foundation)",status:"done",progress:1,metric:"sprint S1"},{id:"k3",title:"Ship Sprint S5 (Kanban centerpiece)",status:"done",progress:1,metric:"sprint S5"},{id:"k4",title:"Wire app-level CommandPalette",status:"in-progress",progress:.5,metric:"1 / 2 hooks",assignee:"alex"},{id:"k5",title:"Ship Sprint S9 (Polish + views)",status:"not-started",progress:0,assignee:"sam"}];function F(){return e.jsxs(p,{gap:5,children:[e.jsx(k,{title:"Goals",description:"Long-horizon commitments. Each goal lists the measurable key results that signal done."}),e.jsx(x,{cols:2,children:M.map(r=>e.jsx(z,{...r},r.id))}),e.jsxs(w,{children:[e.jsx(T,{title:"Key results — current focus"}),e.jsx(R,{children:e.jsx(p,{gap:2,children:O.map(r=>e.jsx(L,{...r},r.id))})})]})]})}export{F as GoalsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoalsView-Dok0yt9S.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle.js","../../src/web/v8/ui/goals/GoalCard.tsx","../../src/web/v8/ui/goals/KeyResult.tsx","../../src/web/v8/views/Goals/GoalsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Circle = createLucideIcon(\"Circle\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { Circle as default };\n//# sourceMappingURL=circle.js.map\n","import { type ReactNode } from 'react';\nimport { Calendar, ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * GoalCard — long-horizon goal surface (PLAN.md: \"Goals page\").\n *\n * Goals are NOT kanban cards. They are intentional commitments tracked\n * over weeks/months. Each card shows: title, why (description), status,\n * progress, due, owner, key results count.\n */\n\nexport type GoalStatus = 'on-track' | 'at-risk' | 'off-track' | 'done';\n\nexport interface GoalCardProps {\n id: string;\n title: string;\n /** Why this goal matters (the \"because\"). */\n description?: string;\n status: GoalStatus;\n /** 0..1 fractional progress. */\n progress: number;\n /** Due date label (e.g. \"Q3 2026\", \"Mar 31\"). */\n due?: string;\n /** Owner name (renders as Avatar when paired with avatarUrl). */\n ownerName?: string;\n ownerAvatarUrl?: string;\n /** Key results count + done count (e.g. \"3 / 5 key results\"). */\n keyResultsDone?: number;\n keyResultsTotal?: number;\n /** Optional badges row (priority, tags). */\n badges?: ReactNode;\n /** Click handler — opens the goal detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<GoalStatus, string> = {\n 'on-track': 'On track',\n 'at-risk': 'At risk',\n 'off-track': 'Off track',\n done: 'Done',\n};\n\nconst STATUS_TONE: Record<GoalStatus, 'success' | 'warning' | 'danger' | 'neutral'> = {\n 'on-track': 'success',\n 'at-risk': 'warning',\n 'off-track': 'danger',\n done: 'neutral',\n};\n\nexport function GoalCard(props: GoalCardProps) {\n const {\n title,\n description,\n status,\n progress,\n due,\n ownerName,\n ownerAvatarUrl,\n keyResultsDone,\n keyResultsTotal,\n badges,\n onOpen,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-goal-card', `v8-goal-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {title}\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg-muted)',\n marginTop: 4,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n <div>\n <ProgressBar\n value={progress}\n tone={status === 'on-track' ? 'success' : status === 'at-risk' ? 'warning' : status === 'off-track' ? 'danger' : 'accent'}\n />\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 6, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontVariantNumeric: 'tabular-nums' }}>\n <span>{Math.round(progress * 100)}% complete</span>\n {keyResultsDone !== undefined && keyResultsTotal !== undefined && (\n <span>\n {keyResultsDone} / {keyResultsTotal} key results\n </span>\n )}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n {due !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Calendar size={12} aria-hidden=\"true\" />\n {due}\n </span>\n )}\n {ownerName !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span\n aria-hidden=\"true\"\n style={{\n width: 16,\n height: 16,\n borderRadius: 'var(--radius-pill)',\n background: ownerAvatarUrl !== undefined ? `url(${ownerAvatarUrl}) center/cover` : 'var(--accent)',\n display: 'inline-block',\n }}\n />\n {ownerName}\n </span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n {badges}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n <style>{`\n .v8-goal-card:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { type ReactNode } from 'react';\nimport { CheckCircle2, Circle, Minus } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\n\n/**\n * KeyResult — a measurable sub-goal inside a Goal.\n *\n * Renders title + progress + status icon + optional metric caption\n * (e.g. \"47 / 100 tasks completed\").\n */\n\nexport type KeyResultStatus = 'done' | 'in-progress' | 'not-started';\n\nexport interface KeyResultProps {\n id: string;\n title: string;\n status: KeyResultStatus;\n /** 0..1 fractional progress. */\n progress: number;\n /** Optional metric caption (e.g. \"47 / 100\"). */\n metric?: ReactNode;\n /** Optional assignee name. */\n assignee?: string;\n onToggle?: () => void;\n className?: string;\n}\n\nconst STATUS_ICON = {\n done: CheckCircle2,\n 'in-progress': Minus,\n 'not-started': Circle,\n} as const;\n\nconst STATUS_FG = {\n done: 'var(--success)',\n 'in-progress': 'var(--info)',\n 'not-started': 'var(--fg-subtle)',\n} as const;\n\nexport function KeyResult(props: KeyResultProps) {\n const { title, status, progress, metric, assignee, onToggle, className } = props;\n const Icon = STATUS_ICON[status];\n return (\n <div\n className={cx('v8-key-result', `v8-key-result--${status}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <button\n type=\"button\"\n onClick={onToggle}\n aria-label={status === 'done' ? 'Mark as not done' : 'Mark as done'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n marginTop: 2,\n padding: 0,\n background: 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: STATUS_FG[status],\n cursor: 'pointer',\n flexShrink: 0,\n }}\n >\n <Icon size={18} aria-hidden=\"true\" />\n </button>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: status === 'done' ? 'var(--fg-muted)' : 'var(--fg)',\n fontWeight: 500,\n textDecoration: status === 'done' ? 'line-through' : 'none',\n lineHeight: 'var(--lh-snug)',\n }}\n >\n {title}\n </div>\n {status !== 'not-started' && (\n <div style={{ marginTop: 'var(--space-2)' }}>\n <ProgressBar value={progress} tone={status === 'done' ? 'success' : 'accent'} height={4} />\n </div>\n )}\n {(metric !== undefined || assignee !== undefined) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginTop: 6,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n }}\n >\n {metric !== undefined && <span style={{ fontVariantNumeric: 'tabular-nums' }}>{metric}</span>}\n {assignee !== undefined && <span>@{assignee}</span>}\n </div>\n )}\n </div>\n </div>\n );\n}","import { Stack } from '../../ui/primitives/Stack.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { GoalCard, type GoalCardProps } from '../../ui/goals/GoalCard.js';\nimport { KeyResult, type KeyResultProps } from '../../ui/goals/KeyResult.js';\nimport { Card, CardBody, CardHeader } from '../../ui/data/Card.js';\n\n/**\n * GoalsView — long-horizon commitments (PLAN.md \"Goals page\").\n *\n * Goals are intentional commitments tracked over weeks/months. They are\n * NOT kanban cards. Each goal surfaces key results inline so the user\n * can see \"what does done look like\" at a glance.\n */\n\nconst GOALS: GoalCardProps[] = [\n {\n id: 'g1',\n title: 'Ship v8 dashboard',\n description: 'Replace the v7 dashboard with a fully-token-driven component library.',\n status: 'on-track',\n progress: 0.62,\n due: 'Q3 2026',\n ownerName: 'alex',\n keyResultsDone: 5,\n keyResultsTotal: 8,\n },\n {\n id: 'g2',\n title: 'Cut S9 polish in half',\n description: 'Reduce polish + views-wiring sprint from 10 days to 5.',\n status: 'at-risk',\n progress: 0.3,\n due: 'Aug 1',\n ownerName: 'sam',\n keyResultsDone: 1,\n keyResultsTotal: 4,\n },\n {\n id: 'g3',\n title: 'Make every page keyboard-navigable',\n description: 'A11y pass across Tasks, Goals, Agents, Memory, Settings.',\n status: 'done',\n progress: 1,\n due: 'Q2 2026',\n ownerName: 'jordan',\n keyResultsDone: 6,\n keyResultsTotal: 6,\n },\n];\n\nconst KEY_RESULTS: KeyResultProps[] = [\n { id: 'k1', title: 'Publish Plan.md with 17 sections', status: 'done', progress: 1, metric: '17 / 17' },\n { id: 'k2', title: 'Ship Sprint S1 (Foundation)', status: 'done', progress: 1, metric: 'sprint S1' },\n { id: 'k3', title: 'Ship Sprint S5 (Kanban centerpiece)', status: 'done', progress: 1, metric: 'sprint S5' },\n { id: 'k4', title: 'Wire app-level CommandPalette', status: 'in-progress', progress: 0.5, metric: '1 / 2 hooks', assignee: 'alex' },\n { id: 'k5', title: 'Ship Sprint S9 (Polish + views)', status: 'not-started', progress: 0, assignee: 'sam' },\n];\n\nexport function GoalsView(): JSX.Element {\n return (\n <Stack gap={5}>\n <ViewHeader\n title=\"Goals\"\n description=\"Long-horizon commitments. Each goal lists the measurable key results that signal done.\"\n />\n <Grid cols={2}>\n {GOALS.map((goal) => (\n <GoalCard key={goal.id} {...goal} />\n ))}\n </Grid>\n <Card>\n <CardHeader title=\"Key results — current focus\" />\n <CardBody>\n <Stack gap={2}>\n {KEY_RESULTS.map((kr) => (\n <KeyResult key={kr.id} {...kr} />\n ))}\n </Stack>\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["Circle","createLucideIcon","STATUS_LABEL","STATUS_TONE","GoalCard","props","title","description","status","progress","due","ownerName","ownerAvatarUrl","keyResultsDone","keyResultsTotal","badges","onOpen","className","jsxs","cx","jsx","Badge","ProgressBar","Calendar","ChevronRight","STATUS_ICON","CheckCircle2","Minus","STATUS_FG","KeyResult","metric","assignee","onToggle","Icon","GOALS","KEY_RESULTS","GoalsView","Stack","ViewHeader","Grid","goal","Card","CardHeader","CardBody","kr"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as w,j as A}from"./cmdk-BwN8hcKQ.js";import{c as T}from"./main-Cw6gybzS.js";const a={0:"0",1:"var(--space-1)",2:"var(--space-2)",3:"var(--space-3)",4:"var(--space-4)",5:"var(--space-5)",6:"var(--space-6)",8:"var(--space-8)",10:"var(--space-10)",12:"var(--space-12)",16:"var(--space-16)"},p={1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))",8:"repeat(8, minmax(0, 1fr))",12:"repeat(12, minmax(0, 1fr))"};function h(e){if(e===void 0)return{};if(typeof e=="number")return{gridTemplateColumns:p[e]};const r=e.base??1;return{gridTemplateColumns:p[r]}}const j={start:"start",center:"center",end:"end",stretch:"stretch"},R={start:"start",center:"center",end:"end",stretch:"stretch"},I=w.forwardRef(function(r,m){const{as:d,gap:f=4,rowGap:t,colGap:s,cols:v,rows:n,autoFlow:o,align:i,justify:c,children:l,className:u,style:x,...g}=r,y=d??"div",G={display:"grid",gap:a[f],...t!==void 0&&{rowGap:a[t]},...s!==void 0&&{columnGap:a[s]},...h(v),...n!==void 0&&{gridTemplateRows:`repeat(${n}, minmax(0, 1fr))`},...o!==void 0&&{gridAutoFlow:o},...i!==void 0&&{alignItems:j[i]},...c!==void 0&&{justifyItems:R[c]},...x};return A.jsx(y,{ref:m,className:T("v8-grid",u),style:G,...g,children:l})});export{I as G};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grid-C62gCPqt.js","sources":["../../src/web/v8/ui/primitives/Grid.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Grid — CSS grid wrapper with token-driven gap and template columns.\n *\n * For responsive grids: pass `cols` as an object { base, sm, md, lg }.\n * Otherwise pass a single number (1..12) for a uniform grid.\n */\nexport type GridCols =\n | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12\n | { base?: number; sm?: number; md?: number; lg?: number; xl?: number };\n\nexport interface GridProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n as?: ElementType;\n gap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n rowGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n colGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n cols?: GridCols;\n rows?: 1 | 2 | 3 | 4;\n autoFlow?: 'row' | 'column' | 'dense';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'stretch';\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst SPACE_VAR: Record<NonNullable<GridProps['gap']>, string> = {\n 0: '0',\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n};\n\nconst COLS_VAR: Record<number, string> = {\n 1: 'repeat(1, minmax(0, 1fr))',\n 2: 'repeat(2, minmax(0, 1fr))',\n 3: 'repeat(3, minmax(0, 1fr))',\n 4: 'repeat(4, minmax(0, 1fr))',\n 5: 'repeat(5, minmax(0, 1fr))',\n 6: 'repeat(6, minmax(0, 1fr))',\n 8: 'repeat(8, minmax(0, 1fr))',\n 12: 'repeat(12, minmax(0, 1fr))',\n};\n\nfunction colsToStyle(cols: GridCols | undefined): CSSProperties {\n if (cols === undefined) return {};\n if (typeof cols === 'number') return { gridTemplateColumns: COLS_VAR[cols] };\n // Responsive object — apply base as the default gridTemplateColumns; the\n // breakpoint variants should be handled by the parent component or a\n // generated class. We export the base here; responsive overrides can\n // compose via additional style overrides at the call site.\n const base = cols.base ?? 1;\n return { gridTemplateColumns: COLS_VAR[base] };\n}\n\nconst ALIGN_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\nconst JUSTIFY_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\n\nexport const Grid = forwardRef<HTMLElement, GridProps>(function Grid(props, ref) {\n const {\n as,\n gap = 4,\n rowGap,\n colGap,\n cols,\n rows,\n autoFlow,\n align,\n justify,\n children,\n className,\n style,\n ...rest\n } = props;\n\n const Tag = (as ?? 'div') as ElementType;\n const computedStyle: CSSProperties = {\n display: 'grid',\n gap: SPACE_VAR[gap],\n ...(rowGap !== undefined && { rowGap: SPACE_VAR[rowGap] }),\n ...(colGap !== undefined && { columnGap: SPACE_VAR[colGap] }),\n ...colsToStyle(cols),\n ...(rows !== undefined && { gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))` }),\n ...(autoFlow !== undefined && { gridAutoFlow: autoFlow }),\n ...(align !== undefined && { alignItems: ALIGN_MAP[align] }),\n ...(justify !== undefined && { justifyItems: JUSTIFY_MAP[justify] }),\n ...style,\n };\n\n return (\n <Tag ref={ref} className={cx('v8-grid', className)} style={computedStyle} {...rest}>\n {children}\n </Tag>\n );\n});"],"names":["SPACE_VAR","COLS_VAR","colsToStyle","cols","base","ALIGN_MAP","JUSTIFY_MAP","Grid","forwardRef","props","ref","as","gap","rowGap","colGap","rows","autoFlow","align","justify","children","className","style","rest","Tag","computedStyle","jsx","cx"],"mappings":"qFA4BA,MAAMA,EAA2D,CAC/D,EAAG,IACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,GAAI,kBACJ,GAAI,kBACJ,GAAI,iBACN,EAEMC,EAAmC,CACvC,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,GAAI,4BACN,EAEA,SAASC,EAAYC,EAA2C,CAC9D,GAAIA,IAAS,OAAW,MAAO,CAAA,EAC/B,GAAI,OAAOA,GAAS,SAAU,MAAO,CAAE,oBAAqBF,EAASE,CAAI,CAAA,EAKzE,MAAMC,EAAOD,EAAK,MAAQ,EAC1B,MAAO,CAAE,oBAAqBF,EAASG,CAAI,CAAA,CAC7C,CAEA,MAAMC,EAAY,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EACrEC,EAAc,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EAEhEC,EAAOC,EAAAA,WAAmC,SAAcC,EAAOC,EAAK,CAC/E,KAAM,CACJ,GAAAC,EACA,IAAAC,EAAM,EACN,OAAAC,EACA,OAAAC,EACA,KAAAX,EACA,KAAAY,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CAAA,EACDb,EAEEc,EAAOZ,GAAM,MACba,EAA+B,CACnC,QAAS,OACT,IAAKxB,EAAUY,CAAG,EAClB,GAAIC,IAAW,QAAa,CAAE,OAAQb,EAAUa,CAAM,CAAA,EACtD,GAAIC,IAAW,QAAa,CAAE,UAAWd,EAAUc,CAAM,CAAA,EACzD,GAAGZ,EAAYC,CAAI,EACnB,GAAIY,IAAS,QAAa,CAAE,iBAAkB,UAAUA,CAAI,mBAAA,EAC5D,GAAIC,IAAa,QAAa,CAAE,aAAcA,CAAA,EAC9C,GAAIC,IAAU,QAAa,CAAE,WAAYZ,EAAUY,CAAK,CAAA,EACxD,GAAIC,IAAY,QAAa,CAAE,aAAcZ,EAAYY,CAAO,CAAA,EAChE,GAAGG,CAAA,EAGL,OACEI,EAAAA,IAACF,EAAA,CAAI,IAAAb,EAAU,UAAWgB,EAAG,UAAWN,CAAS,EAAG,MAAOI,EAAgB,GAAGF,EAC3E,SAAAH,CAAA,CACH,CAEJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import{r as u,j as a}from"./cmdk-BwN8hcKQ.js";import{b as x}from"./dnd-kit-DR2Qzzxk.js";import{a as n,c as m}from"./main-Cw6gybzS.js";import{C as y}from"./calendar-DRlQkGJc.js";import{M as b}from"./message-square-DUTeIQAR.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const j=n("Ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);/**
|
|
7
|
+
* @license lucide-react v0.460.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const k=n("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);/**
|
|
12
|
+
* @license lucide-react v0.460.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const w=n("Paperclip",[["path",{d:"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48",key:"1u3ebp"}]]);/**
|
|
17
|
+
* @license lucide-react v0.460.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const C=n("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),R={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},W=u.forwardRef(function(s,o){const{column:e,children:r,onAdd:i,onOverflow:t,exceedsWip:d,className:l,style:c,...h}=s,{setNodeRef:f,isOver:p}=x({id:e.id});return a.jsxs("section",{ref:o,className:m("v8-kanban-column",p&&"is-over",l),style:{display:"flex",flexDirection:"column",width:280,flexShrink:0,background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",height:"100%",...c},"aria-label":typeof e.title=="string"?e.title:void 0,...h,children:[a.jsxs("header",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)",padding:"var(--space-3) var(--space-3)",borderBottom:"1px solid var(--border)"},children:[a.jsx("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-pill)",background:R[e.accentTone??"neutral"],flexShrink:0}}),a.jsxs("div",{style:{flex:1,minWidth:0},children:[a.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:e.title}),(e.count!==void 0||e.wipLimit!==void 0)&&a.jsxs("div",{style:{fontSize:"var(--fs-12)",color:d===!0?"var(--danger)":"var(--fg-subtle)",fontVariantNumeric:"tabular-nums"},children:[e.count??0,e.wipLimit!==void 0&&` / ${e.wipLimit}`]})]}),t!==void 0&&a.jsx("button",{type:"button",onClick:t,"aria-label":"Column options",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,background:"transparent",border:0,borderRadius:"var(--radius-sm)",color:"var(--fg-muted)",cursor:"pointer"},children:a.jsx(j,{size:14,"aria-hidden":"true"})}),i!==void 0&&a.jsx("button",{type:"button",onClick:i,"aria-label":"Add card",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,background:"transparent",border:0,borderRadius:"var(--radius-sm)",color:"var(--fg-muted)",cursor:"pointer"},children:a.jsx(C,{size:14,"aria-hidden":"true"})})]}),a.jsx("div",{ref:f,className:"v8-kanban-column__body",style:{flex:1,minHeight:0,padding:"var(--space-2)",display:"flex",flexDirection:"column",gap:"var(--space-2)",overflowY:"auto",background:p?"color-mix(in oklch, var(--accent) 6%, transparent)":"transparent",transition:"background var(--motion-fast) var(--ease-out)"},children:r})]})}),v={low:"var(--fg-subtle)",medium:"var(--info)",high:"var(--warning)",urgent:"var(--danger)"},I={low:"Low",medium:"Medium",high:"High",urgent:"Urgent"},z={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},E=u.forwardRef(function(s,o){const{card:e,variant:r="default",isDragging:i,dragHandleProps:t,className:d,style:l,...c}=s;return a.jsxs("div",{ref:o,"data-kanban-card-id":e.id,className:m("v8-kanban-card",`v8-kanban-card--${r}`,i&&"is-dragging",d),style:{position:"relative",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius)",padding:"var(--space-3)",boxShadow:i===!0?"var(--shadow-3)":"none",transform:i===!0?"rotate(1.5deg)":void 0,transition:"box-shadow var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out)",...l},...t,...c,children:[r!=="compact"&&a.jsx("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:6,bottom:6,width:3,borderRadius:"0 var(--radius-pill) var(--radius-pill) 0",background:e.priority!==void 0?v[e.priority]:z[e.accentTone??"neutral"]}}),a.jsxs("div",{style:{paddingLeft:r!=="compact"?"var(--space-2)":0},children:[a.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"var(--space-2)",marginBottom:r==="detailed"?"var(--space-2)":0},children:[a.jsxs("div",{style:{flex:1,minWidth:0},children:[a.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:500,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:e.title}),r==="detailed"&&e.description!==void 0&&a.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:"var(--space-1)",display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:e.description})]}),e.priority!==void 0&&a.jsx("span",{"aria-label":`Priority: ${I[e.priority]}`,style:{width:8,height:8,borderRadius:"var(--radius-pill)",background:v[e.priority],flexShrink:0,marginTop:6}})]}),e.badges!==void 0&&a.jsx("div",{style:{display:"flex",gap:4,flexWrap:"wrap",marginTop:"var(--space-2)"},children:e.badges}),r!=="compact"&&(e.due!==void 0||e.comments!==void 0||e.attachments!==void 0||e.branch!==void 0)&&a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",marginTop:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[e.due!==void 0&&a.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[a.jsx(y,{size:12,"aria-hidden":"true"}),e.due]}),e.comments!==void 0&&e.comments>0&&a.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[a.jsx(b,{size:12,"aria-hidden":"true"}),e.comments]}),e.attachments!==void 0&&e.attachments>0&&a.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[a.jsx(w,{size:12,"aria-hidden":"true"}),e.attachments]}),e.branch!==void 0&&a.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4,fontFamily:"var(--font-mono)"},title:e.branch,children:[a.jsx(k,{size:12,"aria-hidden":"true"}),e.branch]})]})]})]})});export{W as K,E as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KanbanCard-CtTKP6ZX.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/ellipsis.js","../../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../../node_modules/lucide-react/dist/esm/icons/paperclip.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../src/web/v8/ui/kanban/KanbanColumn.tsx","../../src/web/v8/ui/kanban/KanbanCard.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Ellipsis = createLucideIcon(\"Ellipsis\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"19\", cy: \"12\", r: \"1\", key: \"1wjl8i\" }],\n [\"circle\", { cx: \"5\", cy: \"12\", r: \"1\", key: \"1pcz8c\" }]\n]);\n\nexport { Ellipsis as default };\n//# sourceMappingURL=ellipsis.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Paperclip = createLucideIcon(\"Paperclip\", [\n [\n \"path\",\n {\n d: \"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\",\n key: \"1u3ebp\"\n }\n ]\n]);\n\nexport { Paperclip as default };\n//# sourceMappingURL=paperclip.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport { Plus, MoreHorizontal } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * KanbanColumn — a single status column on the kanban board.\n *\n * Built per DESIGN.md §6: title row with count + actions, scrollable\n * card list, \"+ Add\" quick-add affordance at the bottom.\n */\n\nexport interface KanbanColumnData {\n id: string;\n title: ReactNode;\n /** Optional small description below the title. */\n description?: ReactNode;\n /** Number of cards in the column; auto-counted if not provided. */\n count?: number;\n /** WIP limit. When set, the column header shows the limit and warns when exceeded. */\n wipLimit?: number;\n /** Tone for the column header accent bar. */\n accentTone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent';\n}\n\nexport interface KanbanColumnProps extends HTMLAttributes<HTMLElement> {\n column: KanbanColumnData;\n /** Cards rendered inside the column body. */\n children?: ReactNode;\n /** Click handler for the \"+\" add button. */\n onAdd?: () => void;\n /** Click handler for the \"⋯\" overflow button. */\n onOverflow?: () => void;\n /** WIP limit warning state. */\n exceedsWip?: boolean;\n}\n\nconst ACCENT_FG: Record<NonNullable<KanbanColumnData['accentTone']>, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nexport const KanbanColumn = forwardRef<HTMLElement, KanbanColumnProps>(function KanbanColumn(\n props,\n ref,\n) {\n const { column, children, onAdd, onOverflow, exceedsWip, className, style, ...rest } = props;\n const { setNodeRef, isOver } = useDroppable({ id: column.id });\n return (\n <section\n ref={ref}\n className={cx('v8-kanban-column', isOver && 'is-over', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: 280,\n flexShrink: 0,\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n height: '100%',\n ...style,\n }}\n aria-label={typeof column.title === 'string' ? column.title : undefined}\n {...rest}\n >\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n padding: 'var(--space-3) var(--space-3)',\n borderBottom: '1px solid var(--border)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n width: 8,\n height: 8,\n borderRadius: 'var(--radius-pill)',\n background: ACCENT_FG[column.accentTone ?? 'neutral'],\n flexShrink: 0,\n }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 'var(--fs-13)',\n fontWeight: 600,\n color: 'var(--fg)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {column.title}\n </div>\n {(column.count !== undefined || column.wipLimit !== undefined) && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color:\n exceedsWip === true\n ? 'var(--danger)'\n : 'var(--fg-subtle)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {column.count ?? 0}\n {column.wipLimit !== undefined && ` / ${column.wipLimit}`}\n </div>\n )}\n </div>\n {onOverflow !== undefined && (\n <button\n type=\"button\"\n onClick={onOverflow}\n aria-label=\"Column options\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n background: 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n }}\n >\n <MoreHorizontal size={14} aria-hidden=\"true\" />\n </button>\n )}\n {onAdd !== undefined && (\n <button\n type=\"button\"\n onClick={onAdd}\n aria-label=\"Add card\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n background: 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n }}\n >\n <Plus size={14} aria-hidden=\"true\" />\n </button>\n )}\n </header>\n <div\n ref={setNodeRef}\n className=\"v8-kanban-column__body\"\n style={{\n flex: 1,\n minHeight: 0,\n padding: 'var(--space-2)',\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n overflowY: 'auto',\n background: isOver ? 'color-mix(in oklch, var(--accent) 6%, transparent)' : 'transparent',\n transition: 'background var(--motion-fast) var(--ease-out)',\n }}\n >\n {children}\n </div>\n </section>\n );\n});","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { Calendar, MessageSquare, Paperclip, GitBranch } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * KanbanCard — the primary surface of the v8 dashboard.\n *\n * Built per DESIGN.md §6: compact metadata, never decorative, drag-handle\n * is the whole card, every card has a right-click context menu.\n *\n * Variants:\n * - default: full metadata row (date, comments, attachments, branch)\n * - compact: title + 1 priority dot only (for crowded boards)\n * - detailed: title + description preview + metadata\n */\n\nexport type KanbanCardVariant = 'default' | 'compact' | 'detailed';\n\nexport type KanbanPriority = 'low' | 'medium' | 'high' | 'urgent';\n\nexport interface KanbanCardData {\n id: string;\n title: string;\n description?: string;\n priority?: KanbanPriority;\n /** Due date as ISO string or relative phrase (\"Today\", \"Tomorrow\"). */\n due?: string;\n /** Number of comments; renders icon + count. */\n comments?: number;\n /** Number of attachments. */\n attachments?: number;\n /** Branch name to show in the meta row. */\n branch?: string;\n /** IDs of assigned agents/users; rendered as AvatarStack. */\n assignees?: readonly string[];\n /** Tone of the leading priority stripe. */\n accentTone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent';\n /** Custom badge / chip to render after the title. */\n badges?: ReactNode;\n}\n\nexport interface KanbanCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'id'> {\n card: KanbanCardData;\n variant?: KanbanCardVariant;\n /** When true, the card is being dragged (visual lift + shadow). */\n isDragging?: boolean;\n /** Drag handlers from useSortable (omit to make the card non-draggable). */\n dragHandleProps?: Record<string, unknown>;\n}\n\nconst PRIORITY_FG: Record<KanbanPriority, string> = {\n low: 'var(--fg-subtle)',\n medium: 'var(--info)',\n high: 'var(--warning)',\n urgent: 'var(--danger)',\n};\n\nconst PRIORITY_LABEL: Record<KanbanPriority, string> = {\n low: 'Low',\n medium: 'Medium',\n high: 'High',\n urgent: 'Urgent',\n};\n\nconst ACCENT_FG: Record<NonNullable<KanbanCardData['accentTone']>, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nexport const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(function KanbanCard(\n props,\n ref,\n) {\n const { card, variant = 'default', isDragging, dragHandleProps, className, style, ...rest } =\n props;\n\n return (\n <div\n ref={ref}\n data-kanban-card-id={card.id}\n className={cx('v8-kanban-card', `v8-kanban-card--${variant}`, isDragging && 'is-dragging', className)}\n style={{\n position: 'relative',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 'var(--space-3)',\n boxShadow: isDragging === true ? 'var(--shadow-3)' : 'none',\n transform: isDragging === true ? 'rotate(1.5deg)' : undefined,\n transition: 'box-shadow var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out)',\n ...style,\n }}\n {...(dragHandleProps as Record<string, unknown>)}\n {...rest}\n >\n {/* Leading accent stripe — colored by priority or accentTone. */}\n {variant !== 'compact' && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n left: 0,\n top: 6,\n bottom: 6,\n width: 3,\n borderRadius: '0 var(--radius-pill) var(--radius-pill) 0',\n background:\n card.priority !== undefined\n ? PRIORITY_FG[card.priority]\n : ACCENT_FG[card.accentTone ?? 'neutral'],\n }}\n />\n )}\n <div style={{ paddingLeft: variant !== 'compact' ? 'var(--space-2)' : 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-2)',\n marginBottom: variant === 'detailed' ? 'var(--space-2)' : 0,\n }}\n >\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 'var(--fs-13)',\n fontWeight: 500,\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n }}\n >\n {card.title}\n </div>\n {variant === 'detailed' && card.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 'var(--space-1)',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {card.description}\n </div>\n )}\n </div>\n {card.priority !== undefined && (\n <span\n aria-label={`Priority: ${PRIORITY_LABEL[card.priority]}`}\n style={{\n width: 8,\n height: 8,\n borderRadius: 'var(--radius-pill)',\n background: PRIORITY_FG[card.priority],\n flexShrink: 0,\n marginTop: 6,\n }}\n />\n )}\n </div>\n {card.badges !== undefined && (\n <div style={{ display: 'flex', gap: 4, flexWrap: 'wrap', marginTop: 'var(--space-2)' }}>\n {card.badges}\n </div>\n )}\n {variant !== 'compact' &&\n (card.due !== undefined ||\n card.comments !== undefined ||\n card.attachments !== undefined ||\n card.branch !== undefined) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-3)',\n marginTop: 'var(--space-2)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {card.due !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Calendar size={12} aria-hidden=\"true\" />\n {card.due}\n </span>\n )}\n {card.comments !== undefined && card.comments > 0 && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <MessageSquare size={12} aria-hidden=\"true\" />\n {card.comments}\n </span>\n )}\n {card.attachments !== undefined && card.attachments > 0 && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Paperclip size={12} aria-hidden=\"true\" />\n {card.attachments}\n </span>\n )}\n {card.branch !== undefined && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n fontFamily: 'var(--font-mono)',\n }}\n title={card.branch}\n >\n <GitBranch size={12} aria-hidden=\"true\" />\n {card.branch}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n\n/**\n * useKanbanCardSortable — convenience hook wrapping @dnd-kit/sortable's\n * useSortable for a card. Returns props to spread onto <KanbanCard>.\n */\nexport function useKanbanCardSortable(id: string) {\n const sortable = useSortable({ id });\n const style = {\n transform: CSS.Transform.toString(sortable.transform),\n transition: sortable.transition,\n };\n return {\n attributes: sortable.attributes,\n listeners: sortable.listeners,\n setNodeRef: sortable.setNodeRef,\n isDragging: sortable.isDragging,\n style,\n };\n}"],"names":["Ellipsis","createLucideIcon","GitBranch","Paperclip","Plus","ACCENT_FG","KanbanColumn","forwardRef","props","ref","column","children","onAdd","onOverflow","exceedsWip","className","style","rest","setNodeRef","isOver","useDroppable","jsxs","cx","jsx","MoreHorizontal","PRIORITY_FG","PRIORITY_LABEL","KanbanCard","card","variant","isDragging","dragHandleProps","Calendar","MessageSquare"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|