@bluefly/openstandardagents 0.2.7 → 0.2.8

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 (277) hide show
  1. package/.devfile.yaml +1 -1
  2. package/.env.example +1 -1
  3. package/.version.json +2 -2
  4. package/.wiki-config.json +24 -0
  5. package/CHANGELOG.md +11 -18
  6. package/CODEOWNERS +75 -0
  7. package/CONTRIBUTING.md +1 -1
  8. package/README.md +171 -243
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/repositories/schema.repository.d.ts +6 -1
  14. package/dist/repositories/schema.repository.d.ts.map +1 -1
  15. package/dist/repositories/schema.repository.js +49 -27
  16. package/dist/repositories/schema.repository.js.map +1 -1
  17. package/dist/services/migration.service.d.ts +4 -3
  18. package/dist/services/migration.service.d.ts.map +1 -1
  19. package/dist/services/migration.service.js +11 -10
  20. package/dist/services/migration.service.js.map +1 -1
  21. package/dist/services/release-automation/release.service.js +1 -1
  22. package/dist/services/release-automation/release.service.js.map +1 -1
  23. package/dist/services/release-automation/schemas/release.schema.js +1 -1
  24. package/dist/services/runtime/claude/claude-adapter.js +1 -1
  25. package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
  26. package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
  27. package/dist/spec/v0.2.8/README.md +72 -0
  28. package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  29. package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  30. package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  31. 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
  32. package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  33. package/dist/types/index.d.ts +3 -2
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/utils/index.d.ts +6 -0
  36. package/dist/utils/index.d.ts.map +1 -0
  37. package/dist/utils/index.js +6 -0
  38. package/dist/utils/index.js.map +1 -0
  39. package/dist/utils/version.d.ts +68 -0
  40. package/dist/utils/version.d.ts.map +1 -0
  41. package/dist/utils/version.js +156 -0
  42. package/dist/utils/version.js.map +1 -0
  43. package/eslint-report.json +1 -0
  44. package/examples/adk-integration/code-review-workflow.yml +1 -1
  45. package/examples/adk-integration/customer-support.yml +1 -1
  46. package/examples/adk-integration/data-pipeline.yml +1 -1
  47. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  48. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  49. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  50. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  51. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  52. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  53. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  54. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  55. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  56. package/examples/anthropic/claude-assistant.ossa.json +1 -1
  57. package/examples/autogen/multi-agent.ossa.json +1 -1
  58. package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
  59. package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
  60. package/examples/common_npm/agent-router.ossa.yaml +1 -0
  61. package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
  62. package/examples/crewai/research-team.ossa.json +1 -1
  63. package/examples/cursor/code-review-agent.ossa.json +1 -1
  64. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
  65. package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
  66. package/examples/extensions/drupal-v1.yml +1 -1
  67. package/examples/extensions/kagent-v1.yml +1 -1
  68. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  69. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
  70. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  71. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  72. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  73. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
  74. package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
  75. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  76. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  77. package/examples/langchain/chain-agent.ossa.json +1 -1
  78. package/examples/langflow/workflow-agent.ossa.json +1 -1
  79. package/examples/langgraph/state-machine-agent.ossa.json +1 -1
  80. package/examples/llamaindex/rag-agent.ossa.json +1 -1
  81. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  82. package/examples/multi-agent/README.md +74 -0
  83. package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
  84. package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
  85. package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
  86. package/examples/openai/basic-agent.ossa.yaml +1 -1
  87. package/examples/openai/multi-tool-agent.ossa.json +1 -1
  88. package/examples/openai/swarm-agent.ossa.json +1 -1
  89. package/examples/production/document-analyzer-openai.yml +1 -1
  90. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  91. package/examples/spec-examples/audit-agent.yml +1 -1
  92. package/examples/spec-examples/chat-agent.yml +1 -1
  93. package/examples/spec-examples/compliance-agent.yml +1 -1
  94. package/examples/spec-examples/monitoring-agent.yml +1 -1
  95. package/examples/spec-examples/workflow-agent.yml +1 -1
  96. package/examples/templates/ossa-compliance.yaml +1 -1
  97. package/examples/vercel/edge-agent.ossa.json +1 -1
  98. package/gl-code-quality-report.json +62 -0
  99. package/llms-ctx-full.txt +39 -0
  100. package/llms-ctx.txt +39 -0
  101. package/llms.txt +47 -0
  102. package/package.json +3 -2
  103. package/scripts/eslint-to-codequality.cjs +34 -0
  104. package/scripts/generate-llms-ctx.sh +17 -0
  105. package/scripts/generate-schema-docs.ts +31 -10
  106. package/scripts/sync-version.js +4 -12
  107. package/scripts/validate-schema.ts +2 -1
  108. package/spec/v0.2.8/CHANGELOG.md +401 -0
  109. package/spec/v0.2.8/README.md +72 -0
  110. package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  111. package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  112. package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  113. package/{dist/spec/v0.2.6-dev/ossa-0.2.5.schema.json → spec/v0.2.8/ossa-0.2.8.schema.json} +1509 -52
  114. package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  115. package/test-results/junit.xml +299 -0
  116. package/bin/validate-ossa-0.2.5-RC.ts +0 -244
  117. package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
  118. package/scripts/lib/exec.ts +0 -37
  119. package/scripts/lib/file-ops.ts +0 -58
  120. package/scripts/lib/version.ts +0 -83
  121. package/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
  122. package/website/.lighthouserc.ts +0 -24
  123. package/website/.prettierrc +0 -10
  124. package/website/DESIGN_SYSTEM_IMPLEMENTATION.md +0 -445
  125. package/website/Dockerfile +0 -30
  126. package/website/app/about/page.tsx +0 -304
  127. package/website/app/blog/[slug]/page.tsx +0 -208
  128. package/website/app/blog/page.tsx +0 -249
  129. package/website/app/design-guide/page.tsx +0 -511
  130. package/website/app/docs/[[...slug]]/page.tsx +0 -847
  131. package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
  132. package/website/app/ecosystem/page.tsx +0 -410
  133. package/website/app/examples/page.tsx +0 -133
  134. package/website/app/globals.scss +0 -370
  135. package/website/app/layout.tsx +0 -106
  136. package/website/app/license/page.tsx +0 -183
  137. package/website/app/not-found.tsx +0 -18
  138. package/website/app/page.tsx +0 -686
  139. package/website/app/page.tsx.bak +0 -679
  140. package/website/app/page.tsx.bak2 +0 -649
  141. package/website/app/playground/page.tsx +0 -487
  142. package/website/app/robots.ts +0 -19
  143. package/website/app/rss.xml/route.ts +0 -74
  144. package/website/app/schema/page.tsx +0 -1001
  145. package/website/app/sitemap.ts +0 -56
  146. package/website/app/specification/page.tsx +0 -287
  147. package/website/components/InstallCommand.tsx +0 -96
  148. package/website/components/Logo.tsx +0 -97
  149. package/website/components/StructuredData.tsx +0 -65
  150. package/website/components/docs/DocsSearch.tsx +0 -104
  151. package/website/components/docs/DocsSidebar.tsx +0 -155
  152. package/website/components/docs/MarkdownContent.tsx +0 -401
  153. package/website/components/docs/VersionSelector.tsx +0 -105
  154. package/website/components/examples/ExamplesViewer.tsx +0 -293
  155. package/website/components/layout/Footer.tsx +0 -116
  156. package/website/components/layout/Header.tsx +0 -172
  157. package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
  158. package/website/components/schema/SchemaExplorer.tsx +0 -213
  159. package/website/components/ui/Badge.tsx +0 -82
  160. package/website/components/ui/Button.tsx +0 -116
  161. package/website/components/ui/Card.tsx +0 -167
  162. package/website/components/ui/Checkbox.tsx +0 -141
  163. package/website/components/ui/Input.tsx +0 -169
  164. package/website/components/ui/Radio.tsx +0 -141
  165. package/website/components/ui/Select.tsx +0 -182
  166. package/website/components/ui/Tag.tsx +0 -158
  167. package/website/components/ui/Textarea.tsx +0 -195
  168. package/website/components/ui/index.ts +0 -11
  169. package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
  170. package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
  171. package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
  172. package/website/content/blog/introducing-ossa-framework.md +0 -328
  173. package/website/content/blog/ossa-production-results.md +0 -279
  174. package/website/content/blog/welcome-to-ossa.md +0 -43
  175. package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
  176. package/website/content/docs/00-home.md +0 -153
  177. package/website/content/docs/adapters/openai-adapter.md +0 -693
  178. package/website/content/docs/agents/catalog.md +0 -28
  179. package/website/content/docs/aiflow-framework-integration-with-ossa.md +0 -107
  180. package/website/content/docs/api-reference/index.md +0 -38
  181. package/website/content/docs/api-reference/ossa-core-api.md +0 -634
  182. package/website/content/docs/api-reference/ossa-registry-api.md +0 -515
  183. package/website/content/docs/api-reference/unified-agent-gateway.md +0 -599
  184. package/website/content/docs/architecture/execution-flow.md +0 -335
  185. package/website/content/docs/architecture/multi-agent-systems.md +0 -737
  186. package/website/content/docs/architecture/overview.md +0 -121
  187. package/website/content/docs/architecture/stack-integration.md +0 -461
  188. package/website/content/docs/changelog.md +0 -246
  189. package/website/content/docs/cli-reference/index.md +0 -111
  190. package/website/content/docs/cli-reference/ossa-agents.md +0 -70
  191. package/website/content/docs/cli-reference/ossa-export.md +0 -56
  192. package/website/content/docs/cli-reference/ossa-generate.md +0 -66
  193. package/website/content/docs/cli-reference/ossa-gitlab-agent.md +0 -57
  194. package/website/content/docs/cli-reference/ossa-import.md +0 -56
  195. package/website/content/docs/cli-reference/ossa-init.md +0 -57
  196. package/website/content/docs/cli-reference/ossa-migrate.md +0 -62
  197. package/website/content/docs/cli-reference/ossa-run.md +0 -66
  198. package/website/content/docs/cli-reference/ossa-schema.md +0 -57
  199. package/website/content/docs/cli-reference/ossa-setup.md +0 -57
  200. package/website/content/docs/cli-reference/ossa-validate.md +0 -66
  201. package/website/content/docs/configuration/index.md +0 -97
  202. package/website/content/docs/contributing.md +0 -599
  203. package/website/content/docs/deployment/github-mirroring.md +0 -924
  204. package/website/content/docs/documentation.md +0 -100
  205. package/website/content/docs/ecosystem/framework-support.md +0 -1361
  206. package/website/content/docs/ecosystem/overview.md +0 -366
  207. package/website/content/docs/errors/index.md +0 -10
  208. package/website/content/docs/examples/aiflow-framework-integration-with-ossa.md +0 -107
  209. package/website/content/docs/examples/catalog.md +0 -300
  210. package/website/content/docs/for-audiences/students-researchers.md +0 -122
  211. package/website/content/docs/getting-started/index.md +0 -92
  212. package/website/content/docs/getting-started/installation.md +0 -155
  213. package/website/content/docs/getting-started/running-agents.md +0 -309
  214. package/website/content/docs/getting-started.md +0 -91
  215. package/website/content/docs/integrations/aiflow.md +0 -104
  216. package/website/content/docs/integrations/drupal.md +0 -105
  217. package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
  218. package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
  219. package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
  220. package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
  221. package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
  222. package/website/content/docs/migration-guides/index.md +0 -133
  223. package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
  224. package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
  225. package/website/content/docs/migration-guides/migration-manifest.json +0 -64
  226. package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
  227. package/website/content/docs/openapi-extensions/examples.md +0 -550
  228. package/website/content/docs/openapi-extensions/index.md +0 -551
  229. package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
  230. package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
  231. package/website/content/docs/ossa-compliant-badge.md +0 -251
  232. package/website/content/docs/pre-release/index.md +0 -175
  233. package/website/content/docs/quick-reference.md +0 -17
  234. package/website/content/docs/readme.md +0 -35
  235. package/website/content/docs/releases/v0.2.6.md +0 -99
  236. package/website/content/docs/schema-reference/agent-capabilities.md +0 -50
  237. package/website/content/docs/schema-reference/agent-id.md +0 -52
  238. package/website/content/docs/schema-reference/agent-name.md +0 -50
  239. package/website/content/docs/schema-reference/agent-role.md +0 -54
  240. package/website/content/docs/schema-reference/agent-spec.md +0 -406
  241. package/website/content/docs/schema-reference/agent-version.md +0 -50
  242. package/website/content/docs/schema-reference/autonomy.md +0 -568
  243. package/website/content/docs/schema-reference/constraints.md +0 -543
  244. package/website/content/docs/schema-reference/index.md +0 -45
  245. package/website/content/docs/schema-reference/llm-config.md +0 -445
  246. package/website/content/docs/schema-reference/observability.md +0 -654
  247. package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
  248. package/website/content/docs/schema-reference/taxonomy.md +0 -509
  249. package/website/content/docs/schema-reference/tools.md +0 -628
  250. package/website/content/docs/templates/blog-post.md +0 -43
  251. package/website/content/docs/types-reference/index.md +0 -105
  252. package/website/content/docs/use-cases/00-index.md +0 -395
  253. package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
  254. package/website/content/docs/use-cases/customer-support.md +0 -1234
  255. package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
  256. package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
  257. package/website/content/docs/versioning.md +0 -288
  258. package/website/dev.sh +0 -53
  259. package/website/docker-compose.dev.yml +0 -36
  260. package/website/lib/version.ts +0 -35
  261. package/website/lib/versions.json +0 -103
  262. package/website/next.config.ts +0 -18
  263. package/website/nginx.conf +0 -32
  264. package/website/package-lock.json +0 -9679
  265. package/website/package.json +0 -59
  266. package/website/postcss.config.mjs +0 -9
  267. package/website/scripts/fetch-versions.js +0 -166
  268. package/website/scripts/generate-examples-index.js +0 -163
  269. package/website/scripts/merge-docs-to-wiki.ts +0 -207
  270. package/website/scripts/sync-version.js +0 -72
  271. package/website/scripts/sync-wiki.ts +0 -322
  272. package/website/scripts/upload-wiki.ts +0 -199
  273. package/website/styles/_spacing.scss +0 -453
  274. package/website/styles/_tokens.scss +0 -245
  275. package/website/styles/_typography.scss +0 -361
  276. package/website/styles/_variables.scss +0 -287
  277. 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 };