@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,1576 @@
1
+ /* ============================================================================
2
+ GEENIUS ADAPTERS - COMPREHENSIVE CSS
3
+ Component: Adapter Cards, Connectors, API Management
4
+ Colors: OKLCH, Dark Mode Support, Animations
5
+ ============================================================================ */
6
+
7
+ :root {
8
+ /* Base Colors - OKLCH */
9
+ --adapters-bg: oklch(0.10 0.01 250);
10
+ --adapters-surface: oklch(0.13 0.01 250);
11
+ --adapters-surface-2: oklch(0.16 0.01 250);
12
+ --adapters-surface-3: oklch(0.19 0.01 250);
13
+ --adapters-border: oklch(0.22 0.01 250);
14
+ --adapters-border-light: oklch(0.26 0.01 250);
15
+ --adapters-border-focus: oklch(0.65 0.22 265);
16
+ --adapters-text: oklch(0.95 0.01 250);
17
+ --adapters-text-secondary: oklch(0.75 0.01 250);
18
+ --adapters-text-muted: oklch(0.65 0.01 250);
19
+ --adapters-text-disabled: oklch(0.45 0.01 250);
20
+
21
+ /* Semantic Colors - OKLCH */
22
+ --adapters-accent: oklch(0.65 0.22 265);
23
+ --adapters-accent-light: oklch(0.75 0.18 265);
24
+ --adapters-accent-dark: oklch(0.55 0.24 265);
25
+ --adapters-success: oklch(0.72 0.20 145);
26
+ --adapters-success-light: oklch(0.82 0.15 145);
27
+ --adapters-success-dark: oklch(0.62 0.22 145);
28
+ --adapters-warning: oklch(0.78 0.18 75);
29
+ --adapters-warning-light: oklch(0.88 0.13 75);
30
+ --adapters-warning-dark: oklch(0.68 0.20 75);
31
+ --adapters-error: oklch(0.60 0.25 25);
32
+ --adapters-error-light: oklch(0.70 0.20 25);
33
+ --adapters-error-dark: oklch(0.50 0.28 25);
34
+ --adapters-info: oklch(0.65 0.20 265);
35
+ --adapters-active: oklch(0.72 0.20 145);
36
+ --adapters-inactive: oklch(0.45 0.01 250);
37
+
38
+ /* Spacing & Layout */
39
+ --adapters-radius: 0.75rem;
40
+ --adapters-radius-sm: 0.375rem;
41
+ --adapters-radius-lg: 1.25rem;
42
+ --adapters-spacing-xs: 0.375rem;
43
+ --adapters-spacing-sm: 0.5rem;
44
+ --adapters-spacing-md: 0.75rem;
45
+ --adapters-spacing-lg: 1rem;
46
+ --adapters-spacing-xl: 1.5rem;
47
+ --adapters-spacing-2xl: 2rem;
48
+
49
+ /* Effects */
50
+ --adapters-shadow: 0 4px 24px oklch(0 0 0 / 0.4);
51
+ --adapters-shadow-sm: 0 2px 8px oklch(0 0 0 / 0.2);
52
+ --adapters-shadow-lg: 0 12px 48px oklch(0 0 0 / 0.5);
53
+ --adapters-shadow-focus: 0 0 0 3px oklch(0.65 0.22 265 / 0.15);
54
+ --adapters-transition: 200ms ease;
55
+ --adapters-transition-slow: 300ms ease;
56
+ --adapters-transition-fast: 100ms ease;
57
+ --adapters-backdrop: oklch(0 0 0 / 0.7);
58
+ }
59
+
60
+ @media (prefers-color-scheme: dark) {
61
+ :root {
62
+ --adapters-bg: oklch(0.10 0.01 250);
63
+ --adapters-surface: oklch(0.13 0.01 250);
64
+ --adapters-surface-2: oklch(0.16 0.01 250);
65
+ --adapters-text: oklch(0.95 0.01 250);
66
+ }
67
+ }
68
+
69
+ @media (prefers-color-scheme: light) {
70
+ :root {
71
+ --adapters-bg: oklch(0.98 0.01 250);
72
+ --adapters-surface: oklch(0.96 0.01 250);
73
+ --adapters-surface-2: oklch(0.92 0.01 250);
74
+ --adapters-surface-3: oklch(0.88 0.01 250);
75
+ --adapters-border: oklch(0.80 0.02 250);
76
+ --adapters-text: oklch(0.15 0.01 250);
77
+ --adapters-text-secondary: oklch(0.35 0.01 250);
78
+ --adapters-text-muted: oklch(0.50 0.01 250);
79
+ --adapters-text-disabled: oklch(0.70 0.01 250);
80
+ }
81
+ }
82
+
83
+ /* ============================================================================
84
+ MAIN CONTAINER & LAYOUT
85
+ ============================================================================ */
86
+
87
+ .adapters__container {
88
+ display: flex;
89
+ flex-direction: column;
90
+ gap: var(--adapters-spacing-xl);
91
+ padding: var(--adapters-spacing-xl);
92
+ background: var(--adapters-bg);
93
+ min-height: 100vh;
94
+ }
95
+
96
+ .adapters__wrapper {
97
+ display: flex;
98
+ flex-direction: column;
99
+ max-width: 100%;
100
+ }
101
+
102
+ .adapters__page {
103
+ padding: var(--adapters-spacing-xl);
104
+ background: var(--adapters-bg);
105
+ min-height: 100vh;
106
+ }
107
+
108
+ .adapters__section {
109
+ margin-bottom: var(--adapters-spacing-2xl);
110
+ }
111
+
112
+ .adapters__section-title {
113
+ font-size: 1rem;
114
+ font-weight: 600;
115
+ color: var(--adapters-text);
116
+ margin: 0 0 var(--adapters-spacing-lg);
117
+ }
118
+
119
+ .adapters__section-subtitle {
120
+ font-size: 0.875rem;
121
+ color: var(--adapters-text-muted);
122
+ margin: 0 0 var(--adapters-spacing-md);
123
+ }
124
+
125
+ /* ============================================================================
126
+ HEADER & TITLE
127
+ ============================================================================ */
128
+
129
+ .adapters__header {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ margin-bottom: var(--adapters-spacing-lg);
134
+ flex-wrap: wrap;
135
+ gap: var(--adapters-spacing-md);
136
+ }
137
+
138
+ .adapters__title {
139
+ font-size: 1.5rem;
140
+ font-weight: 700;
141
+ color: var(--adapters-text);
142
+ margin: 0;
143
+ line-height: 1.2;
144
+ }
145
+
146
+ .adapters__subtitle {
147
+ font-size: 0.875rem;
148
+ color: var(--adapters-text-muted);
149
+ margin: 0.25rem 0 0;
150
+ font-weight: 400;
151
+ }
152
+
153
+ .adapters__page-header {
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: space-between;
157
+ margin-bottom: var(--adapters-spacing-xl);
158
+ padding-bottom: var(--adapters-spacing-lg);
159
+ border-bottom: 1px solid var(--adapters-border);
160
+ flex-wrap: wrap;
161
+ gap: var(--adapters-spacing-md);
162
+ }
163
+
164
+ /* ============================================================================
165
+ BREADCRUMBS & NAVIGATION
166
+ ============================================================================ */
167
+
168
+ .adapters__breadcrumb {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: var(--adapters-spacing-sm);
172
+ font-size: 0.875rem;
173
+ color: var(--adapters-text-muted);
174
+ margin-bottom: var(--adapters-spacing-md);
175
+ }
176
+
177
+ .adapters__breadcrumb-link {
178
+ color: var(--adapters-accent);
179
+ text-decoration: none;
180
+ transition: color var(--adapters-transition);
181
+ }
182
+
183
+ .adapters__breadcrumb-link:hover {
184
+ color: var(--adapters-accent-light);
185
+ text-decoration: underline;
186
+ }
187
+
188
+ .adapters__breadcrumb-sep {
189
+ opacity: 0.4;
190
+ }
191
+
192
+ .adapters__tabs {
193
+ display: flex;
194
+ gap: 0;
195
+ border-bottom: 1px solid var(--adapters-border);
196
+ margin-bottom: var(--adapters-spacing-xl);
197
+ overflow-x: auto;
198
+ -webkit-overflow-scrolling: touch;
199
+ }
200
+
201
+ .adapters__tab {
202
+ padding: var(--adapters-spacing-sm) var(--adapters-spacing-lg);
203
+ font-size: 0.875rem;
204
+ font-weight: 500;
205
+ color: var(--adapters-text-muted);
206
+ cursor: pointer;
207
+ border: none;
208
+ background: none;
209
+ border-bottom: 2px solid transparent;
210
+ margin-bottom: -1px;
211
+ transition: color var(--adapters-transition);
212
+ white-space: nowrap;
213
+ }
214
+
215
+ .adapters__tab:hover {
216
+ color: var(--adapters-text);
217
+ }
218
+
219
+ .adapters__tab--active {
220
+ color: var(--adapters-accent);
221
+ border-bottom-color: var(--adapters-accent);
222
+ }
223
+
224
+ /* ============================================================================
225
+ GRID & LAYOUT COMPONENTS
226
+ ============================================================================ */
227
+
228
+ .adapters__grid {
229
+ display: grid;
230
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
231
+ gap: var(--adapters-spacing-xl);
232
+ }
233
+
234
+ .adapters__grid--2col {
235
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
236
+ }
237
+
238
+ .adapters__grid--3col {
239
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
240
+ }
241
+
242
+ .adapters__row {
243
+ display: flex;
244
+ gap: var(--adapters-spacing-lg);
245
+ align-items: flex-start;
246
+ flex-wrap: wrap;
247
+ }
248
+
249
+ .adapters__col {
250
+ flex: 1;
251
+ min-width: 0;
252
+ }
253
+
254
+ .adapters__col--half {
255
+ flex: 0 1 calc(50% - var(--adapters-spacing-sm));
256
+ }
257
+
258
+ .adapters__col--third {
259
+ flex: 0 1 calc(33.333% - var(--adapters-spacing-sm));
260
+ }
261
+
262
+ .adapters__spacer {
263
+ height: var(--adapters-spacing-xl);
264
+ }
265
+
266
+ .adapters__divider {
267
+ height: 1px;
268
+ background: var(--adapters-border);
269
+ margin: var(--adapters-spacing-lg) 0;
270
+ }
271
+
272
+ /* ============================================================================
273
+ CARDS & SURFACES
274
+ ============================================================================ */
275
+
276
+ .adapters__card {
277
+ background: var(--adapters-surface);
278
+ border: 1px solid var(--adapters-border);
279
+ border-radius: var(--adapters-radius);
280
+ padding: var(--adapters-spacing-xl);
281
+ transition: all var(--adapters-transition);
282
+ cursor: pointer;
283
+ display: flex;
284
+ flex-direction: column;
285
+ height: 100%;
286
+ }
287
+
288
+ .adapters__card:hover {
289
+ border-color: var(--adapters-accent);
290
+ box-shadow: var(--adapters-shadow);
291
+ transform: translateY(-2px);
292
+ }
293
+
294
+ .adapters__card:focus-within {
295
+ border-color: var(--adapters-border-focus);
296
+ box-shadow: var(--adapters-shadow-focus);
297
+ }
298
+
299
+ .adapters__card--active {
300
+ border-color: var(--adapters-active);
301
+ background: oklch(0.15 0.02 145);
302
+ }
303
+
304
+ .adapters__card--inactive {
305
+ opacity: 0.65;
306
+ }
307
+
308
+ .adapters__card--error {
309
+ border-color: var(--adapters-error);
310
+ background: oklch(0.15 0.03 25);
311
+ }
312
+
313
+ .adapters__card--warning {
314
+ border-color: var(--adapters-warning);
315
+ background: oklch(0.16 0.03 75);
316
+ }
317
+
318
+ .adapters__card--success {
319
+ border-color: var(--adapters-success);
320
+ background: oklch(0.15 0.03 145);
321
+ }
322
+
323
+ .adapters__card--disabled {
324
+ opacity: 0.5;
325
+ pointer-events: none;
326
+ }
327
+
328
+ .adapters__card--loading {
329
+ opacity: 0.75;
330
+ }
331
+
332
+ .adapters__card-header {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: var(--adapters-spacing-md);
336
+ margin-bottom: var(--adapters-spacing-md);
337
+ flex-wrap: wrap;
338
+ }
339
+
340
+ .adapters__card-icon {
341
+ width: 2.5rem;
342
+ height: 2.5rem;
343
+ border-radius: var(--adapters-radius-sm);
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ font-size: 1.25rem;
348
+ background: var(--adapters-surface-2);
349
+ flex-shrink: 0;
350
+ transition: background var(--adapters-transition);
351
+ }
352
+
353
+ .adapters__card:hover .adapters__card-icon {
354
+ background: var(--adapters-surface-3);
355
+ }
356
+
357
+ .adapters__card-title {
358
+ display: flex;
359
+ flex-direction: column;
360
+ gap: 0.25rem;
361
+ flex: 1;
362
+ }
363
+
364
+ .adapters__card-name {
365
+ font-size: 1rem;
366
+ font-weight: 600;
367
+ color: var(--adapters-text);
368
+ margin: 0;
369
+ }
370
+
371
+ .adapters__card-type {
372
+ font-size: 0.75rem;
373
+ color: var(--adapters-text-muted);
374
+ text-transform: uppercase;
375
+ letter-spacing: 0.05em;
376
+ font-weight: 500;
377
+ }
378
+
379
+ .adapters__card-desc {
380
+ font-size: 0.875rem;
381
+ color: var(--adapters-text-muted);
382
+ line-height: 1.5;
383
+ margin: var(--adapters-spacing-md) 0;
384
+ flex-grow: 1;
385
+ }
386
+
387
+ .adapters__card-meta {
388
+ display: flex;
389
+ gap: var(--adapters-spacing-md);
390
+ flex-wrap: wrap;
391
+ margin: var(--adapters-spacing-md) 0;
392
+ font-size: 0.8125rem;
393
+ }
394
+
395
+ .adapters__card-meta-item {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 0.25rem;
399
+ color: var(--adapters-text-muted);
400
+ }
401
+
402
+ .adapters__card-meta-label {
403
+ font-weight: 500;
404
+ }
405
+
406
+ .adapters__card-footer {
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: space-between;
410
+ margin-top: var(--adapters-spacing-md);
411
+ padding-top: var(--adapters-spacing-md);
412
+ border-top: 1px solid var(--adapters-border);
413
+ flex-wrap: wrap;
414
+ gap: var(--adapters-spacing-sm);
415
+ }
416
+
417
+ .adapters__card-actions {
418
+ display: flex;
419
+ gap: var(--adapters-spacing-sm);
420
+ }
421
+
422
+ /* ============================================================================
423
+ STATUS BADGES & INDICATORS
424
+ ============================================================================ */
425
+
426
+ .adapters__status-badge {
427
+ display: inline-flex;
428
+ align-items: center;
429
+ gap: var(--adapters-spacing-xs);
430
+ padding: var(--adapters-spacing-xs) var(--adapters-spacing-md);
431
+ border-radius: 9999px;
432
+ font-size: 0.75rem;
433
+ font-weight: 500;
434
+ transition: all var(--adapters-transition);
435
+ }
436
+
437
+ .adapters__status-badge::before {
438
+ content: '';
439
+ width: 0.5rem;
440
+ height: 0.5rem;
441
+ border-radius: 50%;
442
+ background: currentColor;
443
+ animation: adapters-pulse 2s ease-in-out infinite;
444
+ }
445
+
446
+ .adapters__status-badge--active {
447
+ color: var(--adapters-active);
448
+ background: oklch(0.72 0.20 145 / 0.15);
449
+ }
450
+
451
+ .adapters__status-badge--inactive {
452
+ color: var(--adapters-inactive);
453
+ background: oklch(0.45 0.01 250 / 0.15);
454
+ }
455
+
456
+ .adapters__status-badge--error {
457
+ color: var(--adapters-error);
458
+ background: oklch(0.60 0.25 25 / 0.15);
459
+ }
460
+
461
+ .adapters__status-badge--warning {
462
+ color: var(--adapters-warning);
463
+ background: oklch(0.78 0.18 75 / 0.15);
464
+ }
465
+
466
+ .adapters__status-badge--success {
467
+ color: var(--adapters-success);
468
+ background: oklch(0.72 0.20 145 / 0.15);
469
+ }
470
+
471
+ .adapters__status-badge--pending {
472
+ color: var(--adapters-info);
473
+ background: oklch(0.65 0.20 265 / 0.15);
474
+ }
475
+
476
+ .adapters__status-indicator {
477
+ display: inline-block;
478
+ width: 0.5rem;
479
+ height: 0.5rem;
480
+ border-radius: 50%;
481
+ background: var(--adapters-active);
482
+ animation: adapters-pulse 2s ease-in-out infinite;
483
+ }
484
+
485
+ .adapters__status-indicator--error {
486
+ background: var(--adapters-error);
487
+ animation: adapters-pulse-error 1s ease-in-out infinite;
488
+ }
489
+
490
+ .adapters__type-badge {
491
+ display: inline-flex;
492
+ padding: 0.125rem var(--adapters-spacing-sm);
493
+ border-radius: var(--adapters-radius-sm);
494
+ font-size: 0.75rem;
495
+ font-weight: 500;
496
+ background: var(--adapters-surface-2);
497
+ color: var(--adapters-text-muted);
498
+ border: 1px solid var(--adapters-border);
499
+ text-transform: uppercase;
500
+ letter-spacing: 0.04em;
501
+ white-space: nowrap;
502
+ }
503
+
504
+ .adapters__type-badge--email {
505
+ color: oklch(0.65 0.20 265);
506
+ background: oklch(0.65 0.20 265 / 0.1);
507
+ border-color: oklch(0.65 0.20 265 / 0.2);
508
+ }
509
+
510
+ .adapters__type-badge--sms {
511
+ color: oklch(0.72 0.18 75);
512
+ background: oklch(0.72 0.18 75 / 0.1);
513
+ border-color: oklch(0.72 0.18 75 / 0.2);
514
+ }
515
+
516
+ .adapters__type-badge--push {
517
+ color: oklch(0.72 0.20 145);
518
+ background: oklch(0.72 0.20 145 / 0.1);
519
+ border-color: oklch(0.72 0.20 145 / 0.2);
520
+ }
521
+
522
+ .adapters__type-badge--webhook {
523
+ color: oklch(0.78 0.18 60);
524
+ background: oklch(0.78 0.18 60 / 0.1);
525
+ border-color: oklch(0.78 0.18 60 / 0.2);
526
+ }
527
+
528
+ .adapters__type-badge--api {
529
+ color: oklch(0.65 0.20 240);
530
+ background: oklch(0.65 0.20 240 / 0.1);
531
+ border-color: oklch(0.65 0.20 240 / 0.2);
532
+ }
533
+
534
+ /* ============================================================================
535
+ FORMS & INPUTS
536
+ ============================================================================ */
537
+
538
+ .adapters__config-form {
539
+ background: var(--adapters-surface);
540
+ border: 1px solid var(--adapters-border);
541
+ border-radius: var(--adapters-radius);
542
+ padding: var(--adapters-spacing-xl);
543
+ }
544
+
545
+ .adapters__config-title {
546
+ font-size: 1.125rem;
547
+ font-weight: 600;
548
+ color: var(--adapters-text);
549
+ margin: 0 0 var(--adapters-spacing-xl);
550
+ }
551
+
552
+ .adapters__form-group {
553
+ display: flex;
554
+ flex-direction: column;
555
+ gap: var(--adapters-spacing-xs);
556
+ margin-bottom: var(--adapters-spacing-lg);
557
+ }
558
+
559
+ .adapters__form-label {
560
+ font-size: 0.875rem;
561
+ font-weight: 500;
562
+ color: var(--adapters-text);
563
+ }
564
+
565
+ .adapters__form-label--required::after {
566
+ content: ' *';
567
+ color: var(--adapters-error);
568
+ }
569
+
570
+ .adapters__form-input,
571
+ .adapters__form-select,
572
+ .adapters__form-textarea {
573
+ background: var(--adapters-surface-2);
574
+ border: 1px solid var(--adapters-border);
575
+ border-radius: var(--adapters-radius-sm);
576
+ padding: var(--adapters-spacing-sm) var(--adapters-spacing-md);
577
+ color: var(--adapters-text);
578
+ font-size: 0.875rem;
579
+ transition: all var(--adapters-transition);
580
+ outline: none;
581
+ width: 100%;
582
+ box-sizing: border-box;
583
+ font-family: inherit;
584
+ }
585
+
586
+ .adapters__form-input:focus,
587
+ .adapters__form-select:focus,
588
+ .adapters__form-textarea:focus {
589
+ border-color: var(--adapters-border-focus);
590
+ box-shadow: var(--adapters-shadow-focus);
591
+ }
592
+
593
+ .adapters__form-input::placeholder {
594
+ color: var(--adapters-text-disabled);
595
+ }
596
+
597
+ .adapters__form-input--error {
598
+ border-color: var(--adapters-error);
599
+ }
600
+
601
+ .adapters__form-input--error:focus {
602
+ box-shadow: 0 0 0 3px oklch(0.60 0.25 25 / 0.15);
603
+ }
604
+
605
+ .adapters__form-input:disabled {
606
+ background: var(--adapters-surface-3);
607
+ color: var(--adapters-text-disabled);
608
+ cursor: not-allowed;
609
+ opacity: 0.5;
610
+ }
611
+
612
+ .adapters__form-textarea {
613
+ resize: vertical;
614
+ min-height: 100px;
615
+ }
616
+
617
+ .adapters__form-hint {
618
+ font-size: 0.75rem;
619
+ color: var(--adapters-text-muted);
620
+ margin-top: var(--adapters-spacing-xs);
621
+ }
622
+
623
+ .adapters__form-error {
624
+ font-size: 0.75rem;
625
+ color: var(--adapters-error);
626
+ margin-top: var(--adapters-spacing-xs);
627
+ }
628
+
629
+ .adapters__form-group--inline {
630
+ flex-direction: row;
631
+ align-items: center;
632
+ gap: var(--adapters-spacing-md);
633
+ }
634
+
635
+ .adapters__form-group--inline .adapters__form-label {
636
+ margin: 0;
637
+ flex-shrink: 0;
638
+ }
639
+
640
+ .adapters__checkbox,
641
+ .adapters__radio {
642
+ display: flex;
643
+ align-items: center;
644
+ gap: var(--adapters-spacing-sm);
645
+ cursor: pointer;
646
+ font-size: 0.875rem;
647
+ color: var(--adapters-text);
648
+ }
649
+
650
+ .adapters__checkbox input[type="checkbox"],
651
+ .adapters__radio input[type="radio"] {
652
+ cursor: pointer;
653
+ accent-color: var(--adapters-accent);
654
+ }
655
+
656
+ /* ============================================================================
657
+ BUTTONS & ACTIONS
658
+ ============================================================================ */
659
+
660
+ .adapters__btn {
661
+ display: inline-flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ gap: var(--adapters-spacing-sm);
665
+ padding: var(--adapters-spacing-sm) var(--adapters-spacing-lg);
666
+ border-radius: var(--adapters-radius-sm);
667
+ font-size: 0.875rem;
668
+ font-weight: 500;
669
+ cursor: pointer;
670
+ border: none;
671
+ transition: all var(--adapters-transition);
672
+ text-decoration: none;
673
+ white-space: nowrap;
674
+ user-select: none;
675
+ }
676
+
677
+ .adapters__btn:active {
678
+ transform: scale(0.98);
679
+ }
680
+
681
+ .adapters__btn:disabled {
682
+ opacity: 0.5;
683
+ cursor: not-allowed;
684
+ transform: none;
685
+ }
686
+
687
+ .adapters__btn--primary {
688
+ background: var(--adapters-accent);
689
+ color: oklch(1 0 0);
690
+ box-shadow: var(--adapters-shadow-sm);
691
+ }
692
+
693
+ .adapters__btn--primary:hover:not(:disabled) {
694
+ background: var(--adapters-accent-light);
695
+ box-shadow: var(--adapters-shadow);
696
+ transform: translateY(-1px);
697
+ }
698
+
699
+ .adapters__btn--secondary {
700
+ background: var(--adapters-surface-2);
701
+ color: var(--adapters-text);
702
+ border: 1px solid var(--adapters-border);
703
+ }
704
+
705
+ .adapters__btn--secondary:hover:not(:disabled) {
706
+ border-color: var(--adapters-accent);
707
+ color: var(--adapters-accent);
708
+ background: var(--adapters-surface-3);
709
+ }
710
+
711
+ .adapters__btn--tertiary {
712
+ background: transparent;
713
+ color: var(--adapters-accent);
714
+ border: 1px solid var(--adapters-border);
715
+ }
716
+
717
+ .adapters__btn--tertiary:hover:not(:disabled) {
718
+ background: var(--adapters-surface-2);
719
+ border-color: var(--adapters-accent);
720
+ }
721
+
722
+ .adapters__btn--danger {
723
+ background: var(--adapters-error);
724
+ color: oklch(1 0 0);
725
+ }
726
+
727
+ .adapters__btn--danger:hover:not(:disabled) {
728
+ background: var(--adapters-error-light);
729
+ }
730
+
731
+ .adapters__btn--success {
732
+ background: var(--adapters-success);
733
+ color: oklch(1 0 0);
734
+ }
735
+
736
+ .adapters__btn--success:hover:not(:disabled) {
737
+ background: var(--adapters-success-light);
738
+ }
739
+
740
+ .adapters__btn--warning {
741
+ background: var(--adapters-warning);
742
+ color: oklch(1 0 0);
743
+ }
744
+
745
+ .adapters__btn--warning:hover:not(:disabled) {
746
+ background: var(--adapters-warning-light);
747
+ }
748
+
749
+ .adapters__btn--sm {
750
+ padding: var(--adapters-spacing-xs) var(--adapters-spacing-sm);
751
+ font-size: 0.8125rem;
752
+ }
753
+
754
+ .adapters__btn--lg {
755
+ padding: var(--adapters-spacing-md) var(--adapters-spacing-xl);
756
+ font-size: 1rem;
757
+ }
758
+
759
+ .adapters__btn--block {
760
+ width: 100%;
761
+ }
762
+
763
+ .adapters__btn--loading {
764
+ pointer-events: none;
765
+ opacity: 0.75;
766
+ }
767
+
768
+ .adapters__btn--loading::after {
769
+ content: '';
770
+ display: inline-block;
771
+ width: 0.875rem;
772
+ height: 0.875rem;
773
+ border: 2px solid currentColor;
774
+ border-top-color: transparent;
775
+ border-radius: 50%;
776
+ animation: adapters-spin 600ms linear infinite;
777
+ }
778
+
779
+ .adapters__actions {
780
+ display: flex;
781
+ gap: var(--adapters-spacing-md);
782
+ flex-wrap: wrap;
783
+ }
784
+
785
+ .adapters__action-group {
786
+ display: flex;
787
+ gap: 0;
788
+ border-radius: var(--adapters-radius-sm);
789
+ overflow: hidden;
790
+ }
791
+
792
+ .adapters__action-group .adapters__btn {
793
+ border-radius: 0;
794
+ border-right: 1px solid var(--adapters-border);
795
+ }
796
+
797
+ .adapters__action-group .adapters__btn:last-child {
798
+ border-right: none;
799
+ }
800
+
801
+ /* ============================================================================
802
+ TABLES & DATA DISPLAY
803
+ ============================================================================ */
804
+
805
+ .adapters__table {
806
+ width: 100%;
807
+ border-collapse: collapse;
808
+ }
809
+
810
+ .adapters__table-header {
811
+ background: var(--adapters-surface-2);
812
+ }
813
+
814
+ .adapters__table-th {
815
+ padding: var(--adapters-spacing-md) var(--adapters-spacing-lg);
816
+ text-align: left;
817
+ font-size: 0.8125rem;
818
+ font-weight: 600;
819
+ color: var(--adapters-text-muted);
820
+ text-transform: uppercase;
821
+ letter-spacing: 0.05em;
822
+ border-bottom: 1px solid var(--adapters-border);
823
+ }
824
+
825
+ .adapters__table-row {
826
+ border-bottom: 1px solid var(--adapters-border);
827
+ transition: background-color var(--adapters-transition);
828
+ }
829
+
830
+ .adapters__table-row:hover {
831
+ background: var(--adapters-surface-2);
832
+ }
833
+
834
+ .adapters__table-row--active {
835
+ background: oklch(0.15 0.02 145 / 0.3);
836
+ }
837
+
838
+ .adapters__table-td {
839
+ padding: var(--adapters-spacing-lg);
840
+ font-size: 0.875rem;
841
+ color: var(--adapters-text);
842
+ }
843
+
844
+ .adapters__table-td--numeric {
845
+ text-align: right;
846
+ font-family: 'JetBrains Mono', monospace;
847
+ }
848
+
849
+ .adapters__table-td--status {
850
+ text-align: center;
851
+ }
852
+
853
+ /* ============================================================================
854
+ STATS & METRICS
855
+ ============================================================================ */
856
+
857
+ .adapters__stats {
858
+ display: grid;
859
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
860
+ gap: var(--adapters-spacing-lg);
861
+ margin-bottom: var(--adapters-spacing-xl);
862
+ }
863
+
864
+ .adapters__stat {
865
+ background: var(--adapters-surface);
866
+ border: 1px solid var(--adapters-border);
867
+ border-radius: var(--adapters-radius);
868
+ padding: var(--adapters-spacing-lg);
869
+ text-align: center;
870
+ transition: all var(--adapters-transition);
871
+ }
872
+
873
+ .adapters__stat:hover {
874
+ border-color: var(--adapters-accent);
875
+ box-shadow: var(--adapters-shadow-sm);
876
+ transform: translateY(-1px);
877
+ }
878
+
879
+ .adapters__stat-value {
880
+ font-size: 1.75rem;
881
+ font-weight: 700;
882
+ color: var(--adapters-accent);
883
+ line-height: 1;
884
+ }
885
+
886
+ .adapters__stat-label {
887
+ font-size: 0.8125rem;
888
+ color: var(--adapters-text-muted);
889
+ margin-top: var(--adapters-spacing-xs);
890
+ text-transform: uppercase;
891
+ letter-spacing: 0.05em;
892
+ font-weight: 500;
893
+ }
894
+
895
+ .adapters__stat-change {
896
+ font-size: 0.75rem;
897
+ margin-top: var(--adapters-spacing-xs);
898
+ font-weight: 500;
899
+ }
900
+
901
+ .adapters__stat-change--positive {
902
+ color: var(--adapters-success);
903
+ }
904
+
905
+ .adapters__stat-change--negative {
906
+ color: var(--adapters-error);
907
+ }
908
+
909
+ /* ============================================================================
910
+ FILTERS & CONTROLS
911
+ ============================================================================ */
912
+
913
+ .adapters__filter-bar {
914
+ display: flex;
915
+ gap: var(--adapters-spacing-md);
916
+ flex-wrap: wrap;
917
+ margin-bottom: var(--adapters-spacing-lg);
918
+ align-items: center;
919
+ }
920
+
921
+ .adapters__filter-select {
922
+ background: var(--adapters-surface);
923
+ border: 1px solid var(--adapters-border);
924
+ border-radius: var(--adapters-radius-sm);
925
+ padding: var(--adapters-spacing-sm) var(--adapters-spacing-md);
926
+ color: var(--adapters-text);
927
+ font-size: 0.875rem;
928
+ cursor: pointer;
929
+ transition: all var(--adapters-transition);
930
+ }
931
+
932
+ .adapters__filter-select:focus {
933
+ border-color: var(--adapters-border-focus);
934
+ outline: none;
935
+ }
936
+
937
+ .adapters__filter-chip {
938
+ display: inline-flex;
939
+ align-items: center;
940
+ gap: var(--adapters-spacing-xs);
941
+ padding: var(--adapters-spacing-xs) var(--adapters-spacing-md);
942
+ background: var(--adapters-surface-2);
943
+ border: 1px solid var(--adapters-border);
944
+ border-radius: 9999px;
945
+ font-size: 0.8125rem;
946
+ color: var(--adapters-text);
947
+ }
948
+
949
+ .adapters__filter-chip--removable {
950
+ cursor: pointer;
951
+ padding-right: var(--adapters-spacing-sm);
952
+ }
953
+
954
+ .adapters__pagination {
955
+ display: flex;
956
+ gap: var(--adapters-spacing-sm);
957
+ align-items: center;
958
+ justify-content: center;
959
+ margin-top: var(--adapters-spacing-xl);
960
+ }
961
+
962
+ .adapters__pagination-item {
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: center;
966
+ width: 2rem;
967
+ height: 2rem;
968
+ border: 1px solid var(--adapters-border);
969
+ border-radius: var(--adapters-radius-sm);
970
+ background: var(--adapters-surface);
971
+ color: var(--adapters-text);
972
+ cursor: pointer;
973
+ transition: all var(--adapters-transition);
974
+ font-size: 0.875rem;
975
+ font-weight: 500;
976
+ }
977
+
978
+ .adapters__pagination-item:hover:not(:disabled) {
979
+ border-color: var(--adapters-accent);
980
+ color: var(--adapters-accent);
981
+ }
982
+
983
+ .adapters__pagination-item--active {
984
+ background: var(--adapters-accent);
985
+ border-color: var(--adapters-accent);
986
+ color: oklch(1 0 0);
987
+ }
988
+
989
+ /* ============================================================================
990
+ LOGS & CODE DISPLAY
991
+ ============================================================================ */
992
+
993
+ .adapters__log {
994
+ background: oklch(0.08 0.01 250);
995
+ border: 1px solid var(--adapters-border);
996
+ border-radius: var(--adapters-radius);
997
+ padding: var(--adapters-spacing-lg);
998
+ font-family: 'JetBrains Mono', monospace;
999
+ font-size: 0.8125rem;
1000
+ max-height: 400px;
1001
+ overflow-y: auto;
1002
+ }
1003
+
1004
+ .adapters__log-entry {
1005
+ display: flex;
1006
+ gap: var(--adapters-spacing-md);
1007
+ padding: var(--adapters-spacing-xs) 0;
1008
+ border-bottom: 1px solid oklch(0.15 0 0);
1009
+ }
1010
+
1011
+ .adapters__log-entry:last-child {
1012
+ border-bottom: none;
1013
+ }
1014
+
1015
+ .adapters__log-time {
1016
+ color: var(--adapters-text-muted);
1017
+ flex-shrink: 0;
1018
+ min-width: 10rem;
1019
+ }
1020
+
1021
+ .adapters__log-level {
1022
+ font-weight: 600;
1023
+ flex-shrink: 0;
1024
+ width: 4rem;
1025
+ text-align: center;
1026
+ }
1027
+
1028
+ .adapters__log-level--info {
1029
+ color: var(--adapters-accent);
1030
+ }
1031
+
1032
+ .adapters__log-level--error {
1033
+ color: var(--adapters-error);
1034
+ animation: adapters-pulse-error 1s ease-in-out infinite;
1035
+ }
1036
+
1037
+ .adapters__log-level--warn {
1038
+ color: var(--adapters-warning);
1039
+ }
1040
+
1041
+ .adapters__log-level--success {
1042
+ color: var(--adapters-success);
1043
+ }
1044
+
1045
+ .adapters__log-msg {
1046
+ color: var(--adapters-text);
1047
+ word-break: break-word;
1048
+ flex-grow: 1;
1049
+ }
1050
+
1051
+ /* ============================================================================
1052
+ MODALS & OVERLAYS
1053
+ ============================================================================ */
1054
+
1055
+ .adapters__modal-overlay {
1056
+ position: fixed;
1057
+ inset: 0;
1058
+ background: var(--adapters-backdrop);
1059
+ display: flex;
1060
+ align-items: center;
1061
+ justify-content: center;
1062
+ z-index: 50;
1063
+ backdrop-filter: blur(4px);
1064
+ animation: adapters-fade-in var(--adapters-transition);
1065
+ }
1066
+
1067
+ .adapters__modal {
1068
+ background: var(--adapters-surface);
1069
+ border: 1px solid var(--adapters-border);
1070
+ border-radius: calc(var(--adapters-radius) * 1.5);
1071
+ padding: var(--adapters-spacing-xl);
1072
+ min-width: 24rem;
1073
+ max-width: 90vw;
1074
+ max-height: 90vh;
1075
+ overflow-y: auto;
1076
+ box-shadow: var(--adapters-shadow-lg);
1077
+ animation: adapters-slide-up var(--adapters-transition);
1078
+ }
1079
+
1080
+ .adapters__modal-header {
1081
+ display: flex;
1082
+ align-items: center;
1083
+ justify-content: space-between;
1084
+ margin-bottom: var(--adapters-spacing-xl);
1085
+ }
1086
+
1087
+ .adapters__modal-title {
1088
+ font-size: 1.125rem;
1089
+ font-weight: 600;
1090
+ color: var(--adapters-text);
1091
+ margin: 0;
1092
+ }
1093
+
1094
+ .adapters__modal-close {
1095
+ background: none;
1096
+ border: none;
1097
+ color: var(--adapters-text-muted);
1098
+ cursor: pointer;
1099
+ padding: var(--adapters-spacing-xs);
1100
+ border-radius: var(--adapters-radius-sm);
1101
+ font-size: 1.25rem;
1102
+ line-height: 1;
1103
+ transition: all var(--adapters-transition);
1104
+ flex-shrink: 0;
1105
+ }
1106
+
1107
+ .adapters__modal-close:hover {
1108
+ color: var(--adapters-text);
1109
+ background: var(--adapters-surface-2);
1110
+ }
1111
+
1112
+ .adapters__modal-content {
1113
+ margin-bottom: var(--adapters-spacing-xl);
1114
+ }
1115
+
1116
+ .adapters__modal-footer {
1117
+ display: flex;
1118
+ gap: var(--adapters-spacing-md);
1119
+ justify-content: flex-end;
1120
+ margin-top: var(--adapters-spacing-xl);
1121
+ padding-top: var(--adapters-spacing-lg);
1122
+ border-top: 1px solid var(--adapters-border);
1123
+ flex-wrap: wrap;
1124
+ }
1125
+
1126
+ /* ============================================================================
1127
+ ALERTS & NOTIFICATIONS
1128
+ ============================================================================ */
1129
+
1130
+ .adapters__alert {
1131
+ padding: var(--adapters-spacing-md) var(--adapters-spacing-lg);
1132
+ border-radius: var(--adapters-radius-sm);
1133
+ font-size: 0.875rem;
1134
+ display: flex;
1135
+ gap: var(--adapters-spacing-md);
1136
+ align-items: flex-start;
1137
+ margin-bottom: var(--adapters-spacing-lg);
1138
+ animation: adapters-slide-down var(--adapters-transition);
1139
+ }
1140
+
1141
+ .adapters__alert-icon {
1142
+ flex-shrink: 0;
1143
+ font-size: 1rem;
1144
+ line-height: 1.4;
1145
+ }
1146
+
1147
+ .adapters__alert-content {
1148
+ flex-grow: 1;
1149
+ }
1150
+
1151
+ .adapters__alert-title {
1152
+ font-weight: 600;
1153
+ margin-bottom: var(--adapters-spacing-xs);
1154
+ }
1155
+
1156
+ .adapters__alert--info {
1157
+ background: oklch(0.65 0.20 265 / 0.1);
1158
+ border: 1px solid oklch(0.65 0.20 265 / 0.3);
1159
+ color: oklch(0.80 0.15 265);
1160
+ }
1161
+
1162
+ .adapters__alert--success {
1163
+ background: oklch(0.72 0.20 145 / 0.1);
1164
+ border: 1px solid oklch(0.72 0.20 145 / 0.3);
1165
+ color: oklch(0.80 0.15 145);
1166
+ }
1167
+
1168
+ .adapters__alert--error {
1169
+ background: oklch(0.60 0.25 25 / 0.1);
1170
+ border: 1px solid oklch(0.60 0.25 25 / 0.3);
1171
+ color: oklch(0.75 0.20 25);
1172
+ }
1173
+
1174
+ .adapters__alert--warning {
1175
+ background: oklch(0.78 0.18 75 / 0.1);
1176
+ border: 1px solid oklch(0.78 0.18 75 / 0.3);
1177
+ color: oklch(0.85 0.14 75);
1178
+ }
1179
+
1180
+ .adapters__toast {
1181
+ position: fixed;
1182
+ bottom: var(--adapters-spacing-lg);
1183
+ right: var(--adapters-spacing-lg);
1184
+ max-width: 24rem;
1185
+ animation: adapters-slide-in-right var(--adapters-transition);
1186
+ z-index: 100;
1187
+ }
1188
+
1189
+ /* ============================================================================
1190
+ EMPTY STATE
1191
+ ============================================================================ */
1192
+
1193
+ .adapters__empty {
1194
+ display: flex;
1195
+ flex-direction: column;
1196
+ align-items: center;
1197
+ justify-content: center;
1198
+ padding: 3rem var(--adapters-spacing-lg);
1199
+ text-align: center;
1200
+ color: var(--adapters-text-muted);
1201
+ }
1202
+
1203
+ .adapters__empty-icon {
1204
+ font-size: 3rem;
1205
+ margin-bottom: var(--adapters-spacing-lg);
1206
+ opacity: 0.5;
1207
+ }
1208
+
1209
+ .adapters__empty-title {
1210
+ font-size: 1.125rem;
1211
+ font-weight: 600;
1212
+ color: var(--adapters-text);
1213
+ margin: 0 0 var(--adapters-spacing-sm);
1214
+ }
1215
+
1216
+ .adapters__empty-desc {
1217
+ font-size: 0.875rem;
1218
+ max-width: 24rem;
1219
+ line-height: 1.6;
1220
+ }
1221
+
1222
+ .adapters__empty-action {
1223
+ margin-top: var(--adapters-spacing-lg);
1224
+ }
1225
+
1226
+ /* ============================================================================
1227
+ SKELETON & LOADING
1228
+ ============================================================================ */
1229
+
1230
+ .adapters__skeleton {
1231
+ background: linear-gradient(
1232
+ 90deg,
1233
+ var(--adapters-surface) 25%,
1234
+ var(--adapters-surface-2) 50%,
1235
+ var(--adapters-surface) 75%
1236
+ );
1237
+ background-size: 200% 100%;
1238
+ animation: adapters-shimmer 1.5s infinite;
1239
+ border-radius: var(--adapters-radius-sm);
1240
+ }
1241
+
1242
+ .adapters__skeleton--text {
1243
+ height: 1rem;
1244
+ margin-bottom: var(--adapters-spacing-sm);
1245
+ }
1246
+
1247
+ .adapters__skeleton--title {
1248
+ height: 1.5rem;
1249
+ width: 40%;
1250
+ margin-bottom: var(--adapters-spacing-lg);
1251
+ }
1252
+
1253
+ .adapters__skeleton--card {
1254
+ height: 8rem;
1255
+ }
1256
+
1257
+ .adapters__skeleton--avatar {
1258
+ width: 2.5rem;
1259
+ height: 2.5rem;
1260
+ border-radius: 50%;
1261
+ }
1262
+
1263
+ .adapters__spinner {
1264
+ display: inline-block;
1265
+ width: 1rem;
1266
+ height: 1rem;
1267
+ border: 2px solid var(--adapters-surface-2);
1268
+ border-top-color: var(--adapters-accent);
1269
+ border-radius: 50%;
1270
+ animation: adapters-spin 600ms linear infinite;
1271
+ }
1272
+
1273
+ /* ============================================================================
1274
+ TOOLTIPS
1275
+ ============================================================================ */
1276
+
1277
+ .adapters__tooltip {
1278
+ position: relative;
1279
+ display: inline-block;
1280
+ }
1281
+
1282
+ .adapters__tooltip-trigger {
1283
+ cursor: help;
1284
+ text-decoration: underline dotted;
1285
+ text-decoration-color: var(--adapters-text-muted);
1286
+ }
1287
+
1288
+ .adapters__tooltip-content {
1289
+ position: absolute;
1290
+ bottom: 100%;
1291
+ left: 50%;
1292
+ transform: translateX(-50%);
1293
+ background: oklch(0.15 0.01 250);
1294
+ color: var(--adapters-text);
1295
+ padding: var(--adapters-spacing-sm) var(--adapters-spacing-md);
1296
+ border-radius: var(--adapters-radius-sm);
1297
+ font-size: 0.8125rem;
1298
+ white-space: nowrap;
1299
+ margin-bottom: var(--adapters-spacing-sm);
1300
+ opacity: 0;
1301
+ pointer-events: none;
1302
+ transition: opacity var(--adapters-transition);
1303
+ z-index: 10;
1304
+ box-shadow: var(--adapters-shadow-sm);
1305
+ }
1306
+
1307
+ .adapters__tooltip:hover .adapters__tooltip-content {
1308
+ opacity: 1;
1309
+ }
1310
+
1311
+ /* ============================================================================
1312
+ HELPERS & UTILITIES
1313
+ ============================================================================ */
1314
+
1315
+ .adapters__text--muted {
1316
+ color: var(--adapters-text-muted);
1317
+ }
1318
+
1319
+ .adapters__text--success {
1320
+ color: var(--adapters-success);
1321
+ }
1322
+
1323
+ .adapters__text--error {
1324
+ color: var(--adapters-error);
1325
+ }
1326
+
1327
+ .adapters__text--warning {
1328
+ color: var(--adapters-warning);
1329
+ }
1330
+
1331
+ .adapters__text--accent {
1332
+ color: var(--adapters-accent);
1333
+ }
1334
+
1335
+ .adapters__text--bold {
1336
+ font-weight: 600;
1337
+ }
1338
+
1339
+ .adapters__text--sm {
1340
+ font-size: 0.8125rem;
1341
+ }
1342
+
1343
+ .adapters__text--lg {
1344
+ font-size: 1.125rem;
1345
+ }
1346
+
1347
+ .adapters__badge {
1348
+ display: inline-flex;
1349
+ align-items: center;
1350
+ gap: var(--adapters-spacing-xs);
1351
+ padding: var(--adapters-spacing-xs) var(--adapters-spacing-md);
1352
+ background: var(--adapters-surface-2);
1353
+ border: 1px solid var(--adapters-border);
1354
+ border-radius: 9999px;
1355
+ font-size: 0.75rem;
1356
+ font-weight: 500;
1357
+ color: var(--adapters-text-muted);
1358
+ }
1359
+
1360
+ /* ============================================================================
1361
+ ANIMATIONS
1362
+ ============================================================================ */
1363
+
1364
+ @keyframes adapters-shimmer {
1365
+ 0% {
1366
+ background-position: 200% 0;
1367
+ }
1368
+ 100% {
1369
+ background-position: -200% 0;
1370
+ }
1371
+ }
1372
+
1373
+ @keyframes adapters-pulse {
1374
+ 0%, 100% {
1375
+ opacity: 1;
1376
+ }
1377
+ 50% {
1378
+ opacity: 0.5;
1379
+ }
1380
+ }
1381
+
1382
+ @keyframes adapters-pulse-error {
1383
+ 0%, 100% {
1384
+ opacity: 1;
1385
+ box-shadow: 0 0 0 0 currentColor;
1386
+ }
1387
+ 50% {
1388
+ opacity: 0.8;
1389
+ }
1390
+ }
1391
+
1392
+ @keyframes adapters-spin {
1393
+ to {
1394
+ transform: rotate(360deg);
1395
+ }
1396
+ }
1397
+
1398
+ @keyframes adapters-fade-in {
1399
+ from {
1400
+ opacity: 0;
1401
+ }
1402
+ to {
1403
+ opacity: 1;
1404
+ }
1405
+ }
1406
+
1407
+ @keyframes adapters-slide-up {
1408
+ from {
1409
+ opacity: 0;
1410
+ transform: translateY(1rem);
1411
+ }
1412
+ to {
1413
+ opacity: 1;
1414
+ transform: translateY(0);
1415
+ }
1416
+ }
1417
+
1418
+ @keyframes adapters-slide-down {
1419
+ from {
1420
+ opacity: 0;
1421
+ transform: translateY(-1rem);
1422
+ }
1423
+ to {
1424
+ opacity: 1;
1425
+ transform: translateY(0);
1426
+ }
1427
+ }
1428
+
1429
+ @keyframes adapters-slide-in-right {
1430
+ from {
1431
+ opacity: 0;
1432
+ transform: translateX(1rem);
1433
+ }
1434
+ to {
1435
+ opacity: 1;
1436
+ transform: translateX(0);
1437
+ }
1438
+ }
1439
+
1440
+ /* ============================================================================
1441
+ RESPONSIVE DESIGN
1442
+ ============================================================================ */
1443
+
1444
+ @media (max-width: 1024px) {
1445
+ .adapters__grid {
1446
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1447
+ }
1448
+
1449
+ .adapters__grid--2col {
1450
+ grid-template-columns: 1fr;
1451
+ }
1452
+
1453
+ .adapters__modal {
1454
+ min-width: 90vw;
1455
+ }
1456
+ }
1457
+
1458
+ @media (max-width: 768px) {
1459
+ .adapters__container {
1460
+ gap: var(--adapters-spacing-lg);
1461
+ padding: var(--adapters-spacing-lg);
1462
+ }
1463
+
1464
+ .adapters__grid {
1465
+ grid-template-columns: 1fr;
1466
+ }
1467
+
1468
+ .adapters__stats {
1469
+ grid-template-columns: repeat(2, 1fr);
1470
+ }
1471
+
1472
+ .adapters__filter-bar {
1473
+ flex-direction: column;
1474
+ align-items: stretch;
1475
+ }
1476
+
1477
+ .adapters__page {
1478
+ padding: var(--adapters-spacing-lg);
1479
+ }
1480
+
1481
+ .adapters__modal {
1482
+ min-width: unset;
1483
+ width: calc(100vw - 2rem);
1484
+ max-height: calc(100vh - 2rem);
1485
+ }
1486
+
1487
+ .adapters__modal-footer {
1488
+ flex-direction: column-reverse;
1489
+ }
1490
+
1491
+ .adapters__modal-footer .adapters__btn {
1492
+ width: 100%;
1493
+ }
1494
+
1495
+ .adapters__toast {
1496
+ right: var(--adapters-spacing-sm);
1497
+ left: var(--adapters-spacing-sm);
1498
+ bottom: var(--adapters-spacing-sm);
1499
+ max-width: none;
1500
+ }
1501
+
1502
+ .adapters__col--half,
1503
+ .adapters__col--third {
1504
+ flex: 0 1 100%;
1505
+ }
1506
+ }
1507
+
1508
+ @media (max-width: 480px) {
1509
+ .adapters__stats {
1510
+ grid-template-columns: 1fr;
1511
+ }
1512
+
1513
+ .adapters__actions {
1514
+ flex-direction: column;
1515
+ }
1516
+
1517
+ .adapters__actions .adapters__btn {
1518
+ width: 100%;
1519
+ }
1520
+
1521
+ .adapters__title {
1522
+ font-size: 1.25rem;
1523
+ }
1524
+
1525
+ .adapters__header {
1526
+ flex-direction: column;
1527
+ align-items: flex-start;
1528
+ }
1529
+
1530
+ .adapters__tabs {
1531
+ margin-bottom: var(--adapters-spacing-lg);
1532
+ }
1533
+
1534
+ .adapters__table {
1535
+ font-size: 0.75rem;
1536
+ }
1537
+
1538
+ .adapters__table-th,
1539
+ .adapters__table-td {
1540
+ padding: var(--adapters-spacing-sm);
1541
+ }
1542
+
1543
+ .adapters__modal {
1544
+ border-radius: var(--adapters-radius);
1545
+ }
1546
+ }
1547
+
1548
+ /* ============================================================================
1549
+ DARK MODE (explicit override)
1550
+ ============================================================================ */
1551
+
1552
+ @media (prefers-color-scheme: dark) {
1553
+ :root {
1554
+ --adapters-bg: oklch(0.10 0.01 250);
1555
+ --adapters-surface: oklch(0.13 0.01 250);
1556
+ --adapters-surface-2: oklch(0.16 0.01 250);
1557
+ --adapters-text: oklch(0.95 0.01 250);
1558
+ --adapters-text-muted: oklch(0.65 0.01 250);
1559
+ }
1560
+ }
1561
+
1562
+ /* ============================================================================
1563
+ LIGHT MODE (explicit override)
1564
+ ============================================================================ */
1565
+
1566
+ @media (prefers-color-scheme: light) {
1567
+ :root {
1568
+ --adapters-bg: oklch(0.98 0.01 250);
1569
+ --adapters-surface: oklch(0.96 0.01 250);
1570
+ --adapters-surface-2: oklch(0.92 0.01 250);
1571
+ --adapters-text: oklch(0.15 0.01 250);
1572
+ --adapters-text-muted: oklch(0.50 0.01 250);
1573
+ }
1574
+ }
1575
+
1576
+ /* End of adapters.css */