@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,167 +0,0 @@
1
- import React from 'react';
2
-
3
- type CardVariant = 'default' | 'featured' | 'interactive' | 'ghost';
4
- type CardPadding = 'sm' | 'md' | 'lg';
5
- type CardElevation = 0 | 1 | 2 | 3;
6
-
7
- export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
8
- /** Card content */
9
- children: React.ReactNode;
10
- /** Visual variant */
11
- variant?: CardVariant;
12
- /** Padding size */
13
- padding?: CardPadding;
14
- /** Shadow elevation level */
15
- elevation?: CardElevation;
16
- /** Enable hover effects */
17
- hover?: boolean;
18
- /** Make card clickable */
19
- onClick?: () => void;
20
- }
21
-
22
- const variantClasses: Record<CardVariant, string> = {
23
- default: 'bg-white border border-gray-200 rounded-xl',
24
- featured:
25
- 'bg-gradient-to-br from-blue-50 to-indigo-50 border-2 border-primary/20 rounded-xl',
26
- interactive:
27
- 'bg-white border-2 border-gray-200 rounded-xl cursor-pointer hover:border-primary',
28
- ghost: 'bg-transparent border-none',
29
- };
30
-
31
- const paddingClasses: Record<CardPadding, string> = {
32
- sm: 'p-4',
33
- md: 'p-6',
34
- lg: 'p-8',
35
- };
36
-
37
- const elevationClasses: Record<CardElevation, string> = {
38
- 0: 'shadow-none',
39
- 1: 'shadow-sm',
40
- 2: 'shadow-md',
41
- 3: 'shadow-lg',
42
- };
43
-
44
- const hoverClasses = 'hover:shadow-xl hover:-translate-y-1 transition-all duration-300';
45
-
46
- export const Card = React.forwardRef<HTMLDivElement, CardProps>(
47
- (
48
- {
49
- className = '',
50
- variant = 'default',
51
- padding = 'md',
52
- elevation = 1,
53
- hover = false,
54
- children,
55
- onClick,
56
- ...props
57
- },
58
- ref
59
- ) => {
60
- const classes = [
61
- variantClasses[variant],
62
- paddingClasses[padding],
63
- elevationClasses[elevation],
64
- hover || onClick ? hoverClasses : '',
65
- onClick ? 'cursor-pointer' : '',
66
- className,
67
- ]
68
- .filter(Boolean)
69
- .join(' ');
70
-
71
- return (
72
- <div
73
- ref={ref}
74
- className={classes}
75
- onClick={onClick}
76
- role={onClick ? 'button' : undefined}
77
- tabIndex={onClick ? 0 : undefined}
78
- onKeyDown={
79
- onClick
80
- ? (e) => {
81
- if (e.key === 'Enter' || e.key === ' ') {
82
- e.preventDefault();
83
- onClick();
84
- }
85
- }
86
- : undefined
87
- }
88
- {...props}
89
- >
90
- {children}
91
- </div>
92
- );
93
- }
94
- );
95
-
96
- Card.displayName = 'Card';
97
-
98
- // Card sub-components for better composition
99
- export const CardHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
100
- className = '',
101
- children,
102
- ...props
103
- }) => {
104
- return (
105
- <div className={`mb-4 ${className}`} {...props}>
106
- {children}
107
- </div>
108
- );
109
- };
110
-
111
- CardHeader.displayName = 'CardHeader';
112
-
113
- export const CardTitle: React.FC<React.HTMLAttributes<HTMLHeadingElement>> = ({
114
- className = '',
115
- children,
116
- ...props
117
- }) => {
118
- return (
119
- <h3 className={`text-2xl font-semibold text-gray-900 ${className}`} {...props}>
120
- {children}
121
- </h3>
122
- );
123
- };
124
-
125
- CardTitle.displayName = 'CardTitle';
126
-
127
- export const CardDescription: React.FC<React.HTMLAttributes<HTMLParagraphElement>> = ({
128
- className = '',
129
- children,
130
- ...props
131
- }) => {
132
- return (
133
- <p className={`text-gray-600 ${className}`} {...props}>
134
- {children}
135
- </p>
136
- );
137
- };
138
-
139
- CardDescription.displayName = 'CardDescription';
140
-
141
- export const CardContent: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
142
- className = '',
143
- children,
144
- ...props
145
- }) => {
146
- return (
147
- <div className={className} {...props}>
148
- {children}
149
- </div>
150
- );
151
- };
152
-
153
- CardContent.displayName = 'CardContent';
154
-
155
- export const CardFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
156
- className = '',
157
- children,
158
- ...props
159
- }) => {
160
- return (
161
- <div className={`mt-4 pt-4 border-t border-gray-200 ${className}`} {...props}>
162
- {children}
163
- </div>
164
- );
165
- };
166
-
167
- CardFooter.displayName = 'CardFooter';
@@ -1,141 +0,0 @@
1
- 'use client';
2
-
3
- import React, { InputHTMLAttributes, forwardRef } from 'react';
4
-
5
- // Simple className merger utility
6
- function cn(...classes: (string | undefined | null | false)[]): string {
7
- return classes.filter(Boolean).join(' ');
8
- }
9
-
10
- // ============================================================================
11
- // CHECKBOX COMPONENT
12
- // ============================================================================
13
- // Checkbox with label, error states, and accessibility
14
- // ============================================================================
15
-
16
- export interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {
17
- label?: string;
18
- error?: string;
19
- helperText?: string;
20
- }
21
-
22
- const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
23
- (
24
- {
25
- className,
26
- label,
27
- error,
28
- helperText,
29
- id,
30
- disabled,
31
- ...props
32
- },
33
- ref
34
- ) => {
35
- // Generate ID if not provided
36
- const checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;
37
- const errorId = `${checkboxId}-error`;
38
- const helperId = `${checkboxId}-helper`;
39
-
40
- // Base checkbox styles
41
- const baseStyles = [
42
- 'w-5',
43
- 'h-5',
44
- 'rounded',
45
- 'border-2',
46
- 'transition-all',
47
- 'duration-200',
48
- 'cursor-pointer',
49
- 'focus:outline-none',
50
- 'focus:ring-2',
51
- 'focus:ring-offset-2',
52
- 'disabled:opacity-50',
53
- 'disabled:cursor-not-allowed',
54
- ];
55
-
56
- // State-based styles
57
- const stateStyles = error
58
- ? [
59
- 'border-error-500',
60
- 'text-error-600',
61
- 'focus:ring-error-500',
62
- ]
63
- : [
64
- 'border-gray-300',
65
- 'text-primary-600',
66
- 'focus:ring-primary-500',
67
- 'checked:bg-primary-600',
68
- 'checked:border-primary-600',
69
- ];
70
-
71
- return (
72
- <div>
73
- <div className="flex items-start gap-3">
74
- {/* Checkbox */}
75
- <input
76
- ref={ref}
77
- type="checkbox"
78
- id={checkboxId}
79
- className={cn(
80
- ...baseStyles,
81
- ...stateStyles,
82
- className
83
- )}
84
- disabled={disabled}
85
- aria-invalid={error ? 'true' : 'false'}
86
- aria-describedby={cn(
87
- error ? errorId : undefined,
88
- helperText ? helperId : undefined
89
- )}
90
- {...props}
91
- />
92
-
93
- {/* Label and helper text */}
94
- {(label || helperText) && (
95
- <div className="flex-1">
96
- {label && (
97
- <label
98
- htmlFor={checkboxId}
99
- className={cn(
100
- 'block',
101
- 'text-sm',
102
- 'font-medium',
103
- 'cursor-pointer',
104
- error ? 'text-error-700' : 'text-gray-700',
105
- disabled && 'opacity-50 cursor-not-allowed'
106
- )}
107
- >
108
- {label}
109
- </label>
110
- )}
111
-
112
- {helperText && !error && (
113
- <p
114
- id={helperId}
115
- className="mt-0.5 text-sm text-gray-500"
116
- >
117
- {helperText}
118
- </p>
119
- )}
120
- </div>
121
- )}
122
- </div>
123
-
124
- {/* Error message */}
125
- {error && (
126
- <p
127
- id={errorId}
128
- className="mt-1 ml-8 text-sm text-error-600"
129
- role="alert"
130
- >
131
- {error}
132
- </p>
133
- )}
134
- </div>
135
- );
136
- }
137
- );
138
-
139
- Checkbox.displayName = 'Checkbox';
140
-
141
- export { Checkbox };
@@ -1,169 +0,0 @@
1
- 'use client';
2
-
3
- import React, { InputHTMLAttributes, forwardRef } from 'react';
4
-
5
- // Simple className merger utility
6
- function cn(...classes: (string | undefined | null | false)[]): string {
7
- return classes.filter(Boolean).join(' ');
8
- }
9
-
10
- // ============================================================================
11
- // INPUT COMPONENT
12
- // ============================================================================
13
- // Form input with label, error states, helper text, and accessibility
14
- // ============================================================================
15
-
16
- export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
17
- label?: string;
18
- error?: string;
19
- helperText?: string;
20
- leftIcon?: React.ReactNode;
21
- rightIcon?: React.ReactNode;
22
- fullWidth?: boolean;
23
- }
24
-
25
- const Input = forwardRef<HTMLInputElement, InputProps>(
26
- (
27
- {
28
- className,
29
- label,
30
- error,
31
- helperText,
32
- leftIcon,
33
- rightIcon,
34
- fullWidth = false,
35
- id,
36
- disabled,
37
- required,
38
- ...props
39
- },
40
- ref
41
- ) => {
42
- // Generate ID if not provided
43
- const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;
44
- const errorId = `${inputId}-error`;
45
- const helperId = `${inputId}-helper`;
46
-
47
- // Base input styles
48
- const baseStyles = [
49
- 'block',
50
- 'w-full',
51
- 'rounded-lg',
52
- 'border',
53
- 'px-4',
54
- 'py-2',
55
- 'text-base',
56
- 'transition-colors',
57
- 'duration-200',
58
- 'focus:outline-none',
59
- 'focus:ring-2',
60
- 'focus:ring-offset-1',
61
- 'disabled:opacity-50',
62
- 'disabled:cursor-not-allowed',
63
- 'disabled:bg-gray-100',
64
- ];
65
-
66
- // State-based styles
67
- const stateStyles = error
68
- ? [
69
- 'border-error-500',
70
- 'text-error-900',
71
- 'focus:border-error-500',
72
- 'focus:ring-error-500',
73
- ]
74
- : [
75
- 'border-gray-300',
76
- 'text-gray-900',
77
- 'focus:border-primary-500',
78
- 'focus:ring-primary-500',
79
- ];
80
-
81
- // Icon padding adjustments
82
- const iconPaddingStyles = [];
83
- if (leftIcon) iconPaddingStyles.push('pl-10');
84
- if (rightIcon) iconPaddingStyles.push('pr-10');
85
-
86
- return (
87
- <div className={cn(fullWidth ? 'w-full' : 'w-auto')}>
88
- {/* Label */}
89
- {label && (
90
- <label
91
- htmlFor={inputId}
92
- className={cn(
93
- 'block',
94
- 'text-sm',
95
- 'font-medium',
96
- 'mb-1',
97
- error ? 'text-error-700' : 'text-gray-700'
98
- )}
99
- >
100
- {label}
101
- {required && <span className="text-error-500 ml-1">*</span>}
102
- </label>
103
- )}
104
-
105
- {/* Input wrapper */}
106
- <div className="relative">
107
- {/* Left icon */}
108
- {leftIcon && (
109
- <div className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400">
110
- {leftIcon}
111
- </div>
112
- )}
113
-
114
- {/* Input */}
115
- <input
116
- ref={ref}
117
- id={inputId}
118
- className={cn(
119
- ...baseStyles,
120
- ...stateStyles,
121
- ...iconPaddingStyles,
122
- className
123
- )}
124
- disabled={disabled}
125
- required={required}
126
- aria-invalid={error ? 'true' : 'false'}
127
- aria-describedby={cn(
128
- error ? errorId : undefined,
129
- helperText ? helperId : undefined
130
- )}
131
- {...props}
132
- />
133
-
134
- {/* Right icon */}
135
- {rightIcon && (
136
- <div className="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400">
137
- {rightIcon}
138
- </div>
139
- )}
140
- </div>
141
-
142
- {/* Error message */}
143
- {error && (
144
- <p
145
- id={errorId}
146
- className="mt-1 text-sm text-error-600"
147
- role="alert"
148
- >
149
- {error}
150
- </p>
151
- )}
152
-
153
- {/* Helper text */}
154
- {helperText && !error && (
155
- <p
156
- id={helperId}
157
- className="mt-1 text-sm text-gray-500"
158
- >
159
- {helperText}
160
- </p>
161
- )}
162
- </div>
163
- );
164
- }
165
- );
166
-
167
- Input.displayName = 'Input';
168
-
169
- export { Input };
@@ -1,141 +0,0 @@
1
- 'use client';
2
-
3
- import React, { InputHTMLAttributes, forwardRef } from 'react';
4
-
5
- // Simple className merger utility
6
- function cn(...classes: (string | undefined | null | false)[]): string {
7
- return classes.filter(Boolean).join(' ');
8
- }
9
-
10
- // ============================================================================
11
- // RADIO COMPONENT
12
- // ============================================================================
13
- // Radio button with label, error states, and accessibility
14
- // ============================================================================
15
-
16
- export interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {
17
- label?: string;
18
- error?: string;
19
- helperText?: string;
20
- }
21
-
22
- const Radio = forwardRef<HTMLInputElement, RadioProps>(
23
- (
24
- {
25
- className,
26
- label,
27
- error,
28
- helperText,
29
- id,
30
- disabled,
31
- ...props
32
- },
33
- ref
34
- ) => {
35
- // Generate ID if not provided
36
- const radioId = id || `radio-${Math.random().toString(36).substr(2, 9)}`;
37
- const errorId = `${radioId}-error`;
38
- const helperId = `${radioId}-helper`;
39
-
40
- // Base radio styles
41
- const baseStyles = [
42
- 'w-5',
43
- 'h-5',
44
- 'rounded-full',
45
- 'border-2',
46
- 'transition-all',
47
- 'duration-200',
48
- 'cursor-pointer',
49
- 'focus:outline-none',
50
- 'focus:ring-2',
51
- 'focus:ring-offset-2',
52
- 'disabled:opacity-50',
53
- 'disabled:cursor-not-allowed',
54
- ];
55
-
56
- // State-based styles
57
- const stateStyles = error
58
- ? [
59
- 'border-error-500',
60
- 'text-error-600',
61
- 'focus:ring-error-500',
62
- ]
63
- : [
64
- 'border-gray-300',
65
- 'text-primary-600',
66
- 'focus:ring-primary-500',
67
- 'checked:bg-primary-600',
68
- 'checked:border-primary-600',
69
- ];
70
-
71
- return (
72
- <div>
73
- <div className="flex items-start gap-3">
74
- {/* Radio */}
75
- <input
76
- ref={ref}
77
- type="radio"
78
- id={radioId}
79
- className={cn(
80
- ...baseStyles,
81
- ...stateStyles,
82
- className
83
- )}
84
- disabled={disabled}
85
- aria-invalid={error ? 'true' : 'false'}
86
- aria-describedby={cn(
87
- error ? errorId : undefined,
88
- helperText ? helperId : undefined
89
- )}
90
- {...props}
91
- />
92
-
93
- {/* Label and helper text */}
94
- {(label || helperText) && (
95
- <div className="flex-1">
96
- {label && (
97
- <label
98
- htmlFor={radioId}
99
- className={cn(
100
- 'block',
101
- 'text-sm',
102
- 'font-medium',
103
- 'cursor-pointer',
104
- error ? 'text-error-700' : 'text-gray-700',
105
- disabled && 'opacity-50 cursor-not-allowed'
106
- )}
107
- >
108
- {label}
109
- </label>
110
- )}
111
-
112
- {helperText && !error && (
113
- <p
114
- id={helperId}
115
- className="mt-0.5 text-sm text-gray-500"
116
- >
117
- {helperText}
118
- </p>
119
- )}
120
- </div>
121
- )}
122
- </div>
123
-
124
- {/* Error message */}
125
- {error && (
126
- <p
127
- id={errorId}
128
- className="mt-1 ml-8 text-sm text-error-600"
129
- role="alert"
130
- >
131
- {error}
132
- </p>
133
- )}
134
- </div>
135
- );
136
- }
137
- );
138
-
139
- Radio.displayName = 'Radio';
140
-
141
- export { Radio };