@neurosquad/card-sdk 1.0.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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +431 -0
  3. package/dist/card-sdk.js +5266 -0
  4. package/dist/cli.js +2838 -0
  5. package/dist/react.js +257 -0
  6. package/dist/testing.js +1150 -0
  7. package/dist/types/client/base64.d.ts +7 -0
  8. package/dist/types/client/card.d.ts +653 -0
  9. package/dist/types/client/channel.d.ts +49 -0
  10. package/dist/types/client/coalesce.d.ts +14 -0
  11. package/dist/types/client/connect.d.ts +39 -0
  12. package/dist/types/client/errors.d.ts +46 -0
  13. package/dist/types/client/helpers.d.ts +25 -0
  14. package/dist/types/client/net.d.ts +111 -0
  15. package/dist/types/client/theme.d.ts +31 -0
  16. package/dist/types/client/toolResult.d.ts +16 -0
  17. package/dist/types/contract/api.d.ts +812 -0
  18. package/dist/types/contract/index.d.ts +11 -0
  19. package/dist/types/contract/jsonSchema.d.ts +88 -0
  20. package/dist/types/contract/localized.d.ts +10 -0
  21. package/dist/types/contract/manifest.d.ts +179 -0
  22. package/dist/types/contract/network.d.ts +48 -0
  23. package/dist/types/contract/permissions.d.ts +180 -0
  24. package/dist/types/contract/ports.d.ts +237 -0
  25. package/dist/types/contract/protocol.d.ts +74 -0
  26. package/dist/types/contract/source.d.ts +111 -0
  27. package/dist/types/contract/theme.d.ts +21 -0
  28. package/dist/types/contract/version.d.ts +126 -0
  29. package/dist/types/i18n.d.ts +50 -0
  30. package/dist/types/index.d.ts +28 -0
  31. package/dist/types/react/index.d.ts +132 -0
  32. package/dist/types/testing/index.d.ts +7 -0
  33. package/dist/types/testing/mockHost.d.ts +315 -0
  34. package/dist/types/version.d.ts +2 -0
  35. package/dist/ui.css +581 -0
  36. package/package.json +77 -0
  37. package/schema/neurosquad-card.v1.json +434 -0
  38. package/templates/react/README.md +34 -0
  39. package/templates/react/_gitignore +10 -0
  40. package/templates/react/icon.png +0 -0
  41. package/templates/react/index.html +12 -0
  42. package/templates/react/neurosquad-card.json +94 -0
  43. package/templates/react/package.json +25 -0
  44. package/templates/react/src/App.tsx +131 -0
  45. package/templates/react/src/i18n.ts +61 -0
  46. package/templates/react/src/main.tsx +77 -0
  47. package/templates/react/src/styles.css +42 -0
  48. package/templates/react/tsconfig.json +18 -0
  49. package/templates/react/vite.config.ts +19 -0
  50. package/templates/vanilla/README.md +37 -0
  51. package/templates/vanilla/_gitignore +6 -0
  52. package/templates/vanilla/icon.png +0 -0
  53. package/templates/vanilla/index.html +41 -0
  54. package/templates/vanilla/main.js +256 -0
  55. package/templates/vanilla/neurosquad-card.json +94 -0
  56. package/templates/vanilla/style.css +41 -0
