@nebulr-group/bridge-svelte 0.1.0-beta.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/dist/auth/route-guard.d.ts +2 -0
  4. package/dist/auth/route-guard.js +28 -0
  5. package/dist/client/BridgeBootstrap.d.ts +8 -0
  6. package/dist/client/BridgeBootstrap.js +105 -0
  7. package/dist/client/BridgeBootstrap.svelte +43 -0
  8. package/dist/client/BridgeBootstrap.svelte.d.ts +6 -0
  9. package/dist/client/components/FeatureFlag.svelte +37 -0
  10. package/dist/client/components/FeatureFlag.svelte.d.ts +15 -0
  11. package/dist/client/components/ProfileName.svelte +18 -0
  12. package/dist/client/components/ProfileName.svelte.d.ts +6 -0
  13. package/dist/client/components/developer/ApiTokenManagement.svelte +365 -0
  14. package/dist/client/components/developer/ApiTokenManagement.svelte.d.ts +6 -0
  15. package/dist/client/components/sdk-auth/ForgotPassword.svelte +170 -0
  16. package/dist/client/components/sdk-auth/ForgotPassword.svelte.d.ts +10 -0
  17. package/dist/client/components/sdk-auth/LoginForm.svelte +414 -0
  18. package/dist/client/components/sdk-auth/LoginForm.svelte.d.ts +25 -0
  19. package/dist/client/components/sdk-auth/MagicLink.svelte +92 -0
  20. package/dist/client/components/sdk-auth/MagicLink.svelte.d.ts +9 -0
  21. package/dist/client/components/sdk-auth/MfaChallenge.svelte +150 -0
  22. package/dist/client/components/sdk-auth/MfaChallenge.svelte.d.ts +9 -0
  23. package/dist/client/components/sdk-auth/MfaSetup.svelte +182 -0
  24. package/dist/client/components/sdk-auth/MfaSetup.svelte.d.ts +8 -0
  25. package/dist/client/components/sdk-auth/PasskeyLogin.svelte +99 -0
  26. package/dist/client/components/sdk-auth/PasskeyLogin.svelte.d.ts +10 -0
  27. package/dist/client/components/sdk-auth/PasskeyRequestSetupLink.svelte +83 -0
  28. package/dist/client/components/sdk-auth/PasskeyRequestSetupLink.svelte.d.ts +7 -0
  29. package/dist/client/components/sdk-auth/PasskeySetup.svelte +151 -0
  30. package/dist/client/components/sdk-auth/PasskeySetup.svelte.d.ts +11 -0
  31. package/dist/client/components/sdk-auth/SignupForm.svelte +119 -0
  32. package/dist/client/components/sdk-auth/SignupForm.svelte.d.ts +14 -0
  33. package/dist/client/components/sdk-auth/SsoButton.svelte +70 -0
  34. package/dist/client/components/sdk-auth/SsoButton.svelte.d.ts +13 -0
  35. package/dist/client/components/sdk-auth/SsoProviderIcon.svelte +56 -0
  36. package/dist/client/components/sdk-auth/SsoProviderIcon.svelte.d.ts +7 -0
  37. package/dist/client/components/sdk-auth/TenantSelector.svelte +83 -0
  38. package/dist/client/components/sdk-auth/TenantSelector.svelte.d.ts +11 -0
  39. package/dist/client/components/sdk-auth/WorkspaceSelector.svelte +108 -0
  40. package/dist/client/components/sdk-auth/WorkspaceSelector.svelte.d.ts +16 -0
  41. package/dist/client/components/sdk-auth/shared/Alert.svelte +17 -0
  42. package/dist/client/components/sdk-auth/shared/Alert.svelte.d.ts +9 -0
  43. package/dist/client/components/sdk-auth/shared/AuthFormWrapper.svelte +23 -0
  44. package/dist/client/components/sdk-auth/shared/AuthFormWrapper.svelte.d.ts +10 -0
  45. package/dist/client/components/sdk-auth/shared/Spinner.svelte +16 -0
  46. package/dist/client/components/sdk-auth/shared/Spinner.svelte.d.ts +7 -0
  47. package/dist/client/components/subscription/PlanSelector.svelte +204 -0
  48. package/dist/client/components/subscription/PlanSelector.svelte.d.ts +22 -0
  49. package/dist/client/components/team/TeamAddUserDialog.svelte +125 -0
  50. package/dist/client/components/team/TeamAddUserDialog.svelte.d.ts +17 -0
  51. package/dist/client/components/team/TeamConfirmDialog.svelte +80 -0
  52. package/dist/client/components/team/TeamConfirmDialog.svelte.d.ts +21 -0
  53. package/dist/client/components/team/TeamEditUserDialog.svelte +131 -0
  54. package/dist/client/components/team/TeamEditUserDialog.svelte.d.ts +19 -0
  55. package/dist/client/components/team/TeamManagementPanel.svelte +72 -0
  56. package/dist/client/components/team/TeamManagementPanel.svelte.d.ts +20 -0
  57. package/dist/client/components/team/TeamProfileForm.svelte +129 -0
  58. package/dist/client/components/team/TeamProfileForm.svelte.d.ts +7 -0
  59. package/dist/client/components/team/TeamUserActionsMenu.svelte +63 -0
  60. package/dist/client/components/team/TeamUserActionsMenu.svelte.d.ts +9 -0
  61. package/dist/client/components/team/TeamUserList.svelte +226 -0
  62. package/dist/client/components/team/TeamUserList.svelte.d.ts +7 -0
  63. package/dist/client/components/team/TeamWorkspaceForm.svelte +134 -0
  64. package/dist/client/components/team/TeamWorkspaceForm.svelte.d.ts +7 -0
  65. package/dist/client/stores/config.store.d.ts +6 -0
  66. package/dist/client/stores/config.store.js +76 -0
  67. package/dist/client/utils/cn.d.ts +1 -0
  68. package/dist/client/utils/cn.js +3 -0
  69. package/dist/core/bridge-instance.d.ts +52 -0
  70. package/dist/core/bridge-instance.js +160 -0
  71. package/dist/index.d.ts +34 -0
  72. package/dist/index.js +39 -0
  73. package/dist/shared/feature-flag.d.ts +6 -0
  74. package/dist/shared/feature-flag.js +13 -0
  75. package/dist/shared/logger.d.ts +18 -0
  76. package/dist/shared/logger.js +32 -0
  77. package/dist/shared/profile.d.ts +18 -0
  78. package/dist/shared/profile.js +25 -0
  79. package/dist/shared/types/config.d.ts +42 -0
  80. package/dist/shared/types/config.js +1 -0
  81. package/dist/styles.css +1089 -0
  82. package/package.json +86 -0
