@opencosmos/ui 1.3.1 → 1.3.2

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 (46) hide show
  1. package/.claude/CLAUDE.md +47 -47
  2. package/LICENSE +21 -0
  3. package/README.md +21 -21
  4. package/dist/{hooks-CKW8vE9H.d.ts → hooks-CFPKFXhH.d.ts} +1 -1
  5. package/dist/{hooks-1b8WaQf1.d.mts → hooks-CeAuZ0i5.d.mts} +1 -1
  6. package/dist/hooks.d.mts +1 -1
  7. package/dist/hooks.d.ts +1 -1
  8. package/dist/hooks.js.map +1 -1
  9. package/dist/hooks.mjs.map +1 -1
  10. package/dist/index.d.mts +78 -11
  11. package/dist/index.d.ts +78 -11
  12. package/dist/index.js +585 -342
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.mjs +548 -312
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/{providers-CXPDMsl7.d.mts → providers-CzKisd2T.d.mts} +1 -1
  17. package/dist/{providers-Dn_Msjvz.d.ts → providers-D39-kwai.d.ts} +1 -1
  18. package/dist/providers.d.mts +1 -1
  19. package/dist/providers.d.ts +1 -1
  20. package/dist/providers.js.map +1 -1
  21. package/dist/providers.mjs.map +1 -1
  22. package/dist/tokens.js.map +1 -1
  23. package/dist/{utils-Cs04sxth.d.mts → utils-CkatYLG4.d.mts} +1 -1
  24. package/dist/{utils-CIIM7dAC.d.ts → utils-Y1Zi7biA.d.ts} +1 -1
  25. package/dist/utils.d.mts +1 -1
  26. package/dist/utils.d.ts +1 -1
  27. package/dist/utils.js.map +1 -1
  28. package/dist/utils.mjs.map +1 -1
  29. package/package.json +256 -256
  30. package/src/component-registry.ts +4 -4
  31. package/src/components/data-display/CollapsibleCodeBlock.tsx +1 -1
  32. package/src/components/data-display/OpenCosmosIcon.tsx +39 -0
  33. package/src/components/data-display/index.ts +1 -0
  34. package/src/components/layout/AppSidebar.tsx +277 -0
  35. package/src/components/layout/CustomizerPanel.tsx +2 -2
  36. package/src/components/layout/index.ts +1 -0
  37. package/src/hooks/useTheme.ts +1 -1
  38. package/src/hooks.ts +1 -1
  39. package/src/index.ts +6 -4
  40. package/src/lib/store/customizer.ts +1 -1
  41. package/src/lib/store/theme.ts +1 -1
  42. package/src/lib/syntax-parser/index.ts +1 -1
  43. package/src/providers/ThemeProvider.tsx +2 -2
  44. package/src/providers.ts +1 -1
  45. package/src/tokens.ts +3 -3
  46. package/src/utils.ts +1 -1
