@burdenoff/microfe-crewfoundry 2026.704.7 → 2026.707.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.
|
@@ -18,10 +18,6 @@ var D = "https://graphqlworkspaces.burdenoff.com/workspaces/graphql", O = [
|
|
|
18
18
|
name: "Client",
|
|
19
19
|
domain: "Finance"
|
|
20
20
|
},
|
|
21
|
-
{
|
|
22
|
-
name: "Course",
|
|
23
|
-
domain: "Learning"
|
|
24
|
-
},
|
|
25
21
|
{
|
|
26
22
|
name: "Department",
|
|
27
23
|
domain: "HR"
|
|
@@ -34,26 +30,14 @@ var D = "https://graphqlworkspaces.burdenoff.com/workspaces/graphql", O = [
|
|
|
34
30
|
name: "Interview",
|
|
35
31
|
domain: "Hiring"
|
|
36
32
|
},
|
|
37
|
-
{
|
|
38
|
-
name: "Invoice",
|
|
39
|
-
domain: "Finance"
|
|
40
|
-
},
|
|
41
33
|
{
|
|
42
34
|
name: "JobPosting",
|
|
43
35
|
domain: "Hiring"
|
|
44
36
|
},
|
|
45
|
-
{
|
|
46
|
-
name: "LearningPath",
|
|
47
|
-
domain: "Learning"
|
|
48
|
-
},
|
|
49
37
|
{
|
|
50
38
|
name: "LeaveRequest",
|
|
51
39
|
domain: "HR"
|
|
52
40
|
},
|
|
53
|
-
{
|
|
54
|
-
name: "MarketplaceService",
|
|
55
|
-
domain: "Marketplace"
|
|
56
|
-
},
|
|
57
41
|
{
|
|
58
42
|
name: "PayrollRecord",
|
|
59
43
|
domain: "Finance"
|
|
@@ -138,31 +122,6 @@ function M() {
|
|
|
138
122
|
name: "Delete mutations",
|
|
139
123
|
description: "Remove records",
|
|
140
124
|
operations: n
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
id: "workflow",
|
|
144
|
-
name: "Workflow mutations",
|
|
145
|
-
description: "Enrollment & notifications",
|
|
146
|
-
operations: [
|
|
147
|
-
{
|
|
148
|
-
kind: "Mutation",
|
|
149
|
-
name: "enrollCrewCourse",
|
|
150
|
-
signature: "enrollCrewCourse(id: ID!): CrewCourse!",
|
|
151
|
-
description: "Enroll the current member into a learning course."
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
kind: "Mutation",
|
|
155
|
-
name: "markCrewNotificationRead",
|
|
156
|
-
signature: "markCrewNotificationRead(id: ID!): Boolean!",
|
|
157
|
-
description: "Mark a single notification as read."
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
kind: "Mutation",
|
|
161
|
-
name: "markAllCrewNotificationsRead",
|
|
162
|
-
signature: "markAllCrewNotificationsRead: Boolean!",
|
|
163
|
-
description: "Mark every notification as read."
|
|
164
|
-
}
|
|
165
|
-
]
|
|
166
125
|
}
|
|
167
126
|
];
|
|
168
127
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n Check,\n ChevronRight,\n Code2,\n Copy,\n Database,\n ListTree,\n Lock,\n Network,\n Search,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\n// The CrewFoundry API is served by wspace-crewfoundry-svc as an Apollo\n// Federation v2 subgraph, reached through the workspaces public GraphQL\n// gateway. There is no separate REST surface — this reference is derived\n// directly from the published subgraph schema.\nconst ENDPOINT = 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql';\n\n// The 17 domain entities exposed by the subgraph, each with create / update /\n// remove mutations. Names and input types mirror the published schema exactly.\nconst ENTITIES: { name: string; domain: string }[] = [\n { name: 'Announcement', domain: 'Communications' },\n { name: 'Candidate', domain: 'Hiring' },\n { name: 'Client', domain: 'Finance' },\n { name: 'Course', domain: 'Learning' },\n { name: 'Department', domain: 'HR' },\n { name: 'Employee', domain: 'HR' },\n { name: 'Interview', domain: 'Hiring' },\n { name: 'Invoice', domain: 'Finance' },\n { name: 'JobPosting', domain: 'Hiring' },\n { name: 'LearningPath', domain: 'Learning' },\n { name: 'LeaveRequest', domain: 'HR' },\n { name: 'MarketplaceService', domain: 'Marketplace' },\n { name: 'PayrollRecord', domain: 'Finance' },\n { name: 'Project', domain: 'Projects' },\n { name: 'Team', domain: 'Teams' },\n { name: 'TimeEntry', domain: 'HR' },\n { name: 'Vendor', domain: 'Finance' },\n];\n\ntype OperationKind = 'Query' | 'Mutation';\n\ntype ApiOperation = {\n kind: OperationKind;\n name: string;\n signature: string;\n description: string;\n};\n\ntype ApiGroup = {\n id: string;\n name: string;\n description: string;\n operations: ApiOperation[];\n};\n\nconst kindColors: Record<OperationKind, string> = {\n Query: 'bg-status-success-bg text-status-success-text',\n Mutation: 'bg-status-info-bg text-status-info-text',\n};\n\nconst humanize = (value: string): string => value.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // Fall through to the legacy path for insecure / restricted contexts.\n }\n try {\n if (typeof document === 'undefined') {\n return false;\n }\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n const succeeded = document.execCommand('copy');\n document.body.removeChild(textarea);\n return succeeded;\n } catch {\n return false;\n }\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [search, setSearch] = useState('');\n const [copied, setCopied] = useState<string | null>(null);\n\n const groups = useMemo<ApiGroup[]>(() => {\n const createOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `createCrew${entity.name}`,\n signature: `createCrew${entity.name}(input: CreateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Create a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const updateOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `updateCrew${entity.name}`,\n signature: `updateCrew${entity.name}(id: ID!, input: UpdateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Update an existing ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const removeOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `removeCrew${entity.name}`,\n signature: `removeCrew${entity.name}(id: ID!): Boolean!`,\n description: `Delete a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n\n return [\n {\n id: 'queries',\n name: 'Queries',\n description: 'Read the workspace dataset',\n operations: [\n {\n kind: 'Query',\n name: 'crewfoundryBootstrap',\n signature: 'crewfoundryBootstrap: CrewfoundryBootstrap!',\n description: `Load the full workspace dataset in one call — ${employees.length} employees, ${jobPostings.length} job postings, ${candidates.length} candidates, ${payrollRecords.length} payroll records, ${leaveRequests.length} leave requests, and every other CrewFoundry collection.`,\n },\n ],\n },\n {\n id: 'create',\n name: 'Create mutations',\n description: 'Add new records',\n operations: createOps,\n },\n {\n id: 'update',\n name: 'Update mutations',\n description: 'Modify existing records',\n operations: updateOps,\n },\n {\n id: 'delete',\n name: 'Delete mutations',\n description: 'Remove records',\n operations: removeOps,\n },\n {\n id: 'workflow',\n name: 'Workflow mutations',\n description: 'Enrollment & notifications',\n operations: [\n {\n kind: 'Mutation',\n name: 'enrollCrewCourse',\n signature: 'enrollCrewCourse(id: ID!): CrewCourse!',\n description: 'Enroll the current member into a learning course.',\n },\n {\n kind: 'Mutation',\n name: 'markCrewNotificationRead',\n signature: 'markCrewNotificationRead(id: ID!): Boolean!',\n description: 'Mark a single notification as read.',\n },\n {\n kind: 'Mutation',\n name: 'markAllCrewNotificationsRead',\n signature: 'markAllCrewNotificationsRead: Boolean!',\n description: 'Mark every notification as read.',\n },\n ],\n },\n ];\n }, [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]);\n\n const totalOperations = useMemo(\n () => groups.reduce((sum, group) => sum + group.operations.length, 0),\n [groups]\n );\n\n const filteredGroups = useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) {\n return groups;\n }\n return groups\n .map((group) => ({\n ...group,\n operations: group.operations.filter(\n (op) =>\n op.name.toLowerCase().includes(term) ||\n op.signature.toLowerCase().includes(term) ||\n op.description.toLowerCase().includes(term)\n ),\n }))\n .filter((group) => group.operations.length > 0);\n }, [groups, search]);\n\n const handleCopy = async (value: string) => {\n const ok = await copyToClipboard(value);\n if (ok) {\n setCopied(value);\n showToast('Copied to clipboard', 'success');\n window.setTimeout(() => setCopied((current) => (current === value ? null : current)), 1500);\n } else {\n showToast('Unable to copy to clipboard', 'error');\n }\n };\n\n const scrollToGroup = (id: string) => {\n const target = typeof document !== 'undefined' ? document.getElementById(`group-${id}`) : null;\n target?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n };\n\n const statTiles = [\n { icon: Network, label: 'Protocol', value: 'GraphQL', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'Composition',\n value: 'Apollo Federation v2',\n color: 'text-action-primary-bg',\n },\n { icon: Lock, label: 'Auth', value: 'Bearer token', color: 'text-status-success-text' },\n {\n icon: ListTree,\n label: 'Operations',\n value: String(totalOperations),\n color: 'text-status-warning-text',\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry GraphQL API reference for integrations\n </p>\n <PagePurpose className=\"mt-1\">\n Browse the CrewFoundry API reference — use it to find operations, understand request\n formats, and integrate CrewFoundry with your own tools.\n </PagePurpose>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" className=\"max-w-full truncate font-mono text-[10px]\">\n {ENDPOINT}\n </Badge>\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Copy the GraphQL endpoint URL\"\n onClick={() => void handleCopy(ENDPOINT)}\n >\n {copied === ENDPOINT ? (\n <Check className=\"mr-1 h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"mr-1 h-3 w-3\" />\n )}\n Copy endpoint\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {statTiles.map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"truncate text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <EmphasisPanel>\n <div className=\"mb-2 text-sm font-semibold\">Jump to</div>\n <div className=\"space-y-2\">\n {groups.map((group) => (\n <button\n key={group.id}\n type=\"button\"\n aria-label={`Jump to ${group.name}`}\n onClick={() => scrollToGroup(group.id)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-bg-sunken\"\n >\n <ListTree className=\"h-3 w-3 text-text-secondary\" />\n <span>{group.name}</span>\n <Badge variant=\"outline\" className=\"ml-auto text-[10px]\">\n {group.operations.length}\n </Badge>\n <ChevronRight className=\"h-3 w-3 text-text-secondary\" />\n </button>\n ))}\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"font-mono text-xs\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Requests are authenticated at the gateway edge. Send your session bearer token on\n every request; the gateway resolves the actor and enforces workspace-scoped RBAC\n before the subgraph runs.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4 lg:col-span-3\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search operations...\"\n className=\"pl-9\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n\n {filteredGroups.map((group) => (\n <Card key={group.id} id={`group-${group.id}`} className=\"scroll-mt-6\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n <CardTitle className=\"text-base\">{group.name}</CardTitle>\n </div>\n <CardDescription>\n {group.description} · {group.operations.length} operations\n </CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {group.operations.map((op, index) => (\n <div\n key={op.name}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 ${index < group.operations.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${kindColors[op.kind]} min-w-[64px] justify-center border-0 font-mono text-[10px]`}\n >\n {op.kind}\n </Badge>\n <div className=\"min-w-0 flex-1\">\n <code className=\"block truncate font-mono text-sm\">{op.signature}</code>\n <span className=\"text-xs text-text-secondary\">{op.description}</span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 shrink-0 p-0\"\n aria-label={`Copy ${op.name} operation name`}\n onClick={() => void handleCopy(op.name)}\n >\n {copied === op.name ? (\n <Check className=\"h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"h-3 w-3 text-text-secondary\" />\n )}\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredGroups.length === 0 && (\n <div className=\"py-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No operations match\"\n description=\"Try a different search term to find the operation you need.\"\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n Check,\n ChevronRight,\n Code2,\n Copy,\n Database,\n ListTree,\n Lock,\n Network,\n Search,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\n// The CrewFoundry API is served by wspace-crewfoundry-svc as an Apollo\n// Federation v2 subgraph, reached through the workspaces public GraphQL\n// gateway. There is no separate REST surface — this reference is derived\n// directly from the published subgraph schema.\nconst ENDPOINT = 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql';\n\n// The 13 CrewFoundry-owned domain entities exposed by the subgraph, each with\n// create / update / remove mutations. Marketplace, billing/invoices,\n// notifications, and learning are intentionally served by shared owners.\nconst ENTITIES: { name: string; domain: string }[] = [\n { name: 'Announcement', domain: 'Communications' },\n { name: 'Candidate', domain: 'Hiring' },\n { name: 'Client', domain: 'Finance' },\n { name: 'Department', domain: 'HR' },\n { name: 'Employee', domain: 'HR' },\n { name: 'Interview', domain: 'Hiring' },\n { name: 'JobPosting', domain: 'Hiring' },\n { name: 'LeaveRequest', domain: 'HR' },\n { name: 'PayrollRecord', domain: 'Finance' },\n { name: 'Project', domain: 'Projects' },\n { name: 'Team', domain: 'Teams' },\n { name: 'TimeEntry', domain: 'HR' },\n { name: 'Vendor', domain: 'Finance' },\n];\n\ntype OperationKind = 'Query' | 'Mutation';\n\ntype ApiOperation = {\n kind: OperationKind;\n name: string;\n signature: string;\n description: string;\n};\n\ntype ApiGroup = {\n id: string;\n name: string;\n description: string;\n operations: ApiOperation[];\n};\n\nconst kindColors: Record<OperationKind, string> = {\n Query: 'bg-status-success-bg text-status-success-text',\n Mutation: 'bg-status-info-bg text-status-info-text',\n};\n\nconst humanize = (value: string): string => value.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // Fall through to the legacy path for insecure / restricted contexts.\n }\n try {\n if (typeof document === 'undefined') {\n return false;\n }\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n const succeeded = document.execCommand('copy');\n document.body.removeChild(textarea);\n return succeeded;\n } catch {\n return false;\n }\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [search, setSearch] = useState('');\n const [copied, setCopied] = useState<string | null>(null);\n\n const groups = useMemo<ApiGroup[]>(() => {\n const createOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `createCrew${entity.name}`,\n signature: `createCrew${entity.name}(input: CreateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Create a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const updateOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `updateCrew${entity.name}`,\n signature: `updateCrew${entity.name}(id: ID!, input: UpdateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Update an existing ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const removeOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `removeCrew${entity.name}`,\n signature: `removeCrew${entity.name}(id: ID!): Boolean!`,\n description: `Delete a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n\n return [\n {\n id: 'queries',\n name: 'Queries',\n description: 'Read the workspace dataset',\n operations: [\n {\n kind: 'Query',\n name: 'crewfoundryBootstrap',\n signature: 'crewfoundryBootstrap: CrewfoundryBootstrap!',\n description: `Load the full workspace dataset in one call — ${employees.length} employees, ${jobPostings.length} job postings, ${candidates.length} candidates, ${payrollRecords.length} payroll records, ${leaveRequests.length} leave requests, and every other CrewFoundry collection.`,\n },\n ],\n },\n {\n id: 'create',\n name: 'Create mutations',\n description: 'Add new records',\n operations: createOps,\n },\n {\n id: 'update',\n name: 'Update mutations',\n description: 'Modify existing records',\n operations: updateOps,\n },\n {\n id: 'delete',\n name: 'Delete mutations',\n description: 'Remove records',\n operations: removeOps,\n },\n ];\n }, [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]);\n\n const totalOperations = useMemo(\n () => groups.reduce((sum, group) => sum + group.operations.length, 0),\n [groups]\n );\n\n const filteredGroups = useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) {\n return groups;\n }\n return groups\n .map((group) => ({\n ...group,\n operations: group.operations.filter(\n (op) =>\n op.name.toLowerCase().includes(term) ||\n op.signature.toLowerCase().includes(term) ||\n op.description.toLowerCase().includes(term)\n ),\n }))\n .filter((group) => group.operations.length > 0);\n }, [groups, search]);\n\n const handleCopy = async (value: string) => {\n const ok = await copyToClipboard(value);\n if (ok) {\n setCopied(value);\n showToast('Copied to clipboard', 'success');\n window.setTimeout(() => setCopied((current) => (current === value ? null : current)), 1500);\n } else {\n showToast('Unable to copy to clipboard', 'error');\n }\n };\n\n const scrollToGroup = (id: string) => {\n const target = typeof document !== 'undefined' ? document.getElementById(`group-${id}`) : null;\n target?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n };\n\n const statTiles = [\n { icon: Network, label: 'Protocol', value: 'GraphQL', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'Composition',\n value: 'Apollo Federation v2',\n color: 'text-action-primary-bg',\n },\n { icon: Lock, label: 'Auth', value: 'Bearer token', color: 'text-status-success-text' },\n {\n icon: ListTree,\n label: 'Operations',\n value: String(totalOperations),\n color: 'text-status-warning-text',\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry GraphQL API reference for integrations\n </p>\n <PagePurpose className=\"mt-1\">\n Browse the CrewFoundry API reference — use it to find operations, understand request\n formats, and integrate CrewFoundry with your own tools.\n </PagePurpose>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" className=\"max-w-full truncate font-mono text-[10px]\">\n {ENDPOINT}\n </Badge>\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Copy the GraphQL endpoint URL\"\n onClick={() => void handleCopy(ENDPOINT)}\n >\n {copied === ENDPOINT ? (\n <Check className=\"mr-1 h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"mr-1 h-3 w-3\" />\n )}\n Copy endpoint\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {statTiles.map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"truncate text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <EmphasisPanel>\n <div className=\"mb-2 text-sm font-semibold\">Jump to</div>\n <div className=\"space-y-2\">\n {groups.map((group) => (\n <button\n key={group.id}\n type=\"button\"\n aria-label={`Jump to ${group.name}`}\n onClick={() => scrollToGroup(group.id)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-bg-sunken\"\n >\n <ListTree className=\"h-3 w-3 text-text-secondary\" />\n <span>{group.name}</span>\n <Badge variant=\"outline\" className=\"ml-auto text-[10px]\">\n {group.operations.length}\n </Badge>\n <ChevronRight className=\"h-3 w-3 text-text-secondary\" />\n </button>\n ))}\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"font-mono text-xs\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Requests are authenticated at the gateway edge. Send your session bearer token on\n every request; the gateway resolves the actor and enforces workspace-scoped RBAC\n before the subgraph runs.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4 lg:col-span-3\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search operations...\"\n className=\"pl-9\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n\n {filteredGroups.map((group) => (\n <Card key={group.id} id={`group-${group.id}`} className=\"scroll-mt-6\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n <CardTitle className=\"text-base\">{group.name}</CardTitle>\n </div>\n <CardDescription>\n {group.description} · {group.operations.length} operations\n </CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {group.operations.map((op, index) => (\n <div\n key={op.name}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 ${index < group.operations.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${kindColors[op.kind]} min-w-[64px] justify-center border-0 font-mono text-[10px]`}\n >\n {op.kind}\n </Badge>\n <div className=\"min-w-0 flex-1\">\n <code className=\"block truncate font-mono text-sm\">{op.signature}</code>\n <span className=\"text-xs text-text-secondary\">{op.description}</span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 shrink-0 p-0\"\n aria-label={`Copy ${op.name} operation name`}\n onClick={() => void handleCopy(op.name)}\n >\n {copied === op.name ? (\n <Check className=\"h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"h-3 w-3 text-text-secondary\" />\n )}\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredGroups.length === 0 && (\n <div className=\"py-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No operations match\"\n description=\"Try a different search term to find the operation you need.\"\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|