@geenius/adapters 0.1.0

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 (151) hide show
  1. package/.changeset/config.json +11 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +16 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +11 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  6. package/.github/dependabot.yml +11 -0
  7. package/.github/workflows/ci.yml +23 -0
  8. package/.github/workflows/release.yml +29 -0
  9. package/.nvmrc +1 -0
  10. package/.project/ACCOUNT.yaml +4 -0
  11. package/.project/IDEAS.yaml +7 -0
  12. package/.project/PROJECT.yaml +11 -0
  13. package/.project/ROADMAP.yaml +15 -0
  14. package/CHANGELOG.md +11 -0
  15. package/CODE_OF_CONDUCT.md +16 -0
  16. package/CONTRIBUTING.md +26 -0
  17. package/LICENSE +21 -0
  18. package/README.md +202 -0
  19. package/SECURITY.md +15 -0
  20. package/SUPPORT.md +8 -0
  21. package/package.json +51 -0
  22. package/packages/convex/README.md +64 -0
  23. package/packages/convex/package.json +42 -0
  24. package/packages/convex/src/adapter.ts +39 -0
  25. package/packages/convex/src/index.ts +19 -0
  26. package/packages/convex/src/mutations.ts +142 -0
  27. package/packages/convex/src/queries.ts +106 -0
  28. package/packages/convex/src/schema.ts +54 -0
  29. package/packages/convex/src/types.ts +20 -0
  30. package/packages/convex/tsconfig.json +11 -0
  31. package/packages/convex/tsup.config.ts +10 -0
  32. package/packages/react/README.md +1 -0
  33. package/packages/react/package.json +45 -0
  34. package/packages/react/src/components/AdapterCard.tsx +49 -0
  35. package/packages/react/src/components/AdapterConfigForm.tsx +118 -0
  36. package/packages/react/src/components/AdapterList.tsx +84 -0
  37. package/packages/react/src/components/AdapterStatusBadge.tsx +30 -0
  38. package/packages/react/src/components/index.ts +4 -0
  39. package/packages/react/src/hooks/index.ts +75 -0
  40. package/packages/react/src/index.tsx +44 -0
  41. package/packages/react/src/pages/AdapterDetailPage.tsx +133 -0
  42. package/packages/react/src/pages/AdaptersPage.tsx +111 -0
  43. package/packages/react/src/pages/index.ts +2 -0
  44. package/packages/react/src/provider/AdapterProvider.tsx +115 -0
  45. package/packages/react/src/provider/index.ts +2 -0
  46. package/packages/react/tsconfig.json +18 -0
  47. package/packages/react/tsup.config.ts +10 -0
  48. package/packages/react-css/README.md +1 -0
  49. package/packages/react-css/package.json +44 -0
  50. package/packages/react-css/src/adapters.css +1576 -0
  51. package/packages/react-css/src/components/AdapterCard.tsx +34 -0
  52. package/packages/react-css/src/components/AdapterConfigForm.tsx +63 -0
  53. package/packages/react-css/src/components/AdapterList.tsx +40 -0
  54. package/packages/react-css/src/components/AdapterStatusBadge.tsx +21 -0
  55. package/packages/react-css/src/components/index.ts +4 -0
  56. package/packages/react-css/src/hooks/index.ts +75 -0
  57. package/packages/react-css/src/index.tsx +25 -0
  58. package/packages/react-css/src/pages/AdapterDetailPage.tsx +133 -0
  59. package/packages/react-css/src/pages/AdaptersPage.tsx +111 -0
  60. package/packages/react-css/src/pages/index.ts +2 -0
  61. package/packages/react-css/src/provider/AdapterProvider.tsx +115 -0
  62. package/packages/react-css/src/provider/index.ts +2 -0
  63. package/packages/react-css/src/styles.css +494 -0
  64. package/packages/react-css/tsconfig.json +19 -0
  65. package/packages/react-css/tsup.config.ts +2 -0
  66. package/packages/shared/README.md +1 -0
  67. package/packages/shared/package.json +39 -0
  68. package/packages/shared/src/__tests__/adapters.test.ts +545 -0
  69. package/packages/shared/src/admin/index.ts +2 -0
  70. package/packages/shared/src/admin/interface.ts +34 -0
  71. package/packages/shared/src/admin/localStorage.ts +109 -0
  72. package/packages/shared/src/ai/anthropic.ts +123 -0
  73. package/packages/shared/src/ai/cloudflare-gateway.ts +130 -0
  74. package/packages/shared/src/ai/gemini.ts +181 -0
  75. package/packages/shared/src/ai/index.ts +14 -0
  76. package/packages/shared/src/ai/interface.ts +11 -0
  77. package/packages/shared/src/ai/localStorage.ts +78 -0
  78. package/packages/shared/src/ai/ollama.ts +143 -0
  79. package/packages/shared/src/ai/openai.ts +120 -0
  80. package/packages/shared/src/ai/vercel-ai.ts +101 -0
  81. package/packages/shared/src/auth/better-auth.ts +118 -0
  82. package/packages/shared/src/auth/clerk.ts +151 -0
  83. package/packages/shared/src/auth/convex-auth.ts +125 -0
  84. package/packages/shared/src/auth/index.ts +10 -0
  85. package/packages/shared/src/auth/interface.ts +17 -0
  86. package/packages/shared/src/auth/localStorage.ts +125 -0
  87. package/packages/shared/src/auth/supabase-auth.ts +136 -0
  88. package/packages/shared/src/config.ts +57 -0
  89. package/packages/shared/src/constants.ts +122 -0
  90. package/packages/shared/src/db/convex.ts +146 -0
  91. package/packages/shared/src/db/index.ts +10 -0
  92. package/packages/shared/src/db/interface.ts +13 -0
  93. package/packages/shared/src/db/localStorage.ts +91 -0
  94. package/packages/shared/src/db/mongodb.ts +125 -0
  95. package/packages/shared/src/db/neon.ts +171 -0
  96. package/packages/shared/src/db/supabase.ts +158 -0
  97. package/packages/shared/src/index.ts +117 -0
  98. package/packages/shared/src/payments/index.ts +4 -0
  99. package/packages/shared/src/payments/interface.ts +11 -0
  100. package/packages/shared/src/payments/localStorage.ts +81 -0
  101. package/packages/shared/src/payments/stripe.ts +177 -0
  102. package/packages/shared/src/storage/convex.ts +113 -0
  103. package/packages/shared/src/storage/index.ts +14 -0
  104. package/packages/shared/src/storage/interface.ts +11 -0
  105. package/packages/shared/src/storage/localStorage.ts +95 -0
  106. package/packages/shared/src/storage/minio.ts +47 -0
  107. package/packages/shared/src/storage/r2.ts +123 -0
  108. package/packages/shared/src/storage/s3.ts +128 -0
  109. package/packages/shared/src/storage/supabase-storage.ts +116 -0
  110. package/packages/shared/src/storage/uploadthing.ts +126 -0
  111. package/packages/shared/src/styles/adapters.css +494 -0
  112. package/packages/shared/src/tier-gate.ts +119 -0
  113. package/packages/shared/src/types.ts +162 -0
  114. package/packages/shared/tsconfig.json +18 -0
  115. package/packages/shared/tsup.config.ts +9 -0
  116. package/packages/shared/vitest.config.ts +14 -0
  117. package/packages/solidjs/README.md +1 -0
  118. package/packages/solidjs/package.json +44 -0
  119. package/packages/solidjs/src/components/AdapterCard.tsx +24 -0
  120. package/packages/solidjs/src/components/AdapterConfigForm.tsx +54 -0
  121. package/packages/solidjs/src/components/AdapterList.tsx +28 -0
  122. package/packages/solidjs/src/components/AdapterStatusBadge.tsx +20 -0
  123. package/packages/solidjs/src/components/index.ts +4 -0
  124. package/packages/solidjs/src/index.tsx +17 -0
  125. package/packages/solidjs/src/pages/AdapterDetailPage.tsx +38 -0
  126. package/packages/solidjs/src/pages/AdaptersPage.tsx +39 -0
  127. package/packages/solidjs/src/pages/index.ts +2 -0
  128. package/packages/solidjs/src/primitives/index.ts +78 -0
  129. package/packages/solidjs/src/provider/AdapterProvider.tsx +62 -0
  130. package/packages/solidjs/src/provider/index.ts +2 -0
  131. package/packages/solidjs/tsconfig.json +20 -0
  132. package/packages/solidjs/tsup.config.ts +10 -0
  133. package/packages/solidjs-css/README.md +1 -0
  134. package/packages/solidjs-css/package.json +43 -0
  135. package/packages/solidjs-css/src/adapters.css +1576 -0
  136. package/packages/solidjs-css/src/components/AdapterCard.tsx +43 -0
  137. package/packages/solidjs-css/src/components/AdapterConfigForm.tsx +119 -0
  138. package/packages/solidjs-css/src/components/AdapterList.tsx +68 -0
  139. package/packages/solidjs-css/src/components/AdapterStatusBadge.tsx +24 -0
  140. package/packages/solidjs-css/src/components/index.ts +8 -0
  141. package/packages/solidjs-css/src/index.tsx +30 -0
  142. package/packages/solidjs-css/src/pages/AdapterDetailPage.tsx +107 -0
  143. package/packages/solidjs-css/src/pages/AdaptersPage.tsx +94 -0
  144. package/packages/solidjs-css/src/pages/index.ts +4 -0
  145. package/packages/solidjs-css/src/primitives/index.ts +1 -0
  146. package/packages/solidjs-css/src/provider/AdapterProvider.tsx +61 -0
  147. package/packages/solidjs-css/src/provider/index.ts +2 -0
  148. package/packages/solidjs-css/tsconfig.json +20 -0
  149. package/packages/solidjs-css/tsup.config.ts +2 -0
  150. package/pnpm-workspace.yaml +2 -0
  151. package/tsconfig.json +17 -0
