@bluefly/openstandardagents 0.2.7 → 0.2.9

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.
Files changed (327) hide show
  1. package/.devfile.yaml +1 -1
  2. package/.env.example +1 -1
  3. package/.github/AGENTS.md +245 -0
  4. package/.github/agents/github-issue-triage.ossa.yaml +99 -0
  5. package/.github/agents/github-pr-triage.ossa.yaml +137 -0
  6. package/.github/workflows/issue-sync-to-gitlab.yml +138 -0
  7. package/.github/workflows/pr-triage-to-gitlab.yml +164 -0
  8. package/.version.json +2 -2
  9. package/.wiki-config.json +24 -0
  10. package/CHANGELOG.md +44 -18
  11. package/CODEOWNERS +75 -0
  12. package/CONTRIBUTING.md +103 -4
  13. package/README.md +178 -243
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/repositories/schema.repository.d.ts +6 -1
  19. package/dist/repositories/schema.repository.d.ts.map +1 -1
  20. package/dist/repositories/schema.repository.js +49 -27
  21. package/dist/repositories/schema.repository.js.map +1 -1
  22. package/dist/services/migration.service.d.ts +4 -3
  23. package/dist/services/migration.service.d.ts.map +1 -1
  24. package/dist/services/migration.service.js +11 -10
  25. package/dist/services/migration.service.js.map +1 -1
  26. package/dist/services/release-automation/release.service.js +1 -1
  27. package/dist/services/release-automation/release.service.js.map +1 -1
  28. package/dist/services/release-automation/schemas/release.schema.js +1 -1
  29. package/dist/services/release-automation/webhook.service.js +3 -3
  30. package/dist/services/release-automation/webhook.service.js.map +1 -1
  31. package/dist/services/runtime/claude/claude-adapter.d.ts +1 -1
  32. package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -1
  33. package/dist/services/runtime/claude/claude-adapter.js +2 -2
  34. package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
  35. package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
  36. package/dist/spec/v0.2.8/README.md +72 -0
  37. package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  38. package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  39. package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  40. package/{spec/v0.2.6-dev/ossa-0.2.5.schema.json → dist/spec/v0.2.8/ossa-0.2.8.schema.json} +1509 -52
  41. package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  42. package/dist/spec/v0.2.9/a2a-protocol.md +1337 -0
  43. package/dist/spec/v0.2.9/agent.md +1946 -0
  44. package/dist/spec/v0.2.9/capabilities/index.yaml +25 -0
  45. package/dist/spec/v0.2.9/capabilities/memory.yaml +251 -0
  46. package/dist/spec/v0.2.9/capability-schema.md +576 -0
  47. package/dist/spec/v0.2.9/compliance-profiles.md +533 -0
  48. package/dist/spec/v0.2.9/conformance-testing.md +1527 -0
  49. package/dist/spec/v0.2.9/gitlab-duo-integration.md +621 -0
  50. package/dist/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
  51. package/dist/spec/v0.2.9/runtime-semantics.md +464 -0
  52. package/dist/spec/v0.2.9/security-model.md +1245 -0
  53. package/dist/spec/v0.2.9/semantic-conventions.md +347 -0
  54. package/dist/spec/v0.2.9/types.ts +522 -0
  55. package/dist/types/index.d.ts +3 -2
  56. package/dist/types/index.d.ts.map +1 -1
  57. package/dist/types/policy.d.ts +377 -0
  58. package/dist/types/policy.d.ts.map +1 -0
  59. package/dist/types/policy.js +84 -0
  60. package/dist/types/policy.js.map +1 -0
  61. package/dist/utils/index.d.ts +6 -0
  62. package/dist/utils/index.d.ts.map +1 -0
  63. package/dist/utils/index.js +6 -0
  64. package/dist/utils/index.js.map +1 -0
  65. package/dist/utils/version.d.ts +68 -0
  66. package/dist/utils/version.d.ts.map +1 -0
  67. package/dist/utils/version.js +156 -0
  68. package/dist/utils/version.js.map +1 -0
  69. package/docs/specs/policy-dsl.md +925 -0
  70. package/eslint-report.json +1 -0
  71. package/examples/adk-integration/code-review-workflow.yml +1 -1
  72. package/examples/adk-integration/customer-support.yml +1 -1
  73. package/examples/adk-integration/data-pipeline.yml +1 -1
  74. package/examples/advanced/reasoning-agent.yaml +136 -0
  75. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  76. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  77. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  78. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  79. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  80. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  81. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  82. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  83. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  84. package/examples/agents-md/code-agent.ossa.json +100 -0
  85. package/examples/agents-md/monorepo-agent.ossa.yaml +180 -0
  86. package/examples/anthropic/claude-assistant.ossa.json +1 -1
  87. package/examples/autogen/multi-agent.ossa.json +1 -1
  88. package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
  89. package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
  90. package/examples/common_npm/agent-router.ossa.yaml +1 -0
  91. package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
  92. package/examples/crewai/research-team.ossa.json +1 -1
  93. package/examples/cursor/code-review-agent.ossa.json +1 -1
  94. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
  95. package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
  96. package/examples/extensions/agents-md-v1.yml +175 -0
  97. package/examples/extensions/drupal-v1.yml +1 -1
  98. package/examples/extensions/kagent-v1.yml +1 -1
  99. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  100. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
  101. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  102. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  103. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  104. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
  105. package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
  106. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  107. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  108. package/examples/langchain/chain-agent.ossa.json +1 -1
  109. package/examples/langflow/workflow-agent.ossa.json +1 -1
  110. package/examples/langgraph/state-machine-agent.ossa.json +1 -1
  111. package/examples/llamaindex/rag-agent.ossa.json +1 -1
  112. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  113. package/examples/multi-agent/README.md +74 -0
  114. package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
  115. package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
  116. package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
  117. package/examples/openai/basic-agent.ossa.yaml +1 -1
  118. package/examples/openai/multi-tool-agent.ossa.json +1 -1
  119. package/examples/openai/swarm-agent.ossa.json +1 -1
  120. package/examples/production/document-analyzer-openai.yml +1 -1
  121. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  122. package/examples/spec-examples/audit-agent.yml +1 -1
  123. package/examples/spec-examples/chat-agent.yml +1 -1
  124. package/examples/spec-examples/compliance-agent.yml +1 -1
  125. package/examples/spec-examples/monitoring-agent.yml +1 -1
  126. package/examples/spec-examples/workflow-agent.yml +1 -1
  127. package/examples/templates/ossa-compliance.yaml +1 -1
  128. package/examples/vercel/edge-agent.ossa.json +1 -1
  129. package/gl-code-quality-report.json +62 -0
  130. package/llms-ctx-full.txt +39 -0
  131. package/llms-ctx.txt +39 -0
  132. package/llms.txt +47 -0
  133. package/package.json +6 -3
  134. package/scripts/README.md +25 -0
  135. package/scripts/compliance-audit.ts +796 -0
  136. package/scripts/eslint-to-codequality.cjs +34 -0
  137. package/scripts/generate-agents-catalog.ts +2 -1
  138. package/scripts/generate-api-docs.ts +2 -1
  139. package/scripts/generate-examples-docs.ts +2 -1
  140. package/scripts/generate-llms-ctx.sh +17 -0
  141. package/scripts/generate-schema-docs.ts +31 -10
  142. package/scripts/sync-version.js +4 -12
  143. package/scripts/validate-schema.ts +2 -1
  144. package/spec/v0.2.8/CHANGELOG.md +401 -0
  145. package/spec/v0.2.8/README.md +72 -0
  146. package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  147. package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  148. package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  149. package/spec/{v0.2.6-dev/ossa-0.2.6-dev.schema.json → v0.2.8/ossa-0.2.8.schema.json} +1509 -52
  150. package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  151. package/spec/v0.2.9/a2a-protocol.md +1337 -0
  152. package/spec/v0.2.9/agent.md +1946 -0
  153. package/spec/v0.2.9/capabilities/index.yaml +25 -0
  154. package/spec/v0.2.9/capabilities/memory.yaml +251 -0
  155. package/spec/v0.2.9/capability-schema.md +576 -0
  156. package/spec/v0.2.9/compliance-profiles.md +533 -0
  157. package/spec/v0.2.9/conformance-testing.md +1527 -0
  158. package/spec/v0.2.9/gitlab-duo-integration.md +621 -0
  159. package/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
  160. package/spec/v0.2.9/runtime-semantics.md +464 -0
  161. package/spec/v0.2.9/security-model.md +1245 -0
  162. package/spec/v0.2.9/semantic-conventions.md +347 -0
  163. package/spec/v0.2.9/types.ts +522 -0
  164. package/test-results/junit.xml +337 -0
  165. package/.github/workflows/pr-comment.yml +0 -33
  166. package/bin/validate-ossa-0.2.5-RC.ts +0 -244
  167. package/dist/spec/v0.2.6-dev/ossa-0.2.5.schema.json +0 -1696
  168. package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
  169. package/scripts/lib/exec.ts +0 -37
  170. package/scripts/lib/file-ops.ts +0 -58
  171. package/scripts/lib/version.ts +0 -83
  172. package/website/.lighthouserc.ts +0 -24
  173. package/website/.prettierrc +0 -10
  174. package/website/DESIGN_SYSTEM_IMPLEMENTATION.md +0 -445
  175. package/website/Dockerfile +0 -30
  176. package/website/app/about/page.tsx +0 -304
  177. package/website/app/blog/[slug]/page.tsx +0 -208
  178. package/website/app/blog/page.tsx +0 -249
  179. package/website/app/design-guide/page.tsx +0 -511
  180. package/website/app/docs/[[...slug]]/page.tsx +0 -847
  181. package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
  182. package/website/app/ecosystem/page.tsx +0 -410
  183. package/website/app/examples/page.tsx +0 -133
  184. package/website/app/globals.scss +0 -370
  185. package/website/app/layout.tsx +0 -106
  186. package/website/app/license/page.tsx +0 -183
  187. package/website/app/not-found.tsx +0 -18
  188. package/website/app/page.tsx +0 -686
  189. package/website/app/page.tsx.bak +0 -679
  190. package/website/app/page.tsx.bak2 +0 -649
  191. package/website/app/playground/page.tsx +0 -487
  192. package/website/app/robots.ts +0 -19
  193. package/website/app/rss.xml/route.ts +0 -74
  194. package/website/app/schema/page.tsx +0 -1001
  195. package/website/app/sitemap.ts +0 -56
  196. package/website/app/specification/page.tsx +0 -287
  197. package/website/components/InstallCommand.tsx +0 -96
  198. package/website/components/Logo.tsx +0 -97
  199. package/website/components/StructuredData.tsx +0 -65
  200. package/website/components/docs/DocsSearch.tsx +0 -104
  201. package/website/components/docs/DocsSidebar.tsx +0 -155
  202. package/website/components/docs/MarkdownContent.tsx +0 -401
  203. package/website/components/docs/VersionSelector.tsx +0 -105
  204. package/website/components/examples/ExamplesViewer.tsx +0 -293
  205. package/website/components/layout/Footer.tsx +0 -116
  206. package/website/components/layout/Header.tsx +0 -172
  207. package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
  208. package/website/components/schema/SchemaExplorer.tsx +0 -213
  209. package/website/components/ui/Badge.tsx +0 -82
  210. package/website/components/ui/Button.tsx +0 -116
  211. package/website/components/ui/Card.tsx +0 -167
  212. package/website/components/ui/Checkbox.tsx +0 -141
  213. package/website/components/ui/Input.tsx +0 -169
  214. package/website/components/ui/Radio.tsx +0 -141
  215. package/website/components/ui/Select.tsx +0 -182
  216. package/website/components/ui/Tag.tsx +0 -158
  217. package/website/components/ui/Textarea.tsx +0 -195
  218. package/website/components/ui/index.ts +0 -11
  219. package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
  220. package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
  221. package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
  222. package/website/content/blog/introducing-ossa-framework.md +0 -328
  223. package/website/content/blog/ossa-production-results.md +0 -279
  224. package/website/content/blog/welcome-to-ossa.md +0 -43
  225. package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
  226. package/website/content/docs/00-home.md +0 -153
  227. package/website/content/docs/adapters/openai-adapter.md +0 -693
  228. package/website/content/docs/agents/catalog.md +0 -28
  229. package/website/content/docs/aiflow-framework-integration-with-ossa.md +0 -107
  230. package/website/content/docs/api-reference/index.md +0 -38
  231. package/website/content/docs/api-reference/ossa-core-api.md +0 -634
  232. package/website/content/docs/api-reference/ossa-registry-api.md +0 -515
  233. package/website/content/docs/api-reference/unified-agent-gateway.md +0 -599
  234. package/website/content/docs/architecture/execution-flow.md +0 -335
  235. package/website/content/docs/architecture/multi-agent-systems.md +0 -737
  236. package/website/content/docs/architecture/overview.md +0 -121
  237. package/website/content/docs/architecture/stack-integration.md +0 -461
  238. package/website/content/docs/changelog.md +0 -246
  239. package/website/content/docs/cli-reference/index.md +0 -111
  240. package/website/content/docs/cli-reference/ossa-agents.md +0 -70
  241. package/website/content/docs/cli-reference/ossa-export.md +0 -56
  242. package/website/content/docs/cli-reference/ossa-generate.md +0 -66
  243. package/website/content/docs/cli-reference/ossa-gitlab-agent.md +0 -57
  244. package/website/content/docs/cli-reference/ossa-import.md +0 -56
  245. package/website/content/docs/cli-reference/ossa-init.md +0 -57
  246. package/website/content/docs/cli-reference/ossa-migrate.md +0 -62
  247. package/website/content/docs/cli-reference/ossa-run.md +0 -66
  248. package/website/content/docs/cli-reference/ossa-schema.md +0 -57
  249. package/website/content/docs/cli-reference/ossa-setup.md +0 -57
  250. package/website/content/docs/cli-reference/ossa-validate.md +0 -66
  251. package/website/content/docs/configuration/index.md +0 -97
  252. package/website/content/docs/contributing.md +0 -599
  253. package/website/content/docs/deployment/github-mirroring.md +0 -924
  254. package/website/content/docs/documentation.md +0 -100
  255. package/website/content/docs/ecosystem/framework-support.md +0 -1361
  256. package/website/content/docs/ecosystem/overview.md +0 -366
  257. package/website/content/docs/errors/index.md +0 -10
  258. package/website/content/docs/examples/aiflow-framework-integration-with-ossa.md +0 -107
  259. package/website/content/docs/examples/catalog.md +0 -300
  260. package/website/content/docs/for-audiences/students-researchers.md +0 -122
  261. package/website/content/docs/getting-started/index.md +0 -92
  262. package/website/content/docs/getting-started/installation.md +0 -155
  263. package/website/content/docs/getting-started/running-agents.md +0 -309
  264. package/website/content/docs/getting-started.md +0 -91
  265. package/website/content/docs/integrations/aiflow.md +0 -104
  266. package/website/content/docs/integrations/drupal.md +0 -105
  267. package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
  268. package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
  269. package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
  270. package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
  271. package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
  272. package/website/content/docs/migration-guides/index.md +0 -133
  273. package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
  274. package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
  275. package/website/content/docs/migration-guides/migration-manifest.json +0 -64
  276. package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
  277. package/website/content/docs/openapi-extensions/examples.md +0 -550
  278. package/website/content/docs/openapi-extensions/index.md +0 -551
  279. package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
  280. package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
  281. package/website/content/docs/ossa-compliant-badge.md +0 -251
  282. package/website/content/docs/pre-release/index.md +0 -175
  283. package/website/content/docs/quick-reference.md +0 -17
  284. package/website/content/docs/readme.md +0 -35
  285. package/website/content/docs/releases/v0.2.6.md +0 -99
  286. package/website/content/docs/schema-reference/agent-capabilities.md +0 -50
  287. package/website/content/docs/schema-reference/agent-id.md +0 -52
  288. package/website/content/docs/schema-reference/agent-name.md +0 -50
  289. package/website/content/docs/schema-reference/agent-role.md +0 -54
  290. package/website/content/docs/schema-reference/agent-spec.md +0 -406
  291. package/website/content/docs/schema-reference/agent-version.md +0 -50
  292. package/website/content/docs/schema-reference/autonomy.md +0 -568
  293. package/website/content/docs/schema-reference/constraints.md +0 -543
  294. package/website/content/docs/schema-reference/index.md +0 -45
  295. package/website/content/docs/schema-reference/llm-config.md +0 -445
  296. package/website/content/docs/schema-reference/observability.md +0 -654
  297. package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
  298. package/website/content/docs/schema-reference/taxonomy.md +0 -509
  299. package/website/content/docs/schema-reference/tools.md +0 -628
  300. package/website/content/docs/templates/blog-post.md +0 -43
  301. package/website/content/docs/types-reference/index.md +0 -105
  302. package/website/content/docs/use-cases/00-index.md +0 -395
  303. package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
  304. package/website/content/docs/use-cases/customer-support.md +0 -1234
  305. package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
  306. package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
  307. package/website/content/docs/versioning.md +0 -288
  308. package/website/dev.sh +0 -53
  309. package/website/docker-compose.dev.yml +0 -36
  310. package/website/lib/version.ts +0 -35
  311. package/website/lib/versions.json +0 -103
  312. package/website/next.config.ts +0 -18
  313. package/website/nginx.conf +0 -32
  314. package/website/package-lock.json +0 -9679
  315. package/website/package.json +0 -59
  316. package/website/postcss.config.mjs +0 -9
  317. package/website/scripts/fetch-versions.js +0 -166
  318. package/website/scripts/generate-examples-index.js +0 -163
  319. package/website/scripts/merge-docs-to-wiki.ts +0 -207
  320. package/website/scripts/sync-version.js +0 -72
  321. package/website/scripts/sync-wiki.ts +0 -322
  322. package/website/scripts/upload-wiki.ts +0 -199
  323. package/website/styles/_spacing.scss +0 -453
  324. package/website/styles/_tokens.scss +0 -245
  325. package/website/styles/_typography.scss +0 -361
  326. package/website/styles/_variables.scss +0 -287
  327. package/website/tailwind.config.ts +0 -170
