@burdenoff/planmagnet-fe-sdk 2026.703.1
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/README.md +162 -0
- package/dist/index.d.ts +840 -0
- package/dist/index.js +1764 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +66 -0
- package/package.json +135 -0
|
@@ -0,0 +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/types/index.ts","../src/components/TaskBoardCore.tsx","../src/components/TaskBoard.tsx","../src/components/CreateTaskCore.tsx","../src/components/CreateTask.tsx","../src/ui/badge.tsx","../src/ui/overlay.tsx","../src/components/TaskListCore.tsx","../src/components/TaskList.tsx","../src/components/TaskDetailCore.tsx","../src/components/TaskDetail.tsx","../src/components/TasksPageCore.tsx","../src/components/TasksPage.tsx"],"names":["config","useMemo","jsx","onError","useState","Card","CardContent","jsxs","useEffect","useQuery","Filter","fieldClass","labelClass","priorityVariant","useMutation"],"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(newConfig: Partial<PlanMagnetConfig>): 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","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\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/** 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 { useMemo, useState } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { Filter } from \"lucide-react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { cn } from \"../utils/cn\";\nimport {\n DEFAULT_BOARD_COLUMNS,\n TASK_PRIORITIES,\n TASK_TYPES,\n type BoardColumn,\n type Task,\n type TaskPriority,\n type TaskType,\n type WorkItemList,\n} from \"../types\";\n\n/**\n * Semantic-token color maps. No raw tailwind palette colors (bg-blue-100 etc.) —\n * the CLAUDE.md rule requires semantic tokens so theming works across brands.\n * These use the fe-libs token surface (primary / muted / destructive / accent /\n * secondary + their -foreground pairs) shipped in styles.css.\n */\nconst columnAccent: Record<string, string> = {\n BACKLOG: \"border-t-muted-foreground/40\",\n TODO: \"border-t-primary/50\",\n IN_PROGRESS: \"border-t-primary\",\n IN_REVIEW: \"border-t-secondary-foreground/50\",\n TESTING: \"border-t-accent-foreground/50\",\n DONE: \"border-t-primary/70\",\n CANCELLED: \"border-t-destructive/60\",\n};\n\nconst priorityTone: Record<TaskPriority, string> = {\n NONE: \"bg-muted text-muted-foreground\",\n LOW: \"bg-muted text-muted-foreground\",\n MEDIUM: \"bg-secondary text-secondary-foreground\",\n HIGH: \"bg-accent text-accent-foreground\",\n CRITICAL: \"bg-destructive/15 text-destructive\",\n};\n\nconst typeTone: Record<TaskType, string> = {\n TASK: \"bg-secondary text-secondary-foreground\",\n STORY: \"bg-primary/10 text-primary\",\n BUG: \"bg-destructive/15 text-destructive\",\n EPIC: \"bg-accent text-accent-foreground\",\n SUB_TASK: \"bg-muted text-muted-foreground\",\n};\n\ntype ListWorkItemsResult = { planmagnetWorkItems: WorkItemList };\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 — hides interactive affordances (no create/drag in Phase 1 either way). */\n readonly?: boolean;\n /** Hide the board header (title + count). */\n hideHeader?: boolean;\n /** Hide the priority/type filter bar. */\n hideFilters?: boolean;\n /**\n * Field names to hide on each task card. Product-agnostic hook so hosts can\n * suppress fields that don't apply. Supported: 'key' | 'priority' | 'type' |\n * 'labels' | 'storyPoints' | 'assignee' | 'dueDate'.\n */\n hiddenFields?: string[];\n /** Called when a task card is clicked. */\n onTaskClick?: (task: Task) => void;\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). It never creates a\n * client and never assumes a router.\n * - `workspaceId` comes from a prop or the PlanMagnetProvider context.\n * - Read-only in Phase 1 (no drag/create). Farm-free: no Field/Crop logic.\n */\nexport function TaskBoardCore({\n projectId,\n columns = DEFAULT_BOARD_COLUMNS,\n readonly: _readonly,\n hideHeader,\n hideFilters,\n hiddenFields,\n onTaskClick,\n className,\n workspaceId: workspaceIdProp,\n}: TaskBoardCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\n\n const [priorityFilter, setPriorityFilter] = useState<TaskPriority | \"ALL\">(\n \"ALL\",\n );\n const [typeFilter, setTypeFilter] = useState<TaskType | \"ALL\">(\"ALL\");\n\n const hidden = useMemo(() => new Set(hiddenFields ?? []), [hiddenFields]);\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 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\n className={cn(\n \"flex items-center justify-center p-12\",\n className,\n )}\n >\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 Error loading tasks: {error.message}\n </div>\n );\n }\n\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n\n const filtered = tasks.filter(\n (t) =>\n (priorityFilter === \"ALL\" || t.priority === priorityFilter) &&\n (typeFilter === \"ALL\" || t.type === typeFilter),\n );\n\n const gridCols =\n columns.length <= 4\n ? \"md:grid-cols-4\"\n : columns.length === 5\n ? \"md:grid-cols-5\"\n : \"md:grid-cols-6\";\n\n return (\n <div className={cn(\"space-y-4 p-6\", className)}>\n {!hideHeader && (\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">\n Task Board\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {tasks.length} {tasks.length === 1 ? \"task\" : \"tasks\"}\n </p>\n </div>\n </div>\n )}\n\n {!hideFilters && (\n <div className=\"flex flex-wrap items-center gap-4\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n <div className=\"flex flex-wrap gap-1\">\n <FilterChip\n active={priorityFilter === \"ALL\"}\n label=\"all\"\n onClick={() => setPriorityFilter(\"ALL\")}\n />\n {TASK_PRIORITIES.map((p) => (\n <FilterChip\n key={p}\n active={priorityFilter === p}\n label={p.toLowerCase()}\n onClick={() => setPriorityFilter(p)}\n />\n ))}\n </div>\n <div className=\"flex flex-wrap gap-1\">\n <FilterChip\n active={typeFilter === \"ALL\"}\n label=\"all\"\n onClick={() => setTypeFilter(\"ALL\")}\n />\n {TASK_TYPES.map((t) => (\n <FilterChip\n key={t}\n active={typeFilter === t}\n label={t.toLowerCase().replace(\"_\", \" \")}\n onClick={() => setTypeFilter(t)}\n />\n ))}\n </div>\n </div>\n )}\n\n <div className={cn(\"grid grid-cols-1 gap-3 overflow-x-auto\", gridCols)}>\n {columns.map((col) => {\n const colTasks = filtered.filter((t) => t.status === col.status);\n return (\n <div key={col.status} className=\"min-w-[200px]\">\n <div\n className={cn(\n \"rounded-t-md border-t-2 bg-muted/50 p-2\",\n columnAccent[col.status] ?? \"border-t-muted-foreground/40\",\n )}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">\n {col.label}\n </span>\n <span className=\"rounded-full bg-muted px-1.5 text-xs text-muted-foreground\">\n {colTasks.length}\n </span>\n </div>\n </div>\n <div className=\"mt-2 space-y-2\">\n {colTasks.map((task) => (\n <Card\n key={task.id}\n className={cn(\n \"shadow-sm\",\n onTaskClick && \"cursor-pointer hover:border-primary\",\n )}\n onClick={\n onTaskClick ? () => onTaskClick(task) : undefined\n }\n >\n <CardContent className=\"space-y-2 p-3\">\n <p className=\"text-sm font-medium leading-tight text-foreground\">\n {task.title}\n </p>\n {!hidden.has(\"key\") && (\n <p className=\"text-xs text-muted-foreground\">\n {task.key}\n </p>\n )}\n <div className=\"flex flex-wrap gap-1\">\n {!hidden.has(\"priority\") && (\n <span\n className={cn(\n \"rounded-full px-1.5 py-0.5 text-[10px] capitalize\",\n priorityTone[task.priority],\n )}\n >\n {task.priority.toLowerCase()}\n </span>\n )}\n {!hidden.has(\"type\") && (\n <span\n className={cn(\n \"rounded-full px-1.5 py-0.5 text-[10px] capitalize\",\n typeTone[task.type],\n )}\n >\n {task.type.toLowerCase().replace(\"_\", \" \")}\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n {!hidden.has(\"labels\") && (\n <div className=\"flex gap-1\">\n {(task.labels ?? []).slice(0, 2).map((l) => (\n <span\n key={l}\n className=\"rounded bg-muted px-1 py-0.5 text-[9px] text-muted-foreground\"\n >\n {l}\n </span>\n ))}\n </div>\n )}\n {!hidden.has(\"storyPoints\") && (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-primary/10 text-[10px] font-medium text-primary\">\n {task.storyPoints ?? 0}\n </span>\n )}\n </div>\n <div className=\"flex justify-between text-[10px] text-muted-foreground\">\n {!hidden.has(\"assignee\") && (\n <span>{task.assigneeId ?? \"Unassigned\"}</span>\n )}\n {!hidden.has(\"dueDate\") && (\n <span>{task.dueDate ?? \"\"}</span>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction FilterChip({\n active,\n label,\n onClick,\n}: {\n active: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"rounded px-2 py-1 text-xs capitalize\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-muted/70\",\n )}\n >\n {label}\n </button>\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 {\n TASK_PRIORITIES,\n TASK_STATUSES,\n TASK_TYPES,\n enumLabel,\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 /** 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 hiddenFields,\n defaultValues,\n hideHeader,\n submitLabel = \"Create task\",\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\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 New task\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n Create a work item in this workspace.\n </p>\n </div>\n )}\n\n {!projectId && (\n <p className=\"rounded-md bg-destructive/10 p-2 text-xs text-destructive\">\n A projectId is required to create a task.\n </p>\n )}\n\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-title\" className={labelClass}>\n Title\n </label>\n <input\n id=\"pm-title\"\n className={fieldClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"What needs doing?\"\n required\n />\n </div>\n\n {!hidden.has(\"description\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-description\" className={labelClass}>\n 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=\"Add more detail (optional)\"\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 Type\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 {enumLabel(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 Status\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 {enumLabel(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 Priority\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 {enumLabel(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 Assignee\n </label>\n <input\n id=\"pm-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n placeholder=\"Actor ID (optional)\"\n />\n </div>\n )}\n\n {!hidden.has(\"dueDate\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-due\" className={labelClass}>\n Due date\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 Story points\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 Labels\n </label>\n <input\n id=\"pm-labels\"\n className={fieldClass}\n value={labels}\n onChange={(e) => setLabels(e.target.value)}\n placeholder=\"comma, separated, labels\"\n />\n </div>\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">\n Failed to create task: {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 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 ? \"Creating…\" : submitLabel}\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 { 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>,\n 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 { 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 { useMemo } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport { Filter } from \"lucide-react\";\nimport { LIST_WORK_ITEMS } from \"../graphql-ops\";\nimport { usePlanMagnetContextSafe } from \"./PlanMagnetProvider\";\nimport { cn } from \"../utils/cn\";\nimport { Badge } from \"../ui\";\nimport {\n enumLabel,\n type Task,\n type TaskPriority,\n type TaskStatus,\n type TaskType,\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 | \"labels\";\n\n/** Sort keys for the list. */\nexport type TaskListSort =\n \"priority\" | \"status\" | \"title\" | \"type\" | \"dueDate\" | \"storyPoints\";\n\nconst DEFAULT_COLUMNS: TaskListColumn[] = [\n \"key\",\n \"title\",\n \"type\",\n \"status\",\n \"priority\",\n \"assignee\",\n \"dueDate\",\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\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\nconst COLUMN_LABELS: Record<TaskListColumn, string> = {\n key: \"Key\",\n title: \"Title\",\n type: \"Type\",\n status: \"Status\",\n priority: \"Priority\",\n assignee: \"Assignee\",\n dueDate: \"Due\",\n storyPoints: \"Points\",\n labels: \"Labels\",\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 /** Sort key (client-side). */\n sortBy?: TaskListSort;\n /** 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 /** 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 table\n * layout instead of a kanban. Filters map to the server-side `WorkItemFilter`;\n * sort is applied client-side. 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 limit = 200,\n className,\n workspaceId: workspaceIdProp,\n}: TaskListCoreProps) {\n const ctx = usePlanMagnetContextSafe();\n const workspaceId = workspaceIdProp ?? ctx?.workspaceId;\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 (!sortBy) return items;\n const dir = sortDir === \"desc\" ? -1 : 1;\n return [...items].sort((a, b) => dir * compareTasks(a, b, sortBy));\n }, [data, sortBy, sortDir]);\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 Error loading tasks: {error.message}\n </div>\n );\n }\n\n return (\n <div className={cn(\"space-y-4 p-6\", className)}>\n {!hideHeader && (\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Tasks</h1>\n <p className=\"text-sm text-muted-foreground\">\n {rows.length} {rows.length === 1 ? \"task\" : \"tasks\"}\n </p>\n </div>\n {(status || type || priority || search) && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Filter className=\"h-3.5 w-3.5\" /> filtered\n </span>\n )}\n </div>\n )}\n\n <div className=\"overflow-x-auto rounded-md 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 <th\n key={col}\n className=\"px-3 py-2 font-medium text-muted-foreground\"\n >\n {COLUMN_LABELS[col]}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-3 py-6 text-center text-muted-foreground\"\n >\n No tasks found.\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 key={col} className=\"px-3 py-2 text-foreground\">\n {renderCell(col, task)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction renderCell(col: TaskListColumn, task: Task) {\n switch (col) {\n case \"key\":\n return <span className=\"text-muted-foreground\">{task.key}</span>;\n case \"title\":\n return <span className=\"font-medium\">{task.title}</span>;\n case \"type\":\n return <Badge variant=\"secondary\">{enumLabel(task.type)}</Badge>;\n case \"status\":\n return (\n <span className=\"capitalize text-muted-foreground\">\n {enumLabel(task.status)}\n </span>\n );\n case \"priority\":\n return (\n <Badge variant={priorityVariant[task.priority]}>\n {enumLabel(task.priority)}\n </Badge>\n );\n case \"assignee\":\n return (\n <span className=\"text-muted-foreground\">\n {task.assigneeId ?? \"Unassigned\"}\n </span>\n );\n case \"dueDate\":\n return (\n <span className=\"text-muted-foreground\">{task.dueDate ?? \"—\"}</span>\n );\n case \"storyPoints\":\n return (\n <span className=\"text-muted-foreground\">{task.storyPoints ?? 0}</span>\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 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 {\n useEffect,\n useMemo,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { useMutation, useQuery } from \"@apollo/client/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { GET_WORK_ITEM, UPDATE_WORK_ITEM } from \"../graphql-ops\";\nimport { getPlanMagnetConfig } from \"../config\";\nimport { cn } from \"../utils/cn\";\nimport { Badge } from \"../ui\";\nimport {\n TASK_PRIORITIES,\n TASK_STATUSES,\n TASK_TYPES,\n enumLabel,\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 when the update mutation errors. */\n onError?: (error: Error) => void;\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 onError,\n className,\n}: TaskDetailCoreProps) {\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 [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\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 Error loading task: {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 Task not found.\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 <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 Edit\n </button>\n )}\n </div>\n )}\n\n {!editing ? (\n <dl className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {!hidden.has(\"type\") && (\n <Field label=\"Type\">\n <Badge variant=\"secondary\">{enumLabel(item.type)}</Badge>\n </Field>\n )}\n {!hidden.has(\"status\") && (\n <Field label=\"Status\">\n <span className=\"capitalize text-foreground\">\n {enumLabel(item.status)}\n </span>\n </Field>\n )}\n {!hidden.has(\"priority\") && (\n <Field label=\"Priority\">\n <Badge variant={priorityVariant[item.priority]}>\n {enumLabel(item.priority)}\n </Badge>\n </Field>\n )}\n {!hidden.has(\"assignee\") && (\n <Field label=\"Assignee\">\n <span className=\"text-foreground\">\n {item.assigneeId ?? \"Unassigned\"}\n </span>\n </Field>\n )}\n {!hidden.has(\"dueDate\") && (\n <Field label=\"Due date\">\n <span className=\"text-foreground\">{item.dueDate ?? \"—\"}</span>\n </Field>\n )}\n {!hidden.has(\"storyPoints\") && (\n <Field label=\"Story points\">\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}>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}>Labels</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 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 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 Type\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 {enumLabel(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 Status\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 {enumLabel(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 Priority\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 {enumLabel(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 Assignee\n </label>\n <input\n id=\"pm-detail-assignee\"\n className={fieldClass}\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n placeholder=\"Actor ID\"\n />\n </div>\n )}\n {!hidden.has(\"dueDate\") && (\n <div className=\"space-y-1\">\n <label htmlFor=\"pm-detail-due\" className={labelClass}>\n Due date\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 Story points\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 Labels\n </label>\n <input\n id=\"pm-detail-labels\"\n className={fieldClass}\n value={labels}\n onChange={(e) => setLabels(e.target.value)}\n placeholder=\"comma, separated, labels\"\n />\n </div>\n )}\n\n {saveError && (\n <p className=\"text-sm text-destructive\">\n Failed to save: {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 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 ? \"Saving…\" : \"Save changes\"}\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, 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 { CreateTaskCore, type CreateTaskField } from \"./CreateTaskCore\";\nimport { TaskDetailCore, type TaskDetailField } from \"./TaskDetailCore\";\nimport { Modal, Drawer } from \"../ui\";\nimport { cn } from \"../utils/cn\";\nimport type { BoardColumn, Task, WorkItemDetail } 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 board 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 and disables 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 /** Hide the board's priority/type filter bar. */\n hideFilters?: boolean;\n /**\n * Header/title slot. Pass a string for the default heading, or any node to\n * fully own the header area. Omit for no header.\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. Composes the existing `TaskBoardCore`, `CreateTaskCore`, and\n * `TaskDetailCore` so a host app (e.g. HealthyBowl) doesn't have to wire the\n * three together itself:\n *\n * - renders the kanban `TaskBoardCore`,\n * - a \"New task\" button opens `CreateTaskCore` (modal or inline),\n * - clicking a card opens `TaskDetailCore` (drawer or inline) with inline edit,\n * - `CreateTaskCore.onCreated` + `TaskDetailCore.onUpdated` refetch the board.\n *\n * BYO-Apollo like the sibling cores: reads the ambient `<ApolloProvider>` and\n * takes `workspaceId` from a prop or the PlanMagnetProvider context. Semantic\n * tokens only, farm-free, strict TS.\n */\nexport function TasksPageCore({\n workspaceId: workspaceIdProp,\n projectId,\n boardProjectId,\n columns,\n readonly,\n hiddenFields,\n hideFilters,\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\n const [creating, setCreating] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n // Refetch the board's list query after a create/update so the kanban reflects\n // the change without remounting (preserves the board's local filter state).\n const refetchBoard = useCallback(() => {\n void client\n .refetchQueries({ include: [LIST_WORK_ITEMS] })\n // A refetch failure must never break the save flow; the board keeps its\n // last-good data and the host callback still fires.\n .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 handleTaskClick = useCallback((task: Task) => {\n setSelectedId(task.id);\n }, []);\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 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 onUpdated={handleUpdated}\n />\n ) : null;\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {(header || canCreate) && (\n <div className=\"flex items-center justify-between gap-4 px-6 pt-6\">\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 {canCreate && (\n <button\n type=\"button\"\n onClick={() => setCreating(true)}\n className=\"shrink-0 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n New task\n </button>\n )}\n </div>\n )}\n\n {showInlineCreate && <div className=\"px-6\">{createForm}</div>}\n\n <TaskBoardCore\n workspaceId={workspaceId}\n projectId={boardProjectId}\n columns={columns}\n readonly={readonly}\n hideHeader={Boolean(header)}\n hideFilters={hideFilters}\n hiddenFields={hiddenFields}\n onTaskClick={handleTaskClick}\n />\n\n {showInlineDetail && <div className=\"px-6 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 );\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"]}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* PlanMagnet FE SDK Styles */
|
|
2
|
+
|
|
3
|
+
/* Import Tailwind base styles - consumers should have Tailwind configured */
|
|
4
|
+
@tailwind base;
|
|
5
|
+
@tailwind components;
|
|
6
|
+
@tailwind utilities;
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Semantic theme tokens. The SDK renders ONLY with these tokens (never raw
|
|
10
|
+
* palette colors) so host apps can re-theme by overriding the CSS variables.
|
|
11
|
+
* A host that already ships fe-libs tokens (e.g. HealthyBowl) can skip this file.
|
|
12
|
+
*/
|
|
13
|
+
:root {
|
|
14
|
+
--background: 0 0% 100%;
|
|
15
|
+
--foreground: 222.2 84% 4.9%;
|
|
16
|
+
--card: 0 0% 100%;
|
|
17
|
+
--card-foreground: 222.2 84% 4.9%;
|
|
18
|
+
--popover: 0 0% 100%;
|
|
19
|
+
--popover-foreground: 222.2 84% 4.9%;
|
|
20
|
+
--primary: 222.2 47.4% 11.2%;
|
|
21
|
+
--primary-foreground: 210 40% 98%;
|
|
22
|
+
--secondary: 210 40% 96.1%;
|
|
23
|
+
--secondary-foreground: 222.2 47.4% 11.2%;
|
|
24
|
+
--muted: 210 40% 96.1%;
|
|
25
|
+
--muted-foreground: 215.4 16.3% 46.9%;
|
|
26
|
+
--accent: 210 40% 96.1%;
|
|
27
|
+
--accent-foreground: 222.2 47.4% 11.2%;
|
|
28
|
+
--destructive: 0 84.2% 60.2%;
|
|
29
|
+
--destructive-foreground: 210 40% 98%;
|
|
30
|
+
--border: 214.3 31.8% 91.4%;
|
|
31
|
+
--input: 214.3 31.8% 91.4%;
|
|
32
|
+
--ring: 222.2 84% 4.9%;
|
|
33
|
+
--radius: 0.5rem;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.dark {
|
|
37
|
+
--background: 222.2 84% 4.9%;
|
|
38
|
+
--foreground: 210 40% 98%;
|
|
39
|
+
--card: 222.2 84% 4.9%;
|
|
40
|
+
--card-foreground: 210 40% 98%;
|
|
41
|
+
--popover: 222.2 84% 4.9%;
|
|
42
|
+
--popover-foreground: 210 40% 98%;
|
|
43
|
+
--primary: 210 40% 98%;
|
|
44
|
+
--primary-foreground: 222.2 47.4% 11.2%;
|
|
45
|
+
--secondary: 217.2 32.6% 17.5%;
|
|
46
|
+
--secondary-foreground: 210 40% 98%;
|
|
47
|
+
--muted: 217.2 32.6% 17.5%;
|
|
48
|
+
--muted-foreground: 215 20.2% 65.1%;
|
|
49
|
+
--accent: 217.2 32.6% 17.5%;
|
|
50
|
+
--accent-foreground: 210 40% 98%;
|
|
51
|
+
--destructive: 0 62.8% 30.6%;
|
|
52
|
+
--destructive-foreground: 210 40% 98%;
|
|
53
|
+
--border: 217.2 32.6% 17.5%;
|
|
54
|
+
--input: 217.2 32.6% 17.5%;
|
|
55
|
+
--ring: 212.7 26.8% 83.9%;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Base styles */
|
|
59
|
+
* {
|
|
60
|
+
border-color: hsl(var(--border));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
body {
|
|
64
|
+
background-color: hsl(var(--background));
|
|
65
|
+
color: hsl(var(--foreground));
|
|
66
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@burdenoff/planmagnet-fe-sdk",
|
|
3
|
+
"version": "2026.703.1",
|
|
4
|
+
"description": "PlanMagnet Task SDK - Embeddable, product-agnostic task & work-item management UI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"imports": {
|
|
7
|
+
"#src/*": "./src/*"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./styles.css": "./dist/styles.css"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"dev": "tsup --watch",
|
|
25
|
+
"build": "tsup && cp src/styles/index.css dist/styles.css",
|
|
26
|
+
"lint": "eslint src --no-error-on-unmatched-pattern",
|
|
27
|
+
"lint:sanity": "if [ \"${CI:-}\" = \"true\" ]; then bun run lint; else bun run lint -- --cache --cache-location .eslintcache; fi",
|
|
28
|
+
"format": "prettier --write \"src/**/*.{ts,tsx}\"",
|
|
29
|
+
"type:check": "tsc --noEmit",
|
|
30
|
+
"test": "bun test src",
|
|
31
|
+
"schema:pull": "graphql-codegen --project schema-wspace",
|
|
32
|
+
"codegen": "graphql-codegen --project wspace",
|
|
33
|
+
"codegen:all": "bun run schema:pull && bun run codegen",
|
|
34
|
+
"sanity": "bun run lint:sanity && bun run format && bun run type:check && bun run test && bun run build",
|
|
35
|
+
"prepare": "lefthook install || true"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
39
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
40
|
+
"@burdenoff/fe-libs": "2026.601.1"
|
|
41
|
+
},
|
|
42
|
+
"peerDependenciesMeta": {
|
|
43
|
+
"@burdenoff/fe-libs": {
|
|
44
|
+
"optional": true
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@apollo/client": "^4.0.0",
|
|
49
|
+
"@iconify/react": "^6.0.2",
|
|
50
|
+
"@radix-ui/react-checkbox": "^1.1.0",
|
|
51
|
+
"@radix-ui/react-dialog": "^1.1.0",
|
|
52
|
+
"@radix-ui/react-dropdown-menu": "^2.1.0",
|
|
53
|
+
"@radix-ui/react-label": "^2.1.0",
|
|
54
|
+
"@radix-ui/react-popover": "^1.1.0",
|
|
55
|
+
"@radix-ui/react-scroll-area": "^1.2.0",
|
|
56
|
+
"@radix-ui/react-select": "^2.1.0",
|
|
57
|
+
"@radix-ui/react-separator": "^1.1.0",
|
|
58
|
+
"@radix-ui/react-slot": "^1.1.0",
|
|
59
|
+
"@radix-ui/react-switch": "^1.1.0",
|
|
60
|
+
"@radix-ui/react-tabs": "^1.1.0",
|
|
61
|
+
"@radix-ui/react-tooltip": "^1.1.0",
|
|
62
|
+
"@tanstack/react-query": "^5.62.13",
|
|
63
|
+
"class-variance-authority": "^0.7.1",
|
|
64
|
+
"clsx": "^2.1.1",
|
|
65
|
+
"date-fns": "^4.1.0",
|
|
66
|
+
"graphql": "^16.10.0",
|
|
67
|
+
"lucide-react": "^0.468.0",
|
|
68
|
+
"nanoid": "^5.1.6",
|
|
69
|
+
"radash": "^12.1.1",
|
|
70
|
+
"react-router-dom": "^7.1.3",
|
|
71
|
+
"sonner": "^2.0.7",
|
|
72
|
+
"tailwind-merge": "^3.0.0",
|
|
73
|
+
"uuid": "14.0.0",
|
|
74
|
+
"zustand": "^5.0.3"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@burdenoff/fe-libs": "2026.601.1",
|
|
78
|
+
"@eslint/js": "^9.18.0",
|
|
79
|
+
"@graphql-codegen/cli": "^5.0.0",
|
|
80
|
+
"@graphql-codegen/schema-ast": "^5.0.0",
|
|
81
|
+
"@graphql-codegen/typescript": "^4.0.0",
|
|
82
|
+
"@graphql-codegen/typescript-operations": "^4.0.0",
|
|
83
|
+
"@graphql-codegen/typescript-react-apollo": "^4.0.0",
|
|
84
|
+
"@happy-dom/global-registrator": "^15",
|
|
85
|
+
"@testing-library/dom": "^10",
|
|
86
|
+
"@testing-library/react": "^16",
|
|
87
|
+
"@types/bun": "^1.3.14",
|
|
88
|
+
"@types/react": "^19.0.2",
|
|
89
|
+
"@types/react-dom": "^19.0.2",
|
|
90
|
+
"@types/uuid": "^10.0.0",
|
|
91
|
+
"eslint": "^9.18.0",
|
|
92
|
+
"eslint-plugin-react": "^7.37.0",
|
|
93
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
94
|
+
"happy-dom": "^15",
|
|
95
|
+
"lefthook": "^2.1.1",
|
|
96
|
+
"prettier": "^3.4.2",
|
|
97
|
+
"tailwindcss": "^4.0.0",
|
|
98
|
+
"tsup": "^8.3.5",
|
|
99
|
+
"typescript": "^5.9.0",
|
|
100
|
+
"typescript-eslint": "^8.24.0"
|
|
101
|
+
},
|
|
102
|
+
"repository": {
|
|
103
|
+
"type": "git",
|
|
104
|
+
"url": "git+https://github.com/algoshred/planmagnet-fe-sdk.git"
|
|
105
|
+
},
|
|
106
|
+
"engines": {
|
|
107
|
+
"bun": ">=1.3.10"
|
|
108
|
+
},
|
|
109
|
+
"author": "Burdenoff Consultancy Services Pvt Ltd",
|
|
110
|
+
"license": "Proprietary",
|
|
111
|
+
"publishConfig": {
|
|
112
|
+
"access": "restricted"
|
|
113
|
+
},
|
|
114
|
+
"overrides": {
|
|
115
|
+
"lodash": "4.18.1",
|
|
116
|
+
"lodash-es": "4.18.1",
|
|
117
|
+
"dompurify": "3.4.0",
|
|
118
|
+
"fast-xml-parser": "5.7.0",
|
|
119
|
+
"@xmldom/xmldom": "0.8.13",
|
|
120
|
+
"swiper": "12.1.3",
|
|
121
|
+
"brace-expansion": "5.0.5",
|
|
122
|
+
"follow-redirects": "1.16.0",
|
|
123
|
+
"smol-toml": "1.6.1",
|
|
124
|
+
"flatted": "3.4.2",
|
|
125
|
+
"yaml": "2.8.3",
|
|
126
|
+
"picomatch": "4.0.4",
|
|
127
|
+
"immutable": "5.1.5",
|
|
128
|
+
"minimatch": "10.2.5",
|
|
129
|
+
"uuid": "14.0.0",
|
|
130
|
+
"axios": "1.15.2",
|
|
131
|
+
"esbuild": "0.28.0",
|
|
132
|
+
"vite": "8.0.10",
|
|
133
|
+
"vite-plugin-dts": "4.5.4"
|
|
134
|
+
}
|
|
135
|
+
}
|