@@ -0,0 +1,1089 @@
1
+ /*
2
+ * bridge-svelte default styles — plain baseline
3
+ *
4
+ * Import this file to get the default appearance for all bridge-svelte components:
5
+ * import '@nebulr-group/bridge-svelte/styles';
6
+ *
7
+ * Without this file, components render as plain unstyled HTML — the headless contract.
8
+ * This file provides structural CSS only. Visual design (colors, shadows, radii) is
9
+ * intentionally left to the consumer or a future design-system layer.
10
+ *
11
+ * State selectors:
12
+ * [data-active="true"] — active tab
13
+ * [data-loading="true"] — loading state
14
+ * [data-state="active"] — active status
15
+ * [data-state="disabled"] — disabled status
16
+ * [data-variant="error"] — error variant
17
+ * [data-variant="info"] — info variant
18
+ * [data-variant="success"]— success variant
19
+ * [data-variant="danger"] — danger variant
20
+ */
21
+
22
+ /* ─── CSS variable defaults (consumer can override at any scope) ─────────── */
23
+
24
+ :root {
25
+ --bridge-primary: #4f46e5;
26
+ --bridge-primary-hover: #4338ca;
27
+ --bridge-primary-fg: #ffffff;
28
+ --bridge-border: #d1d5db;
29
+ --bridge-border-radius: 6px;
30
+ --bridge-input-focus: #4f46e5;
31
+ --bridge-alert-error-bg: #fef2f2;
32
+ --bridge-alert-error-fg: #991b1b;
33
+ --bridge-alert-error-border: #fca5a5;
34
+ --bridge-alert-success-bg: #f0fdf4;
35
+ --bridge-alert-success-fg: #166534;
36
+ --bridge-alert-success-border: #86efac;
37
+ }
38
+
39
+ /* ─── Input visual defaults ──────────────────────────────────────────────── */
40
+
41
+ :where(input[type="text"], input[type="email"], input[type="password"], input[type="tel"],
42
+ .bridge-input) {
43
+ border: 1px solid var(--bridge-border);
44
+ border-radius: var(--bridge-border-radius);
45
+ outline: none;
46
+ }
47
+ :where(input[type="text"]:focus, input[type="email"]:focus,
48
+ input[type="password"]:focus, input[type="tel"]:focus,
49
+ .bridge-input:focus) {
50
+ border-color: var(--bridge-input-focus);
51
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--bridge-input-focus) 20%, transparent);
52
+ }
53
+
54
+ /* ─── Buttons ────────────────────────────────────────────────────────────── */
55
+
56
+ .bridge-btn,
57
+ .bridge-btn-primary,
58
+ .bridge-btn-secondary,
59
+ .bridge-btn-outline,
60
+ .bridge-btn-danger,
61
+ .bridge-btn-danger-sm {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ gap: 0.5rem;
66
+ padding: 0.5rem 1rem;
67
+ cursor: pointer;
68
+ font-family: inherit;
69
+ font-size: 0.875rem;
70
+ font-weight: 500;
71
+ line-height: 1.25;
72
+ white-space: nowrap;
73
+ transition: opacity 0.15s;
74
+ }
75
+
76
+ .bridge-btn:disabled,
77
+ .bridge-btn-primary:disabled,
78
+ .bridge-btn-secondary:disabled,
79
+ .bridge-btn-outline:disabled,
80
+ .bridge-btn-danger:disabled {
81
+ cursor: not-allowed;
82
+ opacity: 0.5;
83
+ }
84
+
85
+ .bridge-btn-danger-sm {
86
+ padding: 0.25rem 0.625rem;
87
+ font-size: 0.75rem;
88
+ cursor: pointer;
89
+ }
90
+
91
+ /* ─── Button visual defaults ─────────────────────────────────────────────── */
92
+
93
+ :where(.bridge-btn-primary) {
94
+ background-color: var(--bridge-primary);
95
+ color: var(--bridge-primary-fg);
96
+ border: 1px solid var(--bridge-primary);
97
+ border-radius: var(--bridge-border-radius);
98
+ }
99
+ :where(.bridge-btn-primary:hover:not(:disabled)) {
100
+ background-color: var(--bridge-primary-hover);
101
+ border-color: var(--bridge-primary-hover);
102
+ }
103
+ :where(.bridge-btn-secondary, .bridge-btn-outline) {
104
+ background-color: transparent;
105
+ color: inherit;
106
+ border: 1px solid var(--bridge-border);
107
+ border-radius: var(--bridge-border-radius);
108
+ }
109
+ :where(.bridge-btn-secondary:hover:not(:disabled), .bridge-btn-outline:hover:not(:disabled)) {
110
+ background-color: color-mix(in srgb, currentColor 5%, transparent);
111
+ }
112
+
113
+ /* ─── Spinner ─────────────────────────────────────────────────────────────── */
114
+
115
+ [data-bridge-spinner] {
116
+ display: inline-block;
117
+ border: 2px solid currentColor;
118
+ border-top-color: transparent;
119
+ border-radius: 50%;
120
+ animation: bridge-spin 0.6s linear infinite;
121
+ }
122
+
123
+ @keyframes bridge-spin {
124
+ to { transform: rotate(360deg); }
125
+ }
126
+
127
+ /* ─── Alert ───────────────────────────────────────────────────────────────── */
128
+
129
+ [data-bridge-alert] {
130
+ padding: 0.625rem 0.875rem;
131
+ font-size: 0.875rem;
132
+ }
133
+
134
+ :where([data-bridge-alert]) {
135
+ border-radius: var(--bridge-border-radius);
136
+ border: 1px solid var(--bridge-border);
137
+ }
138
+ :where([data-bridge-alert][data-variant="error"]) {
139
+ background-color: var(--bridge-alert-error-bg);
140
+ color: var(--bridge-alert-error-fg);
141
+ border-color: var(--bridge-alert-error-border);
142
+ }
143
+ :where([data-bridge-alert][data-variant="success"]) {
144
+ background-color: var(--bridge-alert-success-bg);
145
+ color: var(--bridge-alert-success-fg);
146
+ border-color: var(--bridge-alert-success-border);
147
+ }
148
+
149
+ /* ─── AuthFormWrapper ─────────────────────────────────────────────────────── */
150
+
151
+ [data-bridge-auth-form] {
152
+ width: 100%;
153
+ max-width: 400px;
154
+ margin: 0 auto;
155
+ }
156
+
157
+ [data-bridge-auth-form] label {
158
+ display: block;
159
+ margin-bottom: 0.25rem;
160
+ font-size: 0.875rem;
161
+ }
162
+
163
+ [data-bridge-auth-form] input[type="text"],
164
+ [data-bridge-auth-form] input[type="email"],
165
+ [data-bridge-auth-form] input[type="password"],
166
+ [data-bridge-auth-form] input[type="tel"] {
167
+ width: 100%;
168
+ padding: 0.5rem 0.75rem;
169
+ box-sizing: border-box;
170
+ font-size: 0.875rem;
171
+ }
172
+
173
+ [data-bridge-auth-form] .bridge-btn,
174
+ [data-bridge-auth-form] .bridge-btn-primary,
175
+ [data-bridge-auth-form] .bridge-btn-secondary,
176
+ [data-bridge-auth-form] [data-bridge-passkey-login] {
177
+ width: 100%;
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ gap: 0.5rem;
182
+ box-sizing: border-box;
183
+ }
184
+
185
+ [data-bridge-auth-form] .bridge-form-group {
186
+ margin-bottom: 1rem;
187
+ }
188
+
189
+ [data-bridge-auth-form] .bridge-form-footer {
190
+ margin-top: 1rem;
191
+ text-align: center;
192
+ font-size: 0.875rem;
193
+ }
194
+
195
+ [data-bridge-auth-form] .bridge-form-footer a,
196
+ [data-bridge-auth-form] .bridge-link {
197
+ cursor: pointer;
198
+ background: none;
199
+ border: none;
200
+ font-size: inherit;
201
+ padding: 0;
202
+ text-decoration: underline;
203
+ }
204
+
205
+ [data-bridge-auth-form] .bridge-divider {
206
+ display: flex;
207
+ align-items: center;
208
+ margin: 1rem 0;
209
+ font-size: 0.75rem;
210
+ text-transform: uppercase;
211
+ letter-spacing: 0.05em;
212
+ }
213
+
214
+ [data-bridge-auth-form] .bridge-divider::before,
215
+ [data-bridge-auth-form] .bridge-divider::after {
216
+ content: '';
217
+ flex: 1;
218
+ border-bottom: 1px solid;
219
+ }
220
+
221
+ [data-bridge-auth-form] .bridge-divider::before { margin-right: 0.5rem; }
222
+ [data-bridge-auth-form] .bridge-divider::after { margin-left: 0.5rem; }
223
+
224
+ /* ─── PasskeyLogin ────────────────────────────────────────────────────────── */
225
+
226
+ [data-bridge-passkey-login] {
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ gap: 0.5rem;
231
+ cursor: pointer;
232
+ font-family: inherit;
233
+ font-size: 0.875rem;
234
+ }
235
+
236
+ [data-bridge-passkey-login][data-loading="true"] {
237
+ cursor: not-allowed;
238
+ opacity: 0.5;
239
+ }
240
+
241
+ /* ─── SsoButton ──────────────────────────────────────────────────────────── */
242
+
243
+ [data-bridge-sso-button] {
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ gap: 0.5rem;
248
+ width: 100%;
249
+ cursor: pointer;
250
+ font-family: inherit;
251
+ font-size: 0.875rem;
252
+ padding: 0.5rem 1rem;
253
+ box-sizing: border-box;
254
+ }
255
+
256
+ /* ─── Password visibility toggle ─────────────────────────────────────────── */
257
+
258
+ .bridge-password-wrapper {
259
+ position: relative;
260
+ }
261
+
262
+ .bridge-password-wrapper input {
263
+ padding-right: 2.5rem;
264
+ }
265
+
266
+ .bridge-password-toggle {
267
+ position: absolute;
268
+ right: 0.5rem;
269
+ top: 50%;
270
+ transform: translateY(-50%);
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ background: none;
275
+ border: none;
276
+ cursor: pointer;
277
+ padding: 0.25rem;
278
+ color: var(--bridge-muted, #6b7280);
279
+ line-height: 1;
280
+ }
281
+
282
+ .bridge-password-toggle:hover {
283
+ color: var(--bridge-foreground, #374151);
284
+ }
285
+
286
+ /* ─── Auth form helpers ───────────────────────────────────────────────────── */
287
+
288
+ .bridge-sso-row {
289
+ margin-bottom: 0.5rem;
290
+ }
291
+
292
+ .bridge-sso-btn {
293
+ display: flex;
294
+ align-items: center;
295
+ justify-content: center;
296
+ width: 100%;
297
+ box-sizing: border-box;
298
+ }
299
+
300
+ .bridge-sso-btn-inner {
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 0.75rem;
304
+ width: 12rem;
305
+ }
306
+
307
+ .bridge-step-desc {
308
+ font-size: 0.875rem;
309
+ margin: 0 0 1rem;
310
+ }
311
+
312
+ .bridge-mfa-help {
313
+ font-size: 0.8125rem;
314
+ color: var(--bridge-muted, #6b7280);
315
+ margin: 0.75rem 0 0.25rem;
316
+ text-align: center;
317
+ }
318
+
319
+ .bridge-email-display {
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: space-between;
323
+ padding: 0.5rem 0.75rem;
324
+ font-size: 0.875rem;
325
+ }
326
+
327
+ .bridge-forgot-row {
328
+ margin-top: 0.5rem;
329
+ text-align: right;
330
+ font-size: 0.875rem;
331
+ }
332
+
333
+ .bridge-success-heading {
334
+ font-size: 1.25rem;
335
+ font-weight: 600;
336
+ text-align: center;
337
+ margin: 0 0 0.5rem;
338
+ }
339
+
340
+ /* ─── MfaSetup backup code ───────────────────────────────────────────────── */
341
+
342
+ .bridge-backup-code {
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 0.75rem;
346
+ margin-bottom: 1rem;
347
+ padding: 0.75rem;
348
+ background: var(--bridge-bg-muted, #f5f5f5);
349
+ border-radius: 0.5rem;
350
+ }
351
+
352
+ .bridge-backup-code code {
353
+ flex: 1;
354
+ font-size: 1.125rem;
355
+ font-family: monospace;
356
+ letter-spacing: 0.05em;
357
+ white-space: nowrap;
358
+ }
359
+
360
+ /* ─── TenantSelector ─────────────────────────────────────────────────────── */
361
+
362
+ .bridge-tenant-list {
363
+ display: flex;
364
+ flex-direction: column;
365
+ gap: 0.5rem;
366
+ }
367
+
368
+ .bridge-tenant-item {
369
+ display: flex;
370
+ align-items: center;
371
+ gap: 0.75rem;
372
+ padding: 0.75rem;
373
+ cursor: pointer;
374
+ text-align: left;
375
+ width: 100%;
376
+ font-family: inherit;
377
+ }
378
+
379
+ .bridge-tenant-item:disabled,
380
+ .bridge-tenant-item[data-loading="true"] {
381
+ opacity: 0.5;
382
+ cursor: not-allowed;
383
+ }
384
+
385
+ .bridge-tenant-avatar {
386
+ width: 36px;
387
+ height: 36px;
388
+ border-radius: 50%;
389
+ display: flex;
390
+ align-items: center;
391
+ justify-content: center;
392
+ font-size: 0.875rem;
393
+ font-weight: 600;
394
+ flex-shrink: 0;
395
+ overflow: hidden;
396
+ }
397
+
398
+ .bridge-tenant-avatar img {
399
+ width: 100%;
400
+ height: 100%;
401
+ object-fit: cover;
402
+ }
403
+
404
+ .bridge-tenant-info {
405
+ display: flex;
406
+ flex-direction: column;
407
+ flex: 1;
408
+ min-width: 0;
409
+ }
410
+
411
+ .bridge-tenant-name {
412
+ font-size: 0.875rem;
413
+ font-weight: 500;
414
+ }
415
+
416
+ .bridge-tenant-user {
417
+ font-size: 0.75rem;
418
+ }
419
+
420
+ /* ─── TeamManagementPanel ────────────────────────────────────────────────── */
421
+
422
+ .bridge-team-tabs {
423
+ display: flex;
424
+ margin-bottom: 1.5rem;
425
+ }
426
+
427
+ .bridge-team-tab {
428
+ padding: 0.75rem 1rem;
429
+ border: none;
430
+ background: transparent;
431
+ font-size: 0.875rem;
432
+ cursor: pointer;
433
+ font-family: inherit;
434
+ }
435
+
436
+ /* ─── TeamUserList ───────────────────────────────────────────────────────── */
437
+
438
+ .bridge-team-users-header {
439
+ display: flex;
440
+ justify-content: space-between;
441
+ align-items: center;
442
+ margin-bottom: 1rem;
443
+ }
444
+
445
+ .bridge-team-users-title {
446
+ margin: 0;
447
+ font-size: 1.125rem;
448
+ font-weight: 600;
449
+ }
450
+
451
+ .bridge-team-loading {
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ gap: 0.75rem;
456
+ padding: 3rem 1rem;
457
+ font-size: 0.875rem;
458
+ }
459
+
460
+ .bridge-team-empty {
461
+ text-align: center;
462
+ padding: 3rem 1rem;
463
+ }
464
+
465
+ .bridge-team-empty p {
466
+ margin: 0 0 1rem;
467
+ }
468
+
469
+ .bridge-team-table-wrapper {
470
+ overflow-x: auto;
471
+ }
472
+
473
+ .bridge-team-table {
474
+ width: 100%;
475
+ border-collapse: collapse;
476
+ font-size: 0.875rem;
477
+ }
478
+
479
+ .bridge-team-table th {
480
+ text-align: left;
481
+ padding: 0.75rem 1rem;
482
+ font-weight: 500;
483
+ font-size: 0.75rem;
484
+ text-transform: uppercase;
485
+ letter-spacing: 0.05em;
486
+ }
487
+
488
+ .bridge-team-table td {
489
+ padding: 0.75rem 1rem;
490
+ vertical-align: middle;
491
+ }
492
+
493
+ .bridge-team-user-cell {
494
+ display: flex;
495
+ flex-direction: column;
496
+ }
497
+
498
+ .bridge-team-user-name { font-weight: 500; }
499
+
500
+ .bridge-team-user-email { font-size: 0.75rem; }
501
+
502
+ .bridge-team-badge {
503
+ display: inline-block;
504
+ padding: 0.125rem 0.5rem;
505
+ font-size: 0.75rem;
506
+ }
507
+
508
+ .bridge-team-status {
509
+ display: inline-block;
510
+ padding: 0.125rem 0.5rem;
511
+ font-size: 0.75rem;
512
+ }
513
+
514
+ .bridge-team-actions-cell {
515
+ width: 48px;
516
+ text-align: right;
517
+ }
518
+
519
+ /* ─── TeamProfileForm / TeamWorkspaceForm ────────────────────────────────── */
520
+
521
+ .bridge-team-section-title {
522
+ margin: 0 0 1.5rem;
523
+ font-size: 1.125rem;
524
+ font-weight: 600;
525
+ }
526
+
527
+ .bridge-team-alert {
528
+ margin-bottom: 1rem;
529
+ }
530
+
531
+ .bridge-team-form {
532
+ display: flex;
533
+ flex-direction: column;
534
+ }
535
+
536
+ .bridge-team-form-group {
537
+ margin-bottom: 1rem;
538
+ }
539
+
540
+ .bridge-team-form-group label {
541
+ display: block;
542
+ margin-bottom: 0.25rem;
543
+ font-size: 0.875rem;
544
+ }
545
+
546
+ .bridge-team-form-group input,
547
+ .bridge-team-form-group select,
548
+ .bridge-team-form-group textarea {
549
+ width: 100%;
550
+ padding: 0.5rem 0.75rem;
551
+ font-size: 0.875rem;
552
+ font-family: inherit;
553
+ box-sizing: border-box;
554
+ }
555
+
556
+ .bridge-team-form-group textarea {
557
+ resize: vertical;
558
+ }
559
+
560
+ .bridge-team-form-row {
561
+ display: grid;
562
+ grid-template-columns: 1fr 1fr;
563
+ gap: 1rem;
564
+ }
565
+
566
+ .bridge-team-readonly {
567
+ padding: 0.5rem 0;
568
+ font-size: 0.875rem;
569
+ }
570
+
571
+ .bridge-team-form-actions {
572
+ margin-top: 0.5rem;
573
+ }
574
+
575
+ .bridge-team-logo {
576
+ margin-bottom: 1.5rem;
577
+ }
578
+
579
+ .bridge-team-logo img {
580
+ max-width: 120px;
581
+ max-height: 60px;
582
+ object-fit: contain;
583
+ }
584
+
585
+ .bridge-team-checkbox-label {
586
+ display: flex !important;
587
+ align-items: center;
588
+ gap: 0.5rem;
589
+ cursor: pointer;
590
+ }
591
+
592
+ .bridge-team-checkbox-label input[type="checkbox"] {
593
+ width: 1rem;
594
+ height: 1rem;
595
+ }
596
+
597
+ /* ─── TeamUserActionsMenu ────────────────────────────────────────────────── */
598
+
599
+ .bridge-team-actions {
600
+ position: relative;
601
+ display: inline-block;
602
+ }
603
+
604
+ .bridge-team-actions-trigger {
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: center;
608
+ width: 32px;
609
+ height: 32px;
610
+ border: none;
611
+ background: transparent;
612
+ cursor: pointer;
613
+ }
614
+
615
+ .bridge-team-actions-menu {
616
+ position: absolute;
617
+ right: 0;
618
+ top: 100%;
619
+ z-index: 10;
620
+ min-width: 160px;
621
+ }
622
+
623
+ .bridge-team-actions-item {
624
+ display: block;
625
+ width: 100%;
626
+ padding: 0.5rem 0.75rem;
627
+ border: none;
628
+ background: transparent;
629
+ font-size: 0.875rem;
630
+ text-align: left;
631
+ cursor: pointer;
632
+ font-family: inherit;
633
+ }
634
+
635
+ /* ─── Team Dialogs ───────────────────────────────────────────────────────── */
636
+
637
+ .bridge-team-dialog {
638
+ border: none;
639
+ padding: 0;
640
+ max-width: 400px;
641
+ width: 90%;
642
+ }
643
+
644
+ .bridge-team-dialog::backdrop {
645
+ background: rgba(0, 0, 0, 0.4);
646
+ }
647
+
648
+ .bridge-team-dialog-content {
649
+ padding: 1.5rem;
650
+ }
651
+
652
+ .bridge-team-dialog-title {
653
+ margin: 0 0 0.5rem;
654
+ font-size: 1.125rem;
655
+ font-weight: 600;
656
+ }
657
+
658
+ .bridge-team-dialog-message,
659
+ .bridge-team-dialog-subtitle {
660
+ margin: 0 0 1rem;
661
+ font-size: 0.875rem;
662
+ }
663
+
664
+ .bridge-team-dialog-error {
665
+ margin-bottom: 1rem;
666
+ }
667
+
668
+ .bridge-team-dialog-actions {
669
+ display: flex;
670
+ justify-content: flex-end;
671
+ gap: 0.5rem;
672
+ }
673
+
674
+ /* ─── ApiTokenManagement ─────────────────────────────────────────────────── */
675
+
676
+ [data-bridge-api-tokens] {
677
+ display: flex;
678
+ flex-direction: column;
679
+ gap: 1.5rem;
680
+ }
681
+
682
+ [data-bridge-api-tokens] .bridge-api-header {
683
+ display: flex;
684
+ align-items: center;
685
+ justify-content: space-between;
686
+ padding-bottom: 1rem;
687
+ }
688
+
689
+ [data-bridge-api-tokens] .bridge-api-title {
690
+ font-size: 1.25rem;
691
+ font-weight: 600;
692
+ margin: 0;
693
+ }
694
+
695
+ [data-bridge-api-tokens] .bridge-api-subtitle {
696
+ font-size: 0.875rem;
697
+ margin: 0.25rem 0 0;
698
+ }
699
+
700
+ [data-bridge-api-tokens] .bridge-api-error-banner,
701
+ [data-bridge-api-tokens] .bridge-api-success-banner {
702
+ padding: 0.75rem;
703
+ font-size: 0.875rem;
704
+ }
705
+
706
+ [data-bridge-api-tokens] .bridge-api-new-token-banner {
707
+ padding: 1rem;
708
+ display: flex;
709
+ flex-direction: column;
710
+ gap: 0.75rem;
711
+ }
712
+
713
+ [data-bridge-api-tokens] .bridge-api-new-token-warning {
714
+ font-size: 0.875rem;
715
+ font-weight: 500;
716
+ margin: 0;
717
+ }
718
+
719
+ [data-bridge-api-tokens] .bridge-api-new-token-row {
720
+ display: flex;
721
+ align-items: center;
722
+ gap: 0.5rem;
723
+ }
724
+
725
+ [data-bridge-api-tokens] .bridge-api-token-input {
726
+ font-family: monospace;
727
+ font-size: 0.875rem;
728
+ flex: 1;
729
+ }
730
+
731
+ [data-bridge-api-tokens] .bridge-api-empty {
732
+ text-align: center;
733
+ padding: 2.5rem 1rem;
734
+ font-size: 0.875rem;
735
+ }
736
+
737
+ [data-bridge-api-tokens][data-loading="true"] .bridge-api-empty {
738
+ opacity: 0.6;
739
+ }
740
+
741
+ [data-bridge-api-tokens] .bridge-api-table {
742
+ width: 100%;
743
+ font-size: 0.875rem;
744
+ border-collapse: collapse;
745
+ }
746
+
747
+ [data-bridge-api-tokens] .bridge-api-th {
748
+ padding: 0.75rem 1rem;
749
+ font-size: 0.75rem;
750
+ text-transform: uppercase;
751
+ letter-spacing: 0.05em;
752
+ font-weight: 500;
753
+ text-align: left;
754
+ border-bottom: 1px solid var(--bridge-border, #e5e7eb);
755
+ color: var(--bridge-muted, #6b7280);
756
+ }
757
+
758
+ [data-bridge-api-tokens] .bridge-api-td,
759
+ [data-bridge-api-tokens] .bridge-api-td-name,
760
+ [data-bridge-api-tokens] .bridge-api-td-muted {
761
+ padding: 0.75rem 1rem;
762
+ border-bottom: 1px solid var(--bridge-border, #e5e7eb);
763
+ }
764
+
765
+ [data-bridge-api-tokens] .bridge-api-td-muted {
766
+ color: var(--bridge-muted, #6b7280);
767
+ }
768
+
769
+ [data-bridge-api-tokens] .bridge-api-td-actions {
770
+ padding: 0.75rem 1rem;
771
+ text-align: right;
772
+ border-bottom: 1px solid var(--bridge-border, #e5e7eb);
773
+ }
774
+
775
+ [data-bridge-api-tokens] .bridge-api-privileges {
776
+ display: flex;
777
+ flex-wrap: wrap;
778
+ gap: 0.25rem;
779
+ }
780
+
781
+ [data-bridge-api-tokens] .bridge-api-inline-form {
782
+ border: 1px solid var(--bridge-border, #e5e7eb);
783
+ border-radius: 0.5rem;
784
+ padding: 1rem 1.25rem;
785
+ }
786
+
787
+ [data-bridge-api-tokens] .bridge-api-inline-form-title {
788
+ font-size: 0.9375rem;
789
+ font-weight: 600;
790
+ margin: 0 0 0.875rem;
791
+ }
792
+
793
+ [data-bridge-api-tokens] .bridge-api-inline-form-fields {
794
+ display: flex;
795
+ flex-direction: column;
796
+ gap: 0.75rem;
797
+ }
798
+
799
+ [data-bridge-api-tokens] .bridge-api-inline-form-row {
800
+ display: flex;
801
+ gap: 1rem;
802
+ flex-wrap: wrap;
803
+ align-items: flex-start;
804
+ }
805
+
806
+ [data-bridge-api-tokens] .bridge-api-inline-field {
807
+ display: flex;
808
+ flex-direction: column;
809
+ flex: 1 1 160px;
810
+ min-width: 0;
811
+ }
812
+
813
+ [data-bridge-api-tokens] .bridge-api-inline-field--narrow {
814
+ flex: 0 1 160px;
815
+ }
816
+
817
+ [data-bridge-api-tokens] .bridge-api-inline-form-actions {
818
+ display: flex;
819
+ gap: 0.5rem;
820
+ justify-content: flex-end;
821
+ padding-top: 0.25rem;
822
+ }
823
+
824
+ [data-bridge-api-tokens] .bridge-api-hint {
825
+ font-size: 0.75rem;
826
+ margin: 0.25rem 0 0;
827
+ }
828
+
829
+ [data-bridge-api-tokens] .bridge-api-required {
830
+ /* intentionally unstyled — consumer should color this */
831
+ }
832
+
833
+ [data-bridge-api-tokens] .bridge-api-form-error {
834
+ font-size: 0.875rem;
835
+ }
836
+
837
+ [data-bridge-api-tokens] .bridge-privilege-picker { position: relative; }
838
+ [data-bridge-api-tokens] .bridge-privilege-chips { display: flex; flex-wrap: wrap; gap: 0.375rem; min-height: 2.25rem; cursor: pointer; padding: 0.375rem 0.5rem; align-items: center; }
839
+ [data-bridge-api-tokens] .bridge-privilege-chip { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.125rem 0.5rem; font-size: 0.75rem; }
840
+ [data-bridge-api-tokens] .bridge-privilege-chip button { background: none; border: none; cursor: pointer; padding: 0; line-height: 1; }
841
+ [data-bridge-api-tokens] .bridge-privilege-placeholder { font-size: 0.875rem; }
842
+ [data-bridge-api-tokens] .bridge-privilege-dropdown { position: absolute; z-index: 20; width: 100%; max-height: 200px; overflow-y: auto; top: 100%; left: 0; }
843
+ [data-bridge-api-tokens] .bridge-privilege-search { display: block; width: 100%; padding: 0.375rem 0.5rem; font-size: 0.875rem; font-family: inherit; box-sizing: border-box; border: none; border-bottom: 1px solid; outline: none; }
844
+ [data-bridge-api-tokens] .bridge-privilege-option { display: flex; flex-direction: column; align-items: flex-start; width: 100%; padding: 0.375rem 0.75rem; background: none; border: none; cursor: pointer; text-align: left; font-family: inherit; }
845
+ [data-bridge-api-tokens] .bridge-privilege-option-key { font-size: 0.875rem; font-weight: 500; }
846
+ [data-bridge-api-tokens] .bridge-privilege-option-desc { font-size: 0.75rem; }
847
+ [data-bridge-api-tokens] .bridge-privilege-empty { padding: 0.5rem 0.75rem; font-size: 0.875rem; }
848
+
849
+ .bridge-input {
850
+ display: block;
851
+ width: 100%;
852
+ padding: 0.5rem 0.75rem;
853
+ font-size: 0.875rem;
854
+ font-family: inherit;
855
+ box-sizing: border-box;
856
+ }
857
+
858
+ .bridge-label {
859
+ display: block;
860
+ font-size: 0.875rem;
861
+ font-weight: 500;
862
+ margin-bottom: 0.375rem;
863
+ }
864
+
865
+ .bridge-badge {
866
+ display: inline-block;
867
+ padding: 0.125rem 0.5rem;
868
+ font-size: 0.7rem;
869
+ font-family: monospace;
870
+ }
871
+
872
+ .bridge-dialog-overlay {
873
+ position: fixed;
874
+ inset: 0;
875
+ z-index: 50;
876
+ }
877
+
878
+ .bridge-dialog {
879
+ position: fixed;
880
+ z-index: 51;
881
+ left: 50%;
882
+ top: 25%;
883
+ transform: translateX(-50%);
884
+ padding: 1.5rem;
885
+ width: 90vw;
886
+ max-width: 400px;
887
+ }
888
+
889
+ .bridge-dialog-title {
890
+ font-size: 1.125rem;
891
+ font-weight: 600;
892
+ margin: 0 0 0.5rem 0;
893
+ }
894
+
895
+ .bridge-dialog-body {
896
+ font-size: 0.875rem;
897
+ margin: 0 0 1.25rem 0;
898
+ }
899
+
900
+ .bridge-dialog-footer {
901
+ display: flex;
902
+ justify-content: flex-end;
903
+ gap: 0.5rem;
904
+ }
905
+
906
+ /* ─── PlanSelector ───────────────────────────────────────────────────────── */
907
+
908
+ [data-bridge-plan-selector] {
909
+ position: relative;
910
+ }
911
+
912
+ [data-bridge-plan-selector][data-loading="true"] {
913
+ pointer-events: none;
914
+ opacity: 0.7;
915
+ }
916
+
917
+ .bridge-plan-loading {
918
+ display: flex;
919
+ align-items: center;
920
+ justify-content: center;
921
+ padding: 3rem 1rem;
922
+ }
923
+
924
+ .bridge-plan-empty {
925
+ text-align: center;
926
+ padding: 2rem 1rem;
927
+ font-size: 0.875rem;
928
+ }
929
+
930
+ .bridge-plan-payment-failed {
931
+ margin-bottom: 1.5rem;
932
+ }
933
+
934
+ .bridge-plan-portal-btn {
935
+ margin-top: 0.75rem;
936
+ }
937
+
938
+ .bridge-plan-cards {
939
+ display: grid;
940
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
941
+ gap: 1rem;
942
+ }
943
+
944
+ [data-bridge-plan-card] {
945
+ padding: 1.25rem;
946
+ display: flex;
947
+ flex-direction: column;
948
+ gap: 0.75rem;
949
+ }
950
+
951
+ [data-bridge-plan-card][data-current="true"] {
952
+ outline: 2px solid currentColor;
953
+ }
954
+
955
+ .bridge-plan-card-header {
956
+ display: flex;
957
+ align-items: flex-start;
958
+ justify-content: space-between;
959
+ gap: 0.5rem;
960
+ }
961
+
962
+ .bridge-plan-name {
963
+ margin: 0;
964
+ font-size: 1rem;
965
+ font-weight: 600;
966
+ }
967
+
968
+ .bridge-plan-trial-badge {
969
+ display: inline-block;
970
+ padding: 0.125rem 0.5rem;
971
+ font-size: 0.7rem;
972
+ white-space: nowrap;
973
+ }
974
+
975
+ .bridge-plan-description {
976
+ margin: 0;
977
+ font-size: 0.875rem;
978
+ }
979
+
980
+ .bridge-plan-prices {
981
+ display: flex;
982
+ flex-direction: column;
983
+ gap: 0.5rem;
984
+ margin-top: auto;
985
+ }
986
+
987
+ .bridge-plan-select-btn {
988
+ width: 100%;
989
+ text-align: center;
990
+ }
991
+
992
+ /* ─── WorkspaceSelector ─────────────────────────────────────────────── */
993
+
994
+ [data-bridge-workspace-selector] {
995
+ display: flex;
996
+ flex-direction: column;
997
+ gap: 0.25rem;
998
+ }
999
+
1000
+ [data-bridge-workspace-loading] {
1001
+ display: flex;
1002
+ justify-content: center;
1003
+ padding: 1.5rem 0;
1004
+ }
1005
+
1006
+ [data-bridge-workspace-list] {
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ gap: 0.25rem;
1010
+ }
1011
+
1012
+ [data-bridge-workspace-item] {
1013
+ display: flex;
1014
+ align-items: center;
1015
+ gap: 0.75rem;
1016
+ width: 100%;
1017
+ padding: 0.625rem 0.75rem;
1018
+ background: none;
1019
+ border: 1px solid transparent;
1020
+ border-radius: 0.5rem;
1021
+ cursor: pointer;
1022
+ text-align: left;
1023
+ font-family: inherit;
1024
+ transition: background 0.15s;
1025
+ }
1026
+
1027
+ [data-bridge-workspace-item]:hover:not(:disabled) {
1028
+ background: var(--bridge-muted-bg, #f3f4f6);
1029
+ }
1030
+
1031
+ [data-bridge-workspace-item][data-active="true"] {
1032
+ background: var(--bridge-primary-light, #eff6ff);
1033
+ border-color: var(--bridge-primary, #3b82f6);
1034
+ }
1035
+
1036
+ [data-bridge-workspace-item][data-loading="true"] {
1037
+ opacity: 0.7;
1038
+ cursor: wait;
1039
+ }
1040
+
1041
+ [data-bridge-workspace-item]:disabled {
1042
+ cursor: not-allowed;
1043
+ }
1044
+
1045
+ [data-bridge-workspace-avatar] {
1046
+ display: flex;
1047
+ align-items: center;
1048
+ justify-content: center;
1049
+ width: 2rem;
1050
+ height: 2rem;
1051
+ border-radius: 0.375rem;
1052
+ background: var(--bridge-primary, #3b82f6);
1053
+ color: var(--bridge-primary-foreground, #ffffff);
1054
+ font-size: 0.875rem;
1055
+ font-weight: 600;
1056
+ flex-shrink: 0;
1057
+ overflow: hidden;
1058
+ }
1059
+
1060
+ [data-bridge-workspace-avatar] img {
1061
+ width: 100%;
1062
+ height: 100%;
1063
+ object-fit: cover;
1064
+ }
1065
+
1066
+ [data-bridge-workspace-info] {
1067
+ display: flex;
1068
+ flex-direction: column;
1069
+ gap: 0.125rem;
1070
+ flex: 1;
1071
+ min-width: 0;
1072
+ }
1073
+
1074
+ [data-bridge-workspace-name] {
1075
+ font-size: 0.875rem;
1076
+ font-weight: 500;
1077
+ color: var(--bridge-foreground, #111827);
1078
+ white-space: nowrap;
1079
+ overflow: hidden;
1080
+ text-overflow: ellipsis;
1081
+ }
1082
+
1083
+ [data-bridge-workspace-user] {
1084
+ font-size: 0.75rem;
1085
+ color: var(--bridge-muted, #6b7280);
1086
+ white-space: nowrap;
1087
+ overflow: hidden;
1088
+ text-overflow: ellipsis;
1089
+ }