@@ -1,172 +0,0 @@
1
- 'use client';
2
-
3
- import Link from 'next/link';
4
- import { usePathname } from 'next/navigation';
5
- import { useState } from 'react';
6
-
7
- export function Header() {
8
- const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
9
- const pathname = usePathname();
10
-
11
- const isActive = (path: string) => pathname === path || pathname?.startsWith(path + '/');
12
-
13
- return (
14
- <header className="bg-white border-b border-gray-300 sticky top-0 z-50">
15
- <nav className="container mx-auto max-w-6xl px-4">
16
- <div className="flex items-center justify-between h-16">
17
- <Link href="/" className="flex items-center space-x-2 group">
18
- <img
19
- src="/assets/brand/ossa-logo.svg"
20
- alt="OSSA Logo"
21
- className="h-10 w-10 transition-transform group-hover:scale-110"
22
- />
23
- <span className="text-2xl font-bold bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent">
24
- OSSA
25
- </span>
26
- </Link>
27
-
28
- {/* Desktop Navigation */}
29
- <div className="hidden md:flex items-center space-x-3 lg:space-x-6 text-sm lg:text-base">
30
- <Link href="/about" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/about') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
31
- About
32
- </Link>
33
- <Link href="/specification" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/specification') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
34
- Specification
35
- </Link>
36
- <Link href="/schema" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/schema') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
37
- Schema
38
- </Link>
39
- <Link href="/docs" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/docs') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
40
- Docs
41
- </Link>
42
- <Link href="/blog" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/blog') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
43
- Blog
44
- </Link>
45
- <Link href="/playground" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/playground') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
46
- Playground
47
- </Link>
48
- <Link href="/examples" className={`px-3 py-2 rounded-lg transition-all font-medium whitespace-nowrap ${isActive('/examples') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}>
49
- Examples
50
- </Link>
51
- <a
52
- href="https://github.com/blueflyio/openstandardagents"
53
- target="_blank"
54
- rel="noopener noreferrer"
55
- className="text-gray-600 hover:text-primary transition-colors flex items-center font-medium"
56
- title="View on GitHub"
57
- >
58
- <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
59
- <path fillRule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clipRule="evenodd" />
60
- </svg>
61
- </a>
62
- </div>
63
-
64
- {/* Mobile Menu Button */}
65
- <button
66
- className="md:hidden p-2 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 rounded"
67
- onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
68
- aria-label="Toggle menu"
69
- aria-expanded={mobileMenuOpen}
70
- aria-controls="mobile-menu"
71
- >
72
- <svg
73
- className="w-6 h-6"
74
- fill="none"
75
- stroke="currentColor"
76
- viewBox="0 0 24 24"
77
- >
78
- {mobileMenuOpen ? (
79
- <path
80
- strokeLinecap="round"
81
- strokeLinejoin="round"
82
- strokeWidth={2}
83
- d="M6 18L18 6M6 6l12 12"
84
- />
85
- ) : (
86
- <path
87
- strokeLinecap="round"
88
- strokeLinejoin="round"
89
- strokeWidth={2}
90
- d="M4 6h16M4 12h16M4 18h16"
91
- />
92
- )}
93
- </svg>
94
- </button>
95
- </div>
96
-
97
- {/* Mobile Navigation */}
98
- <div
99
- id="mobile-menu"
100
- className={`md:hidden overflow-hidden transition-all duration-300 ease-in-out ${
101
- mobileMenuOpen ? 'max-h-96 opacity-100 py-4 border-t border-gray-300' : 'max-h-0 opacity-0'
102
- }`}
103
- role="navigation"
104
- aria-label="Mobile navigation"
105
- >
106
- <Link
107
- href="/about"
108
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/about') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
109
- onClick={() => setMobileMenuOpen(false)}
110
- >
111
- About
112
- </Link>
113
- <Link
114
- href="/specification"
115
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/specification') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
116
- onClick={() => setMobileMenuOpen(false)}
117
- >
118
- Specification
119
- </Link>
120
- <Link
121
- href="/schema"
122
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/schema') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
123
- onClick={() => setMobileMenuOpen(false)}
124
- >
125
- Schema
126
- </Link>
127
- <Link
128
- href="/docs"
129
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/docs') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
130
- onClick={() => setMobileMenuOpen(false)}
131
- >
132
- Docs
133
- </Link>
134
- <Link
135
- href="/blog"
136
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/blog') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
137
- onClick={() => setMobileMenuOpen(false)}
138
- >
139
- Blog
140
- </Link>
141
- <Link
142
- href="/playground"
143
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/playground') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
144
- onClick={() => setMobileMenuOpen(false)}
145
- >
146
- Playground
147
- </Link>
148
- <Link
149
- href="/examples"
150
- className={`block px-3 py-2 rounded-lg transition-all font-medium ${isActive('/examples') ? 'text-primary bg-primary/10' : 'text-gray-600 hover:text-primary hover:bg-primary/5'}`}
151
- onClick={() => setMobileMenuOpen(false)}
152
- >
153
- Examples
154
- </Link>
155
- <a
156
- href="https://github.com/blueflyio/openstandardagents"
157
- target="_blank"
158
- rel="noopener noreferrer"
159
- className="flex items-center gap-2 py-2 text-gray-600 hover:text-primary transition-colors font-medium"
160
- onClick={() => setMobileMenuOpen(false)}
161
- title="View on GitHub"
162
- >
163
- <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
164
- <path fillRule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clipRule="evenodd" />
165
- </svg>
166
- </a>
167
- </div>
168
- </nav>
169
- </header>
170
- );
171
- }
172
-
@@ -1,84 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
-
5
- interface AccordionItemProps {
6
- title: string;
7
- children: React.ReactNode;
8
- isOpen: boolean;
9
- onToggle: () => void;
10
- borderColor: string;
11
- bgColor: string;
12
- }
13
-
14
- function AccordionItem({ title, children, isOpen, onToggle, borderColor, bgColor }: AccordionItemProps) {
15
- return (
16
- <div className={`bg-white rounded-lg border-l-4 ${borderColor} shadow-md transition-all`}>
17
- <button
18
- onClick={onToggle}
19
- className="w-full flex items-center justify-between p-6 text-left hover:bg-gray-50 transition-colors"
20
- aria-expanded={isOpen}
21
- >
22
- <h3 className="text-xl font-bold text-gray-900">{title}</h3>
23
- <svg
24
- className={`w-5 h-5 text-gray-600 transition-transform ${isOpen ? 'rotate-180' : ''}`}
25
- fill="none"
26
- stroke="currentColor"
27
- viewBox="0 0 24 24"
28
- >
29
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
30
- </svg>
31
- </button>
32
- {isOpen && (
33
- <div className="px-6 pb-6 border-t border-gray-200">
34
- <div className="pt-4">
35
- {children}
36
- </div>
37
- </div>
38
- )}
39
- </div>
40
- );
41
- }
42
-
43
- interface SchemaComponentsAccordionProps {
44
- items: Array<{
45
- id: string;
46
- title: string;
47
- content: React.ReactNode;
48
- borderColor: string;
49
- }>;
50
- }
51
-
52
- export function SchemaComponentsAccordion({ items }: SchemaComponentsAccordionProps) {
53
- const [openItems, setOpenItems] = useState<Set<string>>(new Set([items[0]?.id]));
54
-
55
- const toggleItem = (id: string) => {
56
- setOpenItems(prev => {
57
- const next = new Set(prev);
58
- if (next.has(id)) {
59
- next.delete(id);
60
- } else {
61
- next.add(id);
62
- }
63
- return next;
64
- });
65
- };
66
-
67
- return (
68
- <div className="space-y-4">
69
- {items.map((item) => (
70
- <AccordionItem
71
- key={item.id}
72
- title={item.title}
73
- isOpen={openItems.has(item.id)}
74
- onToggle={() => toggleItem(item.id)}
75
- borderColor={item.borderColor}
76
- bgColor="bg-white"
77
- >
78
- {item.content}
79
- </AccordionItem>
80
- ))}
81
- </div>
82
- );
83
- }
84
-
@@ -1,213 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
5
- import { vscDarkPlus } from 'react-syntax-highlighter/dist/cjs/styles/prism';
6
-
7
- interface SchemaExplorerProps {
8
- schema: any;
9
- }
10
-
11
- interface PropertyInfo {
12
- name: string;
13
- type: string;
14
- description?: string;
15
- required?: boolean;
16
- properties?: PropertyInfo[];
17
- }
18
-
19
- function extractProperties(schema: any, path = ''): PropertyInfo[] {
20
- if (!schema || typeof schema !== 'object') {
21
- return [];
22
- }
23
-
24
- const properties: PropertyInfo[] = [];
25
-
26
- if (schema.properties) {
27
- for (const [key, value] of Object.entries(schema.properties)) {
28
- const prop = value as any;
29
- const propInfo: PropertyInfo = {
30
- name: key,
31
- type: prop.type || 'object',
32
- description: prop.description,
33
- required: schema.required?.includes(key),
34
- };
35
-
36
- if (prop.properties || prop.items) {
37
- propInfo.properties = extractProperties(
38
- prop.properties || prop.items,
39
- `${path}.${key}`
40
- );
41
- }
42
-
43
- properties.push(propInfo);
44
- }
45
- }
46
-
47
- return properties;
48
- }
49
-
50
- export function SchemaExplorer({ schema }: SchemaExplorerProps) {
51
- const [selectedPath, setSelectedPath] = useState<string>('');
52
- const [expandedPaths, setExpandedPaths] = useState<Set<string>>(
53
- new Set([''])
54
- );
55
-
56
- const rootProperties = extractProperties(schema);
57
-
58
- const togglePath = (path: string): void => {
59
- setExpandedPaths((prev) => {
60
- const next = new Set(prev);
61
- if (next.has(path)) {
62
- next.delete(path);
63
- } else {
64
- next.add(path);
65
- }
66
- return next;
67
- });
68
- };
69
-
70
- const renderProperty = (
71
- prop: PropertyInfo,
72
- depth = 0,
73
- currentPath = ''
74
- ) => {
75
- const fullPath = currentPath ? `${currentPath}.${prop.name}` : prop.name;
76
- const isExpanded = expandedPaths.has(fullPath);
77
- const hasChildren = prop.properties && prop.properties.length > 0;
78
-
79
- return (
80
- <div key={prop.name} className="ml-4">
81
- <div
82
- className={`flex items-start py-2 ${
83
- selectedPath === fullPath ? 'bg-primary/10' : ''
84
- }`}
85
- >
86
- {hasChildren && (
87
- <button
88
- onClick={() => togglePath(fullPath)}
89
- className="mr-2 text-gray-500 hover:text-gray-700"
90
- aria-label={isExpanded ? 'Collapse' : 'Expand'}
91
- >
92
- {isExpanded ? '−' : '+'}
93
- </button>
94
- )}
95
- <div
96
- className="flex-1 cursor-pointer"
97
- onClick={() => setSelectedPath(fullPath)}
98
- >
99
- <div className="flex items-center gap-2">
100
- <span className="font-semibold text-gray-900">{prop.name}</span>
101
- <span className="text-sm text-gray-500">({prop.type})</span>
102
- {prop.required && (
103
- <span className="text-xs bg-error/20 text-error px-2 py-0.5 rounded">
104
- required
105
- </span>
106
- )}
107
- </div>
108
- {prop.description && (
109
- <p className="text-sm text-gray-600 mt-1">{prop.description}</p>
110
- )}
111
- </div>
112
- </div>
113
- {hasChildren && isExpanded && (
114
- <div className="ml-6 border-l-2 border-gray-200">
115
- {prop.properties?.map((child) =>
116
- renderProperty(child, depth + 1, fullPath)
117
- )}
118
- </div>
119
- )}
120
- </div>
121
- );
122
- };
123
-
124
- const getPropertyAtPath = (path: string): any => {
125
- const parts = path.split('.').filter(Boolean);
126
- let current: any = schema;
127
-
128
- for (const part of parts) {
129
- if (current?.properties?.[part]) {
130
- current = current.properties[part];
131
- } else {
132
- return null;
133
- }
134
- }
135
-
136
- return current;
137
- };
138
-
139
- const selectedProperty = selectedPath
140
- ? getPropertyAtPath(selectedPath)
141
- : schema;
142
-
143
- return (
144
- <div className="space-y-6">
145
- {/* Property Tree - Row 1 */}
146
- <div className="card">
147
- <h2 className="text-xl font-semibold mb-4">Schema Structure</h2>
148
- <div className="space-y-1 max-h-[400px] overflow-y-auto">
149
- {rootProperties.map((prop) => renderProperty(prop))}
150
- </div>
151
- </div>
152
-
153
- {/* Property Details - Row 2 */}
154
- <div className="card">
155
- <h2 className="text-xl font-semibold mb-4">
156
- {selectedPath || 'Schema Overview'}
157
- </h2>
158
- {selectedProperty && (
159
- <div className="space-y-4">
160
- <div>
161
- <h3 className="font-semibold mb-2">Type</h3>
162
- <p className="text-gray-700">{selectedProperty.type || 'object'}</p>
163
- </div>
164
-
165
- {selectedProperty.description && (
166
- <div>
167
- <h3 className="font-semibold mb-2">Description</h3>
168
- <p className="text-gray-700">{selectedProperty.description}</p>
169
- </div>
170
- )}
171
-
172
- {selectedProperty.enum && (
173
- <div>
174
- <h3 className="font-semibold mb-2">Allowed Values</h3>
175
- <ul className="list-disc list-inside text-gray-700">
176
- {selectedProperty.enum.map((value: any, index: number) => (
177
- <li key={index}>{String(value)}</li>
178
- ))}
179
- </ul>
180
- </div>
181
- )}
182
-
183
- {selectedProperty.default !== undefined && (
184
- <div>
185
- <h3 className="font-semibold mb-2">Default Value</h3>
186
- <p className="text-gray-700">
187
- {JSON.stringify(selectedProperty.default)}
188
- </p>
189
- </div>
190
- )}
191
-
192
- <div>
193
- <h3 className="font-semibold mb-2">JSON Schema</h3>
194
- <div className="border border-gray-300 rounded-lg overflow-hidden">
195
- <SyntaxHighlighter
196
- language="json"
197
- style={vscDarkPlus}
198
- customStyle={{
199
- margin: 0,
200
- fontSize: '12px',
201
- }}
202
- >
203
- {JSON.stringify(selectedProperty, null, 2)}
204
- </SyntaxHighlighter>
205
- </div>
206
- </div>
207
- </div>
208
- )}
209
- </div>
210
- </div>
211
- );
212
- }
213
-
@@ -1,82 +0,0 @@
1
- import React from 'react';
2
-
3
- type BadgeVariant = 'default' | 'success' | 'warning' | 'error' | 'info' | 'primary' | 'secondary';
4
- type BadgeSize = 'sm' | 'md' | 'lg';
5
-
6
- export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
7
- /** Badge content */
8
- children: React.ReactNode;
9
- /** Visual variant */
10
- variant?: BadgeVariant;
11
- /** Size variant */
12
- size?: BadgeSize;
13
- /** Icon to display before text */
14
- icon?: React.ReactNode;
15
- /** Dot indicator instead of full background */
16
- dot?: boolean;
17
- }
18
-
19
- const variantClasses: Record<BadgeVariant, string> = {
20
- default: 'bg-gray-100 text-gray-800 border border-gray-300',
21
- success: 'bg-success-100 text-success-800 border border-success-300',
22
- warning: 'bg-warning-100 text-warning-800 border border-warning-300',
23
- error: 'bg-error-100 text-error-800 border border-error-300',
24
- info: 'bg-info-100 text-info-800 border border-info-300',
25
- primary: 'bg-primary-100 text-primary-800 border border-primary-300',
26
- secondary: 'bg-secondary-100 text-secondary-800 border border-secondary-300',
27
- };
28
-
29
- const sizeClasses: Record<BadgeSize, string> = {
30
- sm: 'px-2 py-0.5 text-xs',
31
- md: 'px-3 py-1 text-sm',
32
- lg: 'px-4 py-1.5 text-base',
33
- };
34
-
35
- const dotVariantClasses: Record<BadgeVariant, string> = {
36
- default: 'bg-gray-500',
37
- success: 'bg-success-500',
38
- warning: 'bg-warning-500',
39
- error: 'bg-error-500',
40
- info: 'bg-info-500',
41
- primary: 'bg-primary-500',
42
- secondary: 'bg-secondary-500',
43
- };
44
-
45
- export const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(
46
- (
47
- {
48
- className = '',
49
- variant = 'default',
50
- size = 'md',
51
- children,
52
- icon,
53
- dot = false,
54
- ...props
55
- },
56
- ref
57
- ) => {
58
- const classes = [
59
- 'inline-flex items-center justify-center rounded-full font-semibold',
60
- variantClasses[variant],
61
- sizeClasses[size],
62
- className,
63
- ]
64
- .filter(Boolean)
65
- .join(' ');
66
-
67
- return (
68
- <span ref={ref} className={classes} {...props}>
69
- {dot && (
70
- <span
71
- className={`w-2 h-2 rounded-full mr-1.5 ${dotVariantClasses[variant]}`}
72
- aria-hidden="true"
73
- />
74
- )}
75
- {icon && <span className="mr-1">{icon}</span>}
76
- {children}
77
- </span>
78
- );
79
- }
80
- );
81
-
82
- Badge.displayName = 'Badge';
@@ -1,116 +0,0 @@
1
- import React from 'react';
2
-
3
- type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'success';
4
- type ButtonSize = 'sm' | 'md' | 'lg';
5
-
6
- export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
7
- /** Button content */
8
- children: React.ReactNode;
9
- /** Visual variant */
10
- variant?: ButtonVariant;
11
- /** Size variant */
12
- size?: ButtonSize;
13
- /** Full width button */
14
- fullWidth?: boolean;
15
- /** Loading state */
16
- loading?: boolean;
17
- /** Icon to display before text */
18
- iconLeft?: React.ReactNode;
19
- /** Icon to display after text */
20
- iconRight?: React.ReactNode;
21
- /** Accessible label for screen readers */
22
- ariaLabel?: string;
23
- }
24
-
25
- const variantClasses: Record<ButtonVariant, string> = {
26
- primary:
27
- 'bg-gradient-to-r from-secondary via-primary to-accent text-white hover:shadow-lg hover:scale-105 focus:ring-primary/30',
28
- secondary:
29
- 'bg-secondary text-white hover:bg-secondary/90 hover:shadow-md focus:ring-secondary/30',
30
- outline:
31
- 'border-2 border-primary text-primary bg-transparent hover:bg-primary hover:text-white focus:ring-primary/30',
32
- ghost:
33
- 'text-primary bg-transparent hover:bg-primary/10 focus:ring-primary/20',
34
- danger:
35
- 'bg-error text-white hover:bg-error-600 hover:shadow-md focus:ring-error/30',
36
- success:
37
- 'bg-success text-white hover:bg-success-600 hover:shadow-md focus:ring-success/30',
38
- };
39
-
40
- const sizeClasses: Record<ButtonSize, string> = {
41
- sm: 'px-4 py-2 text-sm min-h-[36px]',
42
- md: 'px-6 py-3 text-base min-h-[44px]',
43
- lg: 'px-8 py-4 text-lg min-h-[52px]',
44
- };
45
-
46
- export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
47
- (
48
- {
49
- className = '',
50
- variant = 'primary',
51
- size = 'md',
52
- fullWidth = false,
53
- children,
54
- loading = false,
55
- iconLeft,
56
- iconRight,
57
- disabled,
58
- ariaLabel,
59
- ...props
60
- },
61
- ref
62
- ) => {
63
- const baseClasses =
64
- 'inline-flex items-center justify-center rounded-lg font-semibold transition-all duration-200 focus:outline-none focus:ring-4 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';
65
-
66
- const classes = [
67
- baseClasses,
68
- variantClasses[variant],
69
- sizeClasses[size],
70
- fullWidth ? 'w-full' : 'w-auto',
71
- className,
72
- ]
73
- .filter(Boolean)
74
- .join(' ');
75
-
76
- return (
77
- <button
78
- ref={ref}
79
- className={classes}
80
- disabled={disabled || loading}
81
- aria-label={ariaLabel}
82
- aria-busy={loading}
83
- {...props}
84
- >
85
- {loading && (
86
- <svg
87
- className="animate-spin -ml-1 mr-3 h-5 w-5"
88
- xmlns="http://www.w3.org/2000/svg"
89
- fill="none"
90
- viewBox="0 0 24 24"
91
- aria-hidden="true"
92
- >
93
- <circle
94
- className="opacity-25"
95
- cx="12"
96
- cy="12"
97
- r="10"
98
- stroke="currentColor"
99
- strokeWidth="4"
100
- />
101
- <path
102
- className="opacity-75"
103
- fill="currentColor"
104
- d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
105
- />
106
- </svg>
107
- )}
108
- {!loading && iconLeft && <span className="mr-2">{iconLeft}</span>}
109
- {children}
110
- {!loading && iconRight && <span className="ml-2">{iconRight}</span>}
111
- </button>
112
- );
113
- }
114
- );
115
-
116
- Button.displayName = 'Button';