package/package.json CHANGED
@@ -1,267 +1,267 @@
1
1
  {
2
- "name": "@opencosmos/ui",
3
- "version": "1.3.1",
4
- "description": "Sage Design Engine — Make it Lovable. 100 accessible React components, three themes, user-controlled motion.",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "types": "dist/index.d.ts",
8
- "sideEffects": false,
9
- "license": "MIT",
10
- "author": "Shalom Ormsby",
11
- "repository": {
12
- "type": "git",
13
- "url": "https://github.com/shalomormsby/sage-design-engine.git",
14
- "directory": "packages/ui"
2
+ "name": "@opencosmos/ui",
3
+ "version": "1.3.2",
4
+ "description": "OpenCosmos UI — Make it Lovable. 100 accessible React components, three themes, user-controlled motion.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "sideEffects": false,
9
+ "license": "MIT",
10
+ "author": "Shalom Ormsby",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/shalomormsby/opencosmos-ui.git",
14
+ "directory": "packages/ui"
15
+ },
16
+ "homepage": "https://opencosmos.ai/studio",
17
+ "bugs": "https://github.com/shalomormsby/opencosmos-ui/issues",
18
+ "keywords": [
19
+ "react",
20
+ "components",
21
+ "ui",
22
+ "design-system",
23
+ "tailwind",
24
+ "radix",
25
+ "accessible",
26
+ "themes",
27
+ "mcp",
28
+ "ai"
29
+ ],
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "bin": {
34
+ "opencosmos-ui": "dist/cli.mjs"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "src",
39
+ ".claude",
40
+ "README.md"
41
+ ],
42
+ "exports": {
43
+ ".": {
44
+ "types": "./dist/index.d.ts",
45
+ "import": "./dist/index.mjs",
46
+ "require": "./dist/index.js"
15
47
  },
16
- "homepage": "https://thesage.dev",
17
- "bugs": "https://github.com/shalomormsby/sage-design-engine/issues",
18
- "keywords": [
19
- "react",
20
- "components",
21
- "ui",
22
- "design-system",
23
- "tailwind",
24
- "radix",
25
- "accessible",
26
- "themes",
27
- "mcp",
28
- "ai"
29
- ],
30
- "publishConfig": {
31
- "access": "public"
48
+ "./tokens": {
49
+ "types": "./dist/tokens.d.ts",
50
+ "import": "./dist/tokens.mjs",
51
+ "require": "./dist/tokens.js"
32
52
  },
33
- "bin": {
34
- "opencosmos-ui": "dist/cli.mjs"
53
+ "./hooks": {
54
+ "types": "./dist/hooks.d.ts",
55
+ "import": "./dist/hooks.mjs",
56
+ "require": "./dist/hooks.js"
35
57
  },
36
- "files": [
37
- "dist",
38
- "src",
39
- ".claude",
40
- "README.md"
41
- ],
42
- "exports": {
43
- ".": {
44
- "types": "./dist/index.d.ts",
45
- "import": "./dist/index.mjs",
46
- "require": "./dist/index.js"
47
- },
48
- "./tokens": {
49
- "types": "./dist/tokens.d.ts",
50
- "import": "./dist/tokens.mjs",
51
- "require": "./dist/tokens.js"
52
- },
53
- "./hooks": {
54
- "types": "./dist/hooks.d.ts",
55
- "import": "./dist/hooks.mjs",
56
- "require": "./dist/hooks.js"
57
- },
58
- "./utils": {
59
- "types": "./dist/utils.d.ts",
60
- "import": "./dist/utils.mjs",
61
- "require": "./dist/utils.js"
62
- },
63
- "./providers": {
64
- "types": "./dist/providers.d.ts",
65
- "import": "./dist/providers.mjs",
66
- "require": "./dist/providers.js"
67
- },
68
- "./webgl": {
69
- "types": "./dist/webgl.d.ts",
70
- "import": "./dist/webgl.mjs",
71
- "require": "./dist/webgl.js"
72
- },
73
- "./forms": {
74
- "types": "./dist/forms.d.ts",
75
- "import": "./dist/forms.mjs",
76
- "require": "./dist/forms.js"
77
- },
78
- "./dates": {
79
- "types": "./dist/dates.d.ts",
80
- "import": "./dist/dates.mjs",
81
- "require": "./dist/dates.js"
82
- },
83
- "./tables": {
84
- "types": "./dist/tables.d.ts",
85
- "import": "./dist/tables.mjs",
86
- "require": "./dist/tables.js"
87
- },
88
- "./dnd": {
89
- "types": "./dist/dnd.d.ts",
90
- "import": "./dist/dnd.mjs",
91
- "require": "./dist/dnd.js"
92
- },
93
- "./globals.css": "./src/globals.css",
94
- "./theme.css": "./src/theme.css"
58
+ "./utils": {
59
+ "types": "./dist/utils.d.ts",
60
+ "import": "./dist/utils.mjs",
61
+ "require": "./dist/utils.js"
95
62
  },
96
- "scripts": {
97
- "build": "tsup",
98
- "dev": "tsup --watch",
99
- "lint": "eslint src/",
100
- "test": "vitest run",
101
- "test:watch": "vitest",
102
- "typecheck": "tsc --noEmit",
103
- "size": "size-limit",
104
- "size:check": "size-limit --limit"
63
+ "./providers": {
64
+ "types": "./dist/providers.d.ts",
65
+ "import": "./dist/providers.mjs",
66
+ "require": "./dist/providers.js"
105
67
  },
106
- "size-limit": [
107
- {
108
- "name": "Core (index)",
109
- "path": "dist/index.mjs",
110
- "limit": "450 KB"
111
- },
112
- {
113
- "name": "WebGL",
114
- "path": "dist/webgl.mjs",
115
- "limit": "10 KB"
116
- },
117
- {
118
- "name": "Forms",
119
- "path": "dist/forms.mjs",
120
- "limit": "11 KB"
121
- },
122
- {
123
- "name": "Dates",
124
- "path": "dist/dates.mjs",
125
- "limit": "33 KB"
126
- },
127
- {
128
- "name": "Tables",
129
- "path": "dist/tables.mjs",
130
- "limit": "10 KB"
131
- },
132
- {
133
- "name": "DnD",
134
- "path": "dist/dnd.mjs",
135
- "limit": "10 KB"
136
- },
137
- {
138
- "name": "Hooks",
139
- "path": "dist/hooks.mjs",
140
- "limit": "40 KB"
141
- },
142
- {
143
- "name": "Providers",
144
- "path": "dist/providers.mjs",
145
- "limit": "60 KB"
146
- },
147
- {
148
- "name": "Tokens",
149
- "path": "dist/tokens.mjs",
150
- "limit": "70 KB"
151
- },
152
- {
153
- "name": "Utils",
154
- "path": "dist/utils.mjs",
155
- "limit": "25 KB"
156
- }
157
- ],
158
- "peerDependencies": {
159
- "@dnd-kit/core": "^6.3.1",
160
- "@dnd-kit/sortable": "^10.0.0",
161
- "@dnd-kit/utilities": "^3.2.2",
162
- "@hookform/resolvers": "^3.10.0",
163
- "@tanstack/react-table": "^8.21.3",
164
- "date-fns": "^4.1.0",
165
- "framer-motion": "*",
166
- "react": "*",
167
- "react-day-picker": "^9.13.0",
168
- "react-hook-form": "^7.70.0",
169
- "zod": "^3.24.1"
68
+ "./webgl": {
69
+ "types": "./dist/webgl.d.ts",
70
+ "import": "./dist/webgl.mjs",
71
+ "require": "./dist/webgl.js"
170
72
  },
171
- "peerDependenciesMeta": {
172
- "@dnd-kit/core": {
173
- "optional": true
174
- },
175
- "@dnd-kit/sortable": {
176
- "optional": true
177
- },
178
- "@dnd-kit/utilities": {
179
- "optional": true
180
- },
181
- "@hookform/resolvers": {
182
- "optional": true
183
- },
184
- "@tanstack/react-table": {
185
- "optional": true
186
- },
187
- "date-fns": {
188
- "optional": true
189
- },
190
- "react-day-picker": {
191
- "optional": true
192
- },
193
- "react-hook-form": {
194
- "optional": true
195
- },
196
- "zod": {
197
- "optional": true
198
- }
73
+ "./forms": {
74
+ "types": "./dist/forms.d.ts",
75
+ "import": "./dist/forms.mjs",
76
+ "require": "./dist/forms.js"
199
77
  },
200
- "dependencies": {
201
- "@radix-ui/react-accordion": "^1.2.12",
202
- "@radix-ui/react-alert-dialog": "^1.1.15",
203
- "@radix-ui/react-aspect-ratio": "^1.1.8",
204
- "@radix-ui/react-avatar": "^1.1.11",
205
- "@radix-ui/react-checkbox": "^1.3.3",
206
- "@radix-ui/react-collapsible": "^1.1.12",
207
- "@radix-ui/react-context-menu": "^2.2.16",
208
- "@radix-ui/react-dialog": "^1.1.15",
209
- "@radix-ui/react-dropdown-menu": "^2.1.16",
210
- "@radix-ui/react-hover-card": "^1.1.15",
211
- "@radix-ui/react-label": "^2.1.8",
212
- "@radix-ui/react-menubar": "^1.1.16",
213
- "@radix-ui/react-navigation-menu": "^1.2.14",
214
- "@radix-ui/react-popover": "^1.1.15",
215
- "@radix-ui/react-progress": "^1.1.8",
216
- "@radix-ui/react-radio-group": "^1.3.8",
217
- "@radix-ui/react-scroll-area": "^1.2.10",
218
- "@radix-ui/react-select": "^2.2.6",
219
- "@radix-ui/react-separator": "^1.1.8",
220
- "@radix-ui/react-slider": "^1.3.6",
221
- "@radix-ui/react-slot": "^1.2.4",
222
- "@radix-ui/react-switch": "^1.2.6",
223
- "@radix-ui/react-tabs": "^1.1.13",
224
- "@radix-ui/react-toggle": "^1.1.10",
225
- "@radix-ui/react-toggle-group": "^1.1.11",
226
- "@radix-ui/react-tooltip": "^1.2.8",
227
- "class-variance-authority": "^0.7.0",
228
- "clsx": "^2.1.0",
229
- "cmdk": "^1.1.1",
230
- "embla-carousel-react": "^8.6.0",
231
- "input-otp": "^1.4.2",
232
- "lucide-react": "^0.562.0",
233
- "react-dropzone": "^15.0.0",
234
- "react-resizable-panels": "^4.4.0",
235
- "sonner": "^2.0.7",
236
- "tailwind-merge": "^3.0.0",
237
- "vaul": "^1.1.2",
238
- "zustand": "^5.0.9"
78
+ "./dates": {
79
+ "types": "./dist/dates.d.ts",
80
+ "import": "./dist/dates.mjs",
81
+ "require": "./dist/dates.js"
239
82
  },
240
- "devDependencies": {
241
- "@dnd-kit/core": "^6.3.1",
242
- "@dnd-kit/sortable": "^10.0.0",
243
- "@dnd-kit/utilities": "^3.2.2",
244
- "@hookform/resolvers": "^3.10.0",
245
- "@size-limit/preset-small-lib": "^12.0.0",
246
- "@tanstack/react-table": "^8.21.3",
247
- "@testing-library/jest-dom": "^6.9.1",
248
- "@testing-library/react": "^16.3.2",
249
- "@testing-library/user-event": "^14.6.1",
250
- "@types/react": "^19",
251
- "date-fns": "^4.1.0",
252
- "eslint": "^9.39.2",
253
- "eslint-plugin-react-hooks": "^5.2.0",
254
- "framer-motion": "^12.26.2",
255
- "jsdom": "^28.0.0",
256
- "react-day-picker": "^9.13.0",
257
- "react-hook-form": "^7.70.0",
258
- "size-limit": "^12.0.0",
259
- "tailwindcss": "^4.0.0",
260
- "@tailwindcss/postcss": "^4.0.0",
261
- "tsup": "^8.0.0",
262
- "typescript": "^5.0.0",
263
- "typescript-eslint": "^8.54.0",
264
- "vitest": "^4.0.18",
265
- "zod": "^3.24.1"
83
+ "./tables": {
84
+ "types": "./dist/tables.d.ts",
85
+ "import": "./dist/tables.mjs",
86
+ "require": "./dist/tables.js"
87
+ },
88
+ "./dnd": {
89
+ "types": "./dist/dnd.d.ts",
90
+ "import": "./dist/dnd.mjs",
91
+ "require": "./dist/dnd.js"
92
+ },
93
+ "./globals.css": "./src/globals.css",
94
+ "./theme.css": "./src/theme.css"
95
+ },
96
+ "size-limit": [
97
+ {
98
+ "name": "Core (index)",
99
+ "path": "dist/index.mjs",
100
+ "limit": "450 KB"
101
+ },
102
+ {
103
+ "name": "WebGL",
104
+ "path": "dist/webgl.mjs",
105
+ "limit": "10 KB"
106
+ },
107
+ {
108
+ "name": "Forms",
109
+ "path": "dist/forms.mjs",
110
+ "limit": "11 KB"
111
+ },
112
+ {
113
+ "name": "Dates",
114
+ "path": "dist/dates.mjs",
115
+ "limit": "33 KB"
116
+ },
117
+ {
118
+ "name": "Tables",
119
+ "path": "dist/tables.mjs",
120
+ "limit": "10 KB"
121
+ },
122
+ {
123
+ "name": "DnD",
124
+ "path": "dist/dnd.mjs",
125
+ "limit": "10 KB"
126
+ },
127
+ {
128
+ "name": "Hooks",
129
+ "path": "dist/hooks.mjs",
130
+ "limit": "40 KB"
131
+ },
132
+ {
133
+ "name": "Providers",
134
+ "path": "dist/providers.mjs",
135
+ "limit": "60 KB"
136
+ },
137
+ {
138
+ "name": "Tokens",
139
+ "path": "dist/tokens.mjs",
140
+ "limit": "70 KB"
141
+ },
142
+ {
143
+ "name": "Utils",
144
+ "path": "dist/utils.mjs",
145
+ "limit": "25 KB"
146
+ }
147
+ ],
148
+ "peerDependencies": {
149
+ "@dnd-kit/core": "^6.3.1",
150
+ "@dnd-kit/sortable": "^10.0.0",
151
+ "@dnd-kit/utilities": "^3.2.2",
152
+ "@hookform/resolvers": "^3.10.0",
153
+ "@tanstack/react-table": "^8.21.3",
154
+ "date-fns": "^4.1.0",
155
+ "framer-motion": "*",
156
+ "react": "*",
157
+ "react-day-picker": "^9.13.0",
158
+ "react-hook-form": "^7.70.0",
159
+ "zod": "^3.24.1"
160
+ },
161
+ "peerDependenciesMeta": {
162
+ "@dnd-kit/core": {
163
+ "optional": true
164
+ },
165
+ "@dnd-kit/sortable": {
166
+ "optional": true
167
+ },
168
+ "@dnd-kit/utilities": {
169
+ "optional": true
170
+ },
171
+ "@hookform/resolvers": {
172
+ "optional": true
173
+ },
174
+ "@tanstack/react-table": {
175
+ "optional": true
176
+ },
177
+ "date-fns": {
178
+ "optional": true
179
+ },
180
+ "react-day-picker": {
181
+ "optional": true
182
+ },
183
+ "react-hook-form": {
184
+ "optional": true
185
+ },
186
+ "zod": {
187
+ "optional": true
266
188
  }
189
+ },
190
+ "dependencies": {
191
+ "@radix-ui/react-accordion": "^1.2.12",
192
+ "@radix-ui/react-alert-dialog": "^1.1.15",
193
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
194
+ "@radix-ui/react-avatar": "^1.1.11",
195
+ "@radix-ui/react-checkbox": "^1.3.3",
196
+ "@radix-ui/react-collapsible": "^1.1.12",
197
+ "@radix-ui/react-context-menu": "^2.2.16",
198
+ "@radix-ui/react-dialog": "^1.1.15",
199
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
200
+ "@radix-ui/react-hover-card": "^1.1.15",
201
+ "@radix-ui/react-label": "^2.1.8",
202
+ "@radix-ui/react-menubar": "^1.1.16",
203
+ "@radix-ui/react-navigation-menu": "^1.2.14",
204
+ "@radix-ui/react-popover": "^1.1.15",
205
+ "@radix-ui/react-progress": "^1.1.8",
206
+ "@radix-ui/react-radio-group": "^1.3.8",
207
+ "@radix-ui/react-scroll-area": "^1.2.10",
208
+ "@radix-ui/react-select": "^2.2.6",
209
+ "@radix-ui/react-separator": "^1.1.8",
210
+ "@radix-ui/react-slider": "^1.3.6",
211
+ "@radix-ui/react-slot": "^1.2.4",
212
+ "@radix-ui/react-switch": "^1.2.6",
213
+ "@radix-ui/react-tabs": "^1.1.13",
214
+ "@radix-ui/react-toggle": "^1.1.10",
215
+ "@radix-ui/react-toggle-group": "^1.1.11",
216
+ "@radix-ui/react-tooltip": "^1.2.8",
217
+ "class-variance-authority": "^0.7.0",
218
+ "clsx": "^2.1.0",
219
+ "cmdk": "^1.1.1",
220
+ "embla-carousel-react": "^8.6.0",
221
+ "input-otp": "^1.4.2",
222
+ "lucide-react": "^0.562.0",
223
+ "react-dropzone": "^15.0.0",
224
+ "react-resizable-panels": "^4.4.0",
225
+ "sonner": "^2.0.7",
226
+ "tailwind-merge": "^3.0.0",
227
+ "vaul": "^1.1.2",
228
+ "zustand": "^5.0.9"
229
+ },
230
+ "devDependencies": {
231
+ "@dnd-kit/core": "^6.3.1",
232
+ "@dnd-kit/sortable": "^10.0.0",
233
+ "@dnd-kit/utilities": "^3.2.2",
234
+ "@hookform/resolvers": "^3.10.0",
235
+ "@size-limit/preset-small-lib": "^12.0.0",
236
+ "@tanstack/react-table": "^8.21.3",
237
+ "@testing-library/jest-dom": "^6.9.1",
238
+ "@testing-library/react": "^16.3.2",
239
+ "@testing-library/user-event": "^14.6.1",
240
+ "@types/react": "^19",
241
+ "date-fns": "^4.1.0",
242
+ "eslint": "^9.39.2",
243
+ "eslint-plugin-react-hooks": "^5.2.0",
244
+ "framer-motion": "^12.26.2",
245
+ "jsdom": "^28.0.0",
246
+ "react-day-picker": "^9.13.0",
247
+ "react-hook-form": "^7.70.0",
248
+ "size-limit": "^12.0.0",
249
+ "tailwindcss": "^4.0.0",
250
+ "@tailwindcss/postcss": "^4.0.0",
251
+ "tsup": "^8.0.0",
252
+ "typescript": "^5.0.0",
253
+ "typescript-eslint": "^8.54.0",
254
+ "vitest": "^4.0.18",
255
+ "zod": "^3.24.1"
256
+ },
257
+ "scripts": {
258
+ "build": "tsup",
259
+ "dev": "tsup --watch",
260
+ "lint": "eslint src/",
261
+ "test": "vitest run",
262
+ "test:watch": "vitest",
263
+ "typecheck": "tsc --noEmit",
264
+ "size": "size-limit",
265
+ "size:check": "size-limit --limit"
266
+ }
267
267
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * This file serves as the authoritative source for component counts,
5
5
  * categories, and organization. Used by:
6
- * - Documentation (Sage Studio)
6
+ * - Documentation (OpenCosmos Studio)
7
7
  * - MCP Server registry
8
8
  * - Marketing materials
9
9
  * - Internal tooling
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * The workflow includes:
15
15
  * - Creating the component in packages/ui
16
- * - Registering in Sage Studio (apps/web)
16
+ * - Registering in OpenCosmos Studio (apps/web)
17
17
  * - Updating THIS registry file
18
18
  * - Updating MCP server registry
19
19
  * - Version bumping and npm publishing
@@ -22,7 +22,7 @@
22
22
  */
23
23
 
24
24
  export const BRAND = {
25
- productName: 'Sage Design Engine',
25
+ productName: 'OpenCosmos UI',
26
26
  productNameShort: 'Sage',
27
27
  themeNames: {
28
28
  organic: 'Terra',
@@ -35,7 +35,7 @@ export const BRAND = {
35
35
 
36
36
  export const COMPONENT_REGISTRY = {
37
37
  /**
38
- * Total count of all exported UI components from @thesage/ui
38
+ * Total count of all exported UI components from @opencosmos/ui
39
39
  */
40
40
  totalCount: 100,
41
41
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useState, useMemo } from 'react';
4
4
  import { useTheme } from '../../hooks/useTheme';
5
- import { syntaxColors } from '@thesage/tokens';
5
+ import { syntaxColors } from '@opencosmos/tokens';
6
6
  import { parseCode, type SyntaxToken } from '../../lib/syntax-parser';
7
7
 
8
8
  export interface CollapsibleCodeBlockProps {
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+
3
+ export interface OpenCosmosIconProps {
4
+ /** Size of the icon in pixels @default 20 */
5
+ size?: number;
6
+ /** Additional className */
7
+ className?: string;
8
+ }
9
+
10
+ /**
11
+ * OpenCosmos brand icon — an orbital system: outer ring, tilted ellipse, center star.
12
+ * Uses currentColor so it inherits text color from its parent.
13
+ */
14
+ export const OpenCosmosIcon = ({
15
+ ref,
16
+ size = 20,
17
+ className = '',
18
+ }: OpenCosmosIconProps & { ref?: React.Ref<SVGSVGElement> }) => (
19
+ <svg
20
+ ref={ref}
21
+ xmlns="http://www.w3.org/2000/svg"
22
+ width={size}
23
+ height={size}
24
+ viewBox="0 0 24 24"
25
+ fill="none"
26
+ stroke="currentColor"
27
+ strokeLinecap="round"
28
+ strokeLinejoin="round"
29
+ className={className}
30
+ aria-hidden="true"
31
+ >
32
+ {/* Outer ring — the cosmos boundary */}
33
+ <circle cx="12" cy="12" r="9.5" strokeWidth="1.5" />
34
+ {/* Orbital ellipse — tilted to suggest motion */}
35
+ <ellipse cx="12" cy="12" rx="9.5" ry="3.2" strokeWidth="1.25" transform="rotate(-35 12 12)" />
36
+ {/* Center star — the origin */}
37
+ <circle cx="12" cy="12" r="1.75" fill="currentColor" stroke="none" />
38
+ </svg>
39
+ );
@@ -1,4 +1,5 @@
1
1
  export * from './AspectImage';
2
+ export * from './OpenCosmosIcon';
2
3
  export * from './Avatar';
3
4
  export * from './Badge';
4
5
  export * from './Brand';