package/dist/ui.css ADDED
@@ -0,0 +1,581 @@
1
+ /*
2
+ * @neurosquad/card-sdk/ui.css — an optional, small dark kit that matches the
3
+ * NeuroSquad app. Everything reads the --ns-* variables that connect() /
4
+ * applyTheme() set from the app's live theme; the fallbacks below are the
5
+ * app's dark theme, so a page previewed outside the app looks right too.
6
+ *
7
+ * Opt in per element with ns-* classes, or add class="ns-kit" on <body> for
8
+ * base typography, background and scrollbars. Ignore the whole file if you
9
+ * style your card yourself.
10
+ */
11
+
12
+ :root {
13
+ --ns-kit-bg: var(--ns-background, oklch(12% 0.005 285.823));
14
+ --ns-kit-fg: var(--ns-foreground, oklch(0.9911 0 0));
15
+ --ns-kit-muted: var(--ns-muted, oklch(70.5% 0.015 286.067));
16
+ --ns-kit-surface: var(--ns-surface, oklch(0.2103 0.0059 285.89));
17
+ --ns-kit-surface-2: var(--ns-surface-secondary, oklch(0.257 0.0037 286.14));
18
+ --ns-kit-surface-3: var(--ns-surface-tertiary, oklch(0.2721 0.0024 247.91));
19
+ --ns-kit-default: var(--ns-default, oklch(27.4% 0.006 286.033));
20
+ --ns-kit-default-fg: var(--ns-default-foreground, oklch(0.9911 0 0));
21
+ --ns-kit-accent: var(--ns-accent, oklch(0.6204 0.195 253.83));
22
+ --ns-kit-accent-fg: var(--ns-accent-foreground, oklch(0.9911 0 0));
23
+ --ns-kit-accent-soft: var(
24
+ --ns-accent-soft,
25
+ color-mix(in oklab, var(--ns-kit-accent) 15%, transparent)
26
+ );
27
+ --ns-kit-accent-soft-fg: var(--ns-accent-soft-foreground, oklch(0.73 0.14 254));
28
+ --ns-kit-success: var(--ns-success, oklch(0.7329 0.1935 150.81));
29
+ --ns-kit-success-soft: var(
30
+ --ns-success-soft,
31
+ color-mix(in oklab, var(--ns-kit-success) 15%, transparent)
32
+ );
33
+ --ns-kit-warning: var(--ns-warning, oklch(0.8203 0.1388 76.34));
34
+ --ns-kit-warning-soft: var(
35
+ --ns-warning-soft,
36
+ color-mix(in oklab, var(--ns-kit-warning) 15%, transparent)
37
+ );
38
+ --ns-kit-danger: var(--ns-danger, oklch(0.594 0.1967 24.63));
39
+ --ns-kit-danger-fg: var(--ns-danger-foreground, oklch(0.9911 0 0));
40
+ --ns-kit-danger-soft: var(
41
+ --ns-danger-soft,
42
+ color-mix(in oklab, var(--ns-kit-danger) 15%, transparent)
43
+ );
44
+ --ns-kit-border: var(--ns-border, oklch(28% 0.006 286.033));
45
+ --ns-kit-border-2: var(--ns-border-secondary, oklch(38% 0.005 286));
46
+ --ns-kit-separator: var(--ns-separator, oklch(25% 0.006 286.033));
47
+ --ns-kit-focus: var(--ns-focus, var(--ns-kit-accent));
48
+ --ns-kit-field-bg: var(--ns-field-background, oklch(0.2103 0.0059 285.89));
49
+ --ns-kit-field-fg: var(--ns-field-foreground, oklch(0.9911 0 0));
50
+ --ns-kit-field-placeholder: var(--ns-field-placeholder, var(--ns-kit-muted));
51
+ --ns-kit-field-border: var(--ns-field-border, transparent);
52
+ --ns-kit-radius: var(--ns-radius, 0.5rem);
53
+ --ns-kit-field-radius: var(--ns-field-radius, 0.75rem);
54
+ --ns-kit-font: var(
55
+ --ns-font-sans,
56
+ ui-sans-serif,
57
+ system-ui,
58
+ -apple-system,
59
+ 'Segoe UI',
60
+ Roboto,
61
+ 'Helvetica Neue',
62
+ Arial,
63
+ sans-serif
64
+ );
65
+ --ns-kit-mono: var(
66
+ --ns-font-mono,
67
+ ui-monospace,
68
+ SFMono-Regular,
69
+ 'Cascadia Mono',
70
+ Menlo,
71
+ Consolas,
72
+ monospace
73
+ );
74
+ --ns-kit-ease: cubic-bezier(0.2, 0.8, 0.2, 1);
75
+ }
76
+
77
+ /* --- base --------------------------------------------------------------- */
78
+
79
+ .ns-kit {
80
+ margin: 0;
81
+ min-height: 100vh;
82
+ box-sizing: border-box;
83
+ background: var(--ns-kit-bg);
84
+ color: var(--ns-kit-fg);
85
+ font-family: var(--ns-kit-font);
86
+ font-size: 14px;
87
+ line-height: 1.45;
88
+ -webkit-font-smoothing: antialiased;
89
+ color-scheme: dark;
90
+ scrollbar-width: thin;
91
+ scrollbar-color: color-mix(in oklch, var(--ns-kit-fg) 15%, transparent) transparent;
92
+ }
93
+ .ns-kit *,
94
+ .ns-kit *::before,
95
+ .ns-kit *::after {
96
+ box-sizing: inherit;
97
+ }
98
+ .ns-kit :focus-visible {
99
+ outline: 2px solid var(--ns-kit-focus);
100
+ outline-offset: 2px;
101
+ }
102
+
103
+ /* --- layout ------------------------------------------------------------- */
104
+
105
+ .ns-stack {
106
+ display: flex;
107
+ flex-direction: column;
108
+ gap: 8px;
109
+ }
110
+ .ns-row {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 8px;
114
+ }
115
+ .ns-spread {
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: space-between;
119
+ gap: 8px;
120
+ }
121
+ .ns-grow {
122
+ flex: 1 1 auto;
123
+ min-width: 0;
124
+ }
125
+ .ns-pad {
126
+ padding: 12px;
127
+ }
128
+ .ns-scroll {
129
+ overflow: auto;
130
+ min-height: 0;
131
+ scrollbar-width: thin;
132
+ scrollbar-color: color-mix(in oklch, var(--ns-kit-fg) 15%, transparent) transparent;
133
+ overscroll-behavior: contain;
134
+ }
135
+ .ns-divider {
136
+ height: 1px;
137
+ border: 0;
138
+ margin: 4px 0;
139
+ background: var(--ns-kit-separator);
140
+ }
141
+
142
+ /* --- surfaces ----------------------------------------------------------- */
143
+
144
+ .ns-surface {
145
+ background: var(--ns-kit-surface);
146
+ border: 1px solid var(--ns-kit-border);
147
+ border-radius: calc(var(--ns-kit-radius) * 1.5);
148
+ padding: 12px;
149
+ }
150
+ .ns-surface--inset {
151
+ background: var(--ns-kit-surface-2);
152
+ border-color: transparent;
153
+ }
154
+
155
+ /* --- text --------------------------------------------------------------- */
156
+
157
+ .ns-title {
158
+ margin: 0;
159
+ font-size: 15px;
160
+ font-weight: 600;
161
+ letter-spacing: -0.01em;
162
+ }
163
+ .ns-subtitle {
164
+ margin: 0;
165
+ font-size: 12px;
166
+ font-weight: 500;
167
+ text-transform: uppercase;
168
+ letter-spacing: 0.06em;
169
+ color: var(--ns-kit-muted);
170
+ }
171
+ .ns-muted {
172
+ color: var(--ns-kit-muted);
173
+ }
174
+ .ns-small {
175
+ font-size: 12px;
176
+ }
177
+ .ns-mono {
178
+ font-family: var(--ns-kit-mono);
179
+ font-size: 12.5px;
180
+ }
181
+ .ns-truncate {
182
+ overflow: hidden;
183
+ text-overflow: ellipsis;
184
+ white-space: nowrap;
185
+ }
186
+ .ns-kbd {
187
+ display: inline-block;
188
+ padding: 1px 6px;
189
+ border: 1px solid var(--ns-kit-border-2);
190
+ border-bottom-width: 2px;
191
+ border-radius: 6px;
192
+ font-family: var(--ns-kit-mono);
193
+ font-size: 11px;
194
+ color: var(--ns-kit-muted);
195
+ }
196
+
197
+ /* --- buttons ------------------------------------------------------------ */
198
+
199
+ .ns-btn {
200
+ display: inline-flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ gap: 6px;
204
+ height: 32px;
205
+ padding: 0 12px;
206
+ border: 1px solid transparent;
207
+ border-radius: var(--ns-kit-radius);
208
+ background: var(--ns-kit-default);
209
+ color: var(--ns-kit-default-fg);
210
+ font: inherit;
211
+ font-size: 13px;
212
+ font-weight: 500;
213
+ line-height: 1;
214
+ white-space: nowrap;
215
+ cursor: pointer;
216
+ user-select: none;
217
+ transition:
218
+ background-color 150ms var(--ns-kit-ease),
219
+ border-color 150ms var(--ns-kit-ease),
220
+ transform 100ms var(--ns-kit-ease),
221
+ opacity 150ms var(--ns-kit-ease);
222
+ }
223
+ .ns-btn:hover {
224
+ background: color-mix(in oklab, var(--ns-kit-default) 88%, var(--ns-kit-default-fg) 12%);
225
+ }
226
+ .ns-btn:active {
227
+ transform: scale(0.97);
228
+ }
229
+ .ns-btn:focus-visible {
230
+ outline: 2px solid var(--ns-kit-focus);
231
+ outline-offset: 2px;
232
+ }
233
+ .ns-btn:disabled,
234
+ .ns-btn[aria-disabled='true'] {
235
+ opacity: 0.5;
236
+ cursor: not-allowed;
237
+ transform: none;
238
+ }
239
+ .ns-btn--primary {
240
+ background: var(--ns-kit-accent);
241
+ color: var(--ns-kit-accent-fg);
242
+ }
243
+ .ns-btn--primary:hover {
244
+ background: color-mix(in oklab, var(--ns-kit-accent) 90%, var(--ns-kit-accent-fg) 10%);
245
+ }
246
+ .ns-btn--secondary {
247
+ background: var(--ns-kit-accent-soft);
248
+ color: var(--ns-kit-accent-soft-fg);
249
+ }
250
+ .ns-btn--secondary:hover {
251
+ background: color-mix(in oklab, var(--ns-kit-accent) 22%, transparent);
252
+ }
253
+ .ns-btn--outline {
254
+ background: transparent;
255
+ border-color: var(--ns-kit-border-2);
256
+ }
257
+ .ns-btn--outline:hover {
258
+ background: color-mix(in oklab, var(--ns-kit-default) 60%, transparent);
259
+ }
260
+ .ns-btn--ghost {
261
+ background: transparent;
262
+ }
263
+ .ns-btn--ghost:hover {
264
+ background: color-mix(in oklab, var(--ns-kit-default) 70%, transparent);
265
+ }
266
+ .ns-btn--danger {
267
+ background: var(--ns-kit-danger);
268
+ color: var(--ns-kit-danger-fg);
269
+ }
270
+ .ns-btn--danger:hover {
271
+ background: color-mix(in oklab, var(--ns-kit-danger) 90%, var(--ns-kit-danger-fg) 10%);
272
+ }
273
+ .ns-btn--sm {
274
+ height: 26px;
275
+ padding: 0 9px;
276
+ font-size: 12px;
277
+ }
278
+ .ns-btn--lg {
279
+ height: 40px;
280
+ padding: 0 16px;
281
+ font-size: 14px;
282
+ }
283
+ .ns-btn--icon {
284
+ width: 32px;
285
+ padding: 0;
286
+ }
287
+ .ns-btn--icon.ns-btn--sm {
288
+ width: 26px;
289
+ }
290
+
291
+ /* --- fields ------------------------------------------------------------- */
292
+
293
+ .ns-field {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 4px;
297
+ }
298
+ .ns-label {
299
+ font-size: 12px;
300
+ font-weight: 500;
301
+ color: var(--ns-kit-muted);
302
+ }
303
+ .ns-input,
304
+ .ns-textarea,
305
+ .ns-select {
306
+ width: 100%;
307
+ min-height: 34px;
308
+ padding: 7px 10px;
309
+ border: 1px solid var(--ns-kit-field-border);
310
+ border-radius: var(--ns-kit-field-radius);
311
+ background: var(--ns-kit-field-bg);
312
+ color: var(--ns-kit-field-fg);
313
+ font: inherit;
314
+ font-size: 13px;
315
+ outline: none;
316
+ transition:
317
+ background-color 150ms var(--ns-kit-ease),
318
+ box-shadow 150ms var(--ns-kit-ease);
319
+ }
320
+ .ns-input::placeholder,
321
+ .ns-textarea::placeholder {
322
+ color: var(--ns-kit-field-placeholder);
323
+ }
324
+ .ns-input:hover,
325
+ .ns-textarea:hover,
326
+ .ns-select:hover {
327
+ background: color-mix(in oklab, var(--ns-kit-field-bg) 92%, var(--ns-kit-field-fg) 4%);
328
+ }
329
+ .ns-input:focus-visible,
330
+ .ns-textarea:focus-visible,
331
+ .ns-select:focus-visible {
332
+ box-shadow: 0 0 0 2px var(--ns-kit-focus);
333
+ }
334
+ .ns-input[aria-invalid='true'],
335
+ .ns-textarea[aria-invalid='true'] {
336
+ box-shadow: 0 0 0 1px var(--ns-kit-danger);
337
+ }
338
+ .ns-textarea {
339
+ min-height: 72px;
340
+ resize: vertical;
341
+ }
342
+ .ns-select {
343
+ appearance: none;
344
+ padding-right: 28px;
345
+ background-image:
346
+ linear-gradient(45deg, transparent 50%, var(--ns-kit-muted) 50%),
347
+ linear-gradient(135deg, var(--ns-kit-muted) 50%, transparent 50%);
348
+ background-position:
349
+ calc(100% - 15px) 50%,
350
+ calc(100% - 10px) 50%;
351
+ background-size: 5px 5px;
352
+ background-repeat: no-repeat;
353
+ }
354
+ .ns-help {
355
+ font-size: 12px;
356
+ color: var(--ns-kit-muted);
357
+ }
358
+ .ns-error {
359
+ font-size: 12px;
360
+ color: var(--ns-kit-danger);
361
+ }
362
+
363
+ /* Switch: <label class="ns-switch"><input type="checkbox"> Label</label> */
364
+ .ns-switch {
365
+ display: inline-flex;
366
+ align-items: center;
367
+ gap: 8px;
368
+ font-size: 13px;
369
+ cursor: pointer;
370
+ }
371
+ .ns-switch input {
372
+ appearance: none;
373
+ position: relative;
374
+ flex: none;
375
+ width: 32px;
376
+ height: 18px;
377
+ margin: 0;
378
+ border-radius: 999px;
379
+ background: var(--ns-kit-default);
380
+ cursor: pointer;
381
+ transition: background-color 150ms var(--ns-kit-ease);
382
+ }
383
+ .ns-switch input::after {
384
+ content: '';
385
+ position: absolute;
386
+ top: 2px;
387
+ left: 2px;
388
+ width: 14px;
389
+ height: 14px;
390
+ border-radius: 50%;
391
+ background: var(--ns-kit-fg);
392
+ transition: transform 150ms var(--ns-kit-ease);
393
+ }
394
+ .ns-switch input:checked {
395
+ background: var(--ns-kit-accent);
396
+ }
397
+ .ns-switch input:checked::after {
398
+ transform: translateX(14px);
399
+ }
400
+ .ns-switch input:focus-visible {
401
+ outline: 2px solid var(--ns-kit-focus);
402
+ outline-offset: 2px;
403
+ }
404
+
405
+ /* --- lists -------------------------------------------------------------- */
406
+
407
+ .ns-list {
408
+ display: flex;
409
+ flex-direction: column;
410
+ gap: 2px;
411
+ margin: 0;
412
+ padding: 0;
413
+ list-style: none;
414
+ }
415
+ .ns-list-item {
416
+ display: flex;
417
+ align-items: center;
418
+ gap: 10px;
419
+ min-height: 36px;
420
+ padding: 6px 10px;
421
+ border-radius: var(--ns-kit-radius);
422
+ transition: background-color 120ms var(--ns-kit-ease);
423
+ }
424
+ .ns-list-item:hover,
425
+ .ns-list-item[aria-selected='true'] {
426
+ background: var(--ns-kit-surface-2);
427
+ }
428
+ button.ns-list-item {
429
+ width: 100%;
430
+ border: 0;
431
+ background: transparent;
432
+ color: inherit;
433
+ font: inherit;
434
+ text-align: left;
435
+ cursor: pointer;
436
+ }
437
+
438
+ /* --- badges, dots, chips -------------------------------------------------- */
439
+
440
+ .ns-badge {
441
+ display: inline-flex;
442
+ align-items: center;
443
+ gap: 4px;
444
+ height: 20px;
445
+ padding: 0 7px;
446
+ border-radius: 999px;
447
+ background: var(--ns-kit-default);
448
+ color: var(--ns-kit-default-fg);
449
+ font-size: 11px;
450
+ font-weight: 600;
451
+ font-variant-numeric: tabular-nums;
452
+ white-space: nowrap;
453
+ }
454
+ .ns-badge--accent {
455
+ background: var(--ns-kit-accent-soft);
456
+ color: var(--ns-kit-accent-soft-fg);
457
+ }
458
+ .ns-badge--success {
459
+ background: var(--ns-kit-success-soft);
460
+ color: var(--ns-kit-success);
461
+ }
462
+ .ns-badge--warning {
463
+ background: var(--ns-kit-warning-soft);
464
+ color: var(--ns-kit-warning);
465
+ }
466
+ .ns-badge--danger {
467
+ background: var(--ns-kit-danger-soft);
468
+ color: color-mix(in oklab, var(--ns-kit-danger) 70%, var(--ns-kit-fg) 30%);
469
+ }
470
+
471
+ .ns-dot {
472
+ display: inline-block;
473
+ flex: none;
474
+ width: 8px;
475
+ height: 8px;
476
+ border-radius: 50%;
477
+ background: var(--ns-kit-muted);
478
+ }
479
+ .ns-dot--accent {
480
+ background: var(--ns-kit-accent);
481
+ box-shadow: 0 0 8px color-mix(in oklab, var(--ns-kit-accent) 70%, transparent);
482
+ }
483
+ .ns-dot--success {
484
+ background: var(--ns-kit-success);
485
+ box-shadow: 0 0 8px color-mix(in oklab, var(--ns-kit-success) 70%, transparent);
486
+ }
487
+ .ns-dot--warning {
488
+ background: var(--ns-kit-warning);
489
+ box-shadow: 0 0 8px color-mix(in oklab, var(--ns-kit-warning) 70%, transparent);
490
+ }
491
+ .ns-dot--danger {
492
+ background: var(--ns-kit-danger);
493
+ box-shadow: 0 0 8px color-mix(in oklab, var(--ns-kit-danger) 70%, transparent);
494
+ }
495
+
496
+ /* --- feedback ------------------------------------------------------------ */
497
+
498
+ .ns-spinner {
499
+ display: inline-block;
500
+ flex: none;
501
+ width: 16px;
502
+ height: 16px;
503
+ border: 2px solid color-mix(in oklab, var(--ns-kit-fg) 18%, transparent);
504
+ border-top-color: var(--ns-kit-accent);
505
+ border-radius: 50%;
506
+ animation: ns-spin 700ms linear infinite;
507
+ }
508
+ @keyframes ns-spin {
509
+ to {
510
+ transform: rotate(360deg);
511
+ }
512
+ }
513
+
514
+ .ns-progress {
515
+ position: relative;
516
+ height: 6px;
517
+ overflow: hidden;
518
+ border-radius: 999px;
519
+ background: var(--ns-kit-default);
520
+ }
521
+ .ns-progress > span {
522
+ display: block;
523
+ height: 100%;
524
+ width: var(--ns-progress, 0%);
525
+ border-radius: inherit;
526
+ background: var(--ns-kit-accent);
527
+ transition: width 250ms var(--ns-kit-ease);
528
+ }
529
+
530
+ .ns-empty {
531
+ display: flex;
532
+ flex-direction: column;
533
+ align-items: center;
534
+ justify-content: center;
535
+ gap: 6px;
536
+ min-height: 120px;
537
+ padding: 16px;
538
+ text-align: center;
539
+ color: var(--ns-kit-muted);
540
+ }
541
+ .ns-empty strong {
542
+ color: var(--ns-kit-fg);
543
+ font-weight: 600;
544
+ }
545
+
546
+ .ns-callout {
547
+ padding: 8px 10px;
548
+ border-radius: var(--ns-kit-radius);
549
+ background: var(--ns-kit-accent-soft);
550
+ color: var(--ns-kit-accent-soft-fg);
551
+ font-size: 12.5px;
552
+ }
553
+ .ns-callout--danger {
554
+ background: var(--ns-kit-danger-soft);
555
+ color: color-mix(in oklab, var(--ns-kit-danger) 70%, var(--ns-kit-fg) 30%);
556
+ }
557
+ .ns-callout--success {
558
+ background: var(--ns-kit-success-soft);
559
+ color: var(--ns-kit-success);
560
+ }
561
+
562
+ /* A card is paused while nobody sees it: `document.documentElement.dataset.nsPaused` (set it yourself). */
563
+ [data-ns-paused] .ns-spinner {
564
+ animation-play-state: paused;
565
+ }
566
+
567
+ @media (prefers-reduced-motion: reduce) {
568
+ .ns-btn,
569
+ .ns-input,
570
+ .ns-textarea,
571
+ .ns-select,
572
+ .ns-switch input,
573
+ .ns-switch input::after,
574
+ .ns-list-item,
575
+ .ns-progress > span {
576
+ transition: none;
577
+ }
578
+ .ns-spinner {
579
+ animation-duration: 2s;
580
+ }
581
+ }
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@neurosquad/card-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Build custom cards for NeuroSquad: a typed client for the card API, React hooks, an optional dark UI kit and the neurosquad-card CLI (create, dev, validate, pack).",
5
+ "license": "MIT",
6
+ "author": "NeuroSquad",
7
+ "homepage": "https://neurosquad.ai",
8
+ "keywords": [
9
+ "neurosquad",
10
+ "card",
11
+ "sdk",
12
+ "agents",
13
+ "canvas",
14
+ "plugin"
15
+ ],
16
+ "type": "module",
17
+ "sideEffects": [
18
+ "./dist/card-sdk.js",
19
+ "./dist/ui.css"
20
+ ],
21
+ "main": "./dist/card-sdk.js",
22
+ "module": "./dist/card-sdk.js",
23
+ "types": "./dist/types/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/types/index.d.ts",
27
+ "default": "./dist/card-sdk.js"
28
+ },
29
+ "./react": {
30
+ "types": "./dist/types/react/index.d.ts",
31
+ "default": "./dist/react.js"
32
+ },
33
+ "./testing": {
34
+ "types": "./dist/types/testing/index.d.ts",
35
+ "default": "./dist/testing.js"
36
+ },
37
+ "./ui.css": "./dist/ui.css",
38
+ "./schema.json": "./schema/neurosquad-card.v1.json",
39
+ "./package.json": "./package.json"
40
+ },
41
+ "bin": {
42
+ "neurosquad-card": "./dist/cli.js"
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "templates",
47
+ "schema",
48
+ "README.md",
49
+ "LICENSE"
50
+ ],
51
+ "engines": {
52
+ "node": ">=18.17"
53
+ },
54
+ "scripts": {
55
+ "sync-contract": "node scripts/sync-contract.mjs",
56
+ "check-contract": "node scripts/sync-contract.mjs --check",
57
+ "build": "node scripts/build.mjs",
58
+ "typecheck": "tsc --noEmit -p tsconfig.json",
59
+ "test": "node scripts/build.mjs && tsc --noEmit -p tsconfig.json && vitest run"
60
+ },
61
+ "peerDependencies": {
62
+ "react": "^18.2.0 || ^19.0.0"
63
+ },
64
+ "peerDependenciesMeta": {
65
+ "react": {
66
+ "optional": true
67
+ }
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^22.19.1",
71
+ "@types/react": "^19.2.7",
72
+ "esbuild": "^0.25.12",
73
+ "react": "19.2.8",
74
+ "typescript": "^5.9.3",
75
+ "vitest": "^3.2.7"
76
+ }
77
+ }