@@ -0,0 +1,494 @@
1
+ /* @geenius-adapters — Vanilla CSS Design System
2
+ OKLCH colors · BEM naming · CSS custom properties
3
+ Import: @import '@geenius-adapters/react-css/styles.css';
4
+ */
5
+
6
+ /* ─── Theme Variables ──────────────────────────────────────────────────────── */
7
+
8
+ :root {
9
+ --adapter-bg: oklch(0.13 0.02 260);
10
+ --adapter-bg-subtle: oklch(0.16 0.02 260);
11
+ --adapter-bg-card: oklch(0.15 0.015 260);
12
+ --adapter-bg-hover: oklch(0.18 0.02 260);
13
+ --adapter-border: oklch(0.25 0.02 260);
14
+ --adapter-border-hover: oklch(0.35 0.02 260);
15
+ --adapter-text: oklch(0.95 0.01 260);
16
+ --adapter-text-muted: oklch(0.55 0.01 260);
17
+ --adapter-text-faint: oklch(0.40 0.01 260);
18
+ --adapter-brand: oklch(0.55 0.20 270);
19
+ --adapter-brand-light: oklch(0.45 0.15 270 / 0.15);
20
+
21
+ --adapter-connected: oklch(0.70 0.18 155);
22
+ --adapter-connected-bg: oklch(0.70 0.18 155 / 0.08);
23
+ --adapter-disconnected: oklch(0.50 0.01 260);
24
+ --adapter-error: oklch(0.65 0.22 25);
25
+ --adapter-error-bg: oklch(0.65 0.22 25 / 0.08);
26
+ --adapter-warning: oklch(0.75 0.16 75);
27
+ --adapter-warning-bg: oklch(0.75 0.16 75 / 0.08);
28
+
29
+ --adapter-radius-sm: 0.5rem;
30
+ --adapter-radius-md: 0.75rem;
31
+ --adapter-radius-lg: 1rem;
32
+ --adapter-radius-xl: 1.25rem;
33
+ }
34
+
35
+ /* ─── Layout ───────────────────────────────────────────────────────────────── */
36
+
37
+ .adapter-page {
38
+ max-width: 56rem;
39
+ margin: 0 auto;
40
+ }
41
+
42
+ .adapter-page__header {
43
+ margin-bottom: 2rem;
44
+ }
45
+
46
+ .adapter-page__title {
47
+ font-size: 1.5rem;
48
+ font-weight: 800;
49
+ color: var(--adapter-text);
50
+ letter-spacing: -0.02em;
51
+ }
52
+
53
+ .adapter-page__subtitle {
54
+ margin-top: 0.25rem;
55
+ font-size: 0.875rem;
56
+ color: var(--adapter-text-muted);
57
+ }
58
+
59
+ /* ─── Status Summary ───────────────────────────────────────────────────────── */
60
+
61
+ .adapter-summary {
62
+ display: grid;
63
+ gap: 0.75rem;
64
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
65
+ margin-bottom: 2rem;
66
+ }
67
+
68
+ .adapter-summary__card {
69
+ border: 1px solid var(--adapter-border);
70
+ border-radius: var(--adapter-radius-xl);
71
+ background: var(--adapter-bg-card);
72
+ padding: 1rem 1.25rem;
73
+ backdrop-filter: blur(8px);
74
+ }
75
+
76
+ .adapter-summary__card--success {
77
+ border-color: oklch(0.70 0.18 155 / 0.15);
78
+ background: var(--adapter-connected-bg);
79
+ }
80
+
81
+ .adapter-summary__card--error {
82
+ border-color: oklch(0.65 0.22 25 / 0.15);
83
+ background: var(--adapter-error-bg);
84
+ }
85
+
86
+ .adapter-summary__label {
87
+ font-size: 0.625rem;
88
+ font-weight: 700;
89
+ text-transform: uppercase;
90
+ letter-spacing: 0.08em;
91
+ color: var(--adapter-text-faint);
92
+ }
93
+
94
+ .adapter-summary__value {
95
+ font-size: 1.5rem;
96
+ font-weight: 800;
97
+ color: var(--adapter-text);
98
+ margin-top: 0.25rem;
99
+ }
100
+
101
+ .adapter-summary__card--success .adapter-summary__value { color: var(--adapter-connected); }
102
+ .adapter-summary__card--error .adapter-summary__value { color: var(--adapter-error); }
103
+
104
+ .adapter-summary__desc {
105
+ font-size: 0.625rem;
106
+ color: var(--adapter-text-faint);
107
+ }
108
+
109
+ /* ─── Status Badge ─────────────────────────────────────────────────────────── */
110
+
111
+ .adapter-badge {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ gap: 0.375rem;
115
+ border-radius: 9999px;
116
+ padding: 0.125rem 0.5rem;
117
+ font-size: 0.625rem;
118
+ font-weight: 700;
119
+ text-transform: uppercase;
120
+ letter-spacing: 0.05em;
121
+ }
122
+
123
+ .adapter-badge__dot {
124
+ width: 0.375rem;
125
+ height: 0.375rem;
126
+ border-radius: 50%;
127
+ }
128
+
129
+ .adapter-badge--connected { background: var(--adapter-connected-bg); color: var(--adapter-connected); }
130
+ .adapter-badge--connected .adapter-badge__dot { background: var(--adapter-connected); }
131
+
132
+ .adapter-badge--disconnected { background: oklch(0.50 0.01 260 / 0.08); color: var(--adapter-disconnected); }
133
+ .adapter-badge--disconnected .adapter-badge__dot { background: var(--adapter-disconnected); }
134
+
135
+ .adapter-badge--error { background: var(--adapter-error-bg); color: var(--adapter-error); }
136
+ .adapter-badge--error .adapter-badge__dot { background: var(--adapter-error); }
137
+
138
+ .adapter-badge--initializing { background: var(--adapter-warning-bg); color: var(--adapter-warning); }
139
+ .adapter-badge--initializing .adapter-badge__dot { background: var(--adapter-warning); animation: adapter-pulse 1.5s ease-in-out infinite; }
140
+
141
+ @keyframes adapter-pulse {
142
+ 0%, 100% { opacity: 1; }
143
+ 50% { opacity: 0.3; }
144
+ }
145
+
146
+ /* ─── Adapter Card ─────────────────────────────────────────────────────────── */
147
+
148
+ .adapter-card {
149
+ display: flex;
150
+ gap: 1rem;
151
+ align-items: flex-start;
152
+ width: 100%;
153
+ border: 1px solid var(--adapter-border);
154
+ border-radius: var(--adapter-radius-xl);
155
+ background: var(--adapter-bg-card);
156
+ padding: 1.25rem;
157
+ text-align: left;
158
+ cursor: pointer;
159
+ transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;
160
+ backdrop-filter: blur(8px);
161
+ }
162
+
163
+ .adapter-card:hover {
164
+ border-color: var(--adapter-border-hover);
165
+ background: var(--adapter-bg-hover);
166
+ box-shadow: 0 4px 24px oklch(0.1 0.02 260 / 0.2);
167
+ }
168
+
169
+ .adapter-card__icon {
170
+ flex-shrink: 0;
171
+ width: 3rem; height: 3rem;
172
+ display: flex; align-items: center; justify-content: center;
173
+ border-radius: var(--adapter-radius-md);
174
+ background: oklch(0.20 0.02 260);
175
+ font-size: 1.5rem;
176
+ transition: transform 0.2s;
177
+ }
178
+
179
+ .adapter-card:hover .adapter-card__icon { transform: scale(1.05); }
180
+
181
+ .adapter-card__body { flex: 1; min-width: 0; }
182
+
183
+ .adapter-card__header {
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: space-between;
187
+ gap: 0.5rem;
188
+ }
189
+
190
+ .adapter-card__name {
191
+ font-size: 0.875rem;
192
+ font-weight: 700;
193
+ color: var(--adapter-text);
194
+ overflow: hidden;
195
+ text-overflow: ellipsis;
196
+ white-space: nowrap;
197
+ }
198
+
199
+ .adapter-card__desc {
200
+ margin-top: 0.25rem;
201
+ font-size: 0.75rem;
202
+ color: var(--adapter-text-faint);
203
+ display: -webkit-box;
204
+ -webkit-line-clamp: 2;
205
+ -webkit-box-orient: vertical;
206
+ overflow: hidden;
207
+ }
208
+
209
+ .adapter-card__meta {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 0.5rem;
213
+ margin-top: 0.5rem;
214
+ }
215
+
216
+ .adapter-card__provider {
217
+ font-size: 0.625rem;
218
+ font-weight: 600;
219
+ color: var(--adapter-text-muted);
220
+ background: oklch(0.20 0.02 260);
221
+ padding: 0.125rem 0.5rem;
222
+ border-radius: var(--adapter-radius-sm);
223
+ }
224
+
225
+ .adapter-card__latency {
226
+ font-size: 0.625rem;
227
+ color: var(--adapter-text-faint);
228
+ }
229
+
230
+ .adapter-card__error {
231
+ margin-top: 0.375rem;
232
+ font-size: 0.625rem;
233
+ color: var(--adapter-error);
234
+ overflow: hidden;
235
+ text-overflow: ellipsis;
236
+ white-space: nowrap;
237
+ }
238
+
239
+ /* ─── Adapter Grid ─────────────────────────────────────────────────────────── */
240
+
241
+ .adapter-grid {
242
+ display: grid;
243
+ gap: 0.75rem;
244
+ grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
245
+ }
246
+
247
+ /* ─── Search Input ─────────────────────────────────────────────────────────── */
248
+
249
+ .adapter-search {
250
+ width: 100%;
251
+ border: 1px solid var(--adapter-border);
252
+ border-radius: var(--adapter-radius-lg);
253
+ background: oklch(0.12 0.02 260);
254
+ padding: 0.625rem 1rem;
255
+ font-size: 0.875rem;
256
+ color: var(--adapter-text);
257
+ margin-bottom: 1rem;
258
+ transition: border-color 0.2s;
259
+ }
260
+
261
+ .adapter-search::placeholder { color: var(--adapter-text-faint); }
262
+ .adapter-search:focus { outline: none; border-color: var(--adapter-brand); box-shadow: 0 0 0 3px var(--adapter-brand-light); }
263
+
264
+ /* ─── Filter Bar ───────────────────────────────────────────────────────────── */
265
+
266
+ .adapter-filters {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 0.5rem;
270
+ margin-bottom: 1.5rem;
271
+ flex-wrap: wrap;
272
+ }
273
+
274
+ .adapter-filter-btn {
275
+ padding: 0.375rem 0.75rem;
276
+ font-size: 0.75rem;
277
+ font-weight: 600;
278
+ border-radius: var(--adapter-radius-sm);
279
+ color: var(--adapter-text-faint);
280
+ cursor: pointer;
281
+ transition: background 0.15s, color 0.15s;
282
+ background: none;
283
+ border: none;
284
+ }
285
+
286
+ .adapter-filter-btn:hover { color: var(--adapter-text-muted); }
287
+ .adapter-filter-btn--active { background: oklch(0.25 0.02 260); color: var(--adapter-text); }
288
+
289
+ /* ─── Config Form ──────────────────────────────────────────────────────────── */
290
+
291
+ .adapter-form {
292
+ border: 1px solid var(--adapter-border);
293
+ border-radius: var(--adapter-radius-xl);
294
+ background: var(--adapter-bg-card);
295
+ padding: 1.5rem;
296
+ backdrop-filter: blur(8px);
297
+ }
298
+
299
+ .adapter-form__title {
300
+ font-size: 1.125rem;
301
+ font-weight: 700;
302
+ color: var(--adapter-text);
303
+ }
304
+
305
+ .adapter-form__subtitle {
306
+ font-size: 0.75rem;
307
+ color: var(--adapter-text-faint);
308
+ margin-top: 0.25rem;
309
+ }
310
+
311
+ .adapter-field { margin-top: 1.25rem; }
312
+
313
+ .adapter-field__label {
314
+ display: block;
315
+ font-size: 0.625rem;
316
+ font-weight: 700;
317
+ text-transform: uppercase;
318
+ letter-spacing: 0.08em;
319
+ color: var(--adapter-text-faint);
320
+ margin-bottom: 0.375rem;
321
+ }
322
+
323
+ .adapter-field__input {
324
+ width: 100%;
325
+ border: 1px solid var(--adapter-border);
326
+ border-radius: var(--adapter-radius-lg);
327
+ background: oklch(0.12 0.02 260);
328
+ padding: 0.75rem 1rem;
329
+ font-size: 0.875rem;
330
+ color: var(--adapter-text);
331
+ transition: border-color 0.2s;
332
+ }
333
+
334
+ .adapter-field__input:focus { outline: none; border-color: var(--adapter-brand); box-shadow: 0 0 0 3px var(--adapter-brand-light); }
335
+
336
+ /* ─── Provider Selector Grid ──────────────────────────────────────────────── */
337
+
338
+ .adapter-provider-grid {
339
+ display: grid;
340
+ gap: 0.5rem;
341
+ grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
342
+ }
343
+
344
+ .adapter-provider-option {
345
+ display: flex;
346
+ flex-direction: column;
347
+ border: 1px solid var(--adapter-border);
348
+ border-radius: var(--adapter-radius-lg);
349
+ padding: 0.75rem;
350
+ text-align: left;
351
+ cursor: pointer;
352
+ transition: border-color 0.15s, background 0.15s;
353
+ background: none;
354
+ }
355
+
356
+ .adapter-provider-option:hover { background: var(--adapter-bg-hover); }
357
+
358
+ .adapter-provider-option--selected {
359
+ border-color: var(--adapter-brand);
360
+ background: var(--adapter-brand-light);
361
+ }
362
+
363
+ .adapter-provider-option__name {
364
+ font-size: 0.75rem;
365
+ font-weight: 700;
366
+ color: var(--adapter-text);
367
+ }
368
+
369
+ .adapter-provider-option__desc {
370
+ font-size: 0.625rem;
371
+ color: var(--adapter-text-faint);
372
+ margin-top: 0.125rem;
373
+ }
374
+
375
+ .adapter-tier-badge {
376
+ display: inline-block;
377
+ margin-top: 0.375rem;
378
+ font-size: 0.5625rem;
379
+ font-weight: 700;
380
+ text-transform: uppercase;
381
+ padding: 0.125rem 0.375rem;
382
+ border-radius: 0.25rem;
383
+ }
384
+
385
+ .adapter-tier-badge--pronto { background: var(--adapter-connected-bg); color: var(--adapter-connected); }
386
+ .adapter-tier-badge--mvp { background: oklch(0.55 0.18 240 / 0.12); color: oklch(0.65 0.18 240); }
387
+ .adapter-tier-badge--paid { background: oklch(0.55 0.18 300 / 0.12); color: oklch(0.65 0.18 300); }
388
+
389
+ /* ─── Buttons ──────────────────────────────────────────────────────────────── */
390
+
391
+ .adapter-btn {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ justify-content: center;
395
+ gap: 0.5rem;
396
+ border-radius: var(--adapter-radius-lg);
397
+ padding: 0.625rem 1.5rem;
398
+ font-size: 0.875rem;
399
+ font-weight: 600;
400
+ cursor: pointer;
401
+ transition: background 0.15s, opacity 0.15s;
402
+ border: none;
403
+ }
404
+
405
+ .adapter-btn:disabled { opacity: 0.5; cursor: not-allowed; }
406
+
407
+ .adapter-btn--primary { background: var(--adapter-brand); color: white; }
408
+ .adapter-btn--primary:hover:not(:disabled) { background: oklch(0.60 0.20 270); }
409
+
410
+ .adapter-btn--ghost { background: none; color: var(--adapter-text-muted); padding: 0.5rem 1rem; }
411
+ .adapter-btn--ghost:hover { color: var(--adapter-text); }
412
+
413
+ .adapter-btn--sm { font-size: 0.75rem; padding: 0.375rem 0.75rem; }
414
+
415
+ /* ─── Alert ────────────────────────────────────────────────────────────────── */
416
+
417
+ .adapter-alert {
418
+ border-radius: var(--adapter-radius-md);
419
+ padding: 0.75rem 1rem;
420
+ font-size: 0.875rem;
421
+ }
422
+
423
+ .adapter-alert--error { border: 1px solid oklch(0.65 0.22 25 / 0.2); background: var(--adapter-error-bg); color: var(--adapter-error); }
424
+ .adapter-alert--warning { border: 1px solid oklch(0.75 0.16 75 / 0.2); background: var(--adapter-warning-bg); color: var(--adapter-warning); }
425
+
426
+ /* ─── Detail Page ──────────────────────────────────────────────────────────── */
427
+
428
+ .adapter-detail__icon {
429
+ width: 4rem; height: 4rem;
430
+ display: flex; align-items: center; justify-content: center;
431
+ border-radius: var(--adapter-radius-xl);
432
+ background: oklch(0.18 0.02 260);
433
+ font-size: 2rem;
434
+ }
435
+
436
+ .adapter-detail__status-grid {
437
+ display: grid;
438
+ gap: 1rem;
439
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
440
+ }
441
+
442
+ .adapter-detail__label {
443
+ font-size: 0.625rem;
444
+ text-transform: uppercase;
445
+ color: var(--adapter-text-faint);
446
+ }
447
+
448
+ .adapter-detail__value {
449
+ font-size: 0.875rem;
450
+ font-weight: 600;
451
+ color: var(--adapter-text);
452
+ margin-top: 0.125rem;
453
+ }
454
+
455
+ .adapter-provider-list { border-top: 1px solid oklch(0.25 0.02 260); }
456
+ .adapter-provider-list > div { padding: 0.75rem 0; border-bottom: 1px solid oklch(0.20 0.015 260); }
457
+ .adapter-provider-list > div:last-child { border-bottom: none; }
458
+
459
+ /* ─── Skeletons ────────────────────────────────────────────────────────────── */
460
+
461
+ .adapter-skeleton {
462
+ background: linear-gradient(90deg, oklch(0.18 0.02 260) 25%, oklch(0.22 0.02 260) 50%, oklch(0.18 0.02 260) 75%);
463
+ background-size: 200% 100%;
464
+ animation: adapter-shimmer 1.5s ease-in-out infinite;
465
+ border-radius: var(--adapter-radius-lg);
466
+ }
467
+
468
+ @keyframes adapter-shimmer {
469
+ 0% { background-position: -200% 0; }
470
+ 100% { background-position: 200% 0; }
471
+ }
472
+
473
+ /* ─── Empty State ──────────────────────────────────────────────────────────── */
474
+
475
+ .adapter-empty {
476
+ border: 1px solid oklch(0.20 0.015 260);
477
+ border-radius: var(--adapter-radius-lg);
478
+ background: oklch(0.14 0.015 260);
479
+ padding: 2rem;
480
+ text-align: center;
481
+ }
482
+
483
+ .adapter-empty__text { font-size: 0.875rem; color: var(--adapter-text-faint); }
484
+
485
+ /* ─── Modal Overlay ────────────────────────────────────────────────────────── */
486
+
487
+ .adapter-modal-overlay {
488
+ position: fixed; inset: 0; z-index: 50;
489
+ display: flex; align-items: center; justify-content: center;
490
+ background: oklch(0.05 0.02 260 / 0.6);
491
+ backdrop-filter: blur(8px);
492
+ }
493
+
494
+ .adapter-modal { max-width: 32rem; width: 100%; margin: 1rem; }
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "strict": true,
7
+ "skipLibCheck": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "resolveJsonModule": true,
10
+ "isolatedModules": true,
11
+ "target": "ES2022",
12
+ "module": "ESNext",
13
+ "moduleResolution": "bundler",
14
+ "jsx": "react-jsx"
15
+ },
16
+ "include": [
17
+ "src"
18
+ ]
19
+ }
@@ -0,0 +1,2 @@
1
+ import { defineConfig } from 'tsup'
2
+ export default defineConfig({ entry: ['src/index.tsx'], format: ['cjs', 'esm'], dts: true, clean: true, sourcemap: true, external: ['react'] })
@@ -0,0 +1 @@
1
+ # ✦ @geenius-adapters/shared\n\n> Geenius Adapters — Core types, interfaces, and implementations\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-adapters/shared\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-adapters/shared';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@geenius-adapters/shared",
3
+ "version": "0.1.0",
4
+ "description": "Geenius Adapters \u2014 Core types, interfaces, and implementations",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsup",
17
+ "lint": "tsc --noEmit",
18
+ "test": "vitest run",
19
+ "clean": "rm -rf dist",
20
+ "test:watch": "vitest",
21
+ "test:coverage": "vitest run --coverage"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "devDependencies": {
30
+ "tsup": "^8.5.1",
31
+ "typescript": "~6.0.2",
32
+ "vitest": "^4.0.0"
33
+ },
34
+ "author": "Antigravity HQ",
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=20.0.0"
38
+ }
39
+ }