@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.
- package/.devfile.yaml +1 -1
- package/.env.example +1 -1
- package/.github/AGENTS.md +245 -0
- package/.github/agents/github-issue-triage.ossa.yaml +99 -0
- package/.github/agents/github-pr-triage.ossa.yaml +137 -0
- package/.github/workflows/issue-sync-to-gitlab.yml +138 -0
- package/.github/workflows/pr-triage-to-gitlab.yml +164 -0
- package/.version.json +2 -2
- package/.wiki-config.json +24 -0
- package/CHANGELOG.md +44 -18
- package/CODEOWNERS +75 -0
- package/CONTRIBUTING.md +103 -4
- package/README.md +178 -243
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/repositories/schema.repository.d.ts +6 -1
- package/dist/repositories/schema.repository.d.ts.map +1 -1
- package/dist/repositories/schema.repository.js +49 -27
- package/dist/repositories/schema.repository.js.map +1 -1
- package/dist/services/migration.service.d.ts +4 -3
- package/dist/services/migration.service.d.ts.map +1 -1
- package/dist/services/migration.service.js +11 -10
- package/dist/services/migration.service.js.map +1 -1
- package/dist/services/release-automation/release.service.js +1 -1
- package/dist/services/release-automation/release.service.js.map +1 -1
- package/dist/services/release-automation/schemas/release.schema.js +1 -1
- package/dist/services/release-automation/webhook.service.js +3 -3
- package/dist/services/release-automation/webhook.service.js.map +1 -1
- package/dist/services/runtime/claude/claude-adapter.d.ts +1 -1
- package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -1
- package/dist/services/runtime/claude/claude-adapter.js +2 -2
- package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
- package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
- package/dist/spec/v0.2.8/README.md +72 -0
- package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
- 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
- package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/dist/spec/v0.2.9/a2a-protocol.md +1337 -0
- package/dist/spec/v0.2.9/agent.md +1946 -0
- package/dist/spec/v0.2.9/capabilities/index.yaml +25 -0
- package/dist/spec/v0.2.9/capabilities/memory.yaml +251 -0
- package/dist/spec/v0.2.9/capability-schema.md +576 -0
- package/dist/spec/v0.2.9/compliance-profiles.md +533 -0
- package/dist/spec/v0.2.9/conformance-testing.md +1527 -0
- package/dist/spec/v0.2.9/gitlab-duo-integration.md +621 -0
- package/dist/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
- package/dist/spec/v0.2.9/runtime-semantics.md +464 -0
- package/dist/spec/v0.2.9/security-model.md +1245 -0
- package/dist/spec/v0.2.9/semantic-conventions.md +347 -0
- package/dist/spec/v0.2.9/types.ts +522 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/policy.d.ts +377 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +84 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/version.d.ts +68 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +156 -0
- package/dist/utils/version.js.map +1 -0
- package/docs/specs/policy-dsl.md +925 -0
- package/eslint-report.json +1 -0
- package/examples/adk-integration/code-review-workflow.yml +1 -1
- package/examples/adk-integration/customer-support.yml +1 -1
- package/examples/adk-integration/data-pipeline.yml +1 -1
- package/examples/advanced/reasoning-agent.yaml +136 -0
- package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
- package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
- package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
- package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
- package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
- package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
- package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
- package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
- package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
- package/examples/agents-md/code-agent.ossa.json +100 -0
- package/examples/agents-md/monorepo-agent.ossa.yaml +180 -0
- package/examples/anthropic/claude-assistant.ossa.json +1 -1
- package/examples/autogen/multi-agent.ossa.json +1 -1
- package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
- package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
- package/examples/common_npm/agent-router.ossa.yaml +1 -0
- package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
- package/examples/crewai/research-team.ossa.json +1 -1
- package/examples/cursor/code-review-agent.ossa.json +1 -1
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
- package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
- package/examples/extensions/agents-md-v1.yml +175 -0
- package/examples/extensions/drupal-v1.yml +1 -1
- package/examples/extensions/kagent-v1.yml +1 -1
- package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
- package/examples/kagent/compliance-validator.ossa.yaml +1 -1
- package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
- package/examples/kagent/documentation-agent.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
- package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
- package/examples/kagent/security-scanner.ossa.yaml +1 -1
- package/examples/langchain/chain-agent.ossa.json +1 -1
- package/examples/langflow/workflow-agent.ossa.json +1 -1
- package/examples/langgraph/state-machine-agent.ossa.json +1 -1
- package/examples/llamaindex/rag-agent.ossa.json +1 -1
- package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
- package/examples/multi-agent/README.md +74 -0
- package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
- package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
- package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
- package/examples/openai/basic-agent.ossa.yaml +1 -1
- package/examples/openai/multi-tool-agent.ossa.json +1 -1
- package/examples/openai/swarm-agent.ossa.json +1 -1
- package/examples/production/document-analyzer-openai.yml +1 -1
- package/examples/quickstart/support-agent.ossa.yaml +1 -1
- package/examples/spec-examples/audit-agent.yml +1 -1
- package/examples/spec-examples/chat-agent.yml +1 -1
- package/examples/spec-examples/compliance-agent.yml +1 -1
- package/examples/spec-examples/monitoring-agent.yml +1 -1
- package/examples/spec-examples/workflow-agent.yml +1 -1
- package/examples/templates/ossa-compliance.yaml +1 -1
- package/examples/vercel/edge-agent.ossa.json +1 -1
- package/gl-code-quality-report.json +62 -0
- package/llms-ctx-full.txt +39 -0
- package/llms-ctx.txt +39 -0
- package/llms.txt +47 -0
- package/package.json +6 -3
- package/scripts/README.md +25 -0
- package/scripts/compliance-audit.ts +796 -0
- package/scripts/eslint-to-codequality.cjs +34 -0
- package/scripts/generate-agents-catalog.ts +2 -1
- package/scripts/generate-api-docs.ts +2 -1
- package/scripts/generate-examples-docs.ts +2 -1
- package/scripts/generate-llms-ctx.sh +17 -0
- package/scripts/generate-schema-docs.ts +31 -10
- package/scripts/sync-version.js +4 -12
- package/scripts/validate-schema.ts +2 -1
- package/spec/v0.2.8/CHANGELOG.md +401 -0
- package/spec/v0.2.8/README.md +72 -0
- package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
- package/spec/{v0.2.6-dev/ossa-0.2.6-dev.schema.json → v0.2.8/ossa-0.2.8.schema.json} +1509 -52
- package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/spec/v0.2.9/a2a-protocol.md +1337 -0
- package/spec/v0.2.9/agent.md +1946 -0
- package/spec/v0.2.9/capabilities/index.yaml +25 -0
- package/spec/v0.2.9/capabilities/memory.yaml +251 -0
- package/spec/v0.2.9/capability-schema.md +576 -0
- package/spec/v0.2.9/compliance-profiles.md +533 -0
- package/spec/v0.2.9/conformance-testing.md +1527 -0
- package/spec/v0.2.9/gitlab-duo-integration.md +621 -0
- package/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
- package/spec/v0.2.9/runtime-semantics.md +464 -0
- package/spec/v0.2.9/security-model.md +1245 -0
- package/spec/v0.2.9/semantic-conventions.md +347 -0
- package/spec/v0.2.9/types.ts +522 -0
- package/test-results/junit.xml +337 -0
- package/.github/workflows/pr-comment.yml +0 -33
- package/bin/validate-ossa-0.2.5-RC.ts +0 -244
- package/dist/spec/v0.2.6-dev/ossa-0.2.5.schema.json +0 -1696
- package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
- package/scripts/lib/exec.ts +0 -37
- package/scripts/lib/file-ops.ts +0 -58
- package/scripts/lib/version.ts +0 -83
- package/website/.lighthouserc.ts +0 -24
- package/website/.prettierrc +0 -10
- package/website/DESIGN_SYSTEM_IMPLEMENTATION.md +0 -445
- package/website/Dockerfile +0 -30
- package/website/app/about/page.tsx +0 -304
- package/website/app/blog/[slug]/page.tsx +0 -208
- package/website/app/blog/page.tsx +0 -249
- package/website/app/design-guide/page.tsx +0 -511
- package/website/app/docs/[[...slug]]/page.tsx +0 -847
- package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
- package/website/app/ecosystem/page.tsx +0 -410
- package/website/app/examples/page.tsx +0 -133
- package/website/app/globals.scss +0 -370
- package/website/app/layout.tsx +0 -106
- package/website/app/license/page.tsx +0 -183
- package/website/app/not-found.tsx +0 -18
- package/website/app/page.tsx +0 -686
- package/website/app/page.tsx.bak +0 -679
- package/website/app/page.tsx.bak2 +0 -649
- package/website/app/playground/page.tsx +0 -487
- package/website/app/robots.ts +0 -19
- package/website/app/rss.xml/route.ts +0 -74
- package/website/app/schema/page.tsx +0 -1001
- package/website/app/sitemap.ts +0 -56
- package/website/app/specification/page.tsx +0 -287
- package/website/components/InstallCommand.tsx +0 -96
- package/website/components/Logo.tsx +0 -97
- package/website/components/StructuredData.tsx +0 -65
- package/website/components/docs/DocsSearch.tsx +0 -104
- package/website/components/docs/DocsSidebar.tsx +0 -155
- package/website/components/docs/MarkdownContent.tsx +0 -401
- package/website/components/docs/VersionSelector.tsx +0 -105
- package/website/components/examples/ExamplesViewer.tsx +0 -293
- package/website/components/layout/Footer.tsx +0 -116
- package/website/components/layout/Header.tsx +0 -172
- package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
- package/website/components/schema/SchemaExplorer.tsx +0 -213
- package/website/components/ui/Badge.tsx +0 -82
- package/website/components/ui/Button.tsx +0 -116
- package/website/components/ui/Card.tsx +0 -167
- package/website/components/ui/Checkbox.tsx +0 -141
- package/website/components/ui/Input.tsx +0 -169
- package/website/components/ui/Radio.tsx +0 -141
- package/website/components/ui/Select.tsx +0 -182
- package/website/components/ui/Tag.tsx +0 -158
- package/website/components/ui/Textarea.tsx +0 -195
- package/website/components/ui/index.ts +0 -11
- package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
- package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
- package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
- package/website/content/blog/introducing-ossa-framework.md +0 -328
- package/website/content/blog/ossa-production-results.md +0 -279
- package/website/content/blog/welcome-to-ossa.md +0 -43
- package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
- package/website/content/docs/00-home.md +0 -153
- package/website/content/docs/adapters/openai-adapter.md +0 -693
- package/website/content/docs/agents/catalog.md +0 -28
- package/website/content/docs/aiflow-framework-integration-with-ossa.md +0 -107
- package/website/content/docs/api-reference/index.md +0 -38
- package/website/content/docs/api-reference/ossa-core-api.md +0 -634
- package/website/content/docs/api-reference/ossa-registry-api.md +0 -515
- package/website/content/docs/api-reference/unified-agent-gateway.md +0 -599
- package/website/content/docs/architecture/execution-flow.md +0 -335
- package/website/content/docs/architecture/multi-agent-systems.md +0 -737
- package/website/content/docs/architecture/overview.md +0 -121
- package/website/content/docs/architecture/stack-integration.md +0 -461
- package/website/content/docs/changelog.md +0 -246
- package/website/content/docs/cli-reference/index.md +0 -111
- package/website/content/docs/cli-reference/ossa-agents.md +0 -70
- package/website/content/docs/cli-reference/ossa-export.md +0 -56
- package/website/content/docs/cli-reference/ossa-generate.md +0 -66
- package/website/content/docs/cli-reference/ossa-gitlab-agent.md +0 -57
- package/website/content/docs/cli-reference/ossa-import.md +0 -56
- package/website/content/docs/cli-reference/ossa-init.md +0 -57
- package/website/content/docs/cli-reference/ossa-migrate.md +0 -62
- package/website/content/docs/cli-reference/ossa-run.md +0 -66
- package/website/content/docs/cli-reference/ossa-schema.md +0 -57
- package/website/content/docs/cli-reference/ossa-setup.md +0 -57
- package/website/content/docs/cli-reference/ossa-validate.md +0 -66
- package/website/content/docs/configuration/index.md +0 -97
- package/website/content/docs/contributing.md +0 -599
- package/website/content/docs/deployment/github-mirroring.md +0 -924
- package/website/content/docs/documentation.md +0 -100
- package/website/content/docs/ecosystem/framework-support.md +0 -1361
- package/website/content/docs/ecosystem/overview.md +0 -366
- package/website/content/docs/errors/index.md +0 -10
- package/website/content/docs/examples/aiflow-framework-integration-with-ossa.md +0 -107
- package/website/content/docs/examples/catalog.md +0 -300
- package/website/content/docs/for-audiences/students-researchers.md +0 -122
- package/website/content/docs/getting-started/index.md +0 -92
- package/website/content/docs/getting-started/installation.md +0 -155
- package/website/content/docs/getting-started/running-agents.md +0 -309
- package/website/content/docs/getting-started.md +0 -91
- package/website/content/docs/integrations/aiflow.md +0 -104
- package/website/content/docs/integrations/drupal.md +0 -105
- package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
- package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
- package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
- package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
- package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
- package/website/content/docs/migration-guides/index.md +0 -133
- package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
- package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
- package/website/content/docs/migration-guides/migration-manifest.json +0 -64
- package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
- package/website/content/docs/openapi-extensions/examples.md +0 -550
- package/website/content/docs/openapi-extensions/index.md +0 -551
- package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
- package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
- package/website/content/docs/ossa-compliant-badge.md +0 -251
- package/website/content/docs/pre-release/index.md +0 -175
- package/website/content/docs/quick-reference.md +0 -17
- package/website/content/docs/readme.md +0 -35
- package/website/content/docs/releases/v0.2.6.md +0 -99
- package/website/content/docs/schema-reference/agent-capabilities.md +0 -50
- package/website/content/docs/schema-reference/agent-id.md +0 -52
- package/website/content/docs/schema-reference/agent-name.md +0 -50
- package/website/content/docs/schema-reference/agent-role.md +0 -54
- package/website/content/docs/schema-reference/agent-spec.md +0 -406
- package/website/content/docs/schema-reference/agent-version.md +0 -50
- package/website/content/docs/schema-reference/autonomy.md +0 -568
- package/website/content/docs/schema-reference/constraints.md +0 -543
- package/website/content/docs/schema-reference/index.md +0 -45
- package/website/content/docs/schema-reference/llm-config.md +0 -445
- package/website/content/docs/schema-reference/observability.md +0 -654
- package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
- package/website/content/docs/schema-reference/taxonomy.md +0 -509
- package/website/content/docs/schema-reference/tools.md +0 -628
- package/website/content/docs/templates/blog-post.md +0 -43
- package/website/content/docs/types-reference/index.md +0 -105
- package/website/content/docs/use-cases/00-index.md +0 -395
- package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
- package/website/content/docs/use-cases/customer-support.md +0 -1234
- package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
- package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
- package/website/content/docs/versioning.md +0 -288
- package/website/dev.sh +0 -53
- package/website/docker-compose.dev.yml +0 -36
- package/website/lib/version.ts +0 -35
- package/website/lib/versions.json +0 -103
- package/website/next.config.ts +0 -18
- package/website/nginx.conf +0 -32
- package/website/package-lock.json +0 -9679
- package/website/package.json +0 -59
- package/website/postcss.config.mjs +0 -9
- package/website/scripts/fetch-versions.js +0 -166
- package/website/scripts/generate-examples-index.js +0 -163
- package/website/scripts/merge-docs-to-wiki.ts +0 -207
- package/website/scripts/sync-version.js +0 -72
- package/website/scripts/sync-wiki.ts +0 -322
- package/website/scripts/upload-wiki.ts +0 -199
- package/website/styles/_spacing.scss +0 -453
- package/website/styles/_tokens.scss +0 -245
- package/website/styles/_typography.scss +0 -361
- package/website/styles/_variables.scss +0 -287
- 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';
|