@burdenoff/planmagnet-fe-sdk 2026.704.2 → 2026.704.3
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/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphql/client.ts","../src/config/index.ts","../src/components/PlanMagnetProvider.tsx","../src/graphql-ops/index.ts","../src/utils/cn.ts","../src/utils/dates.ts","../src/ui/badge.tsx","../src/ui/avatar.tsx","../src/types/index.ts","../src/ui/link-chip.tsx","../src/i18n/labels.ts","../src/ui/indicators.tsx","../src/ui/overlay.tsx","../src/components/TaskCard.tsx","../src/hooks/useWorkItemLinks.ts","../src/components/TaskBoardCore.tsx","../src/components/TaskBoard.tsx","../src/components/CreateTaskCore.tsx","../src/components/CreateTask.tsx","../src/components/TaskListCore.tsx","../src/components/TaskList.tsx","../src/hooks/useMilestones.ts","../src/components/TaskTimelineCore.tsx","../src/components/TaskToolbar.tsx","../src/components/TaskDetailCore.tsx","../src/components/TaskDetail.tsx","../src/components/TasksPageCore.tsx","../src/components/TasksPage.tsx"],"names":["config","jsx","createContext","useContext","jsxs","useEffect","useMemo","useQuery","from","onError","useState","useMutation","format","a","s","e","isToday","ListIcon","User","fieldClass","labelClass","useApolloClient","Card","CardContent","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import {\n ApolloClient,\n InMemoryCache,\n createHttpLink,\n from,\n} from \"@apollo/client/core\";\nimport { setContext } from \"@apollo/client/link/context\";\nimport { onError } from \"@apollo/client/link/error\";\nimport { CombinedGraphQLErrors } from \"@apollo/client/errors\";\n\nexport interface PlanMagnetClientConfig {\n /** Workspace API gateway base URL (e.g. https://graphqlworkspaces.burdenoff.com). */\n apiGatewayUrl: string;\n /** Platform identity token → `Authorization: Bearer <authToken>`. */\n authToken?: string;\n /** Workspace access token → `X-Workspace-Authorization: Bearer <workspaceToken>`. */\n workspaceToken?: string;\n /** Workspace ID → `x-workspace-id`. Required for task queries. */\n workspaceId: string;\n /** Tenant ID → `x-tenant-id` (optional). */\n tenantId?: string;\n /**\n * Optional callback invoked when the gateway returns UNAUTHENTICATED / FORBIDDEN\n * (or a network-level 401/403). Host shells use this to trigger re-auth / logout.\n */\n onAuthError?: () => void;\n}\n\n// Module-level client reference (for SDK-managed mode / wrapper injection).\nlet clientInstance: ApolloClient | null = null;\n\n/**\n * Build the InMemoryCache with PlanMagnet task/project type policies.\n * `merge:false` on the list roots avoids Apollo warning about paginated merges,\n * and keyFields keep WorkItem / Project normalized by id.\n */\nfunction buildCache(): InMemoryCache {\n return new InMemoryCache({\n typePolicies: {\n Query: {\n fields: {\n planmagnetWorkItems: { merge: false },\n planmagnetProjects: { merge: false },\n planmagnetWorkItemLinks: { merge: false },\n },\n },\n WorkItem: { keyFields: [\"id\"] },\n PlanmagnetProject: { keyFields: [\"id\"] },\n Project: { keyFields: [\"id\"] },\n WorkItemLink: { keyFields: [\"id\"] },\n },\n });\n}\n\n/**\n * Create a new Apollo client for the PlanMagnet SDK.\n *\n * HTTP-only (no subscriptions) — tasks are read/write over queries + mutations.\n * Injects the dual-token workspace headers on every request.\n */\nexport function createPlanMagnetClient(\n config: PlanMagnetClientConfig,\n): ApolloClient {\n const graphqlUrl = getGraphQLUrl(config.apiGatewayUrl);\n\n const httpLink = createHttpLink({ uri: graphqlUrl });\n\n const authLink = setContext((_, { headers }) => ({\n headers: {\n ...headers,\n ...(config.authToken && {\n authorization: `Bearer ${config.authToken}`,\n }),\n ...(config.workspaceToken && {\n \"x-workspace-authorization\": `Bearer ${config.workspaceToken}`,\n }),\n \"x-workspace-id\": config.workspaceId,\n ...(config.tenantId && { \"x-tenant-id\": config.tenantId }),\n },\n }));\n\n const errorLink = onError(({ error }) => {\n if (!config.onAuthError) return;\n if (CombinedGraphQLErrors.is(error)) {\n for (const graphQLError of error.errors) {\n const code = graphQLError.extensions?.code;\n if (code === \"UNAUTHENTICATED\" || code === \"FORBIDDEN\") {\n config.onAuthError();\n return;\n }\n }\n } else if (error) {\n const msg = error.message ?? \"\";\n if (\n msg.includes(\"401\") ||\n msg.includes(\"403\") ||\n msg.includes(\"Unauthorized\")\n ) {\n config.onAuthError();\n }\n }\n });\n\n // NOTE: `errorPolicy` is intentionally NOT set in defaultOptions. Apollo\n // Client v4 requires default errorPolicy to be declared via the\n // `DeclareDefaultOptions` module augmentation for type safety; setting it here\n // fails the .d.ts build. Auth errors are handled by `errorLink`, and callers\n // that need `errorPolicy: 'all'` can pass it per-operation.\n return new ApolloClient({\n link: from([errorLink, authLink, httpLink]),\n cache: buildCache(),\n defaultOptions: {\n watchQuery: { fetchPolicy: \"cache-and-network\" },\n query: { fetchPolicy: \"network-only\" },\n },\n });\n}\n\n/**\n * Resolve the GraphQL URL from the API gateway base URL.\n * Appends `/workspaces/graphql` unless the URL already ends with `/graphql`.\n */\nfunction getGraphQLUrl(apiGatewayUrl: string): string {\n const normalizedBase = apiGatewayUrl.endsWith(\"/\")\n ? apiGatewayUrl.slice(0, -1)\n : apiGatewayUrl;\n if (normalizedBase.endsWith(\"/graphql\")) {\n return normalizedBase;\n }\n return `${normalizedBase}/workspaces/graphql`;\n}\n\n/**\n * Set the module-level client (SDK-managed mode or wrapper injection).\n */\nexport function setPlanMagnetClient(client: ApolloClient): void {\n clientInstance = client;\n}\n\n/**\n * Get the module-level client.\n * @throws if the client is not initialized.\n */\nexport function getPlanMagnetClient(): ApolloClient {\n if (!clientInstance) {\n throw new Error(\n \"PlanMagnet client not initialized. Use PlanMagnetProvider or call setPlanMagnetClient().\",\n );\n }\n return clientInstance;\n}\n\n/**\n * Get the client if available, or null if not initialized.\n */\nexport function getPlanMagnetClientSafe(): ApolloClient | null {\n return clientInstance;\n}\n\n/**\n * Whether the module-level client is ready.\n */\nexport function isPlanMagnetClientReady(): boolean {\n return clientInstance !== null;\n}\n\n/**\n * Poll until the module-level client is initialized (or timeout).\n */\nexport function waitForPlanMagnetClient(\n timeoutMs = 10000,\n intervalMs = 100,\n): Promise<ApolloClient | null> {\n return new Promise((resolve) => {\n if (clientInstance) {\n resolve(clientInstance);\n return;\n }\n const start = Date.now();\n const timer = setInterval(() => {\n if (clientInstance) {\n clearInterval(timer);\n resolve(clientInstance);\n } else if (Date.now() - start >= timeoutMs) {\n clearInterval(timer);\n resolve(null);\n }\n }, intervalMs);\n });\n}\n\n/**\n * Reset the client reference (cleanup on unmount).\n */\nexport function resetPlanMagnetClient(): void {\n clientInstance = null;\n}\n","/**\n * Configuration module for the PlanMagnet SDK.\n */\n\n/** Result passed to the onTaskSaved callback after a successful create/update. */\nexport interface TaskSavedResult {\n /** Work-item row ID. */\n id: string;\n /** Human-readable work-item key (e.g. \"PM-123\"). */\n key: string;\n /** Work-item title. */\n title: string;\n /** Project the work item belongs to. */\n projectId: string;\n /** What kind of save operation occurred. */\n operation: \"created\" | \"updated\";\n}\n\nexport interface PlanMagnetConfig {\n /** GraphQL endpoint URL (workspace gateway). */\n apiGatewayUrl: string;\n /** Auth token for API calls. */\n authToken?: string;\n /** Current workspace ID. */\n workspaceId: string;\n /** Current tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional allowlist for host origins embedding the SDK. */\n trustedOrigins?: string[];\n /** Product ID for host-app isolation (e.g. 'healthybowl', 'workspaces'). */\n productId?: string;\n /** Product name for display purposes. */\n productName?: string;\n /**\n * Callback invoked after a work item is successfully created/updated.\n * Host apps (e.g. HealthyBowl) can use this to sync metadata to their own\n * backends. Errors thrown here are caught and logged — they never block the save.\n */\n onTaskSaved?: (result: TaskSavedResult) => void | Promise<void>;\n}\n\n// Default configuration.\nlet runtimeConfig: PlanMagnetConfig = {\n apiGatewayUrl: \"\",\n workspaceId: \"\",\n};\n\n/**\n * Live-access proxy to the current configuration.\n */\nexport const config = new Proxy({} as PlanMagnetConfig, {\n get(_, prop: keyof PlanMagnetConfig) {\n return runtimeConfig[prop];\n },\n});\n\n/**\n * Get the full configuration object (a copy).\n */\nexport function getPlanMagnetConfig(): PlanMagnetConfig {\n return { ...runtimeConfig };\n}\n\n/**\n * Merge in runtime configuration.\n */\nexport function setPlanMagnetConfig(\n newConfig: Partial<PlanMagnetConfig>,\n): void {\n runtimeConfig = { ...runtimeConfig, ...newConfig };\n}\n\n/**\n * Reset configuration to defaults.\n */\nexport function resetPlanMagnetConfig(): void {\n runtimeConfig = {\n apiGatewayUrl: \"\",\n workspaceId: \"\",\n };\n}\n\nfunction normalizeOrigin(origin: string): string {\n return origin.replace(/\\/$/, \"\");\n}\n\n/**\n * Enforce an optional host-origin allowlist for embedded deployments.\n * @throws if the current window origin is not in the allowlist.\n */\nexport function validateTrustedOrigin(trustedOrigins?: string[]): void {\n if (typeof window === \"undefined\" || !trustedOrigins?.length) {\n return;\n }\n\n const currentOrigin = normalizeOrigin(window.location.origin);\n const allowedOrigins = trustedOrigins.map(normalizeOrigin);\n\n if (!allowedOrigins.includes(currentOrigin)) {\n throw new Error(\n `PlanMagnet SDK blocked untrusted origin: ${currentOrigin}`,\n );\n }\n}\n\n/**\n * Resolve the GraphQL endpoint URL.\n */\nexport function getGraphQLEndpoint(baseUrl?: string): string {\n const url = baseUrl || runtimeConfig.apiGatewayUrl;\n if (!url) {\n throw new Error(\"PlanMagnet SDK requires apiGatewayUrl to be configured\");\n }\n const normalizedBase = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n if (normalizedBase.endsWith(\"/graphql\")) {\n return normalizedBase;\n }\n return `${normalizedBase}/workspaces/graphql`;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { ApolloProvider } from \"@apollo/client/react\";\nimport { type ApolloClient } from \"@apollo/client/core\";\nimport {\n createPlanMagnetClient,\n setPlanMagnetClient,\n resetPlanMagnetClient,\n} from \"../graphql/client\";\nimport {\n setPlanMagnetConfig,\n resetPlanMagnetConfig,\n validateTrustedOrigin,\n} from \"../config\";\n\nexport interface PlanMagnetProviderProps {\n /** Workspace API gateway URL. Required unless a client is injected. */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN so the host can trigger re-auth. */\n onAuthError?: () => void;\n /**\n * BYO: host shell injects its already-authed workspace Apollo client\n * (e.g. microfe / HealthyBowl shell). Takes priority over apiGatewayUrl.\n */\n workspaceClient?: ApolloClient;\n /** @deprecated Use workspaceClient instead. */\n apolloClient?: ApolloClient;\n children: ReactNode;\n}\n\ninterface PlanMagnetContextValue {\n apiGatewayUrl?: string;\n authToken?: string;\n workspaceId: string;\n tenantId?: string;\n organizationId?: string;\n trustedOrigins?: string[];\n workspaceClient: ApolloClient;\n}\n\nconst PlanMagnetContext = createContext<PlanMagnetContextValue | null>(null);\n\n/**\n * PlanMagnetProvider — mirrors the FluidGrids client-injection model.\n *\n * Resolution priority for the workspace Apollo client:\n * 1. `workspaceClient` (host-injected)\n * 2. `apolloClient` (legacy alias)\n * 3. `createPlanMagnetClient({ apiGatewayUrl, ... })`\n * Throws if none of the above is available.\n *\n * Unlike the microfe provider, this ALWAYS mounts its own `<ApolloProvider>`\n * (with the injected-or-built client) so an embedded TaskBoard renders inside\n * any host page — no reliance on an ambient ApolloProvider.\n */\nexport function PlanMagnetProvider({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient: externalWorkspaceClient,\n apolloClient: legacyClient,\n children,\n}: PlanMagnetProviderProps) {\n validateTrustedOrigin(trustedOrigins);\n\n const workspaceClient = useMemo<ApolloClient>(() => {\n if (externalWorkspaceClient) return externalWorkspaceClient;\n if (legacyClient) return legacyClient;\n if (apiGatewayUrl) {\n return createPlanMagnetClient({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n onAuthError,\n });\n }\n throw new Error(\n \"PlanMagnetProvider: Either provide workspaceClient or apiGatewayUrl\",\n );\n }, [\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n onAuthError,\n externalWorkspaceClient,\n legacyClient,\n ]);\n\n // Publish the client to the module singleton so non-hook code / hooks that\n // call getPlanMagnetClient() can reach it without prop drilling.\n useEffect(() => {\n setPlanMagnetClient(workspaceClient);\n return () => {\n resetPlanMagnetClient();\n };\n }, [workspaceClient]);\n\n // Publish runtime config.\n useEffect(() => {\n setPlanMagnetConfig({\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n });\n return () => {\n resetPlanMagnetConfig();\n };\n }, [\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n ]);\n\n const contextValue = useMemo<PlanMagnetContextValue>(\n () => ({\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n workspaceClient,\n }),\n [\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n workspaceClient,\n ],\n );\n\n return (\n <PlanMagnetContext.Provider value={contextValue}>\n <ApolloProvider client={workspaceClient}>{children}</ApolloProvider>\n </PlanMagnetContext.Provider>\n );\n}\n\nexport function usePlanMagnetContext() {\n const context = useContext(PlanMagnetContext);\n if (!context) {\n throw new Error(\n \"usePlanMagnetContext must be used within PlanMagnetProvider\",\n );\n }\n return context;\n}\n\n/**\n * Safe variant — returns null instead of throwing when used outside a provider.\n * TaskBoardCore uses this so a `workspaceId` prop can substitute for context.\n */\nexport function usePlanMagnetContextSafe(): PlanMagnetContextValue | null {\n return useContext(PlanMagnetContext);\n}\n","import { gql } from \"@apollo/client\";\n\n/**\n * PlanMagnet task GraphQL operation documents.\n *\n * Hand-written `gql` documents bundled with the SDK. They target the composed\n * gateway supergraph, whose root fields AND input types are Planmagnet-prefixed\n * (see wspace-planmagnet-svc/.hive-schema.graphql — the source of truth). A GraphQL\n * operation's variable *type definitions* are part of the query document and are\n * validated by the gateway, so the input type names MUST match the schema exactly\n * (`PlanmagnetCreateWorkItemInput`, `PlanmagnetWorkItemFilter`,\n * `PlanmagnetPaginationInput`, …). Un-prefixed names pass Apollo MockedProvider\n * but FAIL live gateway validation (\"Unknown type …\").\n *\n * Phase 3: replace with codegen output after `bun run schema:pull && bun run codegen`.\n */\n\n// ---------------------------------------------------------------------------\n// Fragments\n// ---------------------------------------------------------------------------\n\nexport const WORK_ITEM_SUMMARY_FIELDS = gql`\n fragment WorkItemSummaryFields on WorkItem {\n id\n key\n title\n type\n status\n priority\n assigneeId\n sprintId\n storyPoints\n dueDate\n labels\n }\n`;\n\nexport const WORK_ITEM_FIELDS = gql`\n fragment WorkItemFields on WorkItem {\n id\n workspaceId\n projectId\n key\n title\n description\n type\n status\n priority\n assigneeId\n reporterId\n parentId\n sprintId\n storyPoints\n estimateMinutes\n timeSpentMinutes\n dueDate\n labels\n tags\n sortOrder\n metadata\n createdBy\n createdAt\n updatedAt\n updatedBy\n deletedAt\n }\n`;\n\nexport const PROJECT_SUMMARY_FIELDS = gql`\n fragment ProjectSummaryFields on Project {\n id\n name\n key\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport const LIST_WORK_ITEMS = gql`\n query ListWorkItems(\n $workspaceId: ID!\n $filter: PlanmagnetWorkItemFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetWorkItems(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...WorkItemSummaryFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${WORK_ITEM_SUMMARY_FIELDS}\n`;\n\nexport const GET_WORK_ITEM = gql`\n query GetWorkItem($id: ID!) {\n planmagnetWorkItem(id: $id) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\nexport const GET_PROJECTS = gql`\n query GetProjects(\n $workspaceId: ID!\n $filter: PlanmagnetProjectFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetProjects(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...ProjectSummaryFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${PROJECT_SUMMARY_FIELDS}\n`;\n\n// ---------------------------------------------------------------------------\n// Mutations (Phase 2 wires these into a CreateTask form / drag-move handler)\n// ---------------------------------------------------------------------------\n\nexport const CREATE_WORK_ITEM = gql`\n mutation CreateWorkItem($input: PlanmagnetCreateWorkItemInput!) {\n planmagnetCreateWorkItem(input: $input) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\nexport const UPDATE_WORK_ITEM = gql`\n mutation UpdateWorkItem($id: ID!, $input: PlanmagnetUpdateWorkItemInput!) {\n planmagnetUpdateWorkItem(id: $id, input: $input) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\nexport const MOVE_WORK_ITEM = gql`\n mutation MoveWorkItem($id: ID!, $input: PlanmagnetMoveWorkItemInput!) {\n planmagnetMoveWorkItem(id: $id, input: $input) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\n// ---------------------------------------------------------------------------\n// WorkItemLink — the product-agnostic link between a WorkItem and an external\n// entity owned by another product (HealthyBowl uses it to pin a task to a\n// Field/Crop/Animal/Pest record). The OUTPUT type is the bare `WorkItemLink`;\n// only the root fields and INPUT types are Planmagnet-prefixed. WorkItem has no\n// `links` field, so links are fetched via this standalone query and joined to\n// work items client-side by workItemId.\n// ---------------------------------------------------------------------------\n\nexport const WORK_ITEM_LINK_FIELDS = gql`\n fragment WorkItemLinkFields on WorkItemLink {\n id\n workspaceId\n workItemId\n sourceProduct\n entityType\n entityId\n relationType\n displayNameSnapshot\n deepLinkSnapshot\n metadata\n createdBy\n onBehalfOf\n createdAt\n updatedAt\n }\n`;\n\nexport const LIST_WORK_ITEM_LINKS = gql`\n query ListWorkItemLinks(\n $workspaceId: ID!\n $filter: PlanmagnetWorkItemLinkFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetWorkItemLinks(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...WorkItemLinkFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${WORK_ITEM_LINK_FIELDS}\n`;\n\nexport const CREATE_WORK_ITEM_LINK = gql`\n mutation CreateWorkItemLink($input: PlanmagnetCreateWorkItemLinkInput!) {\n planmagnetLinkWorkItem(input: $input) {\n ...WorkItemLinkFields\n }\n }\n ${WORK_ITEM_LINK_FIELDS}\n`;\n\n// planmagnetUnlinkWorkItem returns a raw Boolean! — NO selection set.\nexport const DELETE_WORK_ITEM_LINK = gql`\n mutation UnlinkWorkItem($id: ID!) {\n planmagnetUnlinkWorkItem(id: $id)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Milestones — used by the Timeline to render milestone flags (e.g. a harvest\n// window). NOTE: Milestone.sortOrder is SDL Int! but maps a Prisma `position`\n// column (same class as the WorkItem.sortOrder serialization bug) — so it is\n// deliberately NOT selected here; the same goes for the non-null tagsV2 JSON we\n// don't need. Only safe, mapped fields are selected.\n// ---------------------------------------------------------------------------\n\nexport const MILESTONE_FIELDS = gql`\n fragment MilestoneFields on Milestone {\n id\n projectId\n name\n description\n status\n dueDate\n completedAt\n ownerId\n createdAt\n updatedAt\n }\n`;\n\nexport const LIST_MILESTONES = gql`\n query ListMilestones(\n $workspaceId: ID!\n $filter: PlanmagnetMilestoneFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetMilestones(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...MilestoneFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${MILESTONE_FIELDS}\n`;\n\n// ---------------------------------------------------------------------------\n// Task delete — planmagnetDeleteWorkItem returns a raw Boolean! (no selection).\n// ---------------------------------------------------------------------------\nexport const DELETE_WORK_ITEM = gql`\n mutation DeleteWorkItem($id: ID!) {\n planmagnetDeleteWorkItem(id: $id)\n }\n`;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { format, isToday, isValid, parseISO, startOfDay } from \"date-fns\";\nimport type { TaskStatus } from \"../types\";\n\n/** Statuses that are \"closed\" — an overdue date on these is not a warning. */\nconst CLOSED_STATUSES: ReadonlySet<TaskStatus> = new Set([\"DONE\", \"CANCELLED\"]);\n\n/** Parse an ISO date/date-time string; returns null if unparseable. */\nexport function parseDate(iso: string | null | undefined): Date | null {\n if (!iso) return null;\n const d = parseISO(iso);\n return isValid(d) ? d : null;\n}\n\n/**\n * Short, human due-date label: \"Jul 20\" within the current year, \"Jul 20 2027\"\n * otherwise. Returns null for missing/invalid dates so callers can render a dash.\n */\nexport function formatDueDate(iso: string | null | undefined): string | null {\n const d = parseDate(iso);\n if (!d) return null;\n const now = new Date();\n return format(\n d,\n d.getFullYear() === now.getFullYear() ? \"MMM d\" : \"MMM d yyyy\",\n );\n}\n\n/** True when the due date is before today and the item is not closed. */\nexport function isOverdue(\n iso: string | null | undefined,\n status?: TaskStatus,\n): boolean {\n const d = parseDate(iso);\n if (!d) return false;\n if (status && CLOSED_STATUSES.has(status)) return false;\n return startOfDay(d).getTime() < startOfDay(new Date()).getTime();\n}\n\n/** True when the due date is today. */\nexport function isDueToday(iso: string | null | undefined): boolean {\n const d = parseDate(iso);\n return d ? isToday(d) : false;\n}\n","import { type HTMLAttributes } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../utils/cn\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize transition-colors\",\n {\n variants: {\n variant: {\n default: \"bg-primary/10 text-primary\",\n muted: \"bg-muted text-muted-foreground\",\n secondary: \"bg-secondary text-secondary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n destructive: \"bg-destructive/15 text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\n/**\n * Badge — a small owned pill primitive used for task status/priority/type.\n * Semantic-token only.\n */\nexport function Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { badgeVariants };\n","import { User } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\n\n/**\n * Avatar — a small identity chip for a task assignee.\n *\n * The board query only returns an `assigneeId` (an actor UUID) — there is no\n * user directory in the SDK, and inventing names/photos would be theater. So\n * the avatar renders deterministic initials in a token-tinted circle, and hosts\n * that DO have a directory can pass a resolved `name` for real initials/tooltip.\n * With no assignee it renders a dashed \"unassigned\" circle.\n *\n * Tints come from the semantic-token palette only (never raw colors); the tint\n * is chosen deterministically from the id so the same actor is always the same\n * color across cards.\n */\n\nconst TINTS = [\n \"bg-primary/15 text-primary\",\n \"bg-secondary text-secondary-foreground\",\n \"bg-accent text-accent-foreground\",\n \"bg-muted text-muted-foreground\",\n \"bg-destructive/15 text-destructive\",\n] as const;\n\nconst SIZES = {\n sm: \"h-5 w-5 text-[9px]\",\n md: \"h-6 w-6 text-[10px]\",\n lg: \"h-8 w-8 text-xs\",\n} as const;\n\n/** Stable index into TINTS from an arbitrary seed string. */\nfunction tintIndex(seed: string): number {\n let h = 0;\n for (let i = 0; i < seed.length; i++) {\n h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n }\n return h % TINTS.length;\n}\n\n/** Two-letter initials from a display name, else the id, else \"?\". */\nfunction initials(\n name: string | null | undefined,\n id: string | null | undefined,\n): string {\n const source = (name ?? \"\").trim();\n if (source) {\n const parts = source.split(/\\s+/);\n const first = parts[0]?.[0] ?? \"\";\n const second = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? \"\") : \"\";\n return (first + second).toUpperCase() || \"?\";\n }\n const raw = (id ?? \"\").replace(/[^a-zA-Z0-9]/g, \"\");\n return raw.slice(0, 2).toUpperCase() || \"?\";\n}\n\nexport interface AvatarProps {\n /** Assignee actor id (used for the deterministic tint + fallback initials). */\n id?: string | null;\n /** Resolved display name, if the host has a directory. */\n name?: string | null;\n size?: keyof typeof SIZES;\n className?: string;\n}\n\nexport function Avatar({ id, name, size = \"md\", className }: AvatarProps) {\n if (!id && !name) {\n return (\n <span\n className={cn(\n \"inline-flex items-center justify-center rounded-full border border-dashed border-border text-muted-foreground\",\n SIZES[size],\n className,\n )}\n title=\"Unassigned\"\n aria-label=\"Unassigned\"\n >\n <User className=\"h-1/2 w-1/2\" aria-hidden=\"true\" />\n </span>\n );\n }\n const tint = TINTS[tintIndex(name || id || \"\")];\n return (\n <span\n className={cn(\n \"inline-flex items-center justify-center rounded-full font-medium\",\n SIZES[size],\n tint,\n className,\n )}\n title={name ?? id ?? undefined}\n aria-label={name ?? id ?? undefined}\n >\n {initials(name, id)}\n </span>\n );\n}\n","/**\n * Domain types for the PlanMagnet task SDK.\n *\n * These mirror the wspace-planmagnet-svc schema (WorkItem / Project) but are\n * kept hand-written for Phase 1 so the SDK compiles without a live `schema:pull`.\n * Phase 2 should replace the hand-written slices with codegen output.\n */\n\n/** Board columns (WorkItemStatus). Logical UI order, not schema alpha order. */\nexport type TaskStatus =\n | \"BACKLOG\"\n | \"TODO\"\n | \"IN_PROGRESS\"\n | \"IN_REVIEW\"\n | \"TESTING\"\n | \"DONE\"\n | \"CANCELLED\";\n\n/** Work-item type (WorkItemType). */\nexport type TaskType = \"TASK\" | \"STORY\" | \"BUG\" | \"EPIC\" | \"SUB_TASK\";\n\n/** Work-item priority (WorkItemPriority). */\nexport type TaskPriority = \"NONE\" | \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\";\n\n/** Cross-product entity link relation (WorkItemLinkRelation). */\nexport type WorkItemLinkRelation =\n \"RELATED_TO\" | \"BLOCKS\" | \"AFFECTS\" | \"INSPECTS\" | \"PRODUCES\" | \"WORKS_ON\";\n\n/**\n * A work item as rendered on the board — the summary field set from\n * `WorkItemSummaryFields`.\n */\nexport interface Task {\n id: string;\n key: string;\n title: string;\n type: TaskType;\n status: TaskStatus;\n priority: TaskPriority;\n assigneeId?: string | null;\n sprintId?: string | null;\n storyPoints?: number | null;\n dueDate?: string | null;\n labels: string[];\n}\n\n/**\n * A work item with the full field set from `WorkItemFields` — used by the\n * detail view (view + inline edit). Superset of `Task` (the board summary).\n */\nexport interface WorkItemDetail {\n id: string;\n workspaceId: string;\n projectId: string;\n key: string;\n title: string;\n description?: string | null;\n type: TaskType;\n status: TaskStatus;\n priority: TaskPriority;\n assigneeId?: string | null;\n reporterId?: string | null;\n parentId?: string | null;\n sprintId?: string | null;\n storyPoints?: number | null;\n estimateMinutes?: number | null;\n timeSpentMinutes?: number | null;\n dueDate?: string | null;\n labels: string[];\n tags: string[];\n sortOrder?: number | null;\n metadata?: unknown;\n createdBy?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n updatedBy?: string | null;\n deletedAt?: string | null;\n}\n\n/** Project summary (for the create form's project selector / board scoping). */\nexport interface Project {\n id: string;\n name: string;\n key: string;\n status: string;\n methodology: string;\n ownerId: string;\n startDate?: string | null;\n endDate?: string | null;\n tags: string[];\n}\n\n/** Input for `planmagnetCreateWorkItem`. projectId + title + type are required. */\nexport interface CreateTaskInput {\n projectId: string;\n title: string;\n type: TaskType;\n description?: string;\n status?: TaskStatus;\n priority?: TaskPriority;\n assigneeId?: string;\n reporterId?: string;\n parentId?: string;\n sprintId?: string;\n storyPoints?: number;\n estimateMinutes?: number;\n dueDate?: string;\n labels?: string[];\n tags?: string[];\n sortOrder?: number;\n}\n\n/** Input for `planmagnetUpdateWorkItem`. */\nexport interface UpdateTaskInput {\n title?: string;\n description?: string;\n type?: TaskType;\n status?: TaskStatus;\n priority?: TaskPriority;\n assigneeId?: string;\n sprintId?: string;\n storyPoints?: number;\n dueDate?: string;\n labels?: string[];\n tags?: string[];\n sortOrder?: number;\n}\n\n/** Filter for `planmagnetWorkItems`. */\nexport interface ListTasksInput {\n assigneeId?: string;\n parentId?: string;\n priority?: TaskPriority;\n projectId?: string;\n reporterId?: string;\n search?: string;\n sprintId?: string;\n status?: TaskStatus;\n type?: TaskType;\n}\n\n/** Cursor pagination input (PlanmagnetPaginationInput / PaginationInput). */\nexport interface TaskPaginationInput {\n after?: string;\n before?: string;\n first?: number;\n last?: number;\n}\n\nexport interface TaskPageInfo {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n startCursor?: string | null;\n endCursor?: string | null;\n totalCount: number;\n}\n\n/** Shape returned by the ListWorkItems query. */\nexport interface WorkItemList {\n items: Task[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/** Shape returned by the GetProjects query. */\nexport interface ProjectList {\n items: Project[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/**\n * A link between a work item and an external entity owned by another product\n * (`WorkItemLink`). HealthyBowl pins a task to a Field/Crop/Animal/Pest record\n * via `sourceProduct: \"healthybowl\"` + `entityType`/`entityId`, snapshotting a\n * label + deep-link so a deleted record degrades gracefully. The OUTPUT type is\n * bare `WorkItemLink`; server-side all ids except `id` are `String`.\n */\nexport interface WorkItemLink {\n id: string;\n workspaceId: string;\n workItemId: string;\n sourceProduct: string;\n entityType: string;\n entityId: string;\n relationType: WorkItemLinkRelation;\n displayNameSnapshot?: string | null;\n deepLinkSnapshot?: string | null;\n metadata?: unknown;\n createdBy: string;\n onBehalfOf?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Input for `planmagnetLinkWorkItem` (PlanmagnetCreateWorkItemLinkInput).\n * Required: workItemId, sourceProduct, entityType, entityId. `relationType` is\n * optional (server defaults to RELATED_TO).\n */\nexport interface CreateWorkItemLinkInput {\n workItemId: string;\n sourceProduct: string;\n entityType: string;\n entityId: string;\n relationType?: WorkItemLinkRelation;\n displayNameSnapshot?: string;\n deepLinkSnapshot?: string;\n metadata?: unknown;\n}\n\n/** Filter for `planmagnetWorkItemLinks` (PlanmagnetWorkItemLinkFilter). */\nexport interface ListWorkItemLinksInput {\n workItemId?: string;\n sourceProduct?: string;\n entityType?: string;\n entityId?: string;\n relationType?: WorkItemLinkRelation;\n}\n\n/** Shape returned by the ListWorkItemLinks query (PlanmagnetWorkItemLinkList). */\nexport interface WorkItemLinkList {\n items: WorkItemLink[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/** Milestone status (MilestoneStatus). */\nexport type MilestoneStatus =\n \"PENDING\" | \"IN_PROGRESS\" | \"COMPLETED\" | \"MISSED\" | \"CANCELLED\";\n\n/**\n * A project milestone (e.g. a harvest window). Rendered as a flag on the\n * Timeline. `sortOrder`/`tagsV2` are intentionally omitted (see LIST_MILESTONES).\n */\nexport interface Milestone {\n id: string;\n projectId: string;\n name: string;\n description?: string | null;\n status: MilestoneStatus;\n dueDate?: string | null;\n completedAt?: string | null;\n ownerId?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/** Filter for `planmagnetMilestones` (PlanmagnetMilestoneFilter). */\nexport interface ListMilestonesInput {\n ownerId?: string;\n projectId?: string;\n search?: string;\n status?: MilestoneStatus;\n}\n\n/** Shape returned by LIST_MILESTONES (PlanmagnetMilestoneList). */\nexport interface MilestoneList {\n items: Milestone[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/** Board column definition. */\nexport interface BoardColumn {\n status: TaskStatus;\n label: string;\n}\n\n/**\n * The default, ordered board columns. Product-agnostic — no farm semantics.\n * TESTING/CANCELLED are omitted from the default board but are valid statuses;\n * callers can override via TaskBoardCoreProps.columns.\n */\nexport const DEFAULT_BOARD_COLUMNS: BoardColumn[] = [\n { status: \"BACKLOG\", label: \"Backlog\" },\n { status: \"TODO\", label: \"To Do\" },\n { status: \"IN_PROGRESS\", label: \"In Progress\" },\n { status: \"IN_REVIEW\", label: \"In Review\" },\n { status: \"TESTING\", label: \"Testing\" },\n { status: \"DONE\", label: \"Done\" },\n];\n\n/** Priority filter options (UI order). */\nexport const TASK_PRIORITIES: TaskPriority[] = [\n \"NONE\",\n \"LOW\",\n \"MEDIUM\",\n \"HIGH\",\n \"CRITICAL\",\n];\n\n/** Type filter options (UI order). */\nexport const TASK_TYPES: TaskType[] = [\n \"TASK\",\n \"STORY\",\n \"BUG\",\n \"EPIC\",\n \"SUB_TASK\",\n];\n\n/** All work-item statuses (UI/logical order). */\nexport const TASK_STATUSES: TaskStatus[] = [\n \"BACKLOG\",\n \"TODO\",\n \"IN_PROGRESS\",\n \"IN_REVIEW\",\n \"TESTING\",\n \"DONE\",\n \"CANCELLED\",\n];\n\n/**\n * Human-readable label for an enum value: lower-cases and turns `_` into a\n * space (e.g. `IN_PROGRESS` → `in progress`, `SUB_TASK` → `sub task`). The UI\n * capitalizes visually via CSS, so this stays product-agnostic.\n */\nexport function enumLabel(value: string): string {\n return value.toLowerCase().replace(/_/g, \" \");\n}\n","import { type ReactNode } from \"react\";\nimport { Link2 } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { enumLabel, type WorkItemLink } from \"../types\";\n\n/**\n * Optional host hook to render an icon for a linked entity type (e.g. a leaf\n * for FIELD, a cow for ANIMAL). The SDK is farm-free, so it renders a generic\n * link glyph unless the host supplies one.\n */\nexport type RenderLinkIcon = (entityType: string) => ReactNode;\n\nexport interface LinkChipProps {\n link: WorkItemLink;\n renderIcon?: RenderLinkIcon;\n className?: string;\n}\n\n/**\n * LinkChip — a compact chip for a WorkItemLink (the task's linked farm record).\n * Shows the snapshotted label (falls back to the entity type), tinted with the\n * primary token so it reads as the mockup's green linked-record chip in the\n * forest theme. Deep-links via `deepLinkSnapshot` when present; the click is\n * stopped from bubbling so it doesn't also open the task.\n */\nexport function LinkChip({ link, renderIcon, className }: LinkChipProps) {\n const label = link.displayNameSnapshot || enumLabel(link.entityType);\n const icon = renderIcon?.(link.entityType) ?? (\n <Link2 className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n );\n const body = (\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1 rounded-full border border-primary/20 bg-primary/5 px-1.5 py-0.5 text-[10px] font-medium text-primary\",\n className,\n )}\n title={`${enumLabel(link.relationType)} · ${enumLabel(link.entityType)}`}\n >\n {icon}\n <span className=\"truncate\">{label}</span>\n </span>\n );\n\n if (link.deepLinkSnapshot) {\n return (\n <a\n href={link.deepLinkSnapshot}\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex max-w-full no-underline hover:brightness-95\"\n >\n {body}\n </a>\n );\n }\n return body;\n}\n","import { createContext, useContext } from \"react\";\nimport type { TaskPriority, TaskStatus, TaskType } from \"../types\";\n\n/**\n * TaskLabels — every user-facing string the SDK renders, so a host (e.g.\n * HealthyBowl, which ships 6 languages) can inject translations. English\n * defaults are used when no `labels` are provided, so the SDK works standalone.\n * The SDK stays farm-free + string-agnostic; the host owns translation.\n */\nexport interface TaskLabels {\n // Toolbar / views\n board: string;\n list: string;\n timeline: string;\n searchPlaceholder: string;\n allPriorities: string;\n allTypes: string;\n newTask: string;\n myTasks: string;\n\n // Board / list / timeline shared\n noTasks: string;\n noTasksFound: string;\n dropHere: string;\n unassigned: string;\n assigned: string;\n overdue: string; // \"{n} overdue\" — {n} is substituted\n noDueDate: string; // \"No due date ({n})\"\n milestones: string;\n today: string;\n week: string;\n month: string;\n tasksSingular: string; // \"task\"\n tasksPlural: string; // \"tasks\"\n\n // List column headers\n colTask: string;\n colStatus: string;\n colPriority: string;\n colAssignee: string;\n colDueDate: string;\n colPoints: string;\n colLinkedRecord: string;\n colType: string;\n colKey: string;\n colLabels: string;\n\n // Create / detail form\n newTaskHeading: string;\n newTaskSubtitle: string;\n title: string;\n titlePlaceholder: string;\n description: string;\n descriptionPlaceholder: string;\n typeLabel: string;\n statusLabel: string;\n priorityLabel: string;\n assigneeLabel: string;\n assigneePlaceholder: string;\n dueDateLabel: string;\n storyPointsLabel: string;\n labelsLabel: string;\n labelsPlaceholder: string;\n create: string;\n creating: string;\n cancel: string;\n edit: string;\n del: string;\n deletePrompt: string; // \"Delete?\"\n yes: string;\n no: string;\n save: string;\n saving: string;\n taskNotFound: string;\n projectRequired: string;\n\n // Status / error messages\n errorLoading: string;\n moveFailed: string;\n failedToCreate: string;\n failedToSave: string;\n failedToDelete: string;\n overdueLabel: string; // single-word \"Overdue\" (card tooltip); cf. `overdue` count\n more: string; // \"+N more\"\n\n // Enum display labels\n status: Record<TaskStatus, string>;\n priority: Record<TaskPriority, string>;\n type: Record<TaskType, string>;\n}\n\n/** English defaults — the SDK renders these when no `labels` prop is provided. */\nexport const DEFAULT_TASK_LABELS: TaskLabels = {\n board: \"Board\",\n list: \"List\",\n timeline: \"Timeline\",\n searchPlaceholder: \"Search tasks…\",\n allPriorities: \"All priorities\",\n allTypes: \"All types\",\n newTask: \"New task\",\n myTasks: \"My tasks\",\n\n noTasks: \"No tasks\",\n noTasksFound: \"No tasks found.\",\n dropHere: \"Drop here\",\n unassigned: \"Unassigned\",\n assigned: \"Assigned\",\n overdue: \"{n} overdue\",\n noDueDate: \"No due date ({n})\",\n milestones: \"Milestones\",\n today: \"Today\",\n week: \"Week\",\n month: \"Month\",\n tasksSingular: \"task\",\n tasksPlural: \"tasks\",\n\n colTask: \"Task\",\n colStatus: \"Status\",\n colPriority: \"Priority\",\n colAssignee: \"Assignee\",\n colDueDate: \"Due Date\",\n colPoints: \"Points\",\n colLinkedRecord: \"Linked Record\",\n colType: \"Type\",\n colKey: \"Key\",\n colLabels: \"Labels\",\n\n newTaskHeading: \"New task\",\n newTaskSubtitle: \"Create a work item in this workspace.\",\n title: \"Title\",\n titlePlaceholder: \"What needs doing?\",\n description: \"Description\",\n descriptionPlaceholder: \"Add more detail (optional)\",\n typeLabel: \"Type\",\n statusLabel: \"Status\",\n priorityLabel: \"Priority\",\n assigneeLabel: \"Assignee\",\n assigneePlaceholder: \"Actor ID (optional)\",\n dueDateLabel: \"Due date\",\n storyPointsLabel: \"Story points\",\n labelsLabel: \"Labels\",\n labelsPlaceholder: \"comma, separated, labels\",\n create: \"Create task\",\n creating: \"Creating…\",\n cancel: \"Cancel\",\n edit: \"Edit\",\n del: \"Delete\",\n deletePrompt: \"Delete?\",\n yes: \"Yes\",\n no: \"No\",\n save: \"Save changes\",\n saving: \"Saving…\",\n taskNotFound: \"Task not found.\",\n projectRequired: \"A projectId is required to create a task.\",\n\n errorLoading: \"Error loading tasks\",\n moveFailed: \"Couldn't move the task. Please try again.\",\n failedToCreate: \"Failed to create task\",\n failedToSave: \"Failed to save\",\n failedToDelete: \"Failed to delete\",\n overdueLabel: \"Overdue\",\n more: \"more\",\n\n status: {\n BACKLOG: \"Backlog\",\n TODO: \"To Do\",\n IN_PROGRESS: \"In Progress\",\n IN_REVIEW: \"In Review\",\n TESTING: \"Testing\",\n DONE: \"Done\",\n CANCELLED: \"Cancelled\",\n },\n priority: {\n NONE: \"None\",\n LOW: \"Low\",\n MEDIUM: \"Medium\",\n HIGH: \"High\",\n CRITICAL: \"Critical\",\n },\n type: {\n TASK: \"Task\",\n STORY: \"Story\",\n BUG: \"Bug\",\n EPIC: \"Epic\",\n SUB_TASK: \"Sub Task\",\n },\n};\n\nconst TaskLabelsContext = createContext<TaskLabels>(DEFAULT_TASK_LABELS);\nexport const TaskLabelsProvider = TaskLabelsContext.Provider;\n\n/** Read the active task labels (English defaults if no host override). */\nexport function useTaskLabels(): TaskLabels {\n return useContext(TaskLabelsContext);\n}\n\n/** A host may override any subset; missing keys fall back to English. */\nexport type PartialTaskLabels = Partial<\n Omit<TaskLabels, \"status\" | \"priority\" | \"type\">\n> & {\n status?: Partial<TaskLabels[\"status\"]>;\n priority?: Partial<TaskLabels[\"priority\"]>;\n type?: Partial<TaskLabels[\"type\"]>;\n};\n\n/** Merge a host's partial overrides onto the English defaults. */\nexport function mergeTaskLabels(overrides?: PartialTaskLabels): TaskLabels {\n if (!overrides) return DEFAULT_TASK_LABELS;\n return {\n ...DEFAULT_TASK_LABELS,\n ...overrides,\n status: { ...DEFAULT_TASK_LABELS.status, ...overrides.status },\n priority: { ...DEFAULT_TASK_LABELS.priority, ...overrides.priority },\n type: { ...DEFAULT_TASK_LABELS.type, ...overrides.type },\n };\n}\n","import { type ComponentType } from \"react\";\nimport {\n Circle,\n CircleCheckBig,\n CircleDashed,\n CircleDot,\n CircleDotDashed,\n CircleX,\n type LucideProps,\n} from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { Badge } from \"./badge\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport { type TaskPriority, type TaskStatus, type TaskType } from \"../types\";\n\n/**\n * Linear-style task indicators — status, priority, type.\n *\n * A hard rule of the codebase is \"semantic tokens only, never raw colors\". The\n * default token palette only exposes a handful of hues (primary / secondary /\n * muted / accent / destructive), which is not enough to give each of the six\n * statuses its own distinct color like a raw-palette design would.\n *\n * So — exactly like Linear — status is differentiated primarily by icon SHAPE\n * (dashed → empty → dotted → filled → check), with a subtle muted→primary tone\n * progression, and priority by a filled-BAR count. This reads as a polished PM\n * tool while staying 100% within the semantic-token contract.\n */\n\n// ---------------------------------------------------------------------------\n// Status\n// ---------------------------------------------------------------------------\n\ninterface StatusMeta {\n icon: ComponentType<LucideProps>;\n /** Icon tone (semantic token). */\n tone: string;\n}\n\n/**\n * Per-status icon + tone. Shape carries the meaning; tone progresses from muted\n * (not started) toward primary (in flight / done). Overridable by hosts only\n * via the column labels, never by raw color.\n */\nexport const STATUS_META: Record<TaskStatus, StatusMeta> = {\n BACKLOG: { icon: CircleDashed, tone: \"text-muted-foreground/60\" },\n TODO: { icon: Circle, tone: \"text-muted-foreground\" },\n IN_PROGRESS: { icon: CircleDot, tone: \"text-primary\" },\n IN_REVIEW: { icon: CircleDotDashed, tone: \"text-accent-foreground\" },\n TESTING: { icon: CircleDotDashed, tone: \"text-secondary-foreground\" },\n DONE: { icon: CircleCheckBig, tone: \"text-primary\" },\n CANCELLED: { icon: CircleX, tone: \"text-destructive/70\" },\n};\n\nexport interface StatusIconProps {\n status: TaskStatus;\n className?: string;\n}\n\n/** A single status glyph — shape-differentiated, token-toned. */\nexport function StatusIcon({ status, className }: StatusIconProps) {\n const meta = STATUS_META[status] ?? STATUS_META.TODO;\n const Icon = meta.icon;\n return (\n <Icon\n className={cn(\"h-3.5 w-3.5 shrink-0\", meta.tone, className)}\n aria-hidden=\"true\"\n />\n );\n}\n\nexport interface StatusPillProps {\n status: TaskStatus;\n className?: string;\n}\n\n/** Status as a compact bordered pill (icon + label) — used in the list view. */\nexport function StatusPill({ status, className }: StatusPillProps) {\n const L = useTaskLabels();\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/40 px-2 py-0.5 text-xs font-medium capitalize text-foreground\",\n className,\n )}\n >\n <StatusIcon status={status} />\n {L.status[status]}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Priority\n// ---------------------------------------------------------------------------\n\ninterface PriorityMeta {\n /** Number of filled bars (0–3). */\n level: number;\n /** Fill tone (semantic token) applied to the filled bars + label. */\n tone: string;\n}\n\nexport const PRIORITY_META: Record<TaskPriority, PriorityMeta> = {\n NONE: { level: 0, tone: \"text-muted-foreground/50\" },\n LOW: { level: 1, tone: \"text-muted-foreground\" },\n MEDIUM: { level: 2, tone: \"text-accent-foreground\" },\n HIGH: { level: 3, tone: \"text-accent-foreground\" },\n CRITICAL: { level: 3, tone: \"text-destructive\" },\n};\n\nconst BAR_HEIGHTS = [\"h-1.5\", \"h-2.5\", \"h-3.5\"] as const;\n\nexport interface PriorityIndicatorProps {\n priority: TaskPriority;\n /** Show the text label next to the bars. */\n showLabel?: boolean;\n className?: string;\n}\n\n/**\n * Linear-style priority signal — three bars, filled by level. NONE renders all\n * bars faint (its own recognizable \"no priority\" look).\n */\nexport function PriorityIndicator({\n priority,\n showLabel = false,\n className,\n}: PriorityIndicatorProps) {\n const L = useTaskLabels();\n const meta = PRIORITY_META[priority] ?? PRIORITY_META.NONE;\n return (\n <span\n className={cn(\"inline-flex items-center gap-1.5\", meta.tone, className)}\n title={`${L.priorityLabel}: ${L.priority[priority]}`}\n >\n <span className=\"flex items-end gap-0.5\" aria-hidden=\"true\">\n {BAR_HEIGHTS.map((h, i) => (\n <span\n key={h}\n className={cn(\n \"w-1 rounded-[1px]\",\n h,\n i < meta.level ? \"bg-current\" : \"bg-current/25\",\n )}\n />\n ))}\n </span>\n {showLabel && (\n <span className=\"text-xs font-medium capitalize\">\n {L.priority[priority]}\n </span>\n )}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Type\n// ---------------------------------------------------------------------------\n\nconst TYPE_VARIANT: Record<\n TaskType,\n \"default\" | \"muted\" | \"secondary\" | \"accent\" | \"destructive\"\n> = {\n TASK: \"secondary\",\n STORY: \"default\",\n BUG: \"destructive\",\n EPIC: \"accent\",\n SUB_TASK: \"muted\",\n};\n\nexport interface TypeBadgeProps {\n type: TaskType;\n className?: string;\n}\n\n/** Work-item type as a subtle badge. */\nexport function TypeBadge({ type, className }: TypeBadgeProps) {\n const L = useTaskLabels();\n return (\n <Badge variant={TYPE_VARIANT[type]} className={className}>\n {L.type[type]}\n </Badge>\n );\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\ninterface OverlayShellProps {\n /** Whether the overlay is mounted/visible. */\n open: boolean;\n /** Called when the user requests dismissal (backdrop click, Escape, close X). */\n onClose: () => void;\n /** Overlay body. */\n children: ReactNode;\n /** Accessible label for the dialog surface. */\n ariaLabel?: string;\n /** Extra classes on the panel. */\n className?: string;\n /** Layout variant — centered modal card vs. right-anchored drawer. */\n variant: \"modal\" | \"drawer\";\n}\n\n/**\n * Owned overlay primitive shared by `Modal` and `Drawer`. Semantic-token only\n * (no raw palette colors, no fe-libs Dialog dependency) so it renders in any\n * host, in happy-dom tests, and in the offline harness. Closes on backdrop\n * click and Escape; renders a corner close button.\n *\n * Not a portal: mounts inline in the React tree. That keeps it BYO-Apollo /\n * provider-agnostic (a portal would escape the ApolloProvider subtree) and\n * avoids requiring `document.body` wiring in tests.\n */\nfunction OverlayShell({\n open,\n onClose,\n children,\n ariaLabel,\n className,\n variant,\n}: OverlayShellProps) {\n useEffect(() => {\n if (!open) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [open, onClose]);\n\n if (!open) return null;\n\n const isModal = variant === \"modal\";\n\n return (\n <div\n className={cn(\n \"fixed inset-0 z-50 flex bg-foreground/40\",\n isModal ? \"items-center justify-center p-4\" : \"justify-end\",\n )}\n onClick={onClose}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n className={cn(\n \"relative overflow-y-auto bg-background text-foreground shadow-lg\",\n isModal\n ? \"max-h-[90vh] w-full max-w-2xl rounded-lg\"\n : \"h-full w-full max-w-lg\",\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n className=\"absolute right-3 top-3 z-10 rounded-md bg-muted px-2 py-1 text-sm font-medium text-muted-foreground hover:bg-muted/70\"\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n ariaLabel?: string;\n className?: string;\n}\n\n/** Centered modal card overlay (owned, semantic-token only). */\nexport function Modal(props: ModalProps) {\n return <OverlayShell variant=\"modal\" {...props} />;\n}\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n ariaLabel?: string;\n className?: string;\n}\n\n/** Right-anchored slide-over drawer overlay (owned, semantic-token only). */\nexport function Drawer(props: DrawerProps) {\n return <OverlayShell variant=\"drawer\" {...props} />;\n}\n","import { type DragEvent, type KeyboardEvent } from \"react\";\nimport { CalendarDays } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { formatDueDate, isOverdue } from \"../utils/dates\";\nimport {\n Avatar,\n LinkChip,\n PriorityIndicator,\n TypeBadge,\n type RenderLinkIcon,\n} from \"../ui\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport type { Task, WorkItemLink } from \"../types\";\n\n/**\n * Optional host hook: resolve an assignee id to a display name (the SDK has no\n * user directory). When omitted the avatar falls back to id-initials.\n */\nexport type ResolveAssignee = (\n assigneeId: string,\n) => { name?: string | null } | null | undefined;\n\n/** A selectable assignee for the create/edit picker (host-provided directory). */\nexport interface AssigneeOption {\n id: string;\n name: string;\n}\n\nexport interface TaskCardProps {\n task: Task;\n /** Field names to hide (key/type/priority/labels/storyPoints/assignee/dueDate). */\n hidden?: ReadonlySet<string>;\n onClick?: (task: Task) => void;\n /** Enable native drag (board wires this to move-between-columns). */\n draggable?: boolean;\n onDragStart?: (task: Task, e: DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (task: Task, e: DragEvent<HTMLDivElement>) => void;\n /** True while this card is the one being dragged. */\n dragging?: boolean;\n resolveAssignee?: ResolveAssignee;\n /** Linked farm records for this task (rendered as chips). */\n links?: WorkItemLink[];\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n className?: string;\n}\n\nconst EMPTY = new Set<string>();\n\n/**\n * TaskCard — a Linear-style board card. Presentational + prop-driven; renders\n * only real fields (no invented assignee names or entity links). Semantic\n * tokens only.\n */\nexport function TaskCard({\n task,\n hidden = EMPTY,\n onClick,\n draggable,\n onDragStart,\n onDragEnd,\n dragging,\n resolveAssignee,\n links,\n renderLinkIcon,\n className,\n}: TaskCardProps) {\n const L = useTaskLabels();\n const overdue = isOverdue(task.dueDate, task.status);\n const due = formatDueDate(task.dueDate);\n const resolved = task.assigneeId ? resolveAssignee?.(task.assigneeId) : null;\n\n const showTopRow = !hidden.has(\"key\") || !hidden.has(\"type\");\n const showLinks = !hidden.has(\"links\") && (links?.length ?? 0) > 0;\n const showLabels = !hidden.has(\"labels\") && (task.labels?.length ?? 0) > 0;\n const showPriority = !hidden.has(\"priority\");\n const showPoints = !hidden.has(\"storyPoints\") && task.storyPoints != null;\n const showMetaRow = showPriority || showPoints;\n const showAssignee = !hidden.has(\"assignee\");\n const showDue = !hidden.has(\"dueDate\") && Boolean(due);\n const showPeopleRow = showAssignee || showDue;\n\n const interactive = Boolean(onClick);\n const handleKey = onClick\n ? (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick(task);\n }\n }\n : undefined;\n\n return (\n <div\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n draggable={draggable}\n onDragStart={draggable ? (e) => onDragStart?.(task, e) : undefined}\n onDragEnd={draggable ? (e) => onDragEnd?.(task, e) : undefined}\n onClick={onClick ? () => onClick(task) : undefined}\n onKeyDown={handleKey}\n className={cn(\n \"group rounded-lg border border-border bg-card p-2.5 shadow-sm transition\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n interactive && \"cursor-pointer hover:border-primary/50 hover:shadow-md\",\n draggable && \"active:cursor-grabbing\",\n dragging && \"opacity-50 ring-2 ring-primary/40\",\n className,\n )}\n >\n {showTopRow && (\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n {!hidden.has(\"key\") ? (\n <span className=\"font-mono text-[10px] uppercase tracking-wide text-muted-foreground\">\n {task.key}\n </span>\n ) : (\n <span />\n )}\n {!hidden.has(\"type\") && <TypeBadge type={task.type} />}\n </div>\n )}\n\n <p className=\"line-clamp-2 text-sm font-medium leading-snug text-foreground\">\n {task.title}\n </p>\n\n {showLinks && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {links!.slice(0, 3).map((link) => (\n <LinkChip key={link.id} link={link} renderIcon={renderLinkIcon} />\n ))}\n {links!.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{links!.length - 3}\n </span>\n )}\n </div>\n )}\n\n {showLabels && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {task.labels.slice(0, 3).map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\"\n >\n {l}\n </span>\n ))}\n {task.labels.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{task.labels.length - 3}\n </span>\n )}\n </div>\n )}\n\n {showMetaRow && (\n <div className=\"mt-2 flex items-center justify-between\">\n {showPriority ? (\n <PriorityIndicator priority={task.priority} showLabel />\n ) : (\n <span />\n )}\n {showPoints && (\n <span\n className=\"flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/10 px-1 text-[10px] font-semibold text-primary\"\n title={`${task.storyPoints} ${L.storyPointsLabel}`}\n >\n {task.storyPoints}\n </span>\n )}\n </div>\n )}\n\n {showPeopleRow && (\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {showAssignee ? (\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <Avatar id={task.assigneeId} name={resolved?.name} size=\"sm\" />\n {resolved?.name && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {resolved.name}\n </span>\n )}\n </span>\n ) : (\n <span />\n )}\n {showDue && (\n <span\n className={cn(\n \"flex shrink-0 items-center gap-1 text-[11px]\",\n overdue\n ? \"font-medium text-destructive\"\n : \"text-muted-foreground\",\n )}\n title={overdue ? L.overdueLabel : L.dueDateLabel}\n >\n <CalendarDays className=\"h-3 w-3\" aria-hidden=\"true\" />\n {due}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { LIST_WORK_ITEM_LINKS } from \"../graphql-ops\";\nimport type { WorkItemLink, WorkItemLinkList } from \"../types\";\n\ntype ListWorkItemLinksResult = { planmagnetWorkItemLinks: WorkItemLinkList };\n\nexport interface UseWorkItemLinksResult {\n /** Links grouped by the work item they belong to. */\n linksByItem: Map<string, WorkItemLink[]>;\n loading: boolean;\n}\n\n/**\n * useWorkItemLinks — batch-fetch WorkItemLinks for a workspace (scoped to one\n * `sourceProduct`, e.g. \"healthybowl\") in ONE query and group them by\n * `workItemId`. WorkItem has no `links` field, so the board/list join links to\n * items client-side. Skips entirely when no `sourceProduct` is provided, so the\n * SDK stays farm-free and link-fetching is opt-in per host.\n */\nexport function useWorkItemLinks(\n workspaceId: string | undefined,\n sourceProduct: string | undefined,\n limit = 500,\n): UseWorkItemLinksResult {\n const { data, loading } = useQuery<ListWorkItemLinksResult>(\n LIST_WORK_ITEM_LINKS,\n {\n variables: {\n workspaceId,\n ...(sourceProduct ? { filter: { sourceProduct } } : {}),\n pagination: { first: limit },\n },\n skip: !workspaceId || !sourceProduct,\n },\n );\n\n const linksByItem = useMemo(() => {\n const map = new Map<string, WorkItemLink[]>();\n for (const link of data?.planmagnetWorkItemLinks?.items ?? []) {\n const arr = map.get(link.workItemId);\n if (arr) arr.push(link);\n else map.set(link.workItemId, [link]);\n }\n return map;\n }, [data]);\n\n return { linksByItem, loading };\n}\n","import { useCallback, useMemo, useState, type DragEvent } from \"react\";\nimport { useApolloClient, useMutation, useQuery } from \"@apollo/client/react\";\nimport { LIST_WORK_ITEMS, UPDATE_WORK_ITEM } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { TaskCard, type ResolveAssignee } from \"./TaskCard\";\nimport { StatusIcon, type RenderLinkIcon } from \"../ui\";\nimport { useWorkItemLinks } from \"../hooks/useWorkItemLinks\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport { cn } from \"../utils/cn\";\nimport {\n DEFAULT_BOARD_COLUMNS,\n type BoardColumn,\n type Task,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type WorkItemDetail,\n type WorkItemList,\n} from \"../types\";\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\ntype UpdateResult = { planmagnetUpdateWorkItem: WorkItemDetail };\n\nexport interface TaskBoardCoreProps {\n /** Scope the board to one project (client-side filter for Phase 1). */\n projectId?: string;\n /** Board columns to render (defaults to DEFAULT_BOARD_COLUMNS). */\n columns?: BoardColumn[];\n /** Read-only mode — disables drag-to-move. */\n readonly?: boolean;\n /** Hide the board's own header (title + count). */\n hideHeader?: boolean;\n /**\n * @deprecated Filtering is now controlled by the parent toolbar via the\n * `priority`/`type`/`search` props. Accepted for backward compatibility; the\n * board no longer renders its own filter chips.\n */\n hideFilters?: boolean;\n /** Controlled priority filter (\"ALL\" or a specific priority). */\n priority?: TaskPriority | \"ALL\";\n /** Controlled type filter (\"ALL\" or a specific type). */\n type?: TaskType | \"ALL\";\n /** Controlled free-text search (matches title/key/labels). */\n search?: string;\n /** Controlled assignee filter (actor id). */\n assigneeId?: string;\n /**\n * Field names to hide on each task card. Supported: 'key' | 'priority' |\n * 'type' | 'labels' | 'storyPoints' | 'assignee' | 'dueDate'.\n */\n hiddenFields?: string[];\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /** Called when a task card is clicked. */\n onTaskClick?: (task: Task) => void;\n /**\n * When set, the board fetches WorkItemLinks for this `sourceProduct` (e.g.\n * \"healthybowl\") and renders a linked-record chip on each card. Omitted → no\n * link fetch (SDK stays farm-free).\n */\n linkSourceProduct?: string;\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n /** Extra classes on the root container. */\n className?: string;\n /**\n * Optional explicit workspace ID. Falls back to the PlanMagnetProvider context.\n * At least one must be present or the query is skipped.\n */\n workspaceId?: string;\n}\n\n/**\n * TaskBoardCore — provider-less, prop-driven, product-agnostic Kanban board.\n *\n * - Reads Apollo via the ambient `<ApolloProvider>` (BYO). Never creates a\n * client, never assumes a router.\n * - `workspaceId` comes from a prop or the PlanMagnetProvider context.\n * - Linear-style columns + cards, with native drag-to-move between columns\n * (optimistic cache update + `UPDATE_WORK_ITEM`; reverts on error). Filtering\n * is controlled by the parent toolbar. Farm-free, semantic-token only.\n */\nexport function TaskBoardCore({\n projectId,\n columns = DEFAULT_BOARD_COLUMNS,\n readonly,\n hideHeader,\n priority = \"ALL\",\n type = \"ALL\",\n search = \"\",\n assigneeId,\n hiddenFields,\n resolveAssignee,\n linkSourceProduct,\n renderLinkIcon,\n onTaskClick,\n className,\n workspaceId: workspaceIdProp,\n}: TaskBoardCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const client = useApolloClient();\n const L = useTaskLabels();\n\n const hidden = useMemo(() => new Set(hiddenFields ?? []), [hiddenFields]);\n const { linksByItem } = useWorkItemLinks(workspaceId, linkSourceProduct);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState<TaskStatus | null>(null);\n const [moveError, setMoveError] = useState<string | null>(null);\n\n const [updateItem] = useMutation<UpdateResult>(UPDATE_WORK_ITEM);\n\n const { data, loading, error } = useQuery<ListWorkItemsResult>(\n LIST_WORK_ITEMS,\n {\n variables: {\n workspaceId,\n ...(projectId ? { filter: { projectId } } : {}),\n pagination: { first: 200 },\n },\n skip: !workspaceId,\n },\n );\n\n const moveTask = useCallback(\n (task: Task, toStatus: TaskStatus) => {\n const from = task.status;\n if (from === toStatus) return;\n const id = client.cache.identify({ __typename: \"WorkItem\", id: task.id });\n if (!id) return;\n setMoveError(null);\n // Optimistically move the card by editing just the status field on the\n // normalized WorkItem — the board recomputes column membership instantly.\n client.cache.modify({ id, fields: { status: () => toStatus } });\n updateItem({\n variables: { id: task.id, input: { status: toStatus } },\n }).catch(() => {\n client.cache.modify({ id, fields: { status: () => from } });\n setMoveError(L.moveFailed);\n });\n },\n [client, updateItem, L],\n );\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TaskBoard: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n const query = search.trim().toLowerCase();\n const filtered = tasks.filter((t) => {\n if (priority !== \"ALL\" && t.priority !== priority) return false;\n if (type !== \"ALL\" && t.type !== type) return false;\n if (assigneeId && t.assigneeId !== assigneeId) return false;\n if (query) {\n const haystack = [t.title, t.key, ...(t.labels ?? [])]\n .join(\" \")\n .toLowerCase();\n if (!haystack.includes(query)) return false;\n }\n return true;\n });\n\n const canDrag = !readonly;\n\n const onColumnDragOver =\n (status: TaskStatus) => (e: DragEvent<HTMLDivElement>) => {\n if (!canDrag || !draggingId) return;\n e.preventDefault();\n if (dragOver !== status) setDragOver(status);\n };\n\n const onColumnDrop =\n (status: TaskStatus) => (e: DragEvent<HTMLDivElement>) => {\n if (!canDrag) return;\n e.preventDefault();\n const task = tasks.find((t) => t.id === draggingId);\n setDragOver(null);\n setDraggingId(null);\n if (task) moveTask(task, status);\n };\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {!hideHeader && (\n <div className=\"flex items-baseline justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">{L.board}</h2>\n <span className=\"text-sm text-muted-foreground\">\n {filtered.length}{\" \"}\n {filtered.length === 1 ? L.tasksSingular : L.tasksPlural}\n </span>\n </div>\n )}\n\n {moveError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-1.5 text-xs text-destructive\">\n {moveError}\n </div>\n )}\n\n <div className=\"flex gap-3 overflow-x-auto pb-2\">\n {columns.map((col) => {\n const colTasks = filtered.filter((t) => t.status === col.status);\n const isOver = dragOver === col.status;\n return (\n <div\n key={col.status}\n onDragOver={onColumnDragOver(col.status)}\n onDragLeave={() => dragOver === col.status && setDragOver(null)}\n onDrop={onColumnDrop(col.status)}\n className={cn(\n \"flex w-72 shrink-0 flex-col rounded-lg border transition-colors\",\n isOver\n ? \"border-primary/50 bg-primary/5\"\n : \"border-transparent bg-muted/40\",\n )}\n >\n <div className=\"flex items-center justify-between gap-2 px-3 py-2\">\n <span className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n <StatusIcon status={col.status} />\n {L.status[col.status]}\n </span>\n <span className=\"rounded-full bg-muted px-1.5 text-xs font-medium text-muted-foreground\">\n {colTasks.length}\n </span>\n </div>\n <div className=\"flex flex-col gap-2 px-2 pb-2\">\n {colTasks.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border/70 px-3 py-6 text-center text-xs text-muted-foreground\">\n {isOver ? L.dropHere : L.noTasks}\n </div>\n ) : (\n colTasks.map((task) => (\n <TaskCard\n key={task.id}\n task={task}\n hidden={hidden}\n onClick={onTaskClick}\n draggable={canDrag}\n dragging={draggingId === task.id}\n resolveAssignee={resolveAssignee}\n links={linksByItem.get(task.id)}\n renderLinkIcon={renderLinkIcon}\n onDragStart={(t, e) => {\n setDraggingId(t.id);\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", t.id);\n }}\n onDragEnd={() => {\n setDraggingId(null);\n setDragOver(null);\n }}\n />\n ))\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TaskBoardCore, type TaskBoardCoreProps } from \"./TaskBoardCore\";\n\nexport interface TaskBoardProps extends TaskBoardCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TaskBoard — standalone, embeddable, product-agnostic task board.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders TaskBoardCore. Mirrors the FluidGrids\n * `WorkflowBuilder` (standalone) → `WorkflowBuilderCore` (BYO) split.\n *\n * Two mount modes:\n * - URL mode: <TaskBoard apiGatewayUrl={..} authToken={..} workspaceId={..} />\n * - BYO mode: <TaskBoard workspaceClient={hostClient} workspaceId={..} />\n *\n * @example URL mode\n * ```tsx\n * <TaskBoard\n * apiGatewayUrl=\"https://graphqlworkspaces.burdenoff.com\"\n * authToken={token}\n * workspaceId=\"ws-123\"\n * onTaskClick={(t) => console.log(t)}\n * />\n * ```\n *\n * @example BYO client (host shell injects its authed client)\n * ```tsx\n * <TaskBoard workspaceClient={hostClient} workspaceId=\"ws-123\" readonly />\n * ```\n */\nexport function TaskBoard({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TaskBoardProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TaskBoardCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useMemo, useState, type FormEvent } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { CREATE_WORK_ITEM } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { getPlanMagnetConfig } from \"../config\";\nimport { cn } from \"../utils/cn\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport {\n TASK_PRIORITIES,\n TASK_STATUSES,\n TASK_TYPES,\n type CreateTaskInput,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type WorkItemDetail,\n} from \"../types\";\n\ntype CreateWorkItemResult = { planmagnetCreateWorkItem: WorkItemDetail };\n\n/**\n * Supported hideable field keys for the create form. Product-agnostic hook so\n * hosts can suppress fields that don't apply to their domain.\n */\nexport type CreateTaskField =\n | \"description\"\n | \"type\"\n | \"status\"\n | \"priority\"\n | \"assignee\"\n | \"dueDate\"\n | \"labels\"\n | \"storyPoints\";\n\nexport interface CreateTaskCoreProps {\n /**\n * Project the new work item belongs to. `projectId` is REQUIRED by the\n * backend (`PlanmagnetCreateWorkItemInput.projectId`). The form blocks submit\n * until a project id is present.\n */\n projectId?: string;\n /** Optional host-provided member directory → renders an assignee picker. */\n assigneeOptions?: import(\"./TaskCard\").AssigneeOption[];\n /** Field names to hide on the form. */\n hiddenFields?: CreateTaskField[];\n /** Default values applied on first render. */\n defaultValues?: Partial<CreateTaskInput>;\n /** Hide the form header (title + subtitle). */\n hideHeader?: boolean;\n /** Custom submit-button label. */\n submitLabel?: string;\n /** Called with the created work item on success. */\n onCreated?: (workItem: WorkItemDetail) => void;\n /** Called when the create mutation errors. */\n onError?: (error: Error) => void;\n /** Called when the cancel button is pressed (button only shown if provided). */\n onCancel?: () => void;\n /** Extra classes on the root container. */\n className?: string;\n /** Explicit workspace ID. Falls back to PlanMagnetProvider context. */\n workspaceId?: string;\n}\n\nconst DEFAULT_TYPE: TaskType = \"TASK\";\nconst DEFAULT_STATUS: TaskStatus = \"BACKLOG\";\nconst DEFAULT_PRIORITY: TaskPriority = \"NONE\";\n\nconst fieldClass =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\";\nconst labelClass = \"text-sm font-medium text-foreground\";\n\n/**\n * CreateTaskCore — provider-less, prop-driven controlled form that creates a\n * WorkItem via `planmagnetCreateWorkItem`. BYO-Apollo (reads the ambient\n * ApolloProvider), semantic-token styled, farm-free.\n *\n * Mirrors the TaskBoardCore contract: `workspaceId` from a prop or the\n * PlanMagnetProvider context, `hiddenFields` for host-driven field suppression.\n */\nexport function CreateTaskCore({\n projectId: projectIdProp,\n assigneeOptions,\n hiddenFields,\n defaultValues,\n hideHeader,\n submitLabel,\n onCreated,\n onError,\n onCancel,\n className,\n workspaceId: workspaceIdProp,\n}: CreateTaskCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const projectId = projectIdProp ?? defaultValues?.projectId;\n const L = useTaskLabels();\n\n const hidden = useMemo(\n () => new Set<CreateTaskField>(hiddenFields ?? []),\n [hiddenFields],\n );\n\n const [title, setTitle] = useState(defaultValues?.title ?? \"\");\n const [description, setDescription] = useState(\n defaultValues?.description ?? \"\",\n );\n const [type, setType] = useState<TaskType>(\n defaultValues?.type ?? DEFAULT_TYPE,\n );\n const [status, setStatus] = useState<TaskStatus>(\n defaultValues?.status ?? DEFAULT_STATUS,\n );\n const [priority, setPriority] = useState<TaskPriority>(\n defaultValues?.priority ?? DEFAULT_PRIORITY,\n );\n const [assigneeId, setAssigneeId] = useState(defaultValues?.assigneeId ?? \"\");\n const [dueDate, setDueDate] = useState(defaultValues?.dueDate ?? \"\");\n const [labels, setLabels] = useState(\n (defaultValues?.labels ?? []).join(\", \"),\n );\n const [storyPoints, setStoryPoints] = useState(\n defaultValues?.storyPoints != null ? String(defaultValues.storyPoints) : \"\",\n );\n\n const [createWorkItem, { loading, error }] =\n useMutation<CreateWorkItemResult>(CREATE_WORK_ITEM);\n\n const canSubmit = Boolean(workspaceId && projectId && title.trim());\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!canSubmit || !projectId) return;\n\n const parsedLabels = labels\n .split(\",\")\n .map((l) => l.trim())\n .filter(Boolean);\n const parsedPoints = storyPoints.trim() ? Number(storyPoints) : undefined;\n\n const input: CreateTaskInput = {\n projectId,\n title: title.trim(),\n type,\n ...(hidden.has(\"status\") ? {} : { status }),\n ...(hidden.has(\"priority\") ? {} : { priority }),\n ...(hidden.has(\"description\") || !description.trim()\n ? {}\n : { description: description.trim() }),\n ...(hidden.has(\"assignee\") || !assigneeId.trim()\n ? {}\n : { assigneeId: assigneeId.trim() }),\n ...(hidden.has(\"dueDate\") || !dueDate.trim() ? {} : { dueDate }),\n ...(hidden.has(\"labels\") || parsedLabels.length === 0\n ? {}\n : { labels: parsedLabels }),\n ...(hidden.has(\"storyPoints\") ||\n parsedPoints == null ||\n Number.isNaN(parsedPoints)\n ? {}\n : { storyPoints: parsedPoints }),\n };\n\n try {\n const result = await createWorkItem({ variables: { input } });\n const created = result.data?.planmagnetCreateWorkItem;\n if (created) {\n // Fire the SDK-level onTaskSaved config hook (never blocks the flow).\n const cfg = getPlanMagnetConfig();\n try {\n await cfg.onTaskSaved?.({\n id: created.id,\n key: created.key,\n title: created.title,\n projectId: created.projectId,\n operation: \"created\",\n });\n } catch {\n // Host callback errors must never break the create flow.\n }\n onCreated?.(created);\n resetForm();\n }\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n function resetForm() {\n setTitle(\"\");\n setDescription(\"\");\n setType(DEFAULT_TYPE);\n setStatus(DEFAULT_STATUS);\n setPriority(DEFAULT_PRIORITY);\n setAssigneeId(\"\");\n setDueDate(\"\");\n setLabels(\"\");\n setStoryPoints(\"\");\n }\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n CreateTask: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n return (\n <Card className={cn(\"shadow-sm\", className)}>\n <CardContent className=\"p-6\">\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {!hideHeader && (\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">\n {L.newTaskHeading}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {L.newTaskSubtitle}\n </p>\n </div>\n )}\n\n {!projectId && (\n <p className=\"rounded-md bg-destructive/10 p-2 text-xs text-destructive\">\n {L.projectRequired}\n </p>\n )}\n\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-title\" className={labelClass}>\n {L.title}\n </label>\n <input\n id=\"pm-title\"\n className={fieldClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={L.titlePlaceholder}\n required\n />\n </div>\n\n {!hidden.has(\"description\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-description\" className={labelClass}>\n {L.description}\n </label>\n <textarea\n id=\"pm-description\"\n className={cn(fieldClass, \"min-h-[80px]\")}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={L.descriptionPlaceholder}\n />\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-type\" className={labelClass}>\n {L.typeLabel}\n </label>\n <select\n id=\"pm-type\"\n className={cn(fieldClass, \"capitalize\")}\n value={type}\n onChange={(e) => setType(e.target.value as TaskType)}\n >\n {TASK_TYPES.map((t) => (\n <option key={t} value={t}>\n {L.type[t]}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!hidden.has(\"status\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-status\" className={labelClass}>\n {L.statusLabel}\n </label>\n <select\n id=\"pm-status\"\n className={cn(fieldClass, \"capitalize\")}\n value={status}\n onChange={(e) => setStatus(e.target.value as TaskStatus)}\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>\n {L.status[s]}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!hidden.has(\"priority\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-priority\" className={labelClass}>\n {L.priorityLabel}\n </label>\n <select\n id=\"pm-priority\"\n className={cn(fieldClass, \"capitalize\")}\n value={priority}\n onChange={(e) => setPriority(e.target.value as TaskPriority)}\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {L.priority[p]}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!hidden.has(\"assignee\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-assignee\" className={labelClass}>\n {L.assigneeLabel}\n </label>\n {assigneeOptions && assigneeOptions.length > 0 ? (\n <select\n id=\"pm-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n >\n <option value=\"\">{L.unassigned}</option>\n {assigneeOptions.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n id=\"pm-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n placeholder={L.assigneePlaceholder}\n />\n )}\n </div>\n )}\n\n {!hidden.has(\"dueDate\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-due\" className={labelClass}>\n {L.dueDateLabel}\n </label>\n <input\n id=\"pm-due\"\n type=\"date\"\n className={fieldClass}\n value={dueDate}\n onChange={(e) => setDueDate(e.target.value)}\n />\n </div>\n )}\n\n {!hidden.has(\"storyPoints\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-points\" className={labelClass}>\n {L.storyPointsLabel}\n </label>\n <input\n id=\"pm-points\"\n type=\"number\"\n min={0}\n className={fieldClass}\n value={storyPoints}\n onChange={(e) => setStoryPoints(e.target.value)}\n placeholder=\"0\"\n />\n </div>\n )}\n </div>\n\n {!hidden.has(\"labels\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-labels\" className={labelClass}>\n {L.labelsLabel}\n </label>\n <input\n id=\"pm-labels\"\n className={fieldClass}\n value={labels}\n onChange={(e) => setLabels(e.target.value)}\n placeholder={L.labelsPlaceholder}\n />\n </div>\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">\n {L.failedToCreate}: {error.message}\n </p>\n )}\n\n <div className=\"flex items-center justify-end gap-2\">\n {onCancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-md bg-muted px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/70\"\n >\n {L.cancel}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={!canSubmit || loading}\n className={cn(\n \"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground\",\n (!canSubmit || loading) && \"cursor-not-allowed opacity-50\",\n )}\n >\n {loading ? L.creating : (submitLabel ?? L.create)}\n </button>\n </div>\n </form>\n </CardContent>\n </Card>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { CreateTaskCore, type CreateTaskCoreProps } from \"./CreateTaskCore\";\n\nexport interface CreateTaskProps extends CreateTaskCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * CreateTask — standalone, embeddable work-item create form.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders CreateTaskCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * @example URL mode\n * ```tsx\n * <CreateTask\n * apiGatewayUrl=\"https://graphqlworkspaces.burdenoff.com\"\n * authToken={token}\n * workspaceId=\"ws-123\"\n * projectId=\"proj-1\"\n * onCreated={(wi) => console.log(wi)}\n * />\n * ```\n *\n * @example BYO client\n * ```tsx\n * <CreateTask workspaceClient={hostClient} workspaceId=\"ws-123\" projectId=\"proj-1\" />\n * ```\n */\nexport function CreateTask({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: CreateTaskProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <CreateTaskCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { cn } from \"../utils/cn\";\nimport {\n Avatar,\n LinkChip,\n PriorityIndicator,\n StatusPill,\n TypeBadge,\n type RenderLinkIcon,\n} from \"../ui\";\nimport { formatDueDate, isOverdue } from \"../utils/dates\";\nimport { useWorkItemLinks } from \"../hooks/useWorkItemLinks\";\nimport { useTaskLabels, type TaskLabels } from \"../i18n/labels\";\nimport type { ResolveAssignee } from \"./TaskCard\";\nimport {\n type Task,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type WorkItemLink,\n type WorkItemList,\n} from \"../types\";\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\n\n/** Columns available in the compact list. */\nexport type TaskListColumn =\n | \"key\"\n | \"title\"\n | \"type\"\n | \"status\"\n | \"priority\"\n | \"assignee\"\n | \"dueDate\"\n | \"storyPoints\"\n | \"linkedRecord\"\n | \"labels\";\n\n/** Sort keys for the list. */\nexport type TaskListSort =\n \"priority\" | \"status\" | \"title\" | \"type\" | \"dueDate\" | \"storyPoints\";\n\nconst DEFAULT_COLUMNS: TaskListColumn[] = [\n \"title\",\n \"status\",\n \"priority\",\n \"assignee\",\n \"dueDate\",\n \"storyPoints\",\n];\n\nconst priorityRank: Record<TaskPriority, number> = {\n CRITICAL: 0,\n HIGH: 1,\n MEDIUM: 2,\n LOW: 3,\n NONE: 4,\n};\n\nconst statusRank: Record<TaskStatus, number> = {\n BACKLOG: 0,\n TODO: 1,\n IN_PROGRESS: 2,\n IN_REVIEW: 3,\n TESTING: 4,\n DONE: 5,\n CANCELLED: 6,\n};\n\n/** Column header text, resolved from the injectable labels (i18n). */\nfunction columnLabel(col: TaskListColumn, L: TaskLabels): string {\n switch (col) {\n case \"key\":\n return L.colKey;\n case \"title\":\n return L.colTask;\n case \"type\":\n return L.colType;\n case \"status\":\n return L.colStatus;\n case \"priority\":\n return L.colPriority;\n case \"assignee\":\n return L.colAssignee;\n case \"dueDate\":\n return L.colDueDate;\n case \"storyPoints\":\n return L.colPoints;\n case \"linkedRecord\":\n return L.colLinkedRecord;\n case \"labels\":\n return L.colLabels;\n default:\n return col;\n }\n}\n\n/** Columns that map to a client-side sort key. */\nconst COLUMN_SORT: Partial<Record<TaskListColumn, TaskListSort>> = {\n title: \"title\",\n type: \"type\",\n status: \"status\",\n priority: \"priority\",\n dueDate: \"dueDate\",\n storyPoints: \"storyPoints\",\n};\n\nexport interface TaskListCoreProps {\n /** Scope to one project (server-side filter). */\n projectId?: string;\n /** Filter by status. */\n status?: TaskStatus;\n /** Filter by type. */\n type?: TaskType;\n /** Filter by priority. */\n priority?: TaskPriority;\n /** Filter by assignee actor id. */\n assigneeId?: string;\n /** Free-text search (server-side). */\n search?: string;\n /** Columns to render (order preserved). */\n columns?: TaskListColumn[];\n /** Initial sort key. */\n sortBy?: TaskListSort;\n /** Initial sort direction. Defaults to ascending. */\n sortDir?: \"asc\" | \"desc\";\n /** Hide the header (title + count). */\n hideHeader?: boolean;\n /** Called with the work-item id when a row is clicked. */\n onSelect?: (id: string) => void;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /**\n * When set, fetch WorkItemLinks for this `sourceProduct` and populate the\n * \"linkedRecord\" column. Omitted → no link fetch.\n */\n linkSourceProduct?: string;\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n /** Max items to fetch (pagination.first). Defaults to 200. */\n limit?: number;\n /** Extra classes on the root container. */\n className?: string;\n /** Explicit workspace ID. Falls back to PlanMagnetProvider context. */\n workspaceId?: string;\n}\n\n/**\n * TaskListCore — provider-less, prop-driven compact list/table of work items.\n *\n * Same data source as TaskBoardCore (`LIST_WORK_ITEMS`) but a dense, Linear-style\n * table: status pills, priority signal bars, assignee avatars, click-to-sort\n * headers. Filters map to the server-side filter; sort is client-side.\n * BYO-Apollo, semantic-token only, farm-free.\n */\nexport function TaskListCore({\n projectId,\n status,\n type,\n priority,\n assigneeId,\n search,\n columns = DEFAULT_COLUMNS,\n sortBy,\n sortDir = \"asc\",\n hideHeader,\n onSelect,\n resolveAssignee,\n linkSourceProduct,\n renderLinkIcon,\n limit = 200,\n className,\n workspaceId: workspaceIdProp,\n}: TaskListCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const { linksByItem } = useWorkItemLinks(workspaceId, linkSourceProduct);\n const L = useTaskLabels();\n\n const [sort, setSort] = useState<{\n by: TaskListSort | null;\n dir: \"asc\" | \"desc\";\n }>({\n by: sortBy ?? null,\n dir: sortDir,\n });\n\n const filter = useMemo(() => {\n const f: Record<string, string> = {};\n if (projectId) f.projectId = projectId;\n if (status) f.status = status;\n if (type) f.type = type;\n if (priority) f.priority = priority;\n if (assigneeId) f.assigneeId = assigneeId;\n if (search) f.search = search;\n return f;\n }, [projectId, status, type, priority, assigneeId, search]);\n\n const { data, loading, error } = useQuery<ListWorkItemsResult>(\n LIST_WORK_ITEMS,\n {\n variables: {\n workspaceId,\n ...(Object.keys(filter).length ? { filter } : {}),\n pagination: { first: limit },\n },\n skip: !workspaceId,\n },\n );\n\n const rows = useMemo(() => {\n const items = data?.planmagnetWorkItems?.items ?? [];\n if (!sort.by) return items;\n const dir = sort.dir === \"desc\" ? -1 : 1;\n const key = sort.by;\n return [...items].sort((a, b) => dir * compareTasks(a, b, key));\n }, [data, sort]);\n\n const toggleSort = (col: TaskListColumn) => {\n const key = COLUMN_SORT[col];\n if (!key) return;\n setSort((prev) =>\n prev.by === key\n ? { by: key, dir: prev.dir === \"asc\" ? \"desc\" : \"asc\" }\n : { by: key, dir: \"asc\" },\n );\n };\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TaskList: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {!hideHeader && (\n <div className=\"flex items-baseline justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">{L.list}</h2>\n <span className=\"text-sm text-muted-foreground\">\n {rows.length} {rows.length === 1 ? L.tasksSingular : L.tasksPlural}\n </span>\n </div>\n )}\n\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50 text-left\">\n {columns.map((col) => {\n const sortable = Boolean(COLUMN_SORT[col]);\n const active = sort.by === COLUMN_SORT[col];\n return (\n <th\n key={col}\n onClick={sortable ? () => toggleSort(col) : undefined}\n className={cn(\n \"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\",\n sortable &&\n \"cursor-pointer select-none hover:text-foreground\",\n )}\n >\n <span className=\"inline-flex items-center gap-1\">\n {columnLabel(col, L)}\n {active &&\n (sort.dir === \"asc\" ? (\n <ChevronUp className=\"h-3 w-3\" aria-hidden=\"true\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" aria-hidden=\"true\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-3 py-8 text-center text-muted-foreground\"\n >\n {L.noTasksFound}\n </td>\n </tr>\n )}\n {rows.map((task) => (\n <tr\n key={task.id}\n onClick={onSelect ? () => onSelect(task.id) : undefined}\n className={cn(\n \"border-b border-border last:border-0\",\n onSelect && \"cursor-pointer hover:bg-muted/40\",\n )}\n >\n {columns.map((col) => (\n <td\n key={col}\n className=\"px-3 py-2 align-middle text-foreground\"\n >\n {renderCell(col, task, {\n resolveAssignee,\n links: linksByItem.get(task.id),\n renderLinkIcon,\n unassigned: L.unassigned,\n })}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction renderCell(\n col: TaskListColumn,\n task: Task,\n opts: {\n resolveAssignee?: ResolveAssignee;\n links?: WorkItemLink[];\n renderLinkIcon?: RenderLinkIcon;\n unassigned: string;\n },\n) {\n const { resolveAssignee, links, renderLinkIcon, unassigned } = opts;\n switch (col) {\n case \"key\":\n return (\n <span className=\"font-mono text-xs text-muted-foreground\">\n {task.key}\n </span>\n );\n case \"title\":\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">{task.title}</span>\n <span className=\"font-mono text-[10px] uppercase text-muted-foreground\">\n {task.key}\n </span>\n </div>\n );\n case \"type\":\n return <TypeBadge type={task.type} />;\n case \"status\":\n return <StatusPill status={task.status} />;\n case \"priority\":\n return <PriorityIndicator priority={task.priority} showLabel />;\n case \"assignee\": {\n const resolved = task.assigneeId\n ? resolveAssignee?.(task.assigneeId)\n : null;\n return (\n <span className=\"flex items-center gap-1.5\">\n <Avatar id={task.assigneeId} name={resolved?.name} size=\"sm\" />\n <span className=\"text-xs text-muted-foreground\">\n {resolved?.name ?? (task.assigneeId ? \"\" : unassigned)}\n </span>\n </span>\n );\n }\n case \"dueDate\": {\n const due = formatDueDate(task.dueDate);\n if (!due) return <span className=\"text-muted-foreground\">—</span>;\n return (\n <span\n className={cn(\n \"text-xs\",\n isOverdue(task.dueDate, task.status)\n ? \"font-medium text-destructive\"\n : \"text-muted-foreground\",\n )}\n >\n {due}\n </span>\n );\n }\n case \"storyPoints\":\n return task.storyPoints != null ? (\n <span className=\"flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/10 px-1 text-[10px] font-semibold text-primary\">\n {task.storyPoints}\n </span>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n );\n case \"linkedRecord\":\n if (!links || links.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n return (\n <div className=\"flex flex-wrap gap-1\">\n {links.slice(0, 2).map((link) => (\n <LinkChip key={link.id} link={link} renderIcon={renderLinkIcon} />\n ))}\n {links.length > 2 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{links.length - 2}\n </span>\n )}\n </div>\n );\n case \"labels\":\n return (\n <div className=\"flex flex-wrap gap-1\">\n {(task.labels ?? []).slice(0, 3).map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\"\n >\n {l}\n </span>\n ))}\n </div>\n );\n default:\n return null;\n }\n}\n\nfunction compareTasks(a: Task, b: Task, sortBy: TaskListSort): number {\n switch (sortBy) {\n case \"priority\":\n return priorityRank[a.priority] - priorityRank[b.priority];\n case \"status\":\n return statusRank[a.status] - statusRank[b.status];\n case \"title\":\n return a.title.localeCompare(b.title);\n case \"type\":\n return a.type.localeCompare(b.type);\n case \"dueDate\":\n return (a.dueDate ?? \"\").localeCompare(b.dueDate ?? \"\");\n case \"storyPoints\":\n return (a.storyPoints ?? 0) - (b.storyPoints ?? 0);\n default:\n return 0;\n }\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TaskListCore, type TaskListCoreProps } from \"./TaskListCore\";\n\nexport interface TaskListProps extends TaskListCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TaskList — standalone, embeddable compact list/table of work items.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders TaskListCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * @example\n * ```tsx\n * <TaskList\n * workspaceClient={hostClient}\n * workspaceId=\"ws-123\"\n * sortBy=\"priority\"\n * onSelect={(id) => openTask(id)}\n * />\n * ```\n */\nexport function TaskList({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TaskListProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TaskListCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { LIST_MILESTONES } from \"../graphql-ops\";\nimport { parseDate } from \"../utils/dates\";\nimport type { Milestone, MilestoneList } from \"../types\";\n\ntype ListMilestonesResult = { planmagnetMilestones: MilestoneList };\n\nexport interface UseMilestonesResult {\n milestones: Milestone[];\n /** Milestones grouped by their due day (yyyy-MM-dd), for timeline flags. */\n byDay: Map<string, Milestone[]>;\n loading: boolean;\n}\n\n/**\n * useMilestones — fetch a project's milestones (e.g. a harvest window) for the\n * Timeline to flag. Skips when no workspaceId. Errors are swallowed by Apollo's\n * error return so a milestone RBAC/serialization hiccup never breaks the board;\n * `milestones` is simply empty. Farm-free; opt-in via `enabled`.\n */\nexport function useMilestones(\n workspaceId: string | undefined,\n opts: { projectId?: string; enabled?: boolean; limit?: number } = {},\n): UseMilestonesResult {\n const { projectId, enabled = true, limit = 100 } = opts;\n const { data, loading } = useQuery<ListMilestonesResult>(LIST_MILESTONES, {\n variables: {\n workspaceId,\n ...(projectId ? { filter: { projectId } } : {}),\n pagination: { first: limit },\n },\n skip: !workspaceId || !enabled,\n errorPolicy: \"all\",\n });\n\n const milestones = useMemo(\n () => data?.planmagnetMilestones?.items ?? [],\n [data],\n );\n\n const byDay = useMemo(() => {\n const map = new Map<string, Milestone[]>();\n for (const m of milestones) {\n const d = parseDate(m.dueDate);\n if (!d) continue;\n const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n const arr = map.get(key);\n if (arr) arr.push(m);\n else map.set(key, [m]);\n }\n return map;\n }, [milestones]);\n\n return { milestones, byDay, loading };\n}\n","import { useMemo, useState } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport {\n addMonths,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n endOfWeek,\n format,\n isSameMonth,\n isToday,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { ChevronLeft, ChevronRight, Flag } from \"lucide-react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { useMilestones } from \"../hooks/useMilestones\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport { cn } from \"../utils/cn\";\nimport { Avatar, PriorityIndicator } from \"../ui\";\nimport { formatDueDate, isOverdue, parseDate } from \"../utils/dates\";\nimport type { ResolveAssignee } from \"./TaskCard\";\nimport {\n type Milestone,\n type Task,\n type TaskPriority,\n type TaskType,\n type WorkItemList,\n} from \"../types\";\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\n\ntype TimelineMode = \"week\" | \"month\";\n\nexport interface TaskTimelineCoreProps {\n /** Scope the timeline to one project (client-side filter). */\n projectId?: string;\n /** Controlled priority filter (\"ALL\" or a specific priority). */\n priority?: TaskPriority | \"ALL\";\n /** Controlled type filter (\"ALL\" or a specific type). */\n type?: TaskType | \"ALL\";\n /** Controlled free-text search (matches title/key/labels). */\n search?: string;\n /** Controlled assignee filter (actor id). */\n assigneeId?: string;\n /** Default mode. */\n defaultMode?: TimelineMode;\n /** Called with the work-item id when a task chip is clicked. */\n onSelect?: (id: string) => void;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /** Fetch + flag project milestones on the timeline (default true). */\n showMilestones?: boolean;\n className?: string;\n workspaceId?: string;\n}\n\nconst WEEK_OPTS = { weekStartsOn: 1 } as const; // Monday\n\n/** yyyy-MM-dd key for a date. */\nfunction dayKey(d: Date): string {\n return format(d, \"yyyy-MM-dd\");\n}\n\n/**\n * TaskTimelineCore — a week/month schedule of work items by due date.\n *\n * The spec's \"week/month timeline that shows when work is scheduled and what's\n * due\". We only have a single `dueDate` per work item (no start/end), so this is\n * an agenda-style schedule (chip on its due day) rather than a span Gantt —\n * honest to the data. Overdue and undated work is surfaced explicitly so nothing\n * hides. BYO-Apollo, semantic-token only, farm-free.\n */\nexport function TaskTimelineCore({\n projectId,\n priority = \"ALL\",\n type = \"ALL\",\n search = \"\",\n assigneeId,\n defaultMode = \"week\",\n onSelect,\n resolveAssignee,\n showMilestones = true,\n className,\n workspaceId: workspaceIdProp,\n}: TaskTimelineCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const L = useTaskLabels();\n const { milestones, byDay: milestonesByDay } = useMilestones(workspaceId, {\n projectId,\n enabled: showMilestones,\n });\n\n const [mode, setMode] = useState<TimelineMode>(defaultMode);\n const [offset, setOffset] = useState(0); // weeks/months from today\n\n const { data, loading, error } = useQuery<ListWorkItemsResult>(\n LIST_WORK_ITEMS,\n {\n variables: {\n workspaceId,\n ...(projectId ? { filter: { projectId } } : {}),\n pagination: { first: 200 },\n },\n skip: !workspaceId,\n },\n );\n\n const tasks = useMemo(() => {\n const all = data?.planmagnetWorkItems?.items ?? [];\n const query = search.trim().toLowerCase();\n return all.filter((t) => {\n if (priority !== \"ALL\" && t.priority !== priority) return false;\n if (type !== \"ALL\" && t.type !== type) return false;\n if (assigneeId && t.assigneeId !== assigneeId) return false;\n if (query) {\n const hay = [t.title, t.key, ...(t.labels ?? [])]\n .join(\" \")\n .toLowerCase();\n if (!hay.includes(query)) return false;\n }\n return true;\n });\n }, [data, priority, type, search, assigneeId]);\n\n const { anchor, rangeStart, rangeEnd, days } = useMemo(() => {\n const base = new Date();\n if (mode === \"week\") {\n const a = addWeeks(base, offset);\n const s = startOfWeek(a, WEEK_OPTS);\n const e = endOfWeek(a, WEEK_OPTS);\n return {\n anchor: a,\n rangeStart: s,\n rangeEnd: e,\n days: eachDayOfInterval({ start: s, end: e }),\n };\n }\n const a = addMonths(base, offset);\n const s = startOfWeek(startOfMonth(a), WEEK_OPTS);\n const e = endOfWeek(endOfMonth(a), WEEK_OPTS);\n return {\n anchor: a,\n rangeStart: s,\n rangeEnd: e,\n days: eachDayOfInterval({ start: s, end: e }),\n };\n }, [mode, offset]);\n\n const { byDay, overdue, undated } = useMemo(() => {\n const map = new Map<string, Task[]>();\n const od: Task[] = [];\n const ud: Task[] = [];\n for (const t of tasks) {\n const d = parseDate(t.dueDate);\n if (!d) {\n ud.push(t);\n continue;\n }\n // Overdue work lives only in the banner — not also in its day cell —\n // so it isn't shown twice when the overdue day falls in the view range.\n if (isOverdue(t.dueDate, t.status)) {\n od.push(t);\n continue;\n }\n const k = dayKey(d);\n const arr = map.get(k);\n if (arr) arr.push(t);\n else map.set(k, [t]);\n }\n return { byDay: map, overdue: od, undated: ud };\n }, [tasks]);\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n Timeline: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n const rangeLabel =\n mode === \"week\"\n ? `${format(rangeStart, \"MMM d\")} – ${format(rangeEnd, \"MMM d\")}`\n : format(anchor, \"MMMM yyyy\");\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Controls */}\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setOffset((o) => o - 1)}\n aria-label=\"Previous\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md border border-border text-muted-foreground hover:bg-muted/50\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setOffset(0)}\n className=\"h-8 rounded-md border border-border px-3 text-xs font-medium text-foreground hover:bg-muted/50\"\n >\n {L.today}\n </button>\n <button\n type=\"button\"\n onClick={() => setOffset((o) => o + 1)}\n aria-label=\"Next\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md border border-border text-muted-foreground hover:bg-muted/50\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n <span className=\"ml-2 text-sm font-medium text-foreground\">\n {rangeLabel}\n </span>\n </div>\n <div className=\"inline-flex rounded-md border border-border p-0.5\">\n {([\"week\", \"month\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => {\n setMode(m);\n setOffset(0);\n }}\n className={cn(\n \"rounded px-3 py-1 text-xs font-medium capitalize transition-colors\",\n mode === m\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {m === \"week\" ? L.week : L.month}\n </button>\n ))}\n </div>\n </div>\n\n {/* Overdue banner (relative to today, always meaningful) */}\n {overdue.length > 0 && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2\">\n <p className=\"mb-1 text-xs font-semibold text-destructive\">\n {L.overdue.replace(\"{n}\", String(overdue.length))}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {overdue.map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n tone=\"destructive\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Milestones strip (AC-04: at least one milestone marker) */}\n {milestones.length > 0 && (\n <div className=\"rounded-md border border-primary/30 bg-primary/5 px-3 py-2\">\n <p className=\"mb-1 flex items-center gap-1 text-xs font-semibold text-primary\">\n <Flag className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {L.milestones}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {milestones.map((m) => (\n <MilestoneFlag key={m.id} milestone={m} />\n ))}\n </div>\n </div>\n )}\n\n {/* Schedule grid */}\n {mode === \"week\" ? (\n <div className=\"grid grid-cols-7 gap-2\">\n {days.map((day) => {\n const items = byDay.get(dayKey(day)) ?? [];\n const dayMilestones = milestonesByDay.get(dayKey(day)) ?? [];\n const today = isToday(day);\n return (\n <div\n key={dayKey(day)}\n className={cn(\n \"flex min-h-32 flex-col rounded-lg border p-2\",\n today\n ? \"border-primary/50 bg-primary/5\"\n : \"border-border bg-muted/20\",\n )}\n >\n <div className=\"mb-2 flex items-baseline justify-between\">\n <span\n className={cn(\n \"text-xs font-semibold uppercase\",\n today ? \"text-primary\" : \"text-muted-foreground\",\n )}\n >\n {format(day, \"EEE\")}\n </span>\n <span\n className={cn(\n \"text-sm font-semibold\",\n today ? \"text-primary\" : \"text-foreground\",\n )}\n >\n {format(day, \"d\")}\n </span>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {dayMilestones.map((m) => (\n <MilestoneFlag key={m.id} milestone={m} compact />\n ))}\n {items.map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-7 gap-1\">\n {[\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"].map((d) => (\n <div\n key={d}\n className=\"px-1 pb-1 text-center text-[10px] font-semibold uppercase text-muted-foreground\"\n >\n {d}\n </div>\n ))}\n {days.map((day) => {\n const items = byDay.get(dayKey(day)) ?? [];\n const today = isToday(day);\n const inMonth = isSameMonth(day, anchor);\n return (\n <div\n key={dayKey(day)}\n className={cn(\n \"flex min-h-20 flex-col gap-1 rounded-md border p-1\",\n today\n ? \"border-primary/50 bg-primary/5\"\n : \"border-border/60 bg-muted/10\",\n !inMonth && \"opacity-40\",\n )}\n >\n <span\n className={cn(\n \"text-[10px] font-semibold\",\n today ? \"text-primary\" : \"text-muted-foreground\",\n )}\n >\n {format(day, \"d\")}\n </span>\n {items.slice(0, 3).map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n compact\n />\n ))}\n {items.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{items.length - 3} {L.more}\n </span>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Undated work */}\n {undated.length > 0 && (\n <div className=\"rounded-md border border-border bg-muted/20 px-3 py-2\">\n <p className=\"mb-1 text-xs font-semibold text-muted-foreground\">\n {L.noDueDate.replace(\"{n}\", String(undated.length))}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {undated.map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/** A milestone rendered as a flag chip on the timeline (name + due date). */\nfunction MilestoneFlag({\n milestone,\n compact,\n}: {\n milestone: Milestone;\n compact?: boolean;\n}) {\n const due = formatDueDate(milestone.dueDate);\n return (\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1 rounded-md border border-primary/40 bg-primary/10 px-1.5 py-1 text-[11px] font-medium text-primary\",\n compact && \"w-full\",\n )}\n title={milestone.name + (due ? ` · ${due}` : \"\")}\n >\n <Flag className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{milestone.name}</span>\n {!compact && due && (\n <span className=\"shrink-0 text-primary/70\">· {due}</span>\n )}\n </span>\n );\n}\n\nfunction TaskChip({\n task,\n onSelect,\n resolveAssignee,\n tone,\n compact,\n}: {\n task: Task;\n onSelect?: (id: string) => void;\n resolveAssignee?: ResolveAssignee;\n tone?: \"destructive\";\n compact?: boolean;\n}) {\n const resolved = task.assigneeId ? resolveAssignee?.(task.assigneeId) : null;\n const interactive = Boolean(onSelect);\n return (\n <button\n type=\"button\"\n disabled={!interactive}\n onClick={interactive ? () => onSelect?.(task.id) : undefined}\n title={task.title}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md border px-1.5 py-1 text-left transition-colors\",\n tone === \"destructive\"\n ? \"border-destructive/40 bg-card hover:bg-destructive/5\"\n : \"border-border bg-card hover:border-primary/50\",\n interactive ? \"cursor-pointer\" : \"cursor-default\",\n )}\n >\n <PriorityIndicator priority={task.priority} />\n <span className=\"min-w-0 flex-1 truncate text-[11px] font-medium text-foreground\">\n {task.title}\n </span>\n {!compact && (\n <Avatar id={task.assigneeId} name={resolved?.name} size=\"sm\" />\n )}\n </button>\n );\n}\n","import { type ComponentType } from \"react\";\nimport {\n CalendarRange,\n LayoutGrid,\n List as ListIcon,\n Plus,\n Search,\n User,\n type LucideProps,\n} from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport {\n TASK_PRIORITIES,\n TASK_TYPES,\n type TaskPriority,\n type TaskType,\n} from \"../types\";\n\n/** The three task views the toolbar can switch between. */\nexport type TaskView = \"board\" | \"list\" | \"timeline\";\n\nconst VIEW_ICONS: Record<TaskView, ComponentType<LucideProps>> = {\n board: LayoutGrid,\n list: ListIcon,\n timeline: CalendarRange,\n};\n\nexport interface TaskToolbarProps {\n view: TaskView;\n onViewChange: (view: TaskView) => void;\n /** Which views to offer (order preserved). Defaults to all three. */\n views?: TaskView[];\n search: string;\n onSearchChange: (search: string) => void;\n priority: TaskPriority | \"ALL\";\n onPriorityChange: (priority: TaskPriority | \"ALL\") => void;\n type: TaskType | \"ALL\";\n onTypeChange: (type: TaskType | \"ALL\") => void;\n onNewTask?: () => void;\n canCreate?: boolean;\n /** \"My tasks\" toggle — only rendered when `onMineChange` is provided. */\n mine?: boolean;\n onMineChange?: (mine: boolean) => void;\n className?: string;\n}\n\nconst SELECT_CLASS =\n \"h-8 rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground capitalize transition-colors hover:bg-muted/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\";\n\n/**\n * TaskToolbar — the single Linear-style control bar for the Tasks experience:\n * view tabs (Board / List / Timeline) + search + priority/type filters + a\n * \"New task\" action. Fully controlled; semantic-token only.\n */\nexport function TaskToolbar({\n view,\n onViewChange,\n views = [\"board\", \"list\", \"timeline\"],\n search,\n onSearchChange,\n priority,\n onPriorityChange,\n type,\n onTypeChange,\n onNewTask,\n canCreate,\n mine,\n onMineChange,\n className,\n}: TaskToolbarProps) {\n const L = useTaskLabels();\n const viewLabel: Record<TaskView, string> = {\n board: L.board,\n list: L.list,\n timeline: L.timeline,\n };\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-between gap-3 border-b border-border pb-2\",\n className,\n )}\n >\n {/* View tabs — underline style */}\n <div\n className=\"flex items-center gap-1\"\n role=\"tablist\"\n aria-label=\"Task views\"\n >\n {views.map((v) => {\n const Icon = VIEW_ICONS[v];\n const active = v === view;\n return (\n <button\n key={v}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onViewChange(v)}\n className={cn(\n \"relative flex items-center gap-1.5 rounded-t-md px-2.5 py-1.5 text-sm font-medium transition-colors\",\n active\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon className=\"h-4 w-4\" aria-hidden=\"true\" />\n {viewLabel[v]}\n {active && (\n <span className=\"absolute inset-x-1 -bottom-[9px] h-0.5 rounded-full bg-primary\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Search + filters + New task */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <input\n type=\"search\"\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={L.searchPlaceholder}\n aria-label={L.searchPlaceholder}\n className=\"h-8 w-40 rounded-md border border-border bg-background pl-7 pr-2 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n\n {onMineChange && (\n <button\n type=\"button\"\n onClick={() => onMineChange(!mine)}\n aria-pressed={mine}\n className={cn(\n \"flex h-8 items-center gap-1.5 rounded-md border px-2.5 text-xs font-medium transition-colors\",\n mine\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted/50 hover:text-foreground\",\n )}\n >\n <User className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {L.myTasks}\n </button>\n )}\n\n <select\n value={priority}\n onChange={(e) =>\n onPriorityChange(e.target.value as TaskPriority | \"ALL\")\n }\n aria-label={L.priorityLabel}\n className={SELECT_CLASS}\n >\n <option value=\"ALL\">{L.allPriorities}</option>\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {L.priority[p]}\n </option>\n ))}\n </select>\n\n <select\n value={type}\n onChange={(e) => onTypeChange(e.target.value as TaskType | \"ALL\")}\n aria-label={L.typeLabel}\n className={SELECT_CLASS}\n >\n <option value=\"ALL\">{L.allTypes}</option>\n {TASK_TYPES.map((t) => (\n <option key={t} value={t}>\n {L.type[t]}\n </option>\n ))}\n </select>\n\n {canCreate && onNewTask && (\n <button\n type=\"button\"\n onClick={onNewTask}\n className=\"flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n {L.newTask}\n </button>\n )}\n </div>\n </div>\n );\n}\n","import {\n useEffect,\n useMemo,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { useApolloClient, useMutation, useQuery } from \"@apollo/client/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { Trash2 } from \"lucide-react\";\nimport {\n DELETE_WORK_ITEM,\n GET_WORK_ITEM,\n LIST_WORK_ITEMS,\n UPDATE_WORK_ITEM,\n} from \"../graphql-ops\";\nimport { getPlanMagnetConfig } from \"../config\";\nimport { cn } from \"../utils/cn\";\nimport { Avatar, Badge } from \"../ui\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport type { AssigneeOption, ResolveAssignee } from \"./TaskCard\";\nimport {\n TASK_PRIORITIES,\n TASK_STATUSES,\n TASK_TYPES,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type UpdateTaskInput,\n type WorkItemDetail,\n} from \"../types\";\n\ntype GetWorkItemResult = { planmagnetWorkItem: WorkItemDetail | null };\ntype UpdateWorkItemResult = { planmagnetUpdateWorkItem: WorkItemDetail };\n\n/** Fields that can be hidden / suppressed on the detail view + edit form. */\nexport type TaskDetailField =\n | \"description\"\n | \"type\"\n | \"status\"\n | \"priority\"\n | \"assignee\"\n | \"dueDate\"\n | \"labels\"\n | \"storyPoints\";\n\nexport interface TaskDetailCoreProps {\n /** Work-item id to fetch + edit. Required. */\n id: string;\n /** Start in read-only mode with no edit affordance. */\n readonly?: boolean;\n /** Field names to hide. */\n hiddenFields?: TaskDetailField[];\n /** Hide the header (key + title). */\n hideHeader?: boolean;\n /** Called with the updated work item after a successful save. */\n onUpdated?: (workItem: WorkItemDetail) => void;\n /** Called after a successful delete (with the deleted id). Enables the Delete button. */\n onDeleted?: (id: string) => void;\n /** Called when a mutation errors. */\n onError?: (error: Error) => void;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /** Optional host-provided member directory → renders a picker instead of a raw id field. */\n assigneeOptions?: AssigneeOption[];\n /** Extra classes on the root container. */\n className?: string;\n}\n\nconst fieldClass =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\";\nconst labelClass =\n \"text-xs font-medium uppercase tracking-wide text-muted-foreground\";\n\nconst priorityVariant: Record<\n TaskPriority,\n \"muted\" | \"secondary\" | \"accent\" | \"destructive\"\n> = {\n NONE: \"muted\",\n LOW: \"muted\",\n MEDIUM: \"secondary\",\n HIGH: \"accent\",\n CRITICAL: \"destructive\",\n};\n\n/**\n * TaskDetailCore — provider-less, prop-driven single work-item view with inline\n * edit. Fetches via `planmagnetWorkItem(id)`, saves via\n * `planmagnetUpdateWorkItem`. BYO-Apollo, semantic-token only, farm-free.\n */\nexport function TaskDetailCore({\n id,\n readonly,\n hiddenFields,\n hideHeader,\n onUpdated,\n onDeleted,\n onError,\n resolveAssignee,\n assigneeOptions,\n className,\n}: TaskDetailCoreProps) {\n const client = useApolloClient();\n const L = useTaskLabels();\n const hidden = useMemo(\n () => new Set<TaskDetailField>(hiddenFields ?? []),\n [hiddenFields],\n );\n\n const { data, loading, error } = useQuery<GetWorkItemResult>(GET_WORK_ITEM, {\n variables: { id },\n skip: !id,\n });\n const item = data?.planmagnetWorkItem ?? null;\n\n const [editing, setEditing] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [type, setType] = useState<TaskType>(\"TASK\");\n const [status, setStatus] = useState<TaskStatus>(\"BACKLOG\");\n const [priority, setPriority] = useState<TaskPriority>(\"NONE\");\n const [assigneeId, setAssigneeId] = useState(\"\");\n const [dueDate, setDueDate] = useState(\"\");\n const [labels, setLabels] = useState(\"\");\n const [storyPoints, setStoryPoints] = useState(\"\");\n\n // Hydrate the edit form from the fetched item whenever it (re)loads.\n useEffect(() => {\n if (!item) return;\n setTitle(item.title);\n setDescription(item.description ?? \"\");\n setType(item.type);\n setStatus(item.status);\n setPriority(item.priority);\n setAssigneeId(item.assigneeId ?? \"\");\n setDueDate(item.dueDate ? String(item.dueDate).slice(0, 10) : \"\");\n setLabels((item.labels ?? []).join(\", \"));\n setStoryPoints(item.storyPoints != null ? String(item.storyPoints) : \"\");\n }, [item]);\n\n const [updateWorkItem, { loading: saving, error: saveError }] =\n useMutation<UpdateWorkItemResult>(UPDATE_WORK_ITEM);\n const [deleteWorkItem, { loading: deleting, error: deleteError }] =\n useMutation<{ planmagnetDeleteWorkItem: boolean }>(DELETE_WORK_ITEM);\n\n const handleDelete = async () => {\n if (!item) return;\n try {\n await deleteWorkItem({ variables: { id: item.id } });\n // Evict from cache so the board/list drop it, then refetch the lists.\n client.cache.evict({\n id: client.cache.identify({ __typename: \"WorkItem\", id: item.id }),\n });\n client.cache.gc();\n void client\n .refetchQueries({ include: [LIST_WORK_ITEMS] })\n .catch(() => {});\n onDeleted?.(item.id);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n const handleSave = async (e: FormEvent) => {\n e.preventDefault();\n if (!item) return;\n\n const parsedLabels = labels\n .split(\",\")\n .map((l) => l.trim())\n .filter(Boolean);\n const parsedPoints = storyPoints.trim() ? Number(storyPoints) : undefined;\n\n const input: UpdateTaskInput = {\n title: title.trim(),\n ...(hidden.has(\"description\") ? {} : { description: description.trim() }),\n ...(hidden.has(\"type\") ? {} : { type }),\n ...(hidden.has(\"status\") ? {} : { status }),\n ...(hidden.has(\"priority\") ? {} : { priority }),\n ...(hidden.has(\"assignee\") ? {} : { assigneeId: assigneeId.trim() }),\n ...(hidden.has(\"dueDate\") ? {} : { dueDate: dueDate || undefined }),\n ...(hidden.has(\"labels\") ? {} : { labels: parsedLabels }),\n ...(hidden.has(\"storyPoints\") ||\n parsedPoints == null ||\n Number.isNaN(parsedPoints)\n ? {}\n : { storyPoints: parsedPoints }),\n };\n\n try {\n const result = await updateWorkItem({\n variables: { id: item.id, input },\n });\n const updated = result.data?.planmagnetUpdateWorkItem;\n if (updated) {\n const cfg = getPlanMagnetConfig();\n try {\n await cfg.onTaskSaved?.({\n id: updated.id,\n key: updated.key,\n title: updated.title,\n projectId: updated.projectId,\n operation: \"updated\",\n });\n } catch {\n // Host callback errors must never break the save flow.\n }\n onUpdated?.(updated);\n setEditing(false);\n }\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n if (!id) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TaskDetail: no work-item id provided.\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n if (!item) {\n return (\n <div className={cn(\"p-6 text-sm text-muted-foreground\", className)}>\n {L.taskNotFound}\n </div>\n );\n }\n\n const canEdit = !readonly;\n\n return (\n <Card className={cn(\"shadow-sm\", className)}>\n <CardContent className=\"space-y-4 p-6\">\n {!hideHeader && (\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <p className=\"text-xs text-muted-foreground\">{item.key}</p>\n <h2 className=\"text-xl font-semibold text-foreground\">\n {item.title}\n </h2>\n </div>\n {canEdit && !editing && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {onDeleted &&\n (confirmingDelete ? (\n <span className=\"flex items-center gap-1 text-xs\">\n <span className=\"text-muted-foreground\">\n {L.deletePrompt}\n </span>\n <button\n type=\"button\"\n disabled={deleting}\n onClick={handleDelete}\n className=\"rounded bg-destructive px-2 py-1 font-medium text-destructive-foreground disabled:opacity-50\"\n >\n {deleting ? \"…\" : L.yes}\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded bg-muted px-2 py-1 text-muted-foreground\"\n >\n {L.no}\n </button>\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n title={L.del}\n aria-label={L.del}\n className=\"rounded-md p-1.5 text-destructive hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className=\"rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground\"\n >\n {L.edit}\n </button>\n </div>\n )}\n </div>\n )}\n {deleteError && (\n <p className=\"text-sm text-destructive\">\n {L.failedToDelete}: {deleteError.message}\n </p>\n )}\n\n {!editing ? (\n <dl className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <Field label={L.typeLabel}>\n <Badge variant=\"secondary\">{L.type[item.type]}</Badge>\n </Field>\n )}\n {!hidden.has(\"status\") && (\n <Field label={L.statusLabel}>\n <span className=\"capitalize text-foreground\">\n {L.status[item.status]}\n </span>\n </Field>\n )}\n {!hidden.has(\"priority\") && (\n <Field label={L.priorityLabel}>\n <Badge variant={priorityVariant[item.priority]}>\n {L.priority[item.priority]}\n </Badge>\n </Field>\n )}\n {!hidden.has(\"assignee\") && (\n <Field label={L.assigneeLabel}>\n {item.assigneeId ? (\n <span className=\"flex items-center gap-1.5\">\n <Avatar\n id={item.assigneeId}\n name={resolveAssignee?.(item.assigneeId)?.name}\n size=\"sm\"\n />\n <span className=\"text-foreground\">\n {resolveAssignee?.(item.assigneeId)?.name ?? L.assigned}\n </span>\n </span>\n ) : (\n <span className=\"text-muted-foreground\">{L.unassigned}</span>\n )}\n </Field>\n )}\n {!hidden.has(\"dueDate\") && (\n <Field label={L.dueDateLabel}>\n <span className=\"text-foreground\">{item.dueDate ?? \"—\"}</span>\n </Field>\n )}\n {!hidden.has(\"storyPoints\") && (\n <Field label={L.storyPointsLabel}>\n <span className=\"text-foreground\">{item.storyPoints ?? 0}</span>\n </Field>\n )}\n {!hidden.has(\"description\") && (\n <div className=\"sm:col-span-2\">\n <dt className={labelClass}>{L.description}</dt>\n <dd className=\"mt-1 whitespace-pre-wrap text-sm text-foreground\">\n {item.description || \"—\"}\n </dd>\n </div>\n )}\n {!hidden.has(\"labels\") && (\n <div className=\"sm:col-span-2\">\n <dt className={labelClass}>{L.labelsLabel}</dt>\n <dd className=\"mt-1 flex flex-wrap gap-1\">\n {(item.labels ?? []).length === 0 ? (\n <span className=\"text-sm text-muted-foreground\">—</span>\n ) : (\n item.labels.map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\"\n >\n {l}\n </span>\n ))\n )}\n </dd>\n </div>\n )}\n </dl>\n ) : (\n <form onSubmit={handleSave} className=\"space-y-4\">\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-title\" className={labelClass}>\n {L.title}\n </label>\n <input\n id=\"pm-detail-title\"\n className={fieldClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n required\n />\n </div>\n\n {!hidden.has(\"description\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-desc\" className={labelClass}>\n {L.description}\n </label>\n <textarea\n id=\"pm-detail-desc\"\n className={cn(fieldClass, \"min-h-[80px]\")}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-type\" className={labelClass}>\n {L.typeLabel}\n </label>\n <select\n id=\"pm-detail-type\"\n className={cn(fieldClass, \"capitalize\")}\n value={type}\n onChange={(e) => setType(e.target.value as TaskType)}\n >\n {TASK_TYPES.map((t) => (\n <option key={t} value={t}>\n {L.type[t]}\n </option>\n ))}\n </select>\n </div>\n )}\n {!hidden.has(\"status\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-status\" className={labelClass}>\n {L.statusLabel}\n </label>\n <select\n id=\"pm-detail-status\"\n className={cn(fieldClass, \"capitalize\")}\n value={status}\n onChange={(e) => setStatus(e.target.value as TaskStatus)}\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>\n {L.status[s]}\n </option>\n ))}\n </select>\n </div>\n )}\n {!hidden.has(\"priority\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-priority\" className={labelClass}>\n {L.priorityLabel}\n </label>\n <select\n id=\"pm-detail-priority\"\n className={cn(fieldClass, \"capitalize\")}\n value={priority}\n onChange={(e) =>\n setPriority(e.target.value as TaskPriority)\n }\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {L.priority[p]}\n </option>\n ))}\n </select>\n </div>\n )}\n {!hidden.has(\"assignee\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-assignee\" className={labelClass}>\n {L.assigneeLabel}\n </label>\n {assigneeOptions && assigneeOptions.length > 0 ? (\n <select\n id=\"pm-detail-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n >\n <option value=\"\">{L.unassigned}</option>\n {assigneeOptions.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n id=\"pm-detail-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n placeholder={L.assigneePlaceholder}\n />\n )}\n </div>\n )}\n {!hidden.has(\"dueDate\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-due\" className={labelClass}>\n {L.dueDateLabel}\n </label>\n <input\n id=\"pm-detail-due\"\n type=\"date\"\n className={fieldClass}\n value={dueDate}\n onChange={(e) => setDueDate(e.target.value)}\n />\n </div>\n )}\n {!hidden.has(\"storyPoints\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-points\" className={labelClass}>\n {L.storyPointsLabel}\n </label>\n <input\n id=\"pm-detail-points\"\n type=\"number\"\n min={0}\n className={fieldClass}\n value={storyPoints}\n onChange={(e) => setStoryPoints(e.target.value)}\n />\n </div>\n )}\n </div>\n\n {!hidden.has(\"labels\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-labels\" className={labelClass}>\n {L.labelsLabel}\n </label>\n <input\n id=\"pm-detail-labels\"\n className={fieldClass}\n value={labels}\n onChange={(e) => setLabels(e.target.value)}\n placeholder={L.labelsPlaceholder}\n />\n </div>\n )}\n\n {saveError && (\n <p className=\"text-sm text-destructive\">\n {L.failedToSave}: {saveError.message}\n </p>\n )}\n\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"rounded-md bg-muted px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/70\"\n >\n {L.cancel}\n </button>\n <button\n type=\"submit\"\n disabled={saving || !title.trim()}\n className={cn(\n \"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground\",\n (saving || !title.trim()) && \"cursor-not-allowed opacity-50\",\n )}\n >\n {saving ? L.saving : L.save}\n </button>\n </div>\n </form>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction Field({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div>\n <dt className={labelClass}>{label}</dt>\n <dd className=\"mt-1 text-sm\">{children}</dd>\n </div>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TaskDetailCore, type TaskDetailCoreProps } from \"./TaskDetailCore\";\n\nexport interface TaskDetailProps extends TaskDetailCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required (scopes the client headers). */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TaskDetail — standalone, embeddable single work-item view with inline edit.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders TaskDetailCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * @example\n * ```tsx\n * <TaskDetail\n * workspaceClient={hostClient}\n * workspaceId=\"ws-123\"\n * id=\"wi-1\"\n * onUpdated={(wi) => console.log(wi)}\n * />\n * ```\n */\nexport function TaskDetail({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TaskDetailProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TaskDetailCore {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useCallback, useEffect, useState, type ReactNode } from \"react\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { TaskBoardCore } from \"./TaskBoardCore\";\nimport { TaskListCore } from \"./TaskListCore\";\nimport { TaskTimelineCore } from \"./TaskTimelineCore\";\nimport { TaskToolbar, type TaskView } from \"./TaskToolbar\";\nimport { CreateTaskCore, type CreateTaskField } from \"./CreateTaskCore\";\nimport { TaskDetailCore, type TaskDetailField } from \"./TaskDetailCore\";\nimport { type AssigneeOption, type ResolveAssignee } from \"./TaskCard\";\nimport { Modal, Drawer, type RenderLinkIcon } from \"../ui\";\nimport {\n TaskLabelsProvider,\n mergeTaskLabels,\n type PartialTaskLabels,\n} from \"../i18n/labels\";\nimport { cn } from \"../utils/cn\";\nimport type {\n BoardColumn,\n Task,\n TaskPriority,\n TaskType,\n WorkItemDetail,\n} from \"../types\";\n\n/**\n * Which SDK fields the composed page should suppress. The union of the create\n * form fields and the detail fields — the page fans a single `hiddenFields`\n * prop out to the board, create form, and detail view so hosts configure the\n * whole experience in one place.\n */\nexport type TasksPageField = CreateTaskField | TaskDetailField;\n\n/** Payload passed to `onTaskSaved` when a create/update completes. */\nexport interface TasksPageSaved {\n workItem: WorkItemDetail;\n operation: \"created\" | \"updated\";\n}\n\nexport interface TasksPageCoreProps {\n /**\n * Explicit workspace ID. Falls back to the PlanMagnetProvider context. At\n * least one must be present or the board query is skipped.\n */\n workspaceId?: string;\n /**\n * Project the \"New task\" flow creates work items in. REQUIRED for create —\n * the backend `PlanmagnetCreateWorkItemInput.projectId` is non-null. When\n * omitted the board still renders read-only-ish (create is disabled).\n */\n projectId?: string;\n /** Scope the views to a single project (client-side filter). */\n boardProjectId?: string;\n /** Board columns to render (defaults to DEFAULT_BOARD_COLUMNS). */\n columns?: BoardColumn[];\n /** Read-only — hides the \"New task\" button, disables drag + detail editing. */\n readonly?: boolean;\n /**\n * Field names to hide across the board cards, create form, and detail view.\n * A product-agnostic hook so hosts can suppress fields that don't apply.\n */\n hiddenFields?: TasksPageField[];\n /** Which views to offer (order preserved). Defaults to all three. */\n views?: TaskView[];\n /** Initial view. Defaults to \"board\". */\n defaultView?: TaskView;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /**\n * When set, the board + list fetch WorkItemLinks for this `sourceProduct`\n * (e.g. \"healthybowl\") and render linked-record chips / a \"Linked Record\"\n * column. Omitted → no link fetch (SDK stays farm-free).\n */\n linkSourceProduct?: string;\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n /** Optional host-provided member directory → renders assignee pickers in create/edit. */\n assigneeOptions?: AssigneeOption[];\n /**\n * The current user's actor id. When provided, the toolbar shows a \"My tasks\"\n * toggle that filters every view to items assigned to this actor.\n */\n currentActorId?: string;\n /** Host-provided translations for every UI string (English defaults otherwise). */\n labels?: PartialTaskLabels;\n /**\n * Open a specific work item's detail on mount / when this changes — e.g. a\n * deep-link from the calendar (`/tasks?item=<id>`). Cleared internally when\n * the user closes the drawer; pass a new value to re-open.\n */\n openItemId?: string;\n /**\n * Header/title slot rendered ABOVE the toolbar. Pass a string for the default\n * heading, or any node to fully own the title area. Omit for no title (e.g.\n * when the host shell already renders the page title).\n */\n header?: ReactNode;\n /** Called after a successful create OR update (board is refetched first). */\n onTaskSaved?: (saved: TasksPageSaved) => void;\n /** How the create form is surfaced. Defaults to \"modal\". */\n createSurface?: \"modal\" | \"inline\";\n /** How the detail view is surfaced. Defaults to \"drawer\". */\n detailSurface?: \"drawer\" | \"inline\";\n /** Extra classes on the root container. */\n className?: string;\n}\n\n/**\n * TasksPageCore — a complete, provider-less, BYO-Apollo Tasks experience in a\n * single mount. A Linear-style shell: one toolbar (Board / List / Timeline tabs\n * + search + priority/type filters + \"New task\"), the selected view, a create\n * modal, and a click-to-open detail drawer.\n *\n * BYO-Apollo: reads the ambient `<ApolloProvider>` and takes `workspaceId` from\n * a prop or the PlanMagnetProvider context. Semantic tokens only, farm-free.\n */\nexport function TasksPageCore({\n workspaceId: workspaceIdProp,\n projectId,\n boardProjectId,\n columns,\n readonly,\n hiddenFields,\n views,\n defaultView = \"board\",\n resolveAssignee,\n linkSourceProduct,\n renderLinkIcon,\n assigneeOptions,\n currentActorId,\n labels,\n openItemId,\n header,\n onTaskSaved,\n createSurface = \"modal\",\n detailSurface = \"drawer\",\n className,\n}: TasksPageCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const client = useApolloClient();\n const mergedLabels = mergeTaskLabels(labels);\n\n const [view, setView] = useState<TaskView>(defaultView);\n const [search, setSearch] = useState(\"\");\n const [priority, setPriority] = useState<TaskPriority | \"ALL\">(\"ALL\");\n const [type, setType] = useState<TaskType | \"ALL\">(\"ALL\");\n // \"My tasks\" quick-filter — only offered when the host passes currentActorId.\n const [mine, setMine] = useState(false);\n\n const [creating, setCreating] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n // Deep-link support: open a specific work item's detail when the host passes\n // an `openItemId` (e.g. a calendar → task click). Re-fires whenever it\n // changes so navigating between two task deep-links re-opens the drawer.\n useEffect(() => {\n if (openItemId) setSelectedId(openItemId);\n }, [openItemId]);\n\n // Refetch the views' list query after a create/update so they reflect the\n // change without remounting (preserves local filter/sort state).\n const refetchBoard = useCallback(() => {\n void client.refetchQueries({ include: [LIST_WORK_ITEMS] }).catch(() => {});\n }, [client]);\n\n const handleCreated = useCallback(\n (workItem: WorkItemDetail) => {\n refetchBoard();\n setCreating(false);\n onTaskSaved?.({ workItem, operation: \"created\" });\n },\n [refetchBoard, onTaskSaved],\n );\n\n const handleUpdated = useCallback(\n (workItem: WorkItemDetail) => {\n refetchBoard();\n onTaskSaved?.({ workItem, operation: \"updated\" });\n },\n [refetchBoard, onTaskSaved],\n );\n\n const handleDeleted = useCallback(() => {\n // The detail component already evicted + refetched the list; just close.\n setSelectedId(null);\n }, []);\n\n const handleTaskClick = useCallback((task: Task) => {\n setSelectedId(task.id);\n }, []);\n const handleSelect = useCallback((id: string) => setSelectedId(id), []);\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TasksPage: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n const canCreate = !readonly && Boolean(projectId);\n const showInlineCreate = creating && createSurface === \"inline\";\n const showInlineDetail = selectedId != null && detailSurface === \"inline\";\n\n const createForm = (\n <CreateTaskCore\n workspaceId={workspaceId}\n projectId={projectId}\n assigneeOptions={assigneeOptions}\n hiddenFields={hiddenFields}\n onCreated={handleCreated}\n onCancel={() => setCreating(false)}\n />\n );\n\n const detailView =\n selectedId != null ? (\n <TaskDetailCore\n id={selectedId}\n readonly={readonly}\n hiddenFields={hiddenFields}\n resolveAssignee={resolveAssignee}\n assigneeOptions={assigneeOptions}\n onUpdated={handleUpdated}\n onDeleted={handleDeleted}\n />\n ) : null;\n\n // Server-side filter for the list view maps \"ALL\" → undefined.\n const listPriority = priority === \"ALL\" ? undefined : priority;\n const listType = type === \"ALL\" ? undefined : type;\n // \"My tasks\" → filter every view to the current actor's assignments.\n const mineAssignee = mine && currentActorId ? currentActorId : undefined;\n // Show the \"Linked Record\" column only when the host opts into link fetching;\n // otherwise fall back to the list's default column set.\n const listColumns = linkSourceProduct\n ? ([\n \"title\",\n \"status\",\n \"priority\",\n \"assignee\",\n \"dueDate\",\n \"linkedRecord\",\n ] as const)\n : undefined;\n\n return (\n <TaskLabelsProvider value={mergedLabels}>\n <div className={cn(\"space-y-4 p-6\", className)}>\n {header && (\n <div className=\"min-w-0\">\n {typeof header === \"string\" ? (\n <h1 className=\"truncate text-2xl font-semibold text-foreground\">\n {header}\n </h1>\n ) : (\n header\n )}\n </div>\n )}\n\n <TaskToolbar\n view={view}\n onViewChange={setView}\n views={views}\n search={search}\n onSearchChange={setSearch}\n priority={priority}\n onPriorityChange={setPriority}\n type={type}\n onTypeChange={setType}\n onNewTask={() => setCreating(true)}\n canCreate={canCreate}\n mine={mine}\n onMineChange={currentActorId ? setMine : undefined}\n />\n\n {showInlineCreate && <div>{createForm}</div>}\n\n {view === \"board\" && (\n <TaskBoardCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n columns={columns}\n readonly={readonly}\n hideHeader\n priority={priority}\n type={type}\n search={search}\n assigneeId={mineAssignee}\n hiddenFields={hiddenFields}\n resolveAssignee={resolveAssignee}\n linkSourceProduct={linkSourceProduct}\n renderLinkIcon={renderLinkIcon}\n onTaskClick={handleTaskClick}\n />\n )}\n\n {view === \"list\" && (\n <TaskListCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n priority={listPriority}\n type={listType}\n search={search || undefined}\n assigneeId={mineAssignee}\n hideHeader\n resolveAssignee={resolveAssignee}\n linkSourceProduct={linkSourceProduct}\n renderLinkIcon={renderLinkIcon}\n columns={listColumns ? [...listColumns] : undefined}\n onSelect={handleSelect}\n />\n )}\n\n {view === \"timeline\" && (\n <TaskTimelineCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n priority={priority}\n type={type}\n search={search}\n assigneeId={mineAssignee}\n resolveAssignee={resolveAssignee}\n onSelect={handleSelect}\n />\n )}\n\n {showInlineDetail && <div className=\"pb-6\">{detailView}</div>}\n\n {createSurface === \"modal\" && (\n <Modal\n open={creating}\n onClose={() => setCreating(false)}\n ariaLabel=\"Create task\"\n className=\"max-w-xl\"\n >\n <div className=\"p-2 pt-8\">{createForm}</div>\n </Modal>\n )}\n\n {detailSurface === \"drawer\" && (\n <Drawer\n open={selectedId != null}\n onClose={() => setSelectedId(null)}\n ariaLabel=\"Task detail\"\n >\n <div className=\"p-2 pt-8\">{detailView}</div>\n </Drawer>\n )}\n </div>\n </TaskLabelsProvider>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TasksPageCore, type TasksPageCoreProps } from \"./TasksPageCore\";\n\nexport interface TasksPageProps extends TasksPageCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TasksPage — standalone, embeddable, composed Tasks experience.\n *\n * The Phase-3 embed target: a single mount that gives a host app a complete\n * Tasks page (kanban board + \"New task\" create flow + click-to-open detail with\n * inline edit). Thin wrapper that self-provisions (or accepts) an Apollo client\n * via PlanMagnetProvider, then renders TasksPageCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * Two mount modes:\n * - URL mode: <TasksPage apiGatewayUrl={..} authToken={..} workspaceId={..} projectId={..} />\n * - BYO mode: <TasksPage workspaceClient={hostClient} workspaceId={..} projectId={..} />\n *\n * @example BYO client (HealthyBowl shell injects its authed client)\n * ```tsx\n * <TasksPage\n * workspaceClient={hostClient}\n * workspaceId=\"ws-123\"\n * projectId=\"proj-1\"\n * header=\"Farm Tasks\"\n * onTaskSaved={({ workItem, operation }) => console.log(operation, workItem)}\n * />\n * ```\n */\nexport function TasksPage({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TasksPageProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TasksPageCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphql/client.ts","../src/config/index.ts","../src/components/PlanMagnetProvider.tsx","../src/graphql-ops/index.ts","../src/utils/cn.ts","../src/utils/dates.ts","../src/ui/badge.tsx","../src/ui/avatar.tsx","../src/types/index.ts","../src/ui/link-chip.tsx","../src/i18n/labels.ts","../src/ui/indicators.tsx","../src/ui/overlay.tsx","../src/components/TaskCard.tsx","../src/hooks/useWorkItemLinks.ts","../src/components/TaskBoardCore.tsx","../src/components/TaskBoard.tsx","../src/components/CreateTaskCore.tsx","../src/components/CreateTask.tsx","../src/components/TaskListCore.tsx","../src/components/TaskList.tsx","../src/hooks/useMilestones.ts","../src/components/TaskTimelineCore.tsx","../src/components/TaskToolbar.tsx","../src/components/TaskDetailCore.tsx","../src/components/TaskDetail.tsx","../src/components/TasksPageCore.tsx","../src/components/TasksPage.tsx"],"names":["config","jsx","createContext","useContext","jsxs","useEffect","useMemo","useQuery","from","onError","useState","useMutation","format","a","s","e","isToday","ListIcon","User","fieldClass","labelClass","useApolloClient","Card","CardContent","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import {\n ApolloClient,\n InMemoryCache,\n createHttpLink,\n from,\n} from \"@apollo/client/core\";\nimport { setContext } from \"@apollo/client/link/context\";\nimport { onError } from \"@apollo/client/link/error\";\nimport { CombinedGraphQLErrors } from \"@apollo/client/errors\";\n\nexport interface PlanMagnetClientConfig {\n /** Workspace API gateway base URL (e.g. https://graphqlworkspaces.burdenoff.com). */\n apiGatewayUrl: string;\n /** Platform identity token → `Authorization: Bearer <authToken>`. */\n authToken?: string;\n /** Workspace access token → `X-Workspace-Authorization: Bearer <workspaceToken>`. */\n workspaceToken?: string;\n /** Workspace ID → `x-workspace-id`. Required for task queries. */\n workspaceId: string;\n /** Tenant ID → `x-tenant-id` (optional). */\n tenantId?: string;\n /**\n * Optional callback invoked when the gateway returns UNAUTHENTICATED / FORBIDDEN\n * (or a network-level 401/403). Host shells use this to trigger re-auth / logout.\n */\n onAuthError?: () => void;\n}\n\n// Module-level client reference (for SDK-managed mode / wrapper injection).\nlet clientInstance: ApolloClient | null = null;\n\n/**\n * Build the InMemoryCache with PlanMagnet task/project type policies.\n * `merge:false` on the list roots avoids Apollo warning about paginated merges,\n * and keyFields keep WorkItem / Project normalized by id.\n */\nfunction buildCache(): InMemoryCache {\n return new InMemoryCache({\n typePolicies: {\n Query: {\n fields: {\n planmagnetWorkItems: { merge: false },\n planmagnetProjects: { merge: false },\n planmagnetWorkItemLinks: { merge: false },\n },\n },\n WorkItem: { keyFields: [\"id\"] },\n PlanmagnetProject: { keyFields: [\"id\"] },\n Project: { keyFields: [\"id\"] },\n WorkItemLink: { keyFields: [\"id\"] },\n },\n });\n}\n\n/**\n * Create a new Apollo client for the PlanMagnet SDK.\n *\n * HTTP-only (no subscriptions) — tasks are read/write over queries + mutations.\n * Injects the dual-token workspace headers on every request.\n */\nexport function createPlanMagnetClient(\n config: PlanMagnetClientConfig,\n): ApolloClient {\n const graphqlUrl = getGraphQLUrl(config.apiGatewayUrl);\n\n const httpLink = createHttpLink({ uri: graphqlUrl });\n\n const authLink = setContext((_, { headers }) => ({\n headers: {\n ...headers,\n ...(config.authToken && {\n authorization: `Bearer ${config.authToken}`,\n }),\n ...(config.workspaceToken && {\n \"x-workspace-authorization\": `Bearer ${config.workspaceToken}`,\n }),\n \"x-workspace-id\": config.workspaceId,\n ...(config.tenantId && { \"x-tenant-id\": config.tenantId }),\n },\n }));\n\n const errorLink = onError(({ error }) => {\n if (!config.onAuthError) return;\n if (CombinedGraphQLErrors.is(error)) {\n for (const graphQLError of error.errors) {\n const code = graphQLError.extensions?.code;\n if (code === \"UNAUTHENTICATED\" || code === \"FORBIDDEN\") {\n config.onAuthError();\n return;\n }\n }\n } else if (error) {\n const msg = error.message ?? \"\";\n if (\n msg.includes(\"401\") ||\n msg.includes(\"403\") ||\n msg.includes(\"Unauthorized\")\n ) {\n config.onAuthError();\n }\n }\n });\n\n // NOTE: `errorPolicy` is intentionally NOT set in defaultOptions. Apollo\n // Client v4 requires default errorPolicy to be declared via the\n // `DeclareDefaultOptions` module augmentation for type safety; setting it here\n // fails the .d.ts build. Auth errors are handled by `errorLink`, and callers\n // that need `errorPolicy: 'all'` can pass it per-operation.\n return new ApolloClient({\n link: from([errorLink, authLink, httpLink]),\n cache: buildCache(),\n defaultOptions: {\n watchQuery: { fetchPolicy: \"cache-and-network\" },\n query: { fetchPolicy: \"network-only\" },\n },\n });\n}\n\n/**\n * Resolve the GraphQL URL from the API gateway base URL.\n * Appends `/workspaces/graphql` unless the URL already ends with `/graphql`.\n */\nfunction getGraphQLUrl(apiGatewayUrl: string): string {\n const normalizedBase = apiGatewayUrl.endsWith(\"/\")\n ? apiGatewayUrl.slice(0, -1)\n : apiGatewayUrl;\n if (normalizedBase.endsWith(\"/graphql\")) {\n return normalizedBase;\n }\n return `${normalizedBase}/workspaces/graphql`;\n}\n\n/**\n * Set the module-level client (SDK-managed mode or wrapper injection).\n */\nexport function setPlanMagnetClient(client: ApolloClient): void {\n clientInstance = client;\n}\n\n/**\n * Get the module-level client.\n * @throws if the client is not initialized.\n */\nexport function getPlanMagnetClient(): ApolloClient {\n if (!clientInstance) {\n throw new Error(\n \"PlanMagnet client not initialized. Use PlanMagnetProvider or call setPlanMagnetClient().\",\n );\n }\n return clientInstance;\n}\n\n/**\n * Get the client if available, or null if not initialized.\n */\nexport function getPlanMagnetClientSafe(): ApolloClient | null {\n return clientInstance;\n}\n\n/**\n * Whether the module-level client is ready.\n */\nexport function isPlanMagnetClientReady(): boolean {\n return clientInstance !== null;\n}\n\n/**\n * Poll until the module-level client is initialized (or timeout).\n */\nexport function waitForPlanMagnetClient(\n timeoutMs = 10000,\n intervalMs = 100,\n): Promise<ApolloClient | null> {\n return new Promise((resolve) => {\n if (clientInstance) {\n resolve(clientInstance);\n return;\n }\n const start = Date.now();\n const timer = setInterval(() => {\n if (clientInstance) {\n clearInterval(timer);\n resolve(clientInstance);\n } else if (Date.now() - start >= timeoutMs) {\n clearInterval(timer);\n resolve(null);\n }\n }, intervalMs);\n });\n}\n\n/**\n * Reset the client reference (cleanup on unmount).\n */\nexport function resetPlanMagnetClient(): void {\n clientInstance = null;\n}\n","/**\n * Configuration module for the PlanMagnet SDK.\n */\n\n/** Result passed to the onTaskSaved callback after a successful create/update. */\nexport interface TaskSavedResult {\n /** Work-item row ID. */\n id: string;\n /** Human-readable work-item key (e.g. \"PM-123\"). */\n key: string;\n /** Work-item title. */\n title: string;\n /** Project the work item belongs to. */\n projectId: string;\n /** What kind of save operation occurred. */\n operation: \"created\" | \"updated\";\n}\n\nexport interface PlanMagnetConfig {\n /** GraphQL endpoint URL (workspace gateway). */\n apiGatewayUrl: string;\n /** Auth token for API calls. */\n authToken?: string;\n /** Current workspace ID. */\n workspaceId: string;\n /** Current tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional allowlist for host origins embedding the SDK. */\n trustedOrigins?: string[];\n /** Product ID for host-app isolation (e.g. 'healthybowl', 'workspaces'). */\n productId?: string;\n /** Product name for display purposes. */\n productName?: string;\n /**\n * Callback invoked after a work item is successfully created/updated.\n * Host apps (e.g. HealthyBowl) can use this to sync metadata to their own\n * backends. Errors thrown here are caught and logged — they never block the save.\n */\n onTaskSaved?: (result: TaskSavedResult) => void | Promise<void>;\n}\n\n// Default configuration.\nlet runtimeConfig: PlanMagnetConfig = {\n apiGatewayUrl: \"\",\n workspaceId: \"\",\n};\n\n/**\n * Live-access proxy to the current configuration.\n */\nexport const config = new Proxy({} as PlanMagnetConfig, {\n get(_, prop: keyof PlanMagnetConfig) {\n return runtimeConfig[prop];\n },\n});\n\n/**\n * Get the full configuration object (a copy).\n */\nexport function getPlanMagnetConfig(): PlanMagnetConfig {\n return { ...runtimeConfig };\n}\n\n/**\n * Merge in runtime configuration.\n */\nexport function setPlanMagnetConfig(\n newConfig: Partial<PlanMagnetConfig>,\n): void {\n runtimeConfig = { ...runtimeConfig, ...newConfig };\n}\n\n/**\n * Reset configuration to defaults.\n */\nexport function resetPlanMagnetConfig(): void {\n runtimeConfig = {\n apiGatewayUrl: \"\",\n workspaceId: \"\",\n };\n}\n\nfunction normalizeOrigin(origin: string): string {\n return origin.replace(/\\/$/, \"\");\n}\n\n/**\n * Enforce an optional host-origin allowlist for embedded deployments.\n * @throws if the current window origin is not in the allowlist.\n */\nexport function validateTrustedOrigin(trustedOrigins?: string[]): void {\n if (typeof window === \"undefined\" || !trustedOrigins?.length) {\n return;\n }\n\n const currentOrigin = normalizeOrigin(window.location.origin);\n const allowedOrigins = trustedOrigins.map(normalizeOrigin);\n\n if (!allowedOrigins.includes(currentOrigin)) {\n throw new Error(\n `PlanMagnet SDK blocked untrusted origin: ${currentOrigin}`,\n );\n }\n}\n\n/**\n * Resolve the GraphQL endpoint URL.\n */\nexport function getGraphQLEndpoint(baseUrl?: string): string {\n const url = baseUrl || runtimeConfig.apiGatewayUrl;\n if (!url) {\n throw new Error(\"PlanMagnet SDK requires apiGatewayUrl to be configured\");\n }\n const normalizedBase = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n if (normalizedBase.endsWith(\"/graphql\")) {\n return normalizedBase;\n }\n return `${normalizedBase}/workspaces/graphql`;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { ApolloProvider } from \"@apollo/client/react\";\nimport { type ApolloClient } from \"@apollo/client/core\";\nimport {\n createPlanMagnetClient,\n setPlanMagnetClient,\n resetPlanMagnetClient,\n} from \"../graphql/client\";\nimport {\n setPlanMagnetConfig,\n resetPlanMagnetConfig,\n validateTrustedOrigin,\n} from \"../config\";\n\nexport interface PlanMagnetProviderProps {\n /** Workspace API gateway URL. Required unless a client is injected. */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN so the host can trigger re-auth. */\n onAuthError?: () => void;\n /**\n * BYO: host shell injects its already-authed workspace Apollo client\n * (e.g. microfe / HealthyBowl shell). Takes priority over apiGatewayUrl.\n */\n workspaceClient?: ApolloClient;\n /** @deprecated Use workspaceClient instead. */\n apolloClient?: ApolloClient;\n children: ReactNode;\n}\n\ninterface PlanMagnetContextValue {\n apiGatewayUrl?: string;\n authToken?: string;\n workspaceId: string;\n tenantId?: string;\n organizationId?: string;\n trustedOrigins?: string[];\n workspaceClient: ApolloClient;\n}\n\nconst PlanMagnetContext = createContext<PlanMagnetContextValue | null>(null);\n\n/**\n * PlanMagnetProvider — mirrors the FluidGrids client-injection model.\n *\n * Resolution priority for the workspace Apollo client:\n * 1. `workspaceClient` (host-injected)\n * 2. `apolloClient` (legacy alias)\n * 3. `createPlanMagnetClient({ apiGatewayUrl, ... })`\n * Throws if none of the above is available.\n *\n * Unlike the microfe provider, this ALWAYS mounts its own `<ApolloProvider>`\n * (with the injected-or-built client) so an embedded TaskBoard renders inside\n * any host page — no reliance on an ambient ApolloProvider.\n */\nexport function PlanMagnetProvider({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient: externalWorkspaceClient,\n apolloClient: legacyClient,\n children,\n}: PlanMagnetProviderProps) {\n validateTrustedOrigin(trustedOrigins);\n\n const workspaceClient = useMemo<ApolloClient>(() => {\n if (externalWorkspaceClient) return externalWorkspaceClient;\n if (legacyClient) return legacyClient;\n if (apiGatewayUrl) {\n return createPlanMagnetClient({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n onAuthError,\n });\n }\n throw new Error(\n \"PlanMagnetProvider: Either provide workspaceClient or apiGatewayUrl\",\n );\n }, [\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n onAuthError,\n externalWorkspaceClient,\n legacyClient,\n ]);\n\n // Publish the client to the module singleton so non-hook code / hooks that\n // call getPlanMagnetClient() can reach it without prop drilling.\n useEffect(() => {\n setPlanMagnetClient(workspaceClient);\n return () => {\n resetPlanMagnetClient();\n };\n }, [workspaceClient]);\n\n // Publish runtime config.\n useEffect(() => {\n setPlanMagnetConfig({\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n });\n return () => {\n resetPlanMagnetConfig();\n };\n }, [\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n ]);\n\n const contextValue = useMemo<PlanMagnetContextValue>(\n () => ({\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n workspaceClient,\n }),\n [\n apiGatewayUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n workspaceClient,\n ],\n );\n\n return (\n <PlanMagnetContext.Provider value={contextValue}>\n <ApolloProvider client={workspaceClient}>{children}</ApolloProvider>\n </PlanMagnetContext.Provider>\n );\n}\n\nexport function usePlanMagnetContext() {\n const context = useContext(PlanMagnetContext);\n if (!context) {\n throw new Error(\n \"usePlanMagnetContext must be used within PlanMagnetProvider\",\n );\n }\n return context;\n}\n\n/**\n * Safe variant — returns null instead of throwing when used outside a provider.\n * TaskBoardCore uses this so a `workspaceId` prop can substitute for context.\n */\nexport function usePlanMagnetContextSafe(): PlanMagnetContextValue | null {\n return useContext(PlanMagnetContext);\n}\n","import { gql } from \"@apollo/client\";\n\n/**\n * PlanMagnet task GraphQL operation documents.\n *\n * Hand-written `gql` documents bundled with the SDK. They target the composed\n * gateway supergraph, whose root fields AND input types are Planmagnet-prefixed\n * (see wspace-planmagnet-svc/.hive-schema.graphql — the source of truth). A GraphQL\n * operation's variable *type definitions* are part of the query document and are\n * validated by the gateway, so the input type names MUST match the schema exactly\n * (`PlanmagnetCreateWorkItemInput`, `PlanmagnetWorkItemFilter`,\n * `PlanmagnetPaginationInput`, …). Un-prefixed names pass Apollo MockedProvider\n * but FAIL live gateway validation (\"Unknown type …\").\n *\n * Phase 3: replace with codegen output after `bun run schema:pull && bun run codegen`.\n */\n\n// ---------------------------------------------------------------------------\n// Fragments\n// ---------------------------------------------------------------------------\n\nexport const WORK_ITEM_SUMMARY_FIELDS = gql`\n fragment WorkItemSummaryFields on WorkItem {\n id\n key\n title\n type\n status\n priority\n assigneeId\n sprintId\n storyPoints\n dueDate\n labels\n }\n`;\n\nexport const WORK_ITEM_FIELDS = gql`\n fragment WorkItemFields on WorkItem {\n id\n workspaceId\n projectId\n key\n title\n description\n type\n status\n priority\n assigneeId\n reporterId\n parentId\n sprintId\n storyPoints\n estimateMinutes\n timeSpentMinutes\n dueDate\n labels\n tags\n sortOrder\n metadata\n createdBy\n createdAt\n updatedAt\n updatedBy\n deletedAt\n }\n`;\n\nexport const PROJECT_SUMMARY_FIELDS = gql`\n fragment ProjectSummaryFields on Project {\n id\n name\n key\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport const LIST_WORK_ITEMS = gql`\n query ListWorkItems(\n $workspaceId: ID!\n $filter: PlanmagnetWorkItemFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetWorkItems(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...WorkItemSummaryFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${WORK_ITEM_SUMMARY_FIELDS}\n`;\n\nexport const GET_WORK_ITEM = gql`\n query GetWorkItem($id: ID!) {\n planmagnetWorkItem(id: $id) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\nexport const GET_PROJECTS = gql`\n query GetProjects(\n $workspaceId: ID!\n $filter: PlanmagnetProjectFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetProjects(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...ProjectSummaryFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${PROJECT_SUMMARY_FIELDS}\n`;\n\n// ---------------------------------------------------------------------------\n// Mutations (Phase 2 wires these into a CreateTask form / drag-move handler)\n// ---------------------------------------------------------------------------\n\nexport const CREATE_WORK_ITEM = gql`\n mutation CreateWorkItem($input: PlanmagnetCreateWorkItemInput!) {\n planmagnetCreateWorkItem(input: $input) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\nexport const UPDATE_WORK_ITEM = gql`\n mutation UpdateWorkItem($id: ID!, $input: PlanmagnetUpdateWorkItemInput!) {\n planmagnetUpdateWorkItem(id: $id, input: $input) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\nexport const MOVE_WORK_ITEM = gql`\n mutation MoveWorkItem($id: ID!, $input: PlanmagnetMoveWorkItemInput!) {\n planmagnetMoveWorkItem(id: $id, input: $input) {\n ...WorkItemFields\n }\n }\n ${WORK_ITEM_FIELDS}\n`;\n\n// ---------------------------------------------------------------------------\n// WorkItemLink — the product-agnostic link between a WorkItem and an external\n// entity owned by another product (HealthyBowl uses it to pin a task to a\n// Field/Crop/Animal/Pest record). The OUTPUT type is the bare `WorkItemLink`;\n// only the root fields and INPUT types are Planmagnet-prefixed. WorkItem has no\n// `links` field, so links are fetched via this standalone query and joined to\n// work items client-side by workItemId.\n// ---------------------------------------------------------------------------\n\nexport const WORK_ITEM_LINK_FIELDS = gql`\n fragment WorkItemLinkFields on WorkItemLink {\n id\n workspaceId\n workItemId\n sourceProduct\n entityType\n entityId\n relationType\n displayNameSnapshot\n deepLinkSnapshot\n metadata\n createdBy\n onBehalfOf\n createdAt\n updatedAt\n }\n`;\n\nexport const LIST_WORK_ITEM_LINKS = gql`\n query ListWorkItemLinks(\n $workspaceId: ID!\n $filter: PlanmagnetWorkItemLinkFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetWorkItemLinks(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...WorkItemLinkFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${WORK_ITEM_LINK_FIELDS}\n`;\n\nexport const CREATE_WORK_ITEM_LINK = gql`\n mutation CreateWorkItemLink($input: PlanmagnetCreateWorkItemLinkInput!) {\n planmagnetLinkWorkItem(input: $input) {\n ...WorkItemLinkFields\n }\n }\n ${WORK_ITEM_LINK_FIELDS}\n`;\n\n// planmagnetUnlinkWorkItem returns a raw Boolean! — NO selection set.\nexport const DELETE_WORK_ITEM_LINK = gql`\n mutation UnlinkWorkItem($id: ID!) {\n planmagnetUnlinkWorkItem(id: $id)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Milestones — used by the Timeline to render milestone flags (e.g. a harvest\n// window). NOTE: Milestone.sortOrder is SDL Int! but maps a Prisma `position`\n// column (same class as the WorkItem.sortOrder serialization bug) — so it is\n// deliberately NOT selected here; the same goes for the non-null tagsV2 JSON we\n// don't need. Only safe, mapped fields are selected.\n// ---------------------------------------------------------------------------\n\nexport const MILESTONE_FIELDS = gql`\n fragment MilestoneFields on Milestone {\n id\n projectId\n name\n description\n status\n dueDate\n completedAt\n ownerId\n createdAt\n updatedAt\n }\n`;\n\nexport const LIST_MILESTONES = gql`\n query ListMilestones(\n $workspaceId: ID!\n $filter: PlanmagnetMilestoneFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetMilestones(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ...MilestoneFields\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n totalCount\n }\n totalCount\n }\n }\n ${MILESTONE_FIELDS}\n`;\n\n// ---------------------------------------------------------------------------\n// Task delete — planmagnetDeleteWorkItem returns a raw Boolean! (no selection).\n// ---------------------------------------------------------------------------\nexport const DELETE_WORK_ITEM = gql`\n mutation DeleteWorkItem($id: ID!) {\n planmagnetDeleteWorkItem(id: $id)\n }\n`;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { format, isToday, isValid, parseISO, startOfDay } from \"date-fns\";\nimport type { TaskStatus } from \"../types\";\n\n/** Statuses that are \"closed\" — an overdue date on these is not a warning. */\nconst CLOSED_STATUSES: ReadonlySet<TaskStatus> = new Set([\"DONE\", \"CANCELLED\"]);\n\n/** Parse an ISO date/date-time string; returns null if unparseable. */\nexport function parseDate(iso: string | null | undefined): Date | null {\n if (!iso) return null;\n const d = parseISO(iso);\n return isValid(d) ? d : null;\n}\n\n/**\n * Coerce an `<input type=\"date\">` value (\"YYYY-MM-DD\") to a full ISO timestamp\n * for the backend. The GraphQL `DateTime` scalar REJECTS a bare date, so sending\n * \"2026-07-06\" fails as a masked INTERNAL_SERVER_ERROR — it must be a full ISO\n * string. A date-only value is anchored to UTC midnight so the calendar day is\n * preserved (no timezone shift); already-ISO values pass through. Returns\n * `undefined` for empty/invalid input so callers can omit the field.\n */\nexport function toIsoDate(\n value: string | null | undefined,\n): string | undefined {\n if (!value) return undefined;\n const iso = /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n ? `${value}T00:00:00.000Z`\n : value;\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? undefined : d.toISOString();\n}\n\n/**\n * Short, human due-date label: \"Jul 20\" within the current year, \"Jul 20 2027\"\n * otherwise. Returns null for missing/invalid dates so callers can render a dash.\n */\nexport function formatDueDate(iso: string | null | undefined): string | null {\n const d = parseDate(iso);\n if (!d) return null;\n const now = new Date();\n return format(\n d,\n d.getFullYear() === now.getFullYear() ? \"MMM d\" : \"MMM d yyyy\",\n );\n}\n\n/** True when the due date is before today and the item is not closed. */\nexport function isOverdue(\n iso: string | null | undefined,\n status?: TaskStatus,\n): boolean {\n const d = parseDate(iso);\n if (!d) return false;\n if (status && CLOSED_STATUSES.has(status)) return false;\n return startOfDay(d).getTime() < startOfDay(new Date()).getTime();\n}\n\n/** True when the due date is today. */\nexport function isDueToday(iso: string | null | undefined): boolean {\n const d = parseDate(iso);\n return d ? isToday(d) : false;\n}\n","import { type HTMLAttributes } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../utils/cn\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize transition-colors\",\n {\n variants: {\n variant: {\n default: \"bg-primary/10 text-primary\",\n muted: \"bg-muted text-muted-foreground\",\n secondary: \"bg-secondary text-secondary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n destructive: \"bg-destructive/15 text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\n/**\n * Badge — a small owned pill primitive used for task status/priority/type.\n * Semantic-token only.\n */\nexport function Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { badgeVariants };\n","import { User } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\n\n/**\n * Avatar — a small identity chip for a task assignee.\n *\n * The board query only returns an `assigneeId` (an actor UUID) — there is no\n * user directory in the SDK, and inventing names/photos would be theater. So\n * the avatar renders deterministic initials in a token-tinted circle, and hosts\n * that DO have a directory can pass a resolved `name` for real initials/tooltip.\n * With no assignee it renders a dashed \"unassigned\" circle.\n *\n * Tints come from the semantic-token palette only (never raw colors); the tint\n * is chosen deterministically from the id so the same actor is always the same\n * color across cards.\n */\n\nconst TINTS = [\n \"bg-primary/15 text-primary\",\n \"bg-secondary text-secondary-foreground\",\n \"bg-accent text-accent-foreground\",\n \"bg-muted text-muted-foreground\",\n \"bg-destructive/15 text-destructive\",\n] as const;\n\nconst SIZES = {\n sm: \"h-5 w-5 text-[9px]\",\n md: \"h-6 w-6 text-[10px]\",\n lg: \"h-8 w-8 text-xs\",\n} as const;\n\n/** Stable index into TINTS from an arbitrary seed string. */\nfunction tintIndex(seed: string): number {\n let h = 0;\n for (let i = 0; i < seed.length; i++) {\n h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n }\n return h % TINTS.length;\n}\n\n/** Two-letter initials from a display name, else the id, else \"?\". */\nfunction initials(\n name: string | null | undefined,\n id: string | null | undefined,\n): string {\n const source = (name ?? \"\").trim();\n if (source) {\n const parts = source.split(/\\s+/);\n const first = parts[0]?.[0] ?? \"\";\n const second = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? \"\") : \"\";\n return (first + second).toUpperCase() || \"?\";\n }\n const raw = (id ?? \"\").replace(/[^a-zA-Z0-9]/g, \"\");\n return raw.slice(0, 2).toUpperCase() || \"?\";\n}\n\nexport interface AvatarProps {\n /** Assignee actor id (used for the deterministic tint + fallback initials). */\n id?: string | null;\n /** Resolved display name, if the host has a directory. */\n name?: string | null;\n size?: keyof typeof SIZES;\n className?: string;\n}\n\nexport function Avatar({ id, name, size = \"md\", className }: AvatarProps) {\n if (!id && !name) {\n return (\n <span\n className={cn(\n \"inline-flex items-center justify-center rounded-full border border-dashed border-border text-muted-foreground\",\n SIZES[size],\n className,\n )}\n title=\"Unassigned\"\n aria-label=\"Unassigned\"\n >\n <User className=\"h-1/2 w-1/2\" aria-hidden=\"true\" />\n </span>\n );\n }\n const tint = TINTS[tintIndex(name || id || \"\")];\n return (\n <span\n className={cn(\n \"inline-flex items-center justify-center rounded-full font-medium\",\n SIZES[size],\n tint,\n className,\n )}\n title={name ?? id ?? undefined}\n aria-label={name ?? id ?? undefined}\n >\n {initials(name, id)}\n </span>\n );\n}\n","/**\n * Domain types for the PlanMagnet task SDK.\n *\n * These mirror the wspace-planmagnet-svc schema (WorkItem / Project) but are\n * kept hand-written for Phase 1 so the SDK compiles without a live `schema:pull`.\n * Phase 2 should replace the hand-written slices with codegen output.\n */\n\n/** Board columns (WorkItemStatus). Logical UI order, not schema alpha order. */\nexport type TaskStatus =\n | \"BACKLOG\"\n | \"TODO\"\n | \"IN_PROGRESS\"\n | \"IN_REVIEW\"\n | \"TESTING\"\n | \"DONE\"\n | \"CANCELLED\";\n\n/** Work-item type (WorkItemType). */\nexport type TaskType = \"TASK\" | \"STORY\" | \"BUG\" | \"EPIC\" | \"SUB_TASK\";\n\n/** Work-item priority (WorkItemPriority). */\nexport type TaskPriority = \"NONE\" | \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\";\n\n/** Cross-product entity link relation (WorkItemLinkRelation). */\nexport type WorkItemLinkRelation =\n \"RELATED_TO\" | \"BLOCKS\" | \"AFFECTS\" | \"INSPECTS\" | \"PRODUCES\" | \"WORKS_ON\";\n\n/**\n * A work item as rendered on the board — the summary field set from\n * `WorkItemSummaryFields`.\n */\nexport interface Task {\n id: string;\n key: string;\n title: string;\n type: TaskType;\n status: TaskStatus;\n priority: TaskPriority;\n assigneeId?: string | null;\n sprintId?: string | null;\n storyPoints?: number | null;\n dueDate?: string | null;\n labels: string[];\n}\n\n/**\n * A work item with the full field set from `WorkItemFields` — used by the\n * detail view (view + inline edit). Superset of `Task` (the board summary).\n */\nexport interface WorkItemDetail {\n id: string;\n workspaceId: string;\n projectId: string;\n key: string;\n title: string;\n description?: string | null;\n type: TaskType;\n status: TaskStatus;\n priority: TaskPriority;\n assigneeId?: string | null;\n reporterId?: string | null;\n parentId?: string | null;\n sprintId?: string | null;\n storyPoints?: number | null;\n estimateMinutes?: number | null;\n timeSpentMinutes?: number | null;\n dueDate?: string | null;\n labels: string[];\n tags: string[];\n sortOrder?: number | null;\n metadata?: unknown;\n createdBy?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n updatedBy?: string | null;\n deletedAt?: string | null;\n}\n\n/** Project summary (for the create form's project selector / board scoping). */\nexport interface Project {\n id: string;\n name: string;\n key: string;\n status: string;\n methodology: string;\n ownerId: string;\n startDate?: string | null;\n endDate?: string | null;\n tags: string[];\n}\n\n/** Input for `planmagnetCreateWorkItem`. projectId + title + type are required. */\nexport interface CreateTaskInput {\n projectId: string;\n title: string;\n type: TaskType;\n description?: string;\n status?: TaskStatus;\n priority?: TaskPriority;\n assigneeId?: string;\n reporterId?: string;\n parentId?: string;\n sprintId?: string;\n storyPoints?: number;\n estimateMinutes?: number;\n dueDate?: string;\n labels?: string[];\n tags?: string[];\n sortOrder?: number;\n}\n\n/** Input for `planmagnetUpdateWorkItem`. */\nexport interface UpdateTaskInput {\n title?: string;\n description?: string;\n type?: TaskType;\n status?: TaskStatus;\n priority?: TaskPriority;\n assigneeId?: string;\n sprintId?: string;\n storyPoints?: number;\n dueDate?: string;\n labels?: string[];\n tags?: string[];\n sortOrder?: number;\n}\n\n/** Filter for `planmagnetWorkItems`. */\nexport interface ListTasksInput {\n assigneeId?: string;\n parentId?: string;\n priority?: TaskPriority;\n projectId?: string;\n reporterId?: string;\n search?: string;\n sprintId?: string;\n status?: TaskStatus;\n type?: TaskType;\n}\n\n/** Cursor pagination input (PlanmagnetPaginationInput / PaginationInput). */\nexport interface TaskPaginationInput {\n after?: string;\n before?: string;\n first?: number;\n last?: number;\n}\n\nexport interface TaskPageInfo {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n startCursor?: string | null;\n endCursor?: string | null;\n totalCount: number;\n}\n\n/** Shape returned by the ListWorkItems query. */\nexport interface WorkItemList {\n items: Task[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/** Shape returned by the GetProjects query. */\nexport interface ProjectList {\n items: Project[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/**\n * A link between a work item and an external entity owned by another product\n * (`WorkItemLink`). HealthyBowl pins a task to a Field/Crop/Animal/Pest record\n * via `sourceProduct: \"healthybowl\"` + `entityType`/`entityId`, snapshotting a\n * label + deep-link so a deleted record degrades gracefully. The OUTPUT type is\n * bare `WorkItemLink`; server-side all ids except `id` are `String`.\n */\nexport interface WorkItemLink {\n id: string;\n workspaceId: string;\n workItemId: string;\n sourceProduct: string;\n entityType: string;\n entityId: string;\n relationType: WorkItemLinkRelation;\n displayNameSnapshot?: string | null;\n deepLinkSnapshot?: string | null;\n metadata?: unknown;\n createdBy: string;\n onBehalfOf?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Input for `planmagnetLinkWorkItem` (PlanmagnetCreateWorkItemLinkInput).\n * Required: workItemId, sourceProduct, entityType, entityId. `relationType` is\n * optional (server defaults to RELATED_TO).\n */\nexport interface CreateWorkItemLinkInput {\n workItemId: string;\n sourceProduct: string;\n entityType: string;\n entityId: string;\n relationType?: WorkItemLinkRelation;\n displayNameSnapshot?: string;\n deepLinkSnapshot?: string;\n metadata?: unknown;\n}\n\n/** Filter for `planmagnetWorkItemLinks` (PlanmagnetWorkItemLinkFilter). */\nexport interface ListWorkItemLinksInput {\n workItemId?: string;\n sourceProduct?: string;\n entityType?: string;\n entityId?: string;\n relationType?: WorkItemLinkRelation;\n}\n\n/** Shape returned by the ListWorkItemLinks query (PlanmagnetWorkItemLinkList). */\nexport interface WorkItemLinkList {\n items: WorkItemLink[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/** Milestone status (MilestoneStatus). */\nexport type MilestoneStatus =\n \"PENDING\" | \"IN_PROGRESS\" | \"COMPLETED\" | \"MISSED\" | \"CANCELLED\";\n\n/**\n * A project milestone (e.g. a harvest window). Rendered as a flag on the\n * Timeline. `sortOrder`/`tagsV2` are intentionally omitted (see LIST_MILESTONES).\n */\nexport interface Milestone {\n id: string;\n projectId: string;\n name: string;\n description?: string | null;\n status: MilestoneStatus;\n dueDate?: string | null;\n completedAt?: string | null;\n ownerId?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/** Filter for `planmagnetMilestones` (PlanmagnetMilestoneFilter). */\nexport interface ListMilestonesInput {\n ownerId?: string;\n projectId?: string;\n search?: string;\n status?: MilestoneStatus;\n}\n\n/** Shape returned by LIST_MILESTONES (PlanmagnetMilestoneList). */\nexport interface MilestoneList {\n items: Milestone[];\n pageInfo: TaskPageInfo;\n totalCount: number;\n}\n\n/** Board column definition. */\nexport interface BoardColumn {\n status: TaskStatus;\n label: string;\n}\n\n/**\n * The default, ordered board columns. Product-agnostic — no farm semantics.\n * TESTING/CANCELLED are omitted from the default board but are valid statuses;\n * callers can override via TaskBoardCoreProps.columns.\n */\nexport const DEFAULT_BOARD_COLUMNS: BoardColumn[] = [\n { status: \"BACKLOG\", label: \"Backlog\" },\n { status: \"TODO\", label: \"To Do\" },\n { status: \"IN_PROGRESS\", label: \"In Progress\" },\n { status: \"IN_REVIEW\", label: \"In Review\" },\n { status: \"TESTING\", label: \"Testing\" },\n { status: \"DONE\", label: \"Done\" },\n];\n\n/** Priority filter options (UI order). */\nexport const TASK_PRIORITIES: TaskPriority[] = [\n \"NONE\",\n \"LOW\",\n \"MEDIUM\",\n \"HIGH\",\n \"CRITICAL\",\n];\n\n/** Type filter options (UI order). */\nexport const TASK_TYPES: TaskType[] = [\n \"TASK\",\n \"STORY\",\n \"BUG\",\n \"EPIC\",\n \"SUB_TASK\",\n];\n\n/** All work-item statuses (UI/logical order). */\nexport const TASK_STATUSES: TaskStatus[] = [\n \"BACKLOG\",\n \"TODO\",\n \"IN_PROGRESS\",\n \"IN_REVIEW\",\n \"TESTING\",\n \"DONE\",\n \"CANCELLED\",\n];\n\n/**\n * Human-readable label for an enum value: lower-cases and turns `_` into a\n * space (e.g. `IN_PROGRESS` → `in progress`, `SUB_TASK` → `sub task`). The UI\n * capitalizes visually via CSS, so this stays product-agnostic.\n */\nexport function enumLabel(value: string): string {\n return value.toLowerCase().replace(/_/g, \" \");\n}\n","import { type ReactNode } from \"react\";\nimport { Link2 } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { enumLabel, type WorkItemLink } from \"../types\";\n\n/**\n * Optional host hook to render an icon for a linked entity type (e.g. a leaf\n * for FIELD, a cow for ANIMAL). The SDK is farm-free, so it renders a generic\n * link glyph unless the host supplies one.\n */\nexport type RenderLinkIcon = (entityType: string) => ReactNode;\n\nexport interface LinkChipProps {\n link: WorkItemLink;\n renderIcon?: RenderLinkIcon;\n className?: string;\n}\n\n/**\n * LinkChip — a compact chip for a WorkItemLink (the task's linked farm record).\n * Shows the snapshotted label (falls back to the entity type), tinted with the\n * primary token so it reads as the mockup's green linked-record chip in the\n * forest theme. Deep-links via `deepLinkSnapshot` when present; the click is\n * stopped from bubbling so it doesn't also open the task.\n */\nexport function LinkChip({ link, renderIcon, className }: LinkChipProps) {\n const label = link.displayNameSnapshot || enumLabel(link.entityType);\n const icon = renderIcon?.(link.entityType) ?? (\n <Link2 className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n );\n const body = (\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1 rounded-full border border-primary/20 bg-primary/5 px-1.5 py-0.5 text-[10px] font-medium text-primary\",\n className,\n )}\n title={`${enumLabel(link.relationType)} · ${enumLabel(link.entityType)}`}\n >\n {icon}\n <span className=\"truncate\">{label}</span>\n </span>\n );\n\n if (link.deepLinkSnapshot) {\n return (\n <a\n href={link.deepLinkSnapshot}\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex max-w-full no-underline hover:brightness-95\"\n >\n {body}\n </a>\n );\n }\n return body;\n}\n","import { createContext, useContext } from \"react\";\nimport type { TaskPriority, TaskStatus, TaskType } from \"../types\";\n\n/**\n * TaskLabels — every user-facing string the SDK renders, so a host (e.g.\n * HealthyBowl, which ships 6 languages) can inject translations. English\n * defaults are used when no `labels` are provided, so the SDK works standalone.\n * The SDK stays farm-free + string-agnostic; the host owns translation.\n */\nexport interface TaskLabels {\n // Toolbar / views\n board: string;\n list: string;\n timeline: string;\n searchPlaceholder: string;\n allPriorities: string;\n allTypes: string;\n newTask: string;\n myTasks: string;\n\n // Board / list / timeline shared\n noTasks: string;\n noTasksFound: string;\n dropHere: string;\n unassigned: string;\n assigned: string;\n overdue: string; // \"{n} overdue\" — {n} is substituted\n noDueDate: string; // \"No due date ({n})\"\n milestones: string;\n today: string;\n week: string;\n month: string;\n tasksSingular: string; // \"task\"\n tasksPlural: string; // \"tasks\"\n\n // List column headers\n colTask: string;\n colStatus: string;\n colPriority: string;\n colAssignee: string;\n colDueDate: string;\n colPoints: string;\n colLinkedRecord: string;\n colType: string;\n colKey: string;\n colLabels: string;\n\n // Create / detail form\n newTaskHeading: string;\n newTaskSubtitle: string;\n title: string;\n titlePlaceholder: string;\n description: string;\n descriptionPlaceholder: string;\n typeLabel: string;\n statusLabel: string;\n priorityLabel: string;\n assigneeLabel: string;\n assigneePlaceholder: string;\n dueDateLabel: string;\n storyPointsLabel: string;\n labelsLabel: string;\n labelsPlaceholder: string;\n create: string;\n creating: string;\n cancel: string;\n edit: string;\n del: string;\n deletePrompt: string; // \"Delete?\"\n yes: string;\n no: string;\n save: string;\n saving: string;\n taskNotFound: string;\n projectRequired: string;\n\n // Status / error messages\n errorLoading: string;\n moveFailed: string;\n failedToCreate: string;\n failedToSave: string;\n failedToDelete: string;\n overdueLabel: string; // single-word \"Overdue\" (card tooltip); cf. `overdue` count\n more: string; // \"+N more\"\n\n // Enum display labels\n status: Record<TaskStatus, string>;\n priority: Record<TaskPriority, string>;\n type: Record<TaskType, string>;\n}\n\n/** English defaults — the SDK renders these when no `labels` prop is provided. */\nexport const DEFAULT_TASK_LABELS: TaskLabels = {\n board: \"Board\",\n list: \"List\",\n timeline: \"Timeline\",\n searchPlaceholder: \"Search tasks…\",\n allPriorities: \"All priorities\",\n allTypes: \"All types\",\n newTask: \"New task\",\n myTasks: \"My tasks\",\n\n noTasks: \"No tasks\",\n noTasksFound: \"No tasks found.\",\n dropHere: \"Drop here\",\n unassigned: \"Unassigned\",\n assigned: \"Assigned\",\n overdue: \"{n} overdue\",\n noDueDate: \"No due date ({n})\",\n milestones: \"Milestones\",\n today: \"Today\",\n week: \"Week\",\n month: \"Month\",\n tasksSingular: \"task\",\n tasksPlural: \"tasks\",\n\n colTask: \"Task\",\n colStatus: \"Status\",\n colPriority: \"Priority\",\n colAssignee: \"Assignee\",\n colDueDate: \"Due Date\",\n colPoints: \"Points\",\n colLinkedRecord: \"Linked Record\",\n colType: \"Type\",\n colKey: \"Key\",\n colLabels: \"Labels\",\n\n newTaskHeading: \"New task\",\n newTaskSubtitle: \"Create a work item in this workspace.\",\n title: \"Title\",\n titlePlaceholder: \"What needs doing?\",\n description: \"Description\",\n descriptionPlaceholder: \"Add more detail (optional)\",\n typeLabel: \"Type\",\n statusLabel: \"Status\",\n priorityLabel: \"Priority\",\n assigneeLabel: \"Assignee\",\n assigneePlaceholder: \"Actor ID (optional)\",\n dueDateLabel: \"Due date\",\n storyPointsLabel: \"Story points\",\n labelsLabel: \"Labels\",\n labelsPlaceholder: \"comma, separated, labels\",\n create: \"Create task\",\n creating: \"Creating…\",\n cancel: \"Cancel\",\n edit: \"Edit\",\n del: \"Delete\",\n deletePrompt: \"Delete?\",\n yes: \"Yes\",\n no: \"No\",\n save: \"Save changes\",\n saving: \"Saving…\",\n taskNotFound: \"Task not found.\",\n projectRequired: \"A projectId is required to create a task.\",\n\n errorLoading: \"Error loading tasks\",\n moveFailed: \"Couldn't move the task. Please try again.\",\n failedToCreate: \"Failed to create task\",\n failedToSave: \"Failed to save\",\n failedToDelete: \"Failed to delete\",\n overdueLabel: \"Overdue\",\n more: \"more\",\n\n status: {\n BACKLOG: \"Backlog\",\n TODO: \"To Do\",\n IN_PROGRESS: \"In Progress\",\n IN_REVIEW: \"In Review\",\n TESTING: \"Testing\",\n DONE: \"Done\",\n CANCELLED: \"Cancelled\",\n },\n priority: {\n NONE: \"None\",\n LOW: \"Low\",\n MEDIUM: \"Medium\",\n HIGH: \"High\",\n CRITICAL: \"Critical\",\n },\n type: {\n TASK: \"Task\",\n STORY: \"Story\",\n BUG: \"Bug\",\n EPIC: \"Epic\",\n SUB_TASK: \"Sub Task\",\n },\n};\n\nconst TaskLabelsContext = createContext<TaskLabels>(DEFAULT_TASK_LABELS);\nexport const TaskLabelsProvider = TaskLabelsContext.Provider;\n\n/** Read the active task labels (English defaults if no host override). */\nexport function useTaskLabels(): TaskLabels {\n return useContext(TaskLabelsContext);\n}\n\n/** A host may override any subset; missing keys fall back to English. */\nexport type PartialTaskLabels = Partial<\n Omit<TaskLabels, \"status\" | \"priority\" | \"type\">\n> & {\n status?: Partial<TaskLabels[\"status\"]>;\n priority?: Partial<TaskLabels[\"priority\"]>;\n type?: Partial<TaskLabels[\"type\"]>;\n};\n\n/** Merge a host's partial overrides onto the English defaults. */\nexport function mergeTaskLabels(overrides?: PartialTaskLabels): TaskLabels {\n if (!overrides) return DEFAULT_TASK_LABELS;\n return {\n ...DEFAULT_TASK_LABELS,\n ...overrides,\n status: { ...DEFAULT_TASK_LABELS.status, ...overrides.status },\n priority: { ...DEFAULT_TASK_LABELS.priority, ...overrides.priority },\n type: { ...DEFAULT_TASK_LABELS.type, ...overrides.type },\n };\n}\n","import { type ComponentType } from \"react\";\nimport {\n Circle,\n CircleCheckBig,\n CircleDashed,\n CircleDot,\n CircleDotDashed,\n CircleX,\n type LucideProps,\n} from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { Badge } from \"./badge\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport { type TaskPriority, type TaskStatus, type TaskType } from \"../types\";\n\n/**\n * Linear-style task indicators — status, priority, type.\n *\n * A hard rule of the codebase is \"semantic tokens only, never raw colors\". The\n * default token palette only exposes a handful of hues (primary / secondary /\n * muted / accent / destructive), which is not enough to give each of the six\n * statuses its own distinct color like a raw-palette design would.\n *\n * So — exactly like Linear — status is differentiated primarily by icon SHAPE\n * (dashed → empty → dotted → filled → check), with a subtle muted→primary tone\n * progression, and priority by a filled-BAR count. This reads as a polished PM\n * tool while staying 100% within the semantic-token contract.\n */\n\n// ---------------------------------------------------------------------------\n// Status\n// ---------------------------------------------------------------------------\n\ninterface StatusMeta {\n icon: ComponentType<LucideProps>;\n /** Icon tone (semantic token). */\n tone: string;\n}\n\n/**\n * Per-status icon + tone. Shape carries the meaning; tone progresses from muted\n * (not started) toward primary (in flight / done). Overridable by hosts only\n * via the column labels, never by raw color.\n */\nexport const STATUS_META: Record<TaskStatus, StatusMeta> = {\n BACKLOG: { icon: CircleDashed, tone: \"text-muted-foreground/60\" },\n TODO: { icon: Circle, tone: \"text-muted-foreground\" },\n IN_PROGRESS: { icon: CircleDot, tone: \"text-primary\" },\n IN_REVIEW: { icon: CircleDotDashed, tone: \"text-accent-foreground\" },\n TESTING: { icon: CircleDotDashed, tone: \"text-secondary-foreground\" },\n DONE: { icon: CircleCheckBig, tone: \"text-primary\" },\n CANCELLED: { icon: CircleX, tone: \"text-destructive/70\" },\n};\n\nexport interface StatusIconProps {\n status: TaskStatus;\n className?: string;\n}\n\n/** A single status glyph — shape-differentiated, token-toned. */\nexport function StatusIcon({ status, className }: StatusIconProps) {\n const meta = STATUS_META[status] ?? STATUS_META.TODO;\n const Icon = meta.icon;\n return (\n <Icon\n className={cn(\"h-3.5 w-3.5 shrink-0\", meta.tone, className)}\n aria-hidden=\"true\"\n />\n );\n}\n\nexport interface StatusPillProps {\n status: TaskStatus;\n className?: string;\n}\n\n/** Status as a compact bordered pill (icon + label) — used in the list view. */\nexport function StatusPill({ status, className }: StatusPillProps) {\n const L = useTaskLabels();\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/40 px-2 py-0.5 text-xs font-medium capitalize text-foreground\",\n className,\n )}\n >\n <StatusIcon status={status} />\n {L.status[status]}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Priority\n// ---------------------------------------------------------------------------\n\ninterface PriorityMeta {\n /** Number of filled bars (0–3). */\n level: number;\n /** Fill tone (semantic token) applied to the filled bars + label. */\n tone: string;\n}\n\nexport const PRIORITY_META: Record<TaskPriority, PriorityMeta> = {\n NONE: { level: 0, tone: \"text-muted-foreground/50\" },\n LOW: { level: 1, tone: \"text-muted-foreground\" },\n MEDIUM: { level: 2, tone: \"text-accent-foreground\" },\n HIGH: { level: 3, tone: \"text-accent-foreground\" },\n CRITICAL: { level: 3, tone: \"text-destructive\" },\n};\n\nconst BAR_HEIGHTS = [\"h-1.5\", \"h-2.5\", \"h-3.5\"] as const;\n\nexport interface PriorityIndicatorProps {\n priority: TaskPriority;\n /** Show the text label next to the bars. */\n showLabel?: boolean;\n className?: string;\n}\n\n/**\n * Linear-style priority signal — three bars, filled by level. NONE renders all\n * bars faint (its own recognizable \"no priority\" look).\n */\nexport function PriorityIndicator({\n priority,\n showLabel = false,\n className,\n}: PriorityIndicatorProps) {\n const L = useTaskLabels();\n const meta = PRIORITY_META[priority] ?? PRIORITY_META.NONE;\n return (\n <span\n className={cn(\"inline-flex items-center gap-1.5\", meta.tone, className)}\n title={`${L.priorityLabel}: ${L.priority[priority]}`}\n >\n <span className=\"flex items-end gap-0.5\" aria-hidden=\"true\">\n {BAR_HEIGHTS.map((h, i) => (\n <span\n key={h}\n className={cn(\n \"w-1 rounded-[1px]\",\n h,\n i < meta.level ? \"bg-current\" : \"bg-current/25\",\n )}\n />\n ))}\n </span>\n {showLabel && (\n <span className=\"text-xs font-medium capitalize\">\n {L.priority[priority]}\n </span>\n )}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Type\n// ---------------------------------------------------------------------------\n\nconst TYPE_VARIANT: Record<\n TaskType,\n \"default\" | \"muted\" | \"secondary\" | \"accent\" | \"destructive\"\n> = {\n TASK: \"secondary\",\n STORY: \"default\",\n BUG: \"destructive\",\n EPIC: \"accent\",\n SUB_TASK: \"muted\",\n};\n\nexport interface TypeBadgeProps {\n type: TaskType;\n className?: string;\n}\n\n/** Work-item type as a subtle badge. */\nexport function TypeBadge({ type, className }: TypeBadgeProps) {\n const L = useTaskLabels();\n return (\n <Badge variant={TYPE_VARIANT[type]} className={className}>\n {L.type[type]}\n </Badge>\n );\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\ninterface OverlayShellProps {\n /** Whether the overlay is mounted/visible. */\n open: boolean;\n /** Called when the user requests dismissal (backdrop click, Escape, close X). */\n onClose: () => void;\n /** Overlay body. */\n children: ReactNode;\n /** Accessible label for the dialog surface. */\n ariaLabel?: string;\n /** Extra classes on the panel. */\n className?: string;\n /** Layout variant — centered modal card vs. right-anchored drawer. */\n variant: \"modal\" | \"drawer\";\n}\n\n/**\n * Owned overlay primitive shared by `Modal` and `Drawer`. Semantic-token only\n * (no raw palette colors, no fe-libs Dialog dependency) so it renders in any\n * host, in happy-dom tests, and in the offline harness. Closes on backdrop\n * click and Escape; renders a corner close button.\n *\n * Not a portal: mounts inline in the React tree. That keeps it BYO-Apollo /\n * provider-agnostic (a portal would escape the ApolloProvider subtree) and\n * avoids requiring `document.body` wiring in tests.\n */\nfunction OverlayShell({\n open,\n onClose,\n children,\n ariaLabel,\n className,\n variant,\n}: OverlayShellProps) {\n useEffect(() => {\n if (!open) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [open, onClose]);\n\n if (!open) return null;\n\n const isModal = variant === \"modal\";\n\n return (\n <div\n className={cn(\n \"fixed inset-0 z-50 flex bg-foreground/40\",\n isModal ? \"items-center justify-center p-4\" : \"justify-end\",\n )}\n onClick={onClose}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n className={cn(\n \"relative overflow-y-auto bg-background text-foreground shadow-lg\",\n isModal\n ? \"max-h-[90vh] w-full max-w-2xl rounded-lg\"\n : \"h-full w-full max-w-lg\",\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n className=\"absolute right-3 top-3 z-10 rounded-md bg-muted px-2 py-1 text-sm font-medium text-muted-foreground hover:bg-muted/70\"\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n ariaLabel?: string;\n className?: string;\n}\n\n/** Centered modal card overlay (owned, semantic-token only). */\nexport function Modal(props: ModalProps) {\n return <OverlayShell variant=\"modal\" {...props} />;\n}\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n ariaLabel?: string;\n className?: string;\n}\n\n/** Right-anchored slide-over drawer overlay (owned, semantic-token only). */\nexport function Drawer(props: DrawerProps) {\n return <OverlayShell variant=\"drawer\" {...props} />;\n}\n","import { type DragEvent, type KeyboardEvent } from \"react\";\nimport { CalendarDays } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { formatDueDate, isOverdue } from \"../utils/dates\";\nimport {\n Avatar,\n LinkChip,\n PriorityIndicator,\n TypeBadge,\n type RenderLinkIcon,\n} from \"../ui\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport type { Task, WorkItemLink } from \"../types\";\n\n/**\n * Optional host hook: resolve an assignee id to a display name (the SDK has no\n * user directory). When omitted the avatar falls back to id-initials.\n */\nexport type ResolveAssignee = (\n assigneeId: string,\n) => { name?: string | null } | null | undefined;\n\n/** A selectable assignee for the create/edit picker (host-provided directory). */\nexport interface AssigneeOption {\n id: string;\n name: string;\n}\n\nexport interface TaskCardProps {\n task: Task;\n /** Field names to hide (key/type/priority/labels/storyPoints/assignee/dueDate). */\n hidden?: ReadonlySet<string>;\n onClick?: (task: Task) => void;\n /** Enable native drag (board wires this to move-between-columns). */\n draggable?: boolean;\n onDragStart?: (task: Task, e: DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (task: Task, e: DragEvent<HTMLDivElement>) => void;\n /** True while this card is the one being dragged. */\n dragging?: boolean;\n resolveAssignee?: ResolveAssignee;\n /** Linked farm records for this task (rendered as chips). */\n links?: WorkItemLink[];\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n className?: string;\n}\n\nconst EMPTY = new Set<string>();\n\n/**\n * TaskCard — a Linear-style board card. Presentational + prop-driven; renders\n * only real fields (no invented assignee names or entity links). Semantic\n * tokens only.\n */\nexport function TaskCard({\n task,\n hidden = EMPTY,\n onClick,\n draggable,\n onDragStart,\n onDragEnd,\n dragging,\n resolveAssignee,\n links,\n renderLinkIcon,\n className,\n}: TaskCardProps) {\n const L = useTaskLabels();\n const overdue = isOverdue(task.dueDate, task.status);\n const due = formatDueDate(task.dueDate);\n const resolved = task.assigneeId ? resolveAssignee?.(task.assigneeId) : null;\n\n const showTopRow = !hidden.has(\"key\") || !hidden.has(\"type\");\n const showLinks = !hidden.has(\"links\") && (links?.length ?? 0) > 0;\n const showLabels = !hidden.has(\"labels\") && (task.labels?.length ?? 0) > 0;\n const showPriority = !hidden.has(\"priority\");\n const showPoints = !hidden.has(\"storyPoints\") && task.storyPoints != null;\n const showMetaRow = showPriority || showPoints;\n const showAssignee = !hidden.has(\"assignee\");\n const showDue = !hidden.has(\"dueDate\") && Boolean(due);\n const showPeopleRow = showAssignee || showDue;\n\n const interactive = Boolean(onClick);\n const handleKey = onClick\n ? (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick(task);\n }\n }\n : undefined;\n\n return (\n <div\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n draggable={draggable}\n onDragStart={draggable ? (e) => onDragStart?.(task, e) : undefined}\n onDragEnd={draggable ? (e) => onDragEnd?.(task, e) : undefined}\n onClick={onClick ? () => onClick(task) : undefined}\n onKeyDown={handleKey}\n className={cn(\n \"group rounded-lg border border-border bg-card p-2.5 shadow-sm transition\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n interactive && \"cursor-pointer hover:border-primary/50 hover:shadow-md\",\n draggable && \"active:cursor-grabbing\",\n dragging && \"opacity-50 ring-2 ring-primary/40\",\n className,\n )}\n >\n {showTopRow && (\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n {!hidden.has(\"key\") ? (\n <span className=\"font-mono text-[10px] uppercase tracking-wide text-muted-foreground\">\n {task.key}\n </span>\n ) : (\n <span />\n )}\n {!hidden.has(\"type\") && <TypeBadge type={task.type} />}\n </div>\n )}\n\n <p className=\"line-clamp-2 text-sm font-medium leading-snug text-foreground\">\n {task.title}\n </p>\n\n {showLinks && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {links!.slice(0, 3).map((link) => (\n <LinkChip key={link.id} link={link} renderIcon={renderLinkIcon} />\n ))}\n {links!.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{links!.length - 3}\n </span>\n )}\n </div>\n )}\n\n {showLabels && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {task.labels.slice(0, 3).map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\"\n >\n {l}\n </span>\n ))}\n {task.labels.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{task.labels.length - 3}\n </span>\n )}\n </div>\n )}\n\n {showMetaRow && (\n <div className=\"mt-2 flex items-center justify-between\">\n {showPriority ? (\n <PriorityIndicator priority={task.priority} showLabel />\n ) : (\n <span />\n )}\n {showPoints && (\n <span\n className=\"flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/10 px-1 text-[10px] font-semibold text-primary\"\n title={`${task.storyPoints} ${L.storyPointsLabel}`}\n >\n {task.storyPoints}\n </span>\n )}\n </div>\n )}\n\n {showPeopleRow && (\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {showAssignee ? (\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <Avatar id={task.assigneeId} name={resolved?.name} size=\"sm\" />\n {resolved?.name && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {resolved.name}\n </span>\n )}\n </span>\n ) : (\n <span />\n )}\n {showDue && (\n <span\n className={cn(\n \"flex shrink-0 items-center gap-1 text-[11px]\",\n overdue\n ? \"font-medium text-destructive\"\n : \"text-muted-foreground\",\n )}\n title={overdue ? L.overdueLabel : L.dueDateLabel}\n >\n <CalendarDays className=\"h-3 w-3\" aria-hidden=\"true\" />\n {due}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { LIST_WORK_ITEM_LINKS } from \"../graphql-ops\";\nimport type { WorkItemLink, WorkItemLinkList } from \"../types\";\n\ntype ListWorkItemLinksResult = { planmagnetWorkItemLinks: WorkItemLinkList };\n\nexport interface UseWorkItemLinksResult {\n /** Links grouped by the work item they belong to. */\n linksByItem: Map<string, WorkItemLink[]>;\n loading: boolean;\n}\n\n/**\n * useWorkItemLinks — batch-fetch WorkItemLinks for a workspace (scoped to one\n * `sourceProduct`, e.g. \"healthybowl\") in ONE query and group them by\n * `workItemId`. WorkItem has no `links` field, so the board/list join links to\n * items client-side. Skips entirely when no `sourceProduct` is provided, so the\n * SDK stays farm-free and link-fetching is opt-in per host.\n */\nexport function useWorkItemLinks(\n workspaceId: string | undefined,\n sourceProduct: string | undefined,\n limit = 500,\n): UseWorkItemLinksResult {\n const { data, loading } = useQuery<ListWorkItemLinksResult>(\n LIST_WORK_ITEM_LINKS,\n {\n variables: {\n workspaceId,\n ...(sourceProduct ? { filter: { sourceProduct } } : {}),\n pagination: { first: limit },\n },\n skip: !workspaceId || !sourceProduct,\n },\n );\n\n const linksByItem = useMemo(() => {\n const map = new Map<string, WorkItemLink[]>();\n for (const link of data?.planmagnetWorkItemLinks?.items ?? []) {\n const arr = map.get(link.workItemId);\n if (arr) arr.push(link);\n else map.set(link.workItemId, [link]);\n }\n return map;\n }, [data]);\n\n return { linksByItem, loading };\n}\n","import { useCallback, useMemo, useState, type DragEvent } from \"react\";\nimport { useApolloClient, useMutation, useQuery } from \"@apollo/client/react\";\nimport { LIST_WORK_ITEMS, UPDATE_WORK_ITEM } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { TaskCard, type ResolveAssignee } from \"./TaskCard\";\nimport { StatusIcon, type RenderLinkIcon } from \"../ui\";\nimport { useWorkItemLinks } from \"../hooks/useWorkItemLinks\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport { cn } from \"../utils/cn\";\nimport {\n DEFAULT_BOARD_COLUMNS,\n type BoardColumn,\n type Task,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type WorkItemDetail,\n type WorkItemList,\n} from \"../types\";\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\ntype UpdateResult = { planmagnetUpdateWorkItem: WorkItemDetail };\n\nexport interface TaskBoardCoreProps {\n /** Scope the board to one project (client-side filter for Phase 1). */\n projectId?: string;\n /** Board columns to render (defaults to DEFAULT_BOARD_COLUMNS). */\n columns?: BoardColumn[];\n /** Read-only mode — disables drag-to-move. */\n readonly?: boolean;\n /** Hide the board's own header (title + count). */\n hideHeader?: boolean;\n /**\n * @deprecated Filtering is now controlled by the parent toolbar via the\n * `priority`/`type`/`search` props. Accepted for backward compatibility; the\n * board no longer renders its own filter chips.\n */\n hideFilters?: boolean;\n /** Controlled priority filter (\"ALL\" or a specific priority). */\n priority?: TaskPriority | \"ALL\";\n /** Controlled type filter (\"ALL\" or a specific type). */\n type?: TaskType | \"ALL\";\n /** Controlled free-text search (matches title/key/labels). */\n search?: string;\n /** Controlled assignee filter (actor id). */\n assigneeId?: string;\n /**\n * Field names to hide on each task card. Supported: 'key' | 'priority' |\n * 'type' | 'labels' | 'storyPoints' | 'assignee' | 'dueDate'.\n */\n hiddenFields?: string[];\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /** Called when a task card is clicked. */\n onTaskClick?: (task: Task) => void;\n /**\n * When set, the board fetches WorkItemLinks for this `sourceProduct` (e.g.\n * \"healthybowl\") and renders a linked-record chip on each card. Omitted → no\n * link fetch (SDK stays farm-free).\n */\n linkSourceProduct?: string;\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n /** Extra classes on the root container. */\n className?: string;\n /**\n * Optional explicit workspace ID. Falls back to the PlanMagnetProvider context.\n * At least one must be present or the query is skipped.\n */\n workspaceId?: string;\n}\n\n/**\n * TaskBoardCore — provider-less, prop-driven, product-agnostic Kanban board.\n *\n * - Reads Apollo via the ambient `<ApolloProvider>` (BYO). Never creates a\n * client, never assumes a router.\n * - `workspaceId` comes from a prop or the PlanMagnetProvider context.\n * - Linear-style columns + cards, with native drag-to-move between columns\n * (optimistic cache update + `UPDATE_WORK_ITEM`; reverts on error). Filtering\n * is controlled by the parent toolbar. Farm-free, semantic-token only.\n */\nexport function TaskBoardCore({\n projectId,\n columns = DEFAULT_BOARD_COLUMNS,\n readonly,\n hideHeader,\n priority = \"ALL\",\n type = \"ALL\",\n search = \"\",\n assigneeId,\n hiddenFields,\n resolveAssignee,\n linkSourceProduct,\n renderLinkIcon,\n onTaskClick,\n className,\n workspaceId: workspaceIdProp,\n}: TaskBoardCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const client = useApolloClient();\n const L = useTaskLabels();\n\n const hidden = useMemo(() => new Set(hiddenFields ?? []), [hiddenFields]);\n const { linksByItem } = useWorkItemLinks(workspaceId, linkSourceProduct);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState<TaskStatus | null>(null);\n const [moveError, setMoveError] = useState<string | null>(null);\n\n const [updateItem] = useMutation<UpdateResult>(UPDATE_WORK_ITEM);\n\n const { data, loading, error } = useQuery<ListWorkItemsResult>(\n LIST_WORK_ITEMS,\n {\n variables: {\n workspaceId,\n ...(projectId ? { filter: { projectId } } : {}),\n pagination: { first: 200 },\n },\n skip: !workspaceId,\n },\n );\n\n const moveTask = useCallback(\n (task: Task, toStatus: TaskStatus) => {\n const from = task.status;\n if (from === toStatus) return;\n const id = client.cache.identify({ __typename: \"WorkItem\", id: task.id });\n if (!id) return;\n setMoveError(null);\n // Optimistically move the card by editing just the status field on the\n // normalized WorkItem — the board recomputes column membership instantly.\n client.cache.modify({ id, fields: { status: () => toStatus } });\n updateItem({\n variables: { id: task.id, input: { status: toStatus } },\n }).catch(() => {\n client.cache.modify({ id, fields: { status: () => from } });\n setMoveError(L.moveFailed);\n });\n },\n [client, updateItem, L],\n );\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TaskBoard: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n const query = search.trim().toLowerCase();\n const filtered = tasks.filter((t) => {\n if (priority !== \"ALL\" && t.priority !== priority) return false;\n if (type !== \"ALL\" && t.type !== type) return false;\n if (assigneeId && t.assigneeId !== assigneeId) return false;\n if (query) {\n const haystack = [t.title, t.key, ...(t.labels ?? [])]\n .join(\" \")\n .toLowerCase();\n if (!haystack.includes(query)) return false;\n }\n return true;\n });\n\n const canDrag = !readonly;\n\n const onColumnDragOver =\n (status: TaskStatus) => (e: DragEvent<HTMLDivElement>) => {\n if (!canDrag || !draggingId) return;\n e.preventDefault();\n if (dragOver !== status) setDragOver(status);\n };\n\n const onColumnDrop =\n (status: TaskStatus) => (e: DragEvent<HTMLDivElement>) => {\n if (!canDrag) return;\n e.preventDefault();\n const task = tasks.find((t) => t.id === draggingId);\n setDragOver(null);\n setDraggingId(null);\n if (task) moveTask(task, status);\n };\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {!hideHeader && (\n <div className=\"flex items-baseline justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">{L.board}</h2>\n <span className=\"text-sm text-muted-foreground\">\n {filtered.length}{\" \"}\n {filtered.length === 1 ? L.tasksSingular : L.tasksPlural}\n </span>\n </div>\n )}\n\n {moveError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-1.5 text-xs text-destructive\">\n {moveError}\n </div>\n )}\n\n <div className=\"flex gap-3 overflow-x-auto pb-2\">\n {columns.map((col) => {\n const colTasks = filtered.filter((t) => t.status === col.status);\n const isOver = dragOver === col.status;\n return (\n <div\n key={col.status}\n onDragOver={onColumnDragOver(col.status)}\n onDragLeave={() => dragOver === col.status && setDragOver(null)}\n onDrop={onColumnDrop(col.status)}\n className={cn(\n \"flex w-72 shrink-0 flex-col rounded-lg border transition-colors\",\n isOver\n ? \"border-primary/50 bg-primary/5\"\n : \"border-transparent bg-muted/40\",\n )}\n >\n <div className=\"flex items-center justify-between gap-2 px-3 py-2\">\n <span className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n <StatusIcon status={col.status} />\n {L.status[col.status]}\n </span>\n <span className=\"rounded-full bg-muted px-1.5 text-xs font-medium text-muted-foreground\">\n {colTasks.length}\n </span>\n </div>\n <div className=\"flex flex-col gap-2 px-2 pb-2\">\n {colTasks.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border/70 px-3 py-6 text-center text-xs text-muted-foreground\">\n {isOver ? L.dropHere : L.noTasks}\n </div>\n ) : (\n colTasks.map((task) => (\n <TaskCard\n key={task.id}\n task={task}\n hidden={hidden}\n onClick={onTaskClick}\n draggable={canDrag}\n dragging={draggingId === task.id}\n resolveAssignee={resolveAssignee}\n links={linksByItem.get(task.id)}\n renderLinkIcon={renderLinkIcon}\n onDragStart={(t, e) => {\n setDraggingId(t.id);\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", t.id);\n }}\n onDragEnd={() => {\n setDraggingId(null);\n setDragOver(null);\n }}\n />\n ))\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TaskBoardCore, type TaskBoardCoreProps } from \"./TaskBoardCore\";\n\nexport interface TaskBoardProps extends TaskBoardCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TaskBoard — standalone, embeddable, product-agnostic task board.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders TaskBoardCore. Mirrors the FluidGrids\n * `WorkflowBuilder` (standalone) → `WorkflowBuilderCore` (BYO) split.\n *\n * Two mount modes:\n * - URL mode: <TaskBoard apiGatewayUrl={..} authToken={..} workspaceId={..} />\n * - BYO mode: <TaskBoard workspaceClient={hostClient} workspaceId={..} />\n *\n * @example URL mode\n * ```tsx\n * <TaskBoard\n * apiGatewayUrl=\"https://graphqlworkspaces.burdenoff.com\"\n * authToken={token}\n * workspaceId=\"ws-123\"\n * onTaskClick={(t) => console.log(t)}\n * />\n * ```\n *\n * @example BYO client (host shell injects its authed client)\n * ```tsx\n * <TaskBoard workspaceClient={hostClient} workspaceId=\"ws-123\" readonly />\n * ```\n */\nexport function TaskBoard({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TaskBoardProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TaskBoardCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useMemo, useState, type FormEvent } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { CREATE_WORK_ITEM } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { getPlanMagnetConfig } from \"../config\";\nimport { cn } from \"../utils/cn\";\nimport { toIsoDate } from \"../utils/dates\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport {\n TASK_PRIORITIES,\n TASK_STATUSES,\n TASK_TYPES,\n type CreateTaskInput,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type WorkItemDetail,\n} from \"../types\";\n\ntype CreateWorkItemResult = { planmagnetCreateWorkItem: WorkItemDetail };\n\n/**\n * Supported hideable field keys for the create form. Product-agnostic hook so\n * hosts can suppress fields that don't apply to their domain.\n */\nexport type CreateTaskField =\n | \"description\"\n | \"type\"\n | \"status\"\n | \"priority\"\n | \"assignee\"\n | \"dueDate\"\n | \"labels\"\n | \"storyPoints\";\n\nexport interface CreateTaskCoreProps {\n /**\n * Project the new work item belongs to. `projectId` is REQUIRED by the\n * backend (`PlanmagnetCreateWorkItemInput.projectId`). The form blocks submit\n * until a project id is present.\n */\n projectId?: string;\n /** Optional host-provided member directory → renders an assignee picker. */\n assigneeOptions?: import(\"./TaskCard\").AssigneeOption[];\n /** Field names to hide on the form. */\n hiddenFields?: CreateTaskField[];\n /** Default values applied on first render. */\n defaultValues?: Partial<CreateTaskInput>;\n /** Hide the form header (title + subtitle). */\n hideHeader?: boolean;\n /** Custom submit-button label. */\n submitLabel?: string;\n /** Called with the created work item on success. */\n onCreated?: (workItem: WorkItemDetail) => void;\n /** Called when the create mutation errors. */\n onError?: (error: Error) => void;\n /** Called when the cancel button is pressed (button only shown if provided). */\n onCancel?: () => void;\n /** Extra classes on the root container. */\n className?: string;\n /** Explicit workspace ID. Falls back to PlanMagnetProvider context. */\n workspaceId?: string;\n}\n\nconst DEFAULT_TYPE: TaskType = \"TASK\";\nconst DEFAULT_STATUS: TaskStatus = \"BACKLOG\";\nconst DEFAULT_PRIORITY: TaskPriority = \"NONE\";\n\nconst fieldClass =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\";\nconst labelClass = \"text-sm font-medium text-foreground\";\n\n/**\n * CreateTaskCore — provider-less, prop-driven controlled form that creates a\n * WorkItem via `planmagnetCreateWorkItem`. BYO-Apollo (reads the ambient\n * ApolloProvider), semantic-token styled, farm-free.\n *\n * Mirrors the TaskBoardCore contract: `workspaceId` from a prop or the\n * PlanMagnetProvider context, `hiddenFields` for host-driven field suppression.\n */\nexport function CreateTaskCore({\n projectId: projectIdProp,\n assigneeOptions,\n hiddenFields,\n defaultValues,\n hideHeader,\n submitLabel,\n onCreated,\n onError,\n onCancel,\n className,\n workspaceId: workspaceIdProp,\n}: CreateTaskCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const projectId = projectIdProp ?? defaultValues?.projectId;\n const L = useTaskLabels();\n\n const hidden = useMemo(\n () => new Set<CreateTaskField>(hiddenFields ?? []),\n [hiddenFields],\n );\n\n const [title, setTitle] = useState(defaultValues?.title ?? \"\");\n const [description, setDescription] = useState(\n defaultValues?.description ?? \"\",\n );\n const [type, setType] = useState<TaskType>(\n defaultValues?.type ?? DEFAULT_TYPE,\n );\n const [status, setStatus] = useState<TaskStatus>(\n defaultValues?.status ?? DEFAULT_STATUS,\n );\n const [priority, setPriority] = useState<TaskPriority>(\n defaultValues?.priority ?? DEFAULT_PRIORITY,\n );\n const [assigneeId, setAssigneeId] = useState(defaultValues?.assigneeId ?? \"\");\n const [dueDate, setDueDate] = useState(defaultValues?.dueDate ?? \"\");\n const [labels, setLabels] = useState(\n (defaultValues?.labels ?? []).join(\", \"),\n );\n const [storyPoints, setStoryPoints] = useState(\n defaultValues?.storyPoints != null ? String(defaultValues.storyPoints) : \"\",\n );\n\n const [createWorkItem, { loading, error }] =\n useMutation<CreateWorkItemResult>(CREATE_WORK_ITEM);\n\n const canSubmit = Boolean(workspaceId && projectId && title.trim());\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!canSubmit || !projectId) return;\n\n const parsedLabels = labels\n .split(\",\")\n .map((l) => l.trim())\n .filter(Boolean);\n const parsedPoints = storyPoints.trim() ? Number(storyPoints) : undefined;\n\n const input: CreateTaskInput = {\n projectId,\n title: title.trim(),\n type,\n ...(hidden.has(\"status\") ? {} : { status }),\n ...(hidden.has(\"priority\") ? {} : { priority }),\n ...(hidden.has(\"description\") || !description.trim()\n ? {}\n : { description: description.trim() }),\n ...(hidden.has(\"assignee\") || !assigneeId.trim()\n ? {}\n : { assigneeId: assigneeId.trim() }),\n ...(hidden.has(\"dueDate\") || !dueDate.trim()\n ? {}\n : { dueDate: toIsoDate(dueDate) }),\n ...(hidden.has(\"labels\") || parsedLabels.length === 0\n ? {}\n : { labels: parsedLabels }),\n ...(hidden.has(\"storyPoints\") ||\n parsedPoints == null ||\n Number.isNaN(parsedPoints)\n ? {}\n : { storyPoints: parsedPoints }),\n };\n\n try {\n const result = await createWorkItem({ variables: { input } });\n const created = result.data?.planmagnetCreateWorkItem;\n if (created) {\n // Fire the SDK-level onTaskSaved config hook (never blocks the flow).\n const cfg = getPlanMagnetConfig();\n try {\n await cfg.onTaskSaved?.({\n id: created.id,\n key: created.key,\n title: created.title,\n projectId: created.projectId,\n operation: \"created\",\n });\n } catch {\n // Host callback errors must never break the create flow.\n }\n onCreated?.(created);\n resetForm();\n }\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n function resetForm() {\n setTitle(\"\");\n setDescription(\"\");\n setType(DEFAULT_TYPE);\n setStatus(DEFAULT_STATUS);\n setPriority(DEFAULT_PRIORITY);\n setAssigneeId(\"\");\n setDueDate(\"\");\n setLabels(\"\");\n setStoryPoints(\"\");\n }\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n CreateTask: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n return (\n <Card className={cn(\"shadow-sm\", className)}>\n <CardContent className=\"p-6\">\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {!hideHeader && (\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">\n {L.newTaskHeading}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {L.newTaskSubtitle}\n </p>\n </div>\n )}\n\n {!projectId && (\n <p className=\"rounded-md bg-destructive/10 p-2 text-xs text-destructive\">\n {L.projectRequired}\n </p>\n )}\n\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-title\" className={labelClass}>\n {L.title}\n </label>\n <input\n id=\"pm-title\"\n className={fieldClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={L.titlePlaceholder}\n required\n />\n </div>\n\n {!hidden.has(\"description\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-description\" className={labelClass}>\n {L.description}\n </label>\n <textarea\n id=\"pm-description\"\n className={cn(fieldClass, \"min-h-[80px]\")}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={L.descriptionPlaceholder}\n />\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-type\" className={labelClass}>\n {L.typeLabel}\n </label>\n <select\n id=\"pm-type\"\n className={cn(fieldClass, \"capitalize\")}\n value={type}\n onChange={(e) => setType(e.target.value as TaskType)}\n >\n {TASK_TYPES.map((t) => (\n <option key={t} value={t}>\n {L.type[t]}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!hidden.has(\"status\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-status\" className={labelClass}>\n {L.statusLabel}\n </label>\n <select\n id=\"pm-status\"\n className={cn(fieldClass, \"capitalize\")}\n value={status}\n onChange={(e) => setStatus(e.target.value as TaskStatus)}\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>\n {L.status[s]}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!hidden.has(\"priority\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-priority\" className={labelClass}>\n {L.priorityLabel}\n </label>\n <select\n id=\"pm-priority\"\n className={cn(fieldClass, \"capitalize\")}\n value={priority}\n onChange={(e) => setPriority(e.target.value as TaskPriority)}\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {L.priority[p]}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!hidden.has(\"assignee\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-assignee\" className={labelClass}>\n {L.assigneeLabel}\n </label>\n {assigneeOptions && assigneeOptions.length > 0 ? (\n <select\n id=\"pm-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n >\n <option value=\"\">{L.unassigned}</option>\n {assigneeOptions.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n id=\"pm-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n placeholder={L.assigneePlaceholder}\n />\n )}\n </div>\n )}\n\n {!hidden.has(\"dueDate\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-due\" className={labelClass}>\n {L.dueDateLabel}\n </label>\n <input\n id=\"pm-due\"\n type=\"date\"\n className={fieldClass}\n value={dueDate}\n onChange={(e) => setDueDate(e.target.value)}\n />\n </div>\n )}\n\n {!hidden.has(\"storyPoints\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-points\" className={labelClass}>\n {L.storyPointsLabel}\n </label>\n <input\n id=\"pm-points\"\n type=\"number\"\n min={0}\n className={fieldClass}\n value={storyPoints}\n onChange={(e) => setStoryPoints(e.target.value)}\n placeholder=\"0\"\n />\n </div>\n )}\n </div>\n\n {!hidden.has(\"labels\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-labels\" className={labelClass}>\n {L.labelsLabel}\n </label>\n <input\n id=\"pm-labels\"\n className={fieldClass}\n value={labels}\n onChange={(e) => setLabels(e.target.value)}\n placeholder={L.labelsPlaceholder}\n />\n </div>\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">\n {L.failedToCreate}: {error.message}\n </p>\n )}\n\n <div className=\"flex items-center justify-end gap-2\">\n {onCancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-md bg-muted px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/70\"\n >\n {L.cancel}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={!canSubmit || loading}\n className={cn(\n \"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground\",\n (!canSubmit || loading) && \"cursor-not-allowed opacity-50\",\n )}\n >\n {loading ? L.creating : (submitLabel ?? L.create)}\n </button>\n </div>\n </form>\n </CardContent>\n </Card>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { CreateTaskCore, type CreateTaskCoreProps } from \"./CreateTaskCore\";\n\nexport interface CreateTaskProps extends CreateTaskCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * CreateTask — standalone, embeddable work-item create form.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders CreateTaskCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * @example URL mode\n * ```tsx\n * <CreateTask\n * apiGatewayUrl=\"https://graphqlworkspaces.burdenoff.com\"\n * authToken={token}\n * workspaceId=\"ws-123\"\n * projectId=\"proj-1\"\n * onCreated={(wi) => console.log(wi)}\n * />\n * ```\n *\n * @example BYO client\n * ```tsx\n * <CreateTask workspaceClient={hostClient} workspaceId=\"ws-123\" projectId=\"proj-1\" />\n * ```\n */\nexport function CreateTask({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: CreateTaskProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <CreateTaskCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { cn } from \"../utils/cn\";\nimport {\n Avatar,\n LinkChip,\n PriorityIndicator,\n StatusPill,\n TypeBadge,\n type RenderLinkIcon,\n} from \"../ui\";\nimport { formatDueDate, isOverdue } from \"../utils/dates\";\nimport { useWorkItemLinks } from \"../hooks/useWorkItemLinks\";\nimport { useTaskLabels, type TaskLabels } from \"../i18n/labels\";\nimport type { ResolveAssignee } from \"./TaskCard\";\nimport {\n type Task,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type WorkItemLink,\n type WorkItemList,\n} from \"../types\";\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\n\n/** Columns available in the compact list. */\nexport type TaskListColumn =\n | \"key\"\n | \"title\"\n | \"type\"\n | \"status\"\n | \"priority\"\n | \"assignee\"\n | \"dueDate\"\n | \"storyPoints\"\n | \"linkedRecord\"\n | \"labels\";\n\n/** Sort keys for the list. */\nexport type TaskListSort =\n \"priority\" | \"status\" | \"title\" | \"type\" | \"dueDate\" | \"storyPoints\";\n\nconst DEFAULT_COLUMNS: TaskListColumn[] = [\n \"title\",\n \"status\",\n \"priority\",\n \"assignee\",\n \"dueDate\",\n \"storyPoints\",\n];\n\nconst priorityRank: Record<TaskPriority, number> = {\n CRITICAL: 0,\n HIGH: 1,\n MEDIUM: 2,\n LOW: 3,\n NONE: 4,\n};\n\nconst statusRank: Record<TaskStatus, number> = {\n BACKLOG: 0,\n TODO: 1,\n IN_PROGRESS: 2,\n IN_REVIEW: 3,\n TESTING: 4,\n DONE: 5,\n CANCELLED: 6,\n};\n\n/** Column header text, resolved from the injectable labels (i18n). */\nfunction columnLabel(col: TaskListColumn, L: TaskLabels): string {\n switch (col) {\n case \"key\":\n return L.colKey;\n case \"title\":\n return L.colTask;\n case \"type\":\n return L.colType;\n case \"status\":\n return L.colStatus;\n case \"priority\":\n return L.colPriority;\n case \"assignee\":\n return L.colAssignee;\n case \"dueDate\":\n return L.colDueDate;\n case \"storyPoints\":\n return L.colPoints;\n case \"linkedRecord\":\n return L.colLinkedRecord;\n case \"labels\":\n return L.colLabels;\n default:\n return col;\n }\n}\n\n/** Columns that map to a client-side sort key. */\nconst COLUMN_SORT: Partial<Record<TaskListColumn, TaskListSort>> = {\n title: \"title\",\n type: \"type\",\n status: \"status\",\n priority: \"priority\",\n dueDate: \"dueDate\",\n storyPoints: \"storyPoints\",\n};\n\nexport interface TaskListCoreProps {\n /** Scope to one project (server-side filter). */\n projectId?: string;\n /** Filter by status. */\n status?: TaskStatus;\n /** Filter by type. */\n type?: TaskType;\n /** Filter by priority. */\n priority?: TaskPriority;\n /** Filter by assignee actor id. */\n assigneeId?: string;\n /** Free-text search (server-side). */\n search?: string;\n /** Columns to render (order preserved). */\n columns?: TaskListColumn[];\n /** Initial sort key. */\n sortBy?: TaskListSort;\n /** Initial sort direction. Defaults to ascending. */\n sortDir?: \"asc\" | \"desc\";\n /** Hide the header (title + count). */\n hideHeader?: boolean;\n /** Called with the work-item id when a row is clicked. */\n onSelect?: (id: string) => void;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /**\n * When set, fetch WorkItemLinks for this `sourceProduct` and populate the\n * \"linkedRecord\" column. Omitted → no link fetch.\n */\n linkSourceProduct?: string;\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n /** Max items to fetch (pagination.first). Defaults to 200. */\n limit?: number;\n /** Extra classes on the root container. */\n className?: string;\n /** Explicit workspace ID. Falls back to PlanMagnetProvider context. */\n workspaceId?: string;\n}\n\n/**\n * TaskListCore — provider-less, prop-driven compact list/table of work items.\n *\n * Same data source as TaskBoardCore (`LIST_WORK_ITEMS`) but a dense, Linear-style\n * table: status pills, priority signal bars, assignee avatars, click-to-sort\n * headers. Filters map to the server-side filter; sort is client-side.\n * BYO-Apollo, semantic-token only, farm-free.\n */\nexport function TaskListCore({\n projectId,\n status,\n type,\n priority,\n assigneeId,\n search,\n columns = DEFAULT_COLUMNS,\n sortBy,\n sortDir = \"asc\",\n hideHeader,\n onSelect,\n resolveAssignee,\n linkSourceProduct,\n renderLinkIcon,\n limit = 200,\n className,\n workspaceId: workspaceIdProp,\n}: TaskListCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const { linksByItem } = useWorkItemLinks(workspaceId, linkSourceProduct);\n const L = useTaskLabels();\n\n const [sort, setSort] = useState<{\n by: TaskListSort | null;\n dir: \"asc\" | \"desc\";\n }>({\n by: sortBy ?? null,\n dir: sortDir,\n });\n\n const filter = useMemo(() => {\n const f: Record<string, string> = {};\n if (projectId) f.projectId = projectId;\n if (status) f.status = status;\n if (type) f.type = type;\n if (priority) f.priority = priority;\n if (assigneeId) f.assigneeId = assigneeId;\n if (search) f.search = search;\n return f;\n }, [projectId, status, type, priority, assigneeId, search]);\n\n const { data, loading, error } = useQuery<ListWorkItemsResult>(\n LIST_WORK_ITEMS,\n {\n variables: {\n workspaceId,\n ...(Object.keys(filter).length ? { filter } : {}),\n pagination: { first: limit },\n },\n skip: !workspaceId,\n },\n );\n\n const rows = useMemo(() => {\n const items = data?.planmagnetWorkItems?.items ?? [];\n if (!sort.by) return items;\n const dir = sort.dir === \"desc\" ? -1 : 1;\n const key = sort.by;\n return [...items].sort((a, b) => dir * compareTasks(a, b, key));\n }, [data, sort]);\n\n const toggleSort = (col: TaskListColumn) => {\n const key = COLUMN_SORT[col];\n if (!key) return;\n setSort((prev) =>\n prev.by === key\n ? { by: key, dir: prev.dir === \"asc\" ? \"desc\" : \"asc\" }\n : { by: key, dir: \"asc\" },\n );\n };\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TaskList: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {!hideHeader && (\n <div className=\"flex items-baseline justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">{L.list}</h2>\n <span className=\"text-sm text-muted-foreground\">\n {rows.length} {rows.length === 1 ? L.tasksSingular : L.tasksPlural}\n </span>\n </div>\n )}\n\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50 text-left\">\n {columns.map((col) => {\n const sortable = Boolean(COLUMN_SORT[col]);\n const active = sort.by === COLUMN_SORT[col];\n return (\n <th\n key={col}\n onClick={sortable ? () => toggleSort(col) : undefined}\n className={cn(\n \"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\",\n sortable &&\n \"cursor-pointer select-none hover:text-foreground\",\n )}\n >\n <span className=\"inline-flex items-center gap-1\">\n {columnLabel(col, L)}\n {active &&\n (sort.dir === \"asc\" ? (\n <ChevronUp className=\"h-3 w-3\" aria-hidden=\"true\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" aria-hidden=\"true\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-3 py-8 text-center text-muted-foreground\"\n >\n {L.noTasksFound}\n </td>\n </tr>\n )}\n {rows.map((task) => (\n <tr\n key={task.id}\n onClick={onSelect ? () => onSelect(task.id) : undefined}\n className={cn(\n \"border-b border-border last:border-0\",\n onSelect && \"cursor-pointer hover:bg-muted/40\",\n )}\n >\n {columns.map((col) => (\n <td\n key={col}\n className=\"px-3 py-2 align-middle text-foreground\"\n >\n {renderCell(col, task, {\n resolveAssignee,\n links: linksByItem.get(task.id),\n renderLinkIcon,\n unassigned: L.unassigned,\n })}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction renderCell(\n col: TaskListColumn,\n task: Task,\n opts: {\n resolveAssignee?: ResolveAssignee;\n links?: WorkItemLink[];\n renderLinkIcon?: RenderLinkIcon;\n unassigned: string;\n },\n) {\n const { resolveAssignee, links, renderLinkIcon, unassigned } = opts;\n switch (col) {\n case \"key\":\n return (\n <span className=\"font-mono text-xs text-muted-foreground\">\n {task.key}\n </span>\n );\n case \"title\":\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">{task.title}</span>\n <span className=\"font-mono text-[10px] uppercase text-muted-foreground\">\n {task.key}\n </span>\n </div>\n );\n case \"type\":\n return <TypeBadge type={task.type} />;\n case \"status\":\n return <StatusPill status={task.status} />;\n case \"priority\":\n return <PriorityIndicator priority={task.priority} showLabel />;\n case \"assignee\": {\n const resolved = task.assigneeId\n ? resolveAssignee?.(task.assigneeId)\n : null;\n return (\n <span className=\"flex items-center gap-1.5\">\n <Avatar id={task.assigneeId} name={resolved?.name} size=\"sm\" />\n <span className=\"text-xs text-muted-foreground\">\n {resolved?.name ?? (task.assigneeId ? \"\" : unassigned)}\n </span>\n </span>\n );\n }\n case \"dueDate\": {\n const due = formatDueDate(task.dueDate);\n if (!due) return <span className=\"text-muted-foreground\">—</span>;\n return (\n <span\n className={cn(\n \"text-xs\",\n isOverdue(task.dueDate, task.status)\n ? \"font-medium text-destructive\"\n : \"text-muted-foreground\",\n )}\n >\n {due}\n </span>\n );\n }\n case \"storyPoints\":\n return task.storyPoints != null ? (\n <span className=\"flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/10 px-1 text-[10px] font-semibold text-primary\">\n {task.storyPoints}\n </span>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n );\n case \"linkedRecord\":\n if (!links || links.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n return (\n <div className=\"flex flex-wrap gap-1\">\n {links.slice(0, 2).map((link) => (\n <LinkChip key={link.id} link={link} renderIcon={renderLinkIcon} />\n ))}\n {links.length > 2 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{links.length - 2}\n </span>\n )}\n </div>\n );\n case \"labels\":\n return (\n <div className=\"flex flex-wrap gap-1\">\n {(task.labels ?? []).slice(0, 3).map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\"\n >\n {l}\n </span>\n ))}\n </div>\n );\n default:\n return null;\n }\n}\n\nfunction compareTasks(a: Task, b: Task, sortBy: TaskListSort): number {\n switch (sortBy) {\n case \"priority\":\n return priorityRank[a.priority] - priorityRank[b.priority];\n case \"status\":\n return statusRank[a.status] - statusRank[b.status];\n case \"title\":\n return a.title.localeCompare(b.title);\n case \"type\":\n return a.type.localeCompare(b.type);\n case \"dueDate\":\n return (a.dueDate ?? \"\").localeCompare(b.dueDate ?? \"\");\n case \"storyPoints\":\n return (a.storyPoints ?? 0) - (b.storyPoints ?? 0);\n default:\n return 0;\n }\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TaskListCore, type TaskListCoreProps } from \"./TaskListCore\";\n\nexport interface TaskListProps extends TaskListCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TaskList — standalone, embeddable compact list/table of work items.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders TaskListCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * @example\n * ```tsx\n * <TaskList\n * workspaceClient={hostClient}\n * workspaceId=\"ws-123\"\n * sortBy=\"priority\"\n * onSelect={(id) => openTask(id)}\n * />\n * ```\n */\nexport function TaskList({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TaskListProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TaskListCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { LIST_MILESTONES } from \"../graphql-ops\";\nimport { parseDate } from \"../utils/dates\";\nimport type { Milestone, MilestoneList } from \"../types\";\n\ntype ListMilestonesResult = { planmagnetMilestones: MilestoneList };\n\nexport interface UseMilestonesResult {\n milestones: Milestone[];\n /** Milestones grouped by their due day (yyyy-MM-dd), for timeline flags. */\n byDay: Map<string, Milestone[]>;\n loading: boolean;\n}\n\n/**\n * useMilestones — fetch a project's milestones (e.g. a harvest window) for the\n * Timeline to flag. Skips when no workspaceId. Errors are swallowed by Apollo's\n * error return so a milestone RBAC/serialization hiccup never breaks the board;\n * `milestones` is simply empty. Farm-free; opt-in via `enabled`.\n */\nexport function useMilestones(\n workspaceId: string | undefined,\n opts: { projectId?: string; enabled?: boolean; limit?: number } = {},\n): UseMilestonesResult {\n const { projectId, enabled = true, limit = 100 } = opts;\n const { data, loading } = useQuery<ListMilestonesResult>(LIST_MILESTONES, {\n variables: {\n workspaceId,\n ...(projectId ? { filter: { projectId } } : {}),\n pagination: { first: limit },\n },\n skip: !workspaceId || !enabled,\n errorPolicy: \"all\",\n });\n\n const milestones = useMemo(\n () => data?.planmagnetMilestones?.items ?? [],\n [data],\n );\n\n const byDay = useMemo(() => {\n const map = new Map<string, Milestone[]>();\n for (const m of milestones) {\n const d = parseDate(m.dueDate);\n if (!d) continue;\n const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n const arr = map.get(key);\n if (arr) arr.push(m);\n else map.set(key, [m]);\n }\n return map;\n }, [milestones]);\n\n return { milestones, byDay, loading };\n}\n","import { useMemo, useState } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport {\n addMonths,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n endOfWeek,\n format,\n isSameMonth,\n isToday,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { ChevronLeft, ChevronRight, Flag } from \"lucide-react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { useMilestones } from \"../hooks/useMilestones\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport { cn } from \"../utils/cn\";\nimport { Avatar, PriorityIndicator } from \"../ui\";\nimport { formatDueDate, isOverdue, parseDate } from \"../utils/dates\";\nimport type { ResolveAssignee } from \"./TaskCard\";\nimport {\n type Milestone,\n type Task,\n type TaskPriority,\n type TaskType,\n type WorkItemList,\n} from \"../types\";\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\n\ntype TimelineMode = \"week\" | \"month\";\n\nexport interface TaskTimelineCoreProps {\n /** Scope the timeline to one project (client-side filter). */\n projectId?: string;\n /** Controlled priority filter (\"ALL\" or a specific priority). */\n priority?: TaskPriority | \"ALL\";\n /** Controlled type filter (\"ALL\" or a specific type). */\n type?: TaskType | \"ALL\";\n /** Controlled free-text search (matches title/key/labels). */\n search?: string;\n /** Controlled assignee filter (actor id). */\n assigneeId?: string;\n /** Default mode. */\n defaultMode?: TimelineMode;\n /** Called with the work-item id when a task chip is clicked. */\n onSelect?: (id: string) => void;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /** Fetch + flag project milestones on the timeline (default true). */\n showMilestones?: boolean;\n className?: string;\n workspaceId?: string;\n}\n\nconst WEEK_OPTS = { weekStartsOn: 1 } as const; // Monday\n\n/** yyyy-MM-dd key for a date. */\nfunction dayKey(d: Date): string {\n return format(d, \"yyyy-MM-dd\");\n}\n\n/**\n * TaskTimelineCore — a week/month schedule of work items by due date.\n *\n * The spec's \"week/month timeline that shows when work is scheduled and what's\n * due\". We only have a single `dueDate` per work item (no start/end), so this is\n * an agenda-style schedule (chip on its due day) rather than a span Gantt —\n * honest to the data. Overdue and undated work is surfaced explicitly so nothing\n * hides. BYO-Apollo, semantic-token only, farm-free.\n */\nexport function TaskTimelineCore({\n projectId,\n priority = \"ALL\",\n type = \"ALL\",\n search = \"\",\n assigneeId,\n defaultMode = \"week\",\n onSelect,\n resolveAssignee,\n showMilestones = true,\n className,\n workspaceId: workspaceIdProp,\n}: TaskTimelineCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const L = useTaskLabels();\n const { milestones, byDay: milestonesByDay } = useMilestones(workspaceId, {\n projectId,\n enabled: showMilestones,\n });\n\n const [mode, setMode] = useState<TimelineMode>(defaultMode);\n const [offset, setOffset] = useState(0); // weeks/months from today\n\n const { data, loading, error } = useQuery<ListWorkItemsResult>(\n LIST_WORK_ITEMS,\n {\n variables: {\n workspaceId,\n ...(projectId ? { filter: { projectId } } : {}),\n pagination: { first: 200 },\n },\n skip: !workspaceId,\n },\n );\n\n const tasks = useMemo(() => {\n const all = data?.planmagnetWorkItems?.items ?? [];\n const query = search.trim().toLowerCase();\n return all.filter((t) => {\n if (priority !== \"ALL\" && t.priority !== priority) return false;\n if (type !== \"ALL\" && t.type !== type) return false;\n if (assigneeId && t.assigneeId !== assigneeId) return false;\n if (query) {\n const hay = [t.title, t.key, ...(t.labels ?? [])]\n .join(\" \")\n .toLowerCase();\n if (!hay.includes(query)) return false;\n }\n return true;\n });\n }, [data, priority, type, search, assigneeId]);\n\n const { anchor, rangeStart, rangeEnd, days } = useMemo(() => {\n const base = new Date();\n if (mode === \"week\") {\n const a = addWeeks(base, offset);\n const s = startOfWeek(a, WEEK_OPTS);\n const e = endOfWeek(a, WEEK_OPTS);\n return {\n anchor: a,\n rangeStart: s,\n rangeEnd: e,\n days: eachDayOfInterval({ start: s, end: e }),\n };\n }\n const a = addMonths(base, offset);\n const s = startOfWeek(startOfMonth(a), WEEK_OPTS);\n const e = endOfWeek(endOfMonth(a), WEEK_OPTS);\n return {\n anchor: a,\n rangeStart: s,\n rangeEnd: e,\n days: eachDayOfInterval({ start: s, end: e }),\n };\n }, [mode, offset]);\n\n const { byDay, overdue, undated } = useMemo(() => {\n const map = new Map<string, Task[]>();\n const od: Task[] = [];\n const ud: Task[] = [];\n for (const t of tasks) {\n const d = parseDate(t.dueDate);\n if (!d) {\n ud.push(t);\n continue;\n }\n // Overdue work lives only in the banner — not also in its day cell —\n // so it isn't shown twice when the overdue day falls in the view range.\n if (isOverdue(t.dueDate, t.status)) {\n od.push(t);\n continue;\n }\n const k = dayKey(d);\n const arr = map.get(k);\n if (arr) arr.push(t);\n else map.set(k, [t]);\n }\n return { byDay: map, overdue: od, undated: ud };\n }, [tasks]);\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n Timeline: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n const rangeLabel =\n mode === \"week\"\n ? `${format(rangeStart, \"MMM d\")} – ${format(rangeEnd, \"MMM d\")}`\n : format(anchor, \"MMMM yyyy\");\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Controls */}\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setOffset((o) => o - 1)}\n aria-label=\"Previous\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md border border-border text-muted-foreground hover:bg-muted/50\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setOffset(0)}\n className=\"h-8 rounded-md border border-border px-3 text-xs font-medium text-foreground hover:bg-muted/50\"\n >\n {L.today}\n </button>\n <button\n type=\"button\"\n onClick={() => setOffset((o) => o + 1)}\n aria-label=\"Next\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md border border-border text-muted-foreground hover:bg-muted/50\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n <span className=\"ml-2 text-sm font-medium text-foreground\">\n {rangeLabel}\n </span>\n </div>\n <div className=\"inline-flex rounded-md border border-border p-0.5\">\n {([\"week\", \"month\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => {\n setMode(m);\n setOffset(0);\n }}\n className={cn(\n \"rounded px-3 py-1 text-xs font-medium capitalize transition-colors\",\n mode === m\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {m === \"week\" ? L.week : L.month}\n </button>\n ))}\n </div>\n </div>\n\n {/* Overdue banner (relative to today, always meaningful) */}\n {overdue.length > 0 && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2\">\n <p className=\"mb-1 text-xs font-semibold text-destructive\">\n {L.overdue.replace(\"{n}\", String(overdue.length))}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {overdue.map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n tone=\"destructive\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Milestones strip (AC-04: at least one milestone marker) */}\n {milestones.length > 0 && (\n <div className=\"rounded-md border border-primary/30 bg-primary/5 px-3 py-2\">\n <p className=\"mb-1 flex items-center gap-1 text-xs font-semibold text-primary\">\n <Flag className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {L.milestones}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {milestones.map((m) => (\n <MilestoneFlag key={m.id} milestone={m} />\n ))}\n </div>\n </div>\n )}\n\n {/* Schedule grid */}\n {mode === \"week\" ? (\n <div className=\"grid grid-cols-7 gap-2\">\n {days.map((day) => {\n const items = byDay.get(dayKey(day)) ?? [];\n const dayMilestones = milestonesByDay.get(dayKey(day)) ?? [];\n const today = isToday(day);\n return (\n <div\n key={dayKey(day)}\n className={cn(\n \"flex min-h-32 flex-col rounded-lg border p-2\",\n today\n ? \"border-primary/50 bg-primary/5\"\n : \"border-border bg-muted/20\",\n )}\n >\n <div className=\"mb-2 flex items-baseline justify-between\">\n <span\n className={cn(\n \"text-xs font-semibold uppercase\",\n today ? \"text-primary\" : \"text-muted-foreground\",\n )}\n >\n {format(day, \"EEE\")}\n </span>\n <span\n className={cn(\n \"text-sm font-semibold\",\n today ? \"text-primary\" : \"text-foreground\",\n )}\n >\n {format(day, \"d\")}\n </span>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {dayMilestones.map((m) => (\n <MilestoneFlag key={m.id} milestone={m} compact />\n ))}\n {items.map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-7 gap-1\">\n {[\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"].map((d) => (\n <div\n key={d}\n className=\"px-1 pb-1 text-center text-[10px] font-semibold uppercase text-muted-foreground\"\n >\n {d}\n </div>\n ))}\n {days.map((day) => {\n const items = byDay.get(dayKey(day)) ?? [];\n const today = isToday(day);\n const inMonth = isSameMonth(day, anchor);\n return (\n <div\n key={dayKey(day)}\n className={cn(\n \"flex min-h-20 flex-col gap-1 rounded-md border p-1\",\n today\n ? \"border-primary/50 bg-primary/5\"\n : \"border-border/60 bg-muted/10\",\n !inMonth && \"opacity-40\",\n )}\n >\n <span\n className={cn(\n \"text-[10px] font-semibold\",\n today ? \"text-primary\" : \"text-muted-foreground\",\n )}\n >\n {format(day, \"d\")}\n </span>\n {items.slice(0, 3).map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n compact\n />\n ))}\n {items.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{items.length - 3} {L.more}\n </span>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Undated work */}\n {undated.length > 0 && (\n <div className=\"rounded-md border border-border bg-muted/20 px-3 py-2\">\n <p className=\"mb-1 text-xs font-semibold text-muted-foreground\">\n {L.noDueDate.replace(\"{n}\", String(undated.length))}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {undated.map((t) => (\n <TaskChip\n key={t.id}\n task={t}\n onSelect={onSelect}\n resolveAssignee={resolveAssignee}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/** A milestone rendered as a flag chip on the timeline (name + due date). */\nfunction MilestoneFlag({\n milestone,\n compact,\n}: {\n milestone: Milestone;\n compact?: boolean;\n}) {\n const due = formatDueDate(milestone.dueDate);\n return (\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1 rounded-md border border-primary/40 bg-primary/10 px-1.5 py-1 text-[11px] font-medium text-primary\",\n compact && \"w-full\",\n )}\n title={milestone.name + (due ? ` · ${due}` : \"\")}\n >\n <Flag className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{milestone.name}</span>\n {!compact && due && (\n <span className=\"shrink-0 text-primary/70\">· {due}</span>\n )}\n </span>\n );\n}\n\nfunction TaskChip({\n task,\n onSelect,\n resolveAssignee,\n tone,\n compact,\n}: {\n task: Task;\n onSelect?: (id: string) => void;\n resolveAssignee?: ResolveAssignee;\n tone?: \"destructive\";\n compact?: boolean;\n}) {\n const resolved = task.assigneeId ? resolveAssignee?.(task.assigneeId) : null;\n const interactive = Boolean(onSelect);\n return (\n <button\n type=\"button\"\n disabled={!interactive}\n onClick={interactive ? () => onSelect?.(task.id) : undefined}\n title={task.title}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md border px-1.5 py-1 text-left transition-colors\",\n tone === \"destructive\"\n ? \"border-destructive/40 bg-card hover:bg-destructive/5\"\n : \"border-border bg-card hover:border-primary/50\",\n interactive ? \"cursor-pointer\" : \"cursor-default\",\n )}\n >\n <PriorityIndicator priority={task.priority} />\n <span className=\"min-w-0 flex-1 truncate text-[11px] font-medium text-foreground\">\n {task.title}\n </span>\n {!compact && (\n <Avatar id={task.assigneeId} name={resolved?.name} size=\"sm\" />\n )}\n </button>\n );\n}\n","import { type ComponentType } from \"react\";\nimport {\n CalendarRange,\n LayoutGrid,\n List as ListIcon,\n Plus,\n Search,\n User,\n type LucideProps,\n} from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport {\n TASK_PRIORITIES,\n TASK_TYPES,\n type TaskPriority,\n type TaskType,\n} from \"../types\";\n\n/** The three task views the toolbar can switch between. */\nexport type TaskView = \"board\" | \"list\" | \"timeline\";\n\nconst VIEW_ICONS: Record<TaskView, ComponentType<LucideProps>> = {\n board: LayoutGrid,\n list: ListIcon,\n timeline: CalendarRange,\n};\n\nexport interface TaskToolbarProps {\n view: TaskView;\n onViewChange: (view: TaskView) => void;\n /** Which views to offer (order preserved). Defaults to all three. */\n views?: TaskView[];\n search: string;\n onSearchChange: (search: string) => void;\n priority: TaskPriority | \"ALL\";\n onPriorityChange: (priority: TaskPriority | \"ALL\") => void;\n type: TaskType | \"ALL\";\n onTypeChange: (type: TaskType | \"ALL\") => void;\n onNewTask?: () => void;\n canCreate?: boolean;\n /** \"My tasks\" toggle — only rendered when `onMineChange` is provided. */\n mine?: boolean;\n onMineChange?: (mine: boolean) => void;\n className?: string;\n}\n\nconst SELECT_CLASS =\n \"h-8 rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground capitalize transition-colors hover:bg-muted/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\";\n\n/**\n * TaskToolbar — the single Linear-style control bar for the Tasks experience:\n * view tabs (Board / List / Timeline) + search + priority/type filters + a\n * \"New task\" action. Fully controlled; semantic-token only.\n */\nexport function TaskToolbar({\n view,\n onViewChange,\n views = [\"board\", \"list\", \"timeline\"],\n search,\n onSearchChange,\n priority,\n onPriorityChange,\n type,\n onTypeChange,\n onNewTask,\n canCreate,\n mine,\n onMineChange,\n className,\n}: TaskToolbarProps) {\n const L = useTaskLabels();\n const viewLabel: Record<TaskView, string> = {\n board: L.board,\n list: L.list,\n timeline: L.timeline,\n };\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-between gap-3 border-b border-border pb-2\",\n className,\n )}\n >\n {/* View tabs — underline style */}\n <div\n className=\"flex items-center gap-1\"\n role=\"tablist\"\n aria-label=\"Task views\"\n >\n {views.map((v) => {\n const Icon = VIEW_ICONS[v];\n const active = v === view;\n return (\n <button\n key={v}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onViewChange(v)}\n className={cn(\n \"relative flex items-center gap-1.5 rounded-t-md px-2.5 py-1.5 text-sm font-medium transition-colors\",\n active\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon className=\"h-4 w-4\" aria-hidden=\"true\" />\n {viewLabel[v]}\n {active && (\n <span className=\"absolute inset-x-1 -bottom-[9px] h-0.5 rounded-full bg-primary\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Search + filters + New task */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <input\n type=\"search\"\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={L.searchPlaceholder}\n aria-label={L.searchPlaceholder}\n className=\"h-8 w-40 rounded-md border border-border bg-background pl-7 pr-2 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n\n {onMineChange && (\n <button\n type=\"button\"\n onClick={() => onMineChange(!mine)}\n aria-pressed={mine}\n className={cn(\n \"flex h-8 items-center gap-1.5 rounded-md border px-2.5 text-xs font-medium transition-colors\",\n mine\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted/50 hover:text-foreground\",\n )}\n >\n <User className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {L.myTasks}\n </button>\n )}\n\n <select\n value={priority}\n onChange={(e) =>\n onPriorityChange(e.target.value as TaskPriority | \"ALL\")\n }\n aria-label={L.priorityLabel}\n className={SELECT_CLASS}\n >\n <option value=\"ALL\">{L.allPriorities}</option>\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {L.priority[p]}\n </option>\n ))}\n </select>\n\n <select\n value={type}\n onChange={(e) => onTypeChange(e.target.value as TaskType | \"ALL\")}\n aria-label={L.typeLabel}\n className={SELECT_CLASS}\n >\n <option value=\"ALL\">{L.allTypes}</option>\n {TASK_TYPES.map((t) => (\n <option key={t} value={t}>\n {L.type[t]}\n </option>\n ))}\n </select>\n\n {canCreate && onNewTask && (\n <button\n type=\"button\"\n onClick={onNewTask}\n className=\"flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n {L.newTask}\n </button>\n )}\n </div>\n </div>\n );\n}\n","import {\n useEffect,\n useMemo,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { useApolloClient, useMutation, useQuery } from \"@apollo/client/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { Trash2 } from \"lucide-react\";\nimport {\n DELETE_WORK_ITEM,\n GET_WORK_ITEM,\n LIST_WORK_ITEMS,\n UPDATE_WORK_ITEM,\n} from \"../graphql-ops\";\nimport { getPlanMagnetConfig } from \"../config\";\nimport { cn } from \"../utils/cn\";\nimport { toIsoDate } from \"../utils/dates\";\nimport { Avatar, Badge } from \"../ui\";\nimport { useTaskLabels } from \"../i18n/labels\";\nimport type { AssigneeOption, ResolveAssignee } from \"./TaskCard\";\nimport {\n TASK_PRIORITIES,\n TASK_STATUSES,\n TASK_TYPES,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\n type UpdateTaskInput,\n type WorkItemDetail,\n} from \"../types\";\n\ntype GetWorkItemResult = { planmagnetWorkItem: WorkItemDetail | null };\ntype UpdateWorkItemResult = { planmagnetUpdateWorkItem: WorkItemDetail };\n\n/** Fields that can be hidden / suppressed on the detail view + edit form. */\nexport type TaskDetailField =\n | \"description\"\n | \"type\"\n | \"status\"\n | \"priority\"\n | \"assignee\"\n | \"dueDate\"\n | \"labels\"\n | \"storyPoints\";\n\nexport interface TaskDetailCoreProps {\n /** Work-item id to fetch + edit. Required. */\n id: string;\n /** Start in read-only mode with no edit affordance. */\n readonly?: boolean;\n /** Field names to hide. */\n hiddenFields?: TaskDetailField[];\n /** Hide the header (key + title). */\n hideHeader?: boolean;\n /** Called with the updated work item after a successful save. */\n onUpdated?: (workItem: WorkItemDetail) => void;\n /** Called after a successful delete (with the deleted id). Enables the Delete button. */\n onDeleted?: (id: string) => void;\n /** Called when a mutation errors. */\n onError?: (error: Error) => void;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /** Optional host-provided member directory → renders a picker instead of a raw id field. */\n assigneeOptions?: AssigneeOption[];\n /** Extra classes on the root container. */\n className?: string;\n}\n\nconst fieldClass =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\";\nconst labelClass =\n \"text-xs font-medium uppercase tracking-wide text-muted-foreground\";\n\nconst priorityVariant: Record<\n TaskPriority,\n \"muted\" | \"secondary\" | \"accent\" | \"destructive\"\n> = {\n NONE: \"muted\",\n LOW: \"muted\",\n MEDIUM: \"secondary\",\n HIGH: \"accent\",\n CRITICAL: \"destructive\",\n};\n\n/**\n * TaskDetailCore — provider-less, prop-driven single work-item view with inline\n * edit. Fetches via `planmagnetWorkItem(id)`, saves via\n * `planmagnetUpdateWorkItem`. BYO-Apollo, semantic-token only, farm-free.\n */\nexport function TaskDetailCore({\n id,\n readonly,\n hiddenFields,\n hideHeader,\n onUpdated,\n onDeleted,\n onError,\n resolveAssignee,\n assigneeOptions,\n className,\n}: TaskDetailCoreProps) {\n const client = useApolloClient();\n const L = useTaskLabels();\n const hidden = useMemo(\n () => new Set<TaskDetailField>(hiddenFields ?? []),\n [hiddenFields],\n );\n\n const { data, loading, error } = useQuery<GetWorkItemResult>(GET_WORK_ITEM, {\n variables: { id },\n skip: !id,\n });\n const item = data?.planmagnetWorkItem ?? null;\n\n const [editing, setEditing] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [type, setType] = useState<TaskType>(\"TASK\");\n const [status, setStatus] = useState<TaskStatus>(\"BACKLOG\");\n const [priority, setPriority] = useState<TaskPriority>(\"NONE\");\n const [assigneeId, setAssigneeId] = useState(\"\");\n const [dueDate, setDueDate] = useState(\"\");\n const [labels, setLabels] = useState(\"\");\n const [storyPoints, setStoryPoints] = useState(\"\");\n\n // Hydrate the edit form from the fetched item whenever it (re)loads.\n useEffect(() => {\n if (!item) return;\n setTitle(item.title);\n setDescription(item.description ?? \"\");\n setType(item.type);\n setStatus(item.status);\n setPriority(item.priority);\n setAssigneeId(item.assigneeId ?? \"\");\n setDueDate(item.dueDate ? String(item.dueDate).slice(0, 10) : \"\");\n setLabels((item.labels ?? []).join(\", \"));\n setStoryPoints(item.storyPoints != null ? String(item.storyPoints) : \"\");\n }, [item]);\n\n const [updateWorkItem, { loading: saving, error: saveError }] =\n useMutation<UpdateWorkItemResult>(UPDATE_WORK_ITEM);\n const [deleteWorkItem, { loading: deleting, error: deleteError }] =\n useMutation<{ planmagnetDeleteWorkItem: boolean }>(DELETE_WORK_ITEM);\n\n const handleDelete = async () => {\n if (!item) return;\n try {\n await deleteWorkItem({ variables: { id: item.id } });\n // Evict from cache so the board/list drop it, then refetch the lists.\n client.cache.evict({\n id: client.cache.identify({ __typename: \"WorkItem\", id: item.id }),\n });\n client.cache.gc();\n void client\n .refetchQueries({ include: [LIST_WORK_ITEMS] })\n .catch(() => {});\n onDeleted?.(item.id);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n const handleSave = async (e: FormEvent) => {\n e.preventDefault();\n if (!item) return;\n\n const parsedLabels = labels\n .split(\",\")\n .map((l) => l.trim())\n .filter(Boolean);\n const parsedPoints = storyPoints.trim() ? Number(storyPoints) : undefined;\n\n const input: UpdateTaskInput = {\n title: title.trim(),\n ...(hidden.has(\"description\") ? {} : { description: description.trim() }),\n ...(hidden.has(\"type\") ? {} : { type }),\n ...(hidden.has(\"status\") ? {} : { status }),\n ...(hidden.has(\"priority\") ? {} : { priority }),\n ...(hidden.has(\"assignee\") ? {} : { assigneeId: assigneeId.trim() }),\n ...(hidden.has(\"dueDate\") ? {} : { dueDate: toIsoDate(dueDate) }),\n ...(hidden.has(\"labels\") ? {} : { labels: parsedLabels }),\n ...(hidden.has(\"storyPoints\") ||\n parsedPoints == null ||\n Number.isNaN(parsedPoints)\n ? {}\n : { storyPoints: parsedPoints }),\n };\n\n try {\n const result = await updateWorkItem({\n variables: { id: item.id, input },\n });\n const updated = result.data?.planmagnetUpdateWorkItem;\n if (updated) {\n const cfg = getPlanMagnetConfig();\n try {\n await cfg.onTaskSaved?.({\n id: updated.id,\n key: updated.key,\n title: updated.title,\n projectId: updated.projectId,\n operation: \"updated\",\n });\n } catch {\n // Host callback errors must never break the save flow.\n }\n onUpdated?.(updated);\n setEditing(false);\n }\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n if (!id) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TaskDetail: no work-item id provided.\n </div>\n );\n }\n\n if (loading && !data) {\n return (\n <div className={cn(\"flex items-center justify-center p-12\", className)}>\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n\n if (error && !data) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n {L.errorLoading}: {error.message}\n </div>\n );\n }\n\n if (!item) {\n return (\n <div className={cn(\"p-6 text-sm text-muted-foreground\", className)}>\n {L.taskNotFound}\n </div>\n );\n }\n\n const canEdit = !readonly;\n\n return (\n <Card className={cn(\"shadow-sm\", className)}>\n <CardContent className=\"space-y-4 p-6\">\n {!hideHeader && (\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <p className=\"text-xs text-muted-foreground\">{item.key}</p>\n <h2 className=\"text-xl font-semibold text-foreground\">\n {item.title}\n </h2>\n </div>\n {canEdit && !editing && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {onDeleted &&\n (confirmingDelete ? (\n <span className=\"flex items-center gap-1 text-xs\">\n <span className=\"text-muted-foreground\">\n {L.deletePrompt}\n </span>\n <button\n type=\"button\"\n disabled={deleting}\n onClick={handleDelete}\n className=\"rounded bg-destructive px-2 py-1 font-medium text-destructive-foreground disabled:opacity-50\"\n >\n {deleting ? \"…\" : L.yes}\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded bg-muted px-2 py-1 text-muted-foreground\"\n >\n {L.no}\n </button>\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n title={L.del}\n aria-label={L.del}\n className=\"rounded-md p-1.5 text-destructive hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className=\"rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground\"\n >\n {L.edit}\n </button>\n </div>\n )}\n </div>\n )}\n {deleteError && (\n <p className=\"text-sm text-destructive\">\n {L.failedToDelete}: {deleteError.message}\n </p>\n )}\n\n {!editing ? (\n <dl className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <Field label={L.typeLabel}>\n <Badge variant=\"secondary\">{L.type[item.type]}</Badge>\n </Field>\n )}\n {!hidden.has(\"status\") && (\n <Field label={L.statusLabel}>\n <span className=\"capitalize text-foreground\">\n {L.status[item.status]}\n </span>\n </Field>\n )}\n {!hidden.has(\"priority\") && (\n <Field label={L.priorityLabel}>\n <Badge variant={priorityVariant[item.priority]}>\n {L.priority[item.priority]}\n </Badge>\n </Field>\n )}\n {!hidden.has(\"assignee\") && (\n <Field label={L.assigneeLabel}>\n {item.assigneeId ? (\n <span className=\"flex items-center gap-1.5\">\n <Avatar\n id={item.assigneeId}\n name={resolveAssignee?.(item.assigneeId)?.name}\n size=\"sm\"\n />\n <span className=\"text-foreground\">\n {resolveAssignee?.(item.assigneeId)?.name ?? L.assigned}\n </span>\n </span>\n ) : (\n <span className=\"text-muted-foreground\">{L.unassigned}</span>\n )}\n </Field>\n )}\n {!hidden.has(\"dueDate\") && (\n <Field label={L.dueDateLabel}>\n <span className=\"text-foreground\">{item.dueDate ?? \"—\"}</span>\n </Field>\n )}\n {!hidden.has(\"storyPoints\") && (\n <Field label={L.storyPointsLabel}>\n <span className=\"text-foreground\">{item.storyPoints ?? 0}</span>\n </Field>\n )}\n {!hidden.has(\"description\") && (\n <div className=\"sm:col-span-2\">\n <dt className={labelClass}>{L.description}</dt>\n <dd className=\"mt-1 whitespace-pre-wrap text-sm text-foreground\">\n {item.description || \"—\"}\n </dd>\n </div>\n )}\n {!hidden.has(\"labels\") && (\n <div className=\"sm:col-span-2\">\n <dt className={labelClass}>{L.labelsLabel}</dt>\n <dd className=\"mt-1 flex flex-wrap gap-1\">\n {(item.labels ?? []).length === 0 ? (\n <span className=\"text-sm text-muted-foreground\">—</span>\n ) : (\n item.labels.map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\"\n >\n {l}\n </span>\n ))\n )}\n </dd>\n </div>\n )}\n </dl>\n ) : (\n <form onSubmit={handleSave} className=\"space-y-4\">\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-title\" className={labelClass}>\n {L.title}\n </label>\n <input\n id=\"pm-detail-title\"\n className={fieldClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n required\n />\n </div>\n\n {!hidden.has(\"description\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-desc\" className={labelClass}>\n {L.description}\n </label>\n <textarea\n id=\"pm-detail-desc\"\n className={cn(fieldClass, \"min-h-[80px]\")}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-type\" className={labelClass}>\n {L.typeLabel}\n </label>\n <select\n id=\"pm-detail-type\"\n className={cn(fieldClass, \"capitalize\")}\n value={type}\n onChange={(e) => setType(e.target.value as TaskType)}\n >\n {TASK_TYPES.map((t) => (\n <option key={t} value={t}>\n {L.type[t]}\n </option>\n ))}\n </select>\n </div>\n )}\n {!hidden.has(\"status\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-status\" className={labelClass}>\n {L.statusLabel}\n </label>\n <select\n id=\"pm-detail-status\"\n className={cn(fieldClass, \"capitalize\")}\n value={status}\n onChange={(e) => setStatus(e.target.value as TaskStatus)}\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>\n {L.status[s]}\n </option>\n ))}\n </select>\n </div>\n )}\n {!hidden.has(\"priority\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-priority\" className={labelClass}>\n {L.priorityLabel}\n </label>\n <select\n id=\"pm-detail-priority\"\n className={cn(fieldClass, \"capitalize\")}\n value={priority}\n onChange={(e) =>\n setPriority(e.target.value as TaskPriority)\n }\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {L.priority[p]}\n </option>\n ))}\n </select>\n </div>\n )}\n {!hidden.has(\"assignee\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-assignee\" className={labelClass}>\n {L.assigneeLabel}\n </label>\n {assigneeOptions && assigneeOptions.length > 0 ? (\n <select\n id=\"pm-detail-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n >\n <option value=\"\">{L.unassigned}</option>\n {assigneeOptions.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n id=\"pm-detail-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n placeholder={L.assigneePlaceholder}\n />\n )}\n </div>\n )}\n {!hidden.has(\"dueDate\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-due\" className={labelClass}>\n {L.dueDateLabel}\n </label>\n <input\n id=\"pm-detail-due\"\n type=\"date\"\n className={fieldClass}\n value={dueDate}\n onChange={(e) => setDueDate(e.target.value)}\n />\n </div>\n )}\n {!hidden.has(\"storyPoints\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-points\" className={labelClass}>\n {L.storyPointsLabel}\n </label>\n <input\n id=\"pm-detail-points\"\n type=\"number\"\n min={0}\n className={fieldClass}\n value={storyPoints}\n onChange={(e) => setStoryPoints(e.target.value)}\n />\n </div>\n )}\n </div>\n\n {!hidden.has(\"labels\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-labels\" className={labelClass}>\n {L.labelsLabel}\n </label>\n <input\n id=\"pm-detail-labels\"\n className={fieldClass}\n value={labels}\n onChange={(e) => setLabels(e.target.value)}\n placeholder={L.labelsPlaceholder}\n />\n </div>\n )}\n\n {saveError && (\n <p className=\"text-sm text-destructive\">\n {L.failedToSave}: {saveError.message}\n </p>\n )}\n\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"rounded-md bg-muted px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/70\"\n >\n {L.cancel}\n </button>\n <button\n type=\"submit\"\n disabled={saving || !title.trim()}\n className={cn(\n \"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground\",\n (saving || !title.trim()) && \"cursor-not-allowed opacity-50\",\n )}\n >\n {saving ? L.saving : L.save}\n </button>\n </div>\n </form>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction Field({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div>\n <dt className={labelClass}>{label}</dt>\n <dd className=\"mt-1 text-sm\">{children}</dd>\n </div>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TaskDetailCore, type TaskDetailCoreProps } from \"./TaskDetailCore\";\n\nexport interface TaskDetailProps extends TaskDetailCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required (scopes the client headers). */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TaskDetail — standalone, embeddable single work-item view with inline edit.\n *\n * Thin wrapper that self-provisions (or accepts) an Apollo client via\n * PlanMagnetProvider, then renders TaskDetailCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * @example\n * ```tsx\n * <TaskDetail\n * workspaceClient={hostClient}\n * workspaceId=\"ws-123\"\n * id=\"wi-1\"\n * onUpdated={(wi) => console.log(wi)}\n * />\n * ```\n */\nexport function TaskDetail({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TaskDetailProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TaskDetailCore {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n","import { useCallback, useEffect, useState, type ReactNode } from \"react\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { TaskBoardCore } from \"./TaskBoardCore\";\nimport { TaskListCore } from \"./TaskListCore\";\nimport { TaskTimelineCore } from \"./TaskTimelineCore\";\nimport { TaskToolbar, type TaskView } from \"./TaskToolbar\";\nimport { CreateTaskCore, type CreateTaskField } from \"./CreateTaskCore\";\nimport { TaskDetailCore, type TaskDetailField } from \"./TaskDetailCore\";\nimport { type AssigneeOption, type ResolveAssignee } from \"./TaskCard\";\nimport { Modal, Drawer, type RenderLinkIcon } from \"../ui\";\nimport {\n TaskLabelsProvider,\n mergeTaskLabels,\n type PartialTaskLabels,\n} from \"../i18n/labels\";\nimport { cn } from \"../utils/cn\";\nimport type {\n BoardColumn,\n Task,\n TaskPriority,\n TaskType,\n WorkItemDetail,\n} from \"../types\";\n\n/**\n * Which SDK fields the composed page should suppress. The union of the create\n * form fields and the detail fields — the page fans a single `hiddenFields`\n * prop out to the board, create form, and detail view so hosts configure the\n * whole experience in one place.\n */\nexport type TasksPageField = CreateTaskField | TaskDetailField;\n\n/** Payload passed to `onTaskSaved` when a create/update completes. */\nexport interface TasksPageSaved {\n workItem: WorkItemDetail;\n operation: \"created\" | \"updated\";\n}\n\nexport interface TasksPageCoreProps {\n /**\n * Explicit workspace ID. Falls back to the PlanMagnetProvider context. At\n * least one must be present or the board query is skipped.\n */\n workspaceId?: string;\n /**\n * Project the \"New task\" flow creates work items in. REQUIRED for create —\n * the backend `PlanmagnetCreateWorkItemInput.projectId` is non-null. When\n * omitted the board still renders read-only-ish (create is disabled).\n */\n projectId?: string;\n /** Scope the views to a single project (client-side filter). */\n boardProjectId?: string;\n /** Board columns to render (defaults to DEFAULT_BOARD_COLUMNS). */\n columns?: BoardColumn[];\n /** Read-only — hides the \"New task\" button, disables drag + detail editing. */\n readonly?: boolean;\n /**\n * Field names to hide across the board cards, create form, and detail view.\n * A product-agnostic hook so hosts can suppress fields that don't apply.\n */\n hiddenFields?: TasksPageField[];\n /** Which views to offer (order preserved). Defaults to all three. */\n views?: TaskView[];\n /** Initial view. Defaults to \"board\". */\n defaultView?: TaskView;\n /** Optional host hook to resolve an assignee id → display name. */\n resolveAssignee?: ResolveAssignee;\n /**\n * When set, the board + list fetch WorkItemLinks for this `sourceProduct`\n * (e.g. \"healthybowl\") and render linked-record chips / a \"Linked Record\"\n * column. Omitted → no link fetch (SDK stays farm-free).\n */\n linkSourceProduct?: string;\n /** Optional host hook to render an icon per linked-entity type. */\n renderLinkIcon?: RenderLinkIcon;\n /** Optional host-provided member directory → renders assignee pickers in create/edit. */\n assigneeOptions?: AssigneeOption[];\n /**\n * The current user's actor id. When provided, the toolbar shows a \"My tasks\"\n * toggle that filters every view to items assigned to this actor.\n */\n currentActorId?: string;\n /** Host-provided translations for every UI string (English defaults otherwise). */\n labels?: PartialTaskLabels;\n /**\n * Open a specific work item's detail on mount / when this changes — e.g. a\n * deep-link from the calendar (`/tasks?item=<id>`). Cleared internally when\n * the user closes the drawer; pass a new value to re-open.\n */\n openItemId?: string;\n /**\n * Header/title slot rendered ABOVE the toolbar. Pass a string for the default\n * heading, or any node to fully own the title area. Omit for no title (e.g.\n * when the host shell already renders the page title).\n */\n header?: ReactNode;\n /** Called after a successful create OR update (board is refetched first). */\n onTaskSaved?: (saved: TasksPageSaved) => void;\n /** How the create form is surfaced. Defaults to \"modal\". */\n createSurface?: \"modal\" | \"inline\";\n /** How the detail view is surfaced. Defaults to \"drawer\". */\n detailSurface?: \"drawer\" | \"inline\";\n /** Extra classes on the root container. */\n className?: string;\n}\n\n/**\n * TasksPageCore — a complete, provider-less, BYO-Apollo Tasks experience in a\n * single mount. A Linear-style shell: one toolbar (Board / List / Timeline tabs\n * + search + priority/type filters + \"New task\"), the selected view, a create\n * modal, and a click-to-open detail drawer.\n *\n * BYO-Apollo: reads the ambient `<ApolloProvider>` and takes `workspaceId` from\n * a prop or the PlanMagnetProvider context. Semantic tokens only, farm-free.\n */\nexport function TasksPageCore({\n workspaceId: workspaceIdProp,\n projectId,\n boardProjectId,\n columns,\n readonly,\n hiddenFields,\n views,\n defaultView = \"board\",\n resolveAssignee,\n linkSourceProduct,\n renderLinkIcon,\n assigneeOptions,\n currentActorId,\n labels,\n openItemId,\n header,\n onTaskSaved,\n createSurface = \"modal\",\n detailSurface = \"drawer\",\n className,\n}: TasksPageCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n const client = useApolloClient();\n const mergedLabels = mergeTaskLabels(labels);\n\n const [view, setView] = useState<TaskView>(defaultView);\n const [search, setSearch] = useState(\"\");\n const [priority, setPriority] = useState<TaskPriority | \"ALL\">(\"ALL\");\n const [type, setType] = useState<TaskType | \"ALL\">(\"ALL\");\n // \"My tasks\" quick-filter — only offered when the host passes currentActorId.\n const [mine, setMine] = useState(false);\n\n const [creating, setCreating] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n // Deep-link support: open a specific work item's detail when the host passes\n // an `openItemId` (e.g. a calendar → task click). Re-fires whenever it\n // changes so navigating between two task deep-links re-opens the drawer.\n useEffect(() => {\n if (openItemId) setSelectedId(openItemId);\n }, [openItemId]);\n\n // Refetch the views' list query after a create/update so they reflect the\n // change without remounting (preserves local filter/sort state).\n const refetchBoard = useCallback(() => {\n void client.refetchQueries({ include: [LIST_WORK_ITEMS] }).catch(() => {});\n }, [client]);\n\n const handleCreated = useCallback(\n (workItem: WorkItemDetail) => {\n refetchBoard();\n setCreating(false);\n onTaskSaved?.({ workItem, operation: \"created\" });\n },\n [refetchBoard, onTaskSaved],\n );\n\n const handleUpdated = useCallback(\n (workItem: WorkItemDetail) => {\n refetchBoard();\n onTaskSaved?.({ workItem, operation: \"updated\" });\n },\n [refetchBoard, onTaskSaved],\n );\n\n const handleDeleted = useCallback(() => {\n // The detail component already evicted + refetched the list; just close.\n setSelectedId(null);\n }, []);\n\n const handleTaskClick = useCallback((task: Task) => {\n setSelectedId(task.id);\n }, []);\n const handleSelect = useCallback((id: string) => setSelectedId(id), []);\n\n if (!workspaceId) {\n return (\n <div className={cn(\"p-6 text-sm text-destructive\", className)}>\n TasksPage: no workspaceId provided (prop or PlanMagnetProvider).\n </div>\n );\n }\n\n const canCreate = !readonly && Boolean(projectId);\n const showInlineCreate = creating && createSurface === \"inline\";\n const showInlineDetail = selectedId != null && detailSurface === \"inline\";\n\n const createForm = (\n <CreateTaskCore\n workspaceId={workspaceId}\n projectId={projectId}\n assigneeOptions={assigneeOptions}\n hiddenFields={hiddenFields}\n onCreated={handleCreated}\n onCancel={() => setCreating(false)}\n />\n );\n\n const detailView =\n selectedId != null ? (\n <TaskDetailCore\n id={selectedId}\n readonly={readonly}\n hiddenFields={hiddenFields}\n resolveAssignee={resolveAssignee}\n assigneeOptions={assigneeOptions}\n onUpdated={handleUpdated}\n onDeleted={handleDeleted}\n />\n ) : null;\n\n // Server-side filter for the list view maps \"ALL\" → undefined.\n const listPriority = priority === \"ALL\" ? undefined : priority;\n const listType = type === \"ALL\" ? undefined : type;\n // \"My tasks\" → filter every view to the current actor's assignments.\n const mineAssignee = mine && currentActorId ? currentActorId : undefined;\n // Show the \"Linked Record\" column only when the host opts into link fetching;\n // otherwise fall back to the list's default column set.\n const listColumns = linkSourceProduct\n ? ([\n \"title\",\n \"status\",\n \"priority\",\n \"assignee\",\n \"dueDate\",\n \"linkedRecord\",\n ] as const)\n : undefined;\n\n return (\n <TaskLabelsProvider value={mergedLabels}>\n <div className={cn(\"space-y-4 p-6\", className)}>\n {header && (\n <div className=\"min-w-0\">\n {typeof header === \"string\" ? (\n <h1 className=\"truncate text-2xl font-semibold text-foreground\">\n {header}\n </h1>\n ) : (\n header\n )}\n </div>\n )}\n\n <TaskToolbar\n view={view}\n onViewChange={setView}\n views={views}\n search={search}\n onSearchChange={setSearch}\n priority={priority}\n onPriorityChange={setPriority}\n type={type}\n onTypeChange={setType}\n onNewTask={() => setCreating(true)}\n canCreate={canCreate}\n mine={mine}\n onMineChange={currentActorId ? setMine : undefined}\n />\n\n {showInlineCreate && <div>{createForm}</div>}\n\n {view === \"board\" && (\n <TaskBoardCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n columns={columns}\n readonly={readonly}\n hideHeader\n priority={priority}\n type={type}\n search={search}\n assigneeId={mineAssignee}\n hiddenFields={hiddenFields}\n resolveAssignee={resolveAssignee}\n linkSourceProduct={linkSourceProduct}\n renderLinkIcon={renderLinkIcon}\n onTaskClick={handleTaskClick}\n />\n )}\n\n {view === \"list\" && (\n <TaskListCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n priority={listPriority}\n type={listType}\n search={search || undefined}\n assigneeId={mineAssignee}\n hideHeader\n resolveAssignee={resolveAssignee}\n linkSourceProduct={linkSourceProduct}\n renderLinkIcon={renderLinkIcon}\n columns={listColumns ? [...listColumns] : undefined}\n onSelect={handleSelect}\n />\n )}\n\n {view === \"timeline\" && (\n <TaskTimelineCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n priority={priority}\n type={type}\n search={search}\n assigneeId={mineAssignee}\n resolveAssignee={resolveAssignee}\n onSelect={handleSelect}\n />\n )}\n\n {showInlineDetail && <div className=\"pb-6\">{detailView}</div>}\n\n {createSurface === \"modal\" && (\n <Modal\n open={creating}\n onClose={() => setCreating(false)}\n ariaLabel=\"Create task\"\n className=\"max-w-xl\"\n >\n <div className=\"p-2 pt-8\">{createForm}</div>\n </Modal>\n )}\n\n {detailSurface === \"drawer\" && (\n <Drawer\n open={selectedId != null}\n onClose={() => setSelectedId(null)}\n ariaLabel=\"Task detail\"\n >\n <div className=\"p-2 pt-8\">{detailView}</div>\n </Drawer>\n )}\n </div>\n </TaskLabelsProvider>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { PlanMagnetProvider } from \"./PlanMagnetProvider\";\nimport { TasksPageCore, type TasksPageCoreProps } from \"./TasksPageCore\";\n\nexport interface TasksPageProps extends TasksPageCoreProps {\n /** Workspace API gateway URL (URL mode). */\n apiGatewayUrl?: string;\n /** Platform identity token. */\n authToken?: string;\n /** Workspace access token (X-Workspace-Authorization). */\n workspaceToken?: string;\n /** Workspace ID. Required. */\n workspaceId: string;\n /** Tenant ID. */\n tenantId?: string;\n /** Organization ID. */\n organizationId?: string;\n /** Optional host allowlist for embedded deployments. */\n trustedOrigins?: string[];\n /** Called on UNAUTHENTICATED / FORBIDDEN. */\n onAuthError?: () => void;\n /** BYO: provide your own already-authed workspace Apollo client. */\n workspaceClient?: ApolloClient;\n}\n\n/**\n * TasksPage — standalone, embeddable, composed Tasks experience.\n *\n * The Phase-3 embed target: a single mount that gives a host app a complete\n * Tasks page (kanban board + \"New task\" create flow + click-to-open detail with\n * inline edit). Thin wrapper that self-provisions (or accepts) an Apollo client\n * via PlanMagnetProvider, then renders TasksPageCore. Mirrors the\n * TaskBoard → TaskBoardCore split.\n *\n * Two mount modes:\n * - URL mode: <TasksPage apiGatewayUrl={..} authToken={..} workspaceId={..} projectId={..} />\n * - BYO mode: <TasksPage workspaceClient={hostClient} workspaceId={..} projectId={..} />\n *\n * @example BYO client (HealthyBowl shell injects its authed client)\n * ```tsx\n * <TasksPage\n * workspaceClient={hostClient}\n * workspaceId=\"ws-123\"\n * projectId=\"proj-1\"\n * header=\"Farm Tasks\"\n * onTaskSaved={({ workItem, operation }) => console.log(operation, workItem)}\n * />\n * ```\n */\nexport function TasksPage({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n organizationId,\n trustedOrigins,\n onAuthError,\n workspaceClient,\n ...coreProps\n}: TasksPageProps) {\n return (\n <PlanMagnetProvider\n apiGatewayUrl={apiGatewayUrl}\n authToken={authToken}\n workspaceToken={workspaceToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n trustedOrigins={trustedOrigins}\n onAuthError={onAuthError}\n workspaceClient={workspaceClient}\n >\n <TasksPageCore workspaceId={workspaceId} {...coreProps} />\n </PlanMagnetProvider>\n );\n}\n"]}
|