@visns-studio/visns-components 6.17.2 → 6.20.1

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 (83) hide show
  1. package/package.json +10 -7
  2. package/src/components/AssociationManager.jsx +344 -177
  3. package/src/components/AsyncSelect.jsx +2 -2
  4. package/src/components/Autocomplete.jsx +57 -12
  5. package/src/components/Breadcrumb.jsx +23 -4
  6. package/src/components/ClientAssociationManager.jsx +321 -145
  7. package/src/components/DataGrid.jsx +625 -20
  8. package/src/components/DropZone.jsx +4 -1
  9. package/src/components/Form.jsx +233 -6
  10. package/src/components/MultiSelect.jsx +2 -2
  11. package/src/components/Navigation.jsx +39 -23
  12. package/src/components/TableFilter.jsx +172 -12
  13. package/src/components/UniversalSearch.jsx +390 -0
  14. package/src/components/auth/Login.jsx +164 -8
  15. package/src/components/auth/Profile.jsx +209 -22
  16. package/src/components/auth/authEndpoints.js +4 -0
  17. package/src/components/auth/webauthn.js +194 -0
  18. package/src/components/columns/ColumnRenderers.jsx +6 -1
  19. package/src/components/controls/DataGridSearch.jsx +11 -5
  20. package/src/components/generic/GenericAuth.jsx +6 -0
  21. package/src/components/generic/GenericDashboard.jsx +93 -36
  22. package/src/components/generic/GenericDetail.jsx +146 -61
  23. package/src/components/generic/GenericIndex.jsx +142 -38
  24. package/src/components/generic/GenericSettings.jsx +220 -0
  25. package/src/components/generic/StandardModal.jsx +165 -8
  26. package/src/components/generic/dashboardChartDefaults.js +230 -0
  27. package/src/components/generic/shared/indexLayout.js +38 -0
  28. package/src/components/settings/IntegrationsManager.jsx +474 -0
  29. package/src/components/sms/SmsLineSettings.jsx +16 -12
  30. package/src/components/styles/AssociationManager.module.scss +4 -363
  31. package/src/components/styles/AuditLog.module.scss +6 -6
  32. package/src/components/styles/AuditLogs.module.scss +3 -3
  33. package/src/components/styles/Autocomplete.module.scss +7 -7
  34. package/src/components/styles/BusinessCardOcr.module.scss +6 -1
  35. package/src/components/styles/CallQueueSettings.module.scss +4 -1
  36. package/src/components/styles/CameraPlacement.module.scss +19 -19
  37. package/src/components/styles/CategorizedDropZone.module.scss +6 -1
  38. package/src/components/styles/ClientAssociationManager.module.scss +5 -289
  39. package/src/components/styles/ClientAuth.module.scss +1 -1
  40. package/src/components/styles/DataGrid.module.scss +455 -8
  41. package/src/components/styles/Field.module.scss +32 -24
  42. package/src/components/styles/Form.module.scss +123 -3
  43. package/src/components/styles/GenericDashboard.module.scss +612 -825
  44. package/src/components/styles/GenericDetail.module.scss +406 -61
  45. package/src/components/styles/GenericDynamic.module.scss +25 -25
  46. package/src/components/styles/GenericEditableTable.module.scss +33 -33
  47. package/src/components/styles/GenericFormBuilder.module.scss +119 -119
  48. package/src/components/styles/GenericIndex.module.scss +483 -38
  49. package/src/components/styles/GenericMain.module.scss +6 -3
  50. package/src/components/styles/GenericQuote.module.scss +399 -81
  51. package/src/components/styles/GenericReport.module.scss +8 -8
  52. package/src/components/styles/GenericSettings.module.scss +209 -0
  53. package/src/components/styles/GenericSort.module.scss +9 -9
  54. package/src/components/styles/Integrations.module.scss +321 -0
  55. package/src/components/styles/List.module.scss +4 -4
  56. package/src/components/styles/Login.module.scss +57 -0
  57. package/src/components/styles/MultiSelect.module.scss +4 -4
  58. package/src/components/styles/Navigation.module.scss +12 -12
  59. package/src/components/styles/Notification.module.scss +12 -8
  60. package/src/components/styles/NotificationList.module.scss +5 -5
  61. package/src/components/styles/Profile.module.scss +5 -5
  62. package/src/components/styles/QrCode.module.scss +4 -4
  63. package/src/components/styles/QuickAction.module.scss +20 -20
  64. package/src/components/styles/SortableQuoteItems.module.scss +4 -4
  65. package/src/components/styles/TableFilter.module.scss +128 -17
  66. package/src/components/styles/TicketConversation.module.scss +497 -0
  67. package/src/components/styles/UniversalSearch.module.scss +229 -0
  68. package/src/components/styles/Vault.module.scss +413 -0
  69. package/src/components/styles/_associationManager.scss +467 -0
  70. package/src/components/styles/_authBrandPanel.scss +15 -9
  71. package/src/components/styles/_controls.scss +43 -39
  72. package/src/components/styles/global-datagrid.css +196 -0
  73. package/src/components/styles/global.css +168 -17
  74. package/src/components/tickets/TicketConversation.jsx +455 -0
  75. package/src/components/utils/rowActionSettings.js +117 -0
  76. package/src/components/vault/VaultClientPicker.jsx +183 -0
  77. package/src/components/vault/VaultEntryForm.jsx +23 -0
  78. package/src/components/vault/VaultManager.jsx +382 -34
  79. package/src/components/vault/VaultShareModal.jsx +454 -0
  80. package/src/components/vault/vaultEndpoints.js +16 -2
  81. package/src/components/vault/vaultShares.js +247 -0
  82. package/src/index.js +35 -0
  83. package/src/utils/fetchUtil.js +38 -14
@@ -676,8 +676,8 @@
676
676
  width: 24px;
677
677
  height: 24px;
678
678
  border-radius: 50%;
679
- background-color: rgba(var(--approval-color, #c53030), 0.1);
680
- border: 1px solid rgba(var(--approval-color, #c53030), 0.2);
679
+ background-color: color-mix(in srgb, var(--approval-color, #c53030) 10%, transparent);
680
+ border: 1px solid color-mix(in srgb, var(--approval-color, #c53030) 20%, transparent);
681
681
  color: var(--approval-color, #c53030);
682
682
  font-size: 16px;
683
683
  font-weight: bold;
@@ -1771,7 +1771,7 @@
1771
1771
  flex-shrink: 0;
1772
1772
 
1773
1773
  &:hover {
1774
- background-color: rgba(var(--approval-color, #c53030), 0.1);
1774
+ background-color: color-mix(in srgb, var(--approval-color, #c53030) 10%, transparent);
1775
1775
  }
1776
1776
  }
1777
1777
 
@@ -1779,7 +1779,7 @@
1779
1779
  padding: 40px 20px;
1780
1780
  text-align: center;
1781
1781
  color: var(--paragraph-color, #221e33);
1782
- background-color: var(--bg-color, #f7f7f8) er;
1782
+ background-color: var(--bg-color, #f7f7f8);
1783
1783
 
1784
1784
  p {
1785
1785
  margin: 0;
@@ -1953,7 +1953,7 @@
1953
1953
  justify-content: center;
1954
1954
 
1955
1955
  &:hover {
1956
- background-color: rgba(var(--approval-color, #c53030), 0.1);
1956
+ background-color: color-mix(in srgb, var(--approval-color, #c53030) 10%, transparent);
1957
1957
  transform: scale(1.1);
1958
1958
  }
1959
1959
  }
@@ -2305,7 +2305,7 @@
2305
2305
  transition: all 0.2s ease;
2306
2306
 
2307
2307
  &:hover {
2308
- background-color: rgba(var(--approval-color, #c53030), 0.1);
2308
+ background-color: color-mix(in srgb, var(--approval-color, #c53030) 10%, transparent);
2309
2309
  }
2310
2310
  }
2311
2311
  }
@@ -2446,7 +2446,7 @@
2446
2446
  .manualJoinSection {
2447
2447
  margin-bottom: 24px;
2448
2448
  padding: 20px;
2449
- background-color: var(--bg-color, #f7f7f8) er;
2449
+ background-color: var(--bg-color, #f7f7f8);
2450
2450
  border-radius: var(--radius, var(--br, 5px));
2451
2451
  border: 1px solid var(--border-color, #e1e1e1);
2452
2452
 
@@ -2577,7 +2577,7 @@
2577
2577
  transition: all 0.2s ease;
2578
2578
 
2579
2579
  &:hover {
2580
- background-color: rgba(var(--approval-color, #c53030), 0.1);
2580
+ background-color: color-mix(in srgb, var(--approval-color, #c53030) 10%, transparent);
2581
2581
  }
2582
2582
  }
2583
2583
  }
@@ -0,0 +1,209 @@
1
+ /**
2
+ * The settings hub.
3
+ *
4
+ * Same rail treatment as GenericIndex and GenericDetail — a sticky borderless
5
+ * column, not a card that terminates and leaves a void beside a tall panel —
6
+ * and it reads the same `--index-rail-*` tokens so a project retuning the rail
7
+ * retunes all three.
8
+ */
9
+
10
+ /* No page header above the layout: the rail and the panel both start at the
11
+ top, and the panel's own header is the page's single heading block. */
12
+ .page {
13
+ width: 100%;
14
+ box-sizing: border-box;
15
+ padding: 0.25rem 0.25rem 0;
16
+ }
17
+
18
+ .layout {
19
+ display: grid;
20
+ grid-template-columns:
21
+ minmax(var(--index-rail-min, 190px), var(--index-rail-width, 224px))
22
+ minmax(0, 1fr);
23
+ align-items: start;
24
+ gap: var(--index-rail-gap, 1.25rem);
25
+ }
26
+
27
+ .rail {
28
+ position: sticky;
29
+ top: var(--index-rail-top, 88px);
30
+ max-height: calc(100vh - var(--index-rail-offset, 120px));
31
+ overflow-y: auto;
32
+ overscroll-behavior: contain;
33
+ scrollbar-width: thin;
34
+ }
35
+
36
+ .railSearch {
37
+ position: relative;
38
+ display: flex;
39
+ gap: 0.4rem;
40
+ align-items: center;
41
+ margin-bottom: 0.75rem;
42
+ padding: 0 0.5rem;
43
+ border: 1px solid var(--border-color, rgba(43, 43, 43, 0.15));
44
+ border-radius: var(--btn-br, 5px);
45
+ background: var(--background-color, #fff);
46
+ color: var(--muted-color, #6b7280);
47
+
48
+ input {
49
+ width: 100%;
50
+ height: 32px;
51
+ border: 0;
52
+ background: none;
53
+ color: var(--paragraph-color, #2b2b2b);
54
+ font: inherit;
55
+ font-size: 0.8rem;
56
+
57
+ &:focus {
58
+ outline: none;
59
+ }
60
+ }
61
+
62
+ &:focus-within {
63
+ border-color: color-mix(
64
+ in srgb,
65
+ var(--primary-color, #1b3933) 45%,
66
+ var(--border-color, rgba(43, 43, 43, 0.15))
67
+ );
68
+ }
69
+ }
70
+
71
+ .railGroup {
72
+ margin-bottom: 1rem;
73
+
74
+ ul {
75
+ margin: 0;
76
+ padding: 0;
77
+ list-style: none;
78
+ }
79
+ }
80
+
81
+ .railGroupTitle {
82
+ margin: 0 0 0.35rem 0.75rem;
83
+ color: var(--muted-color, #6b7280);
84
+ font-size: 0.68rem;
85
+ font-weight: var(--font-weight-semibold, 600);
86
+ letter-spacing: 0.08em;
87
+ text-transform: uppercase;
88
+ }
89
+
90
+ .railItem,
91
+ .railItemActive {
92
+ display: block;
93
+ width: 100%;
94
+ /* The 3px is reserved on every item, selected or not, so choosing one does
95
+ not shift its label sideways. */
96
+ padding: 0.45rem calc(var(--spacing-md, 1rem) - 3px);
97
+ border: 0;
98
+ border-left: 3px solid transparent;
99
+ border-radius: var(--radius-sm, 6px);
100
+ background: none;
101
+ color: var(--paragraph-color, #52606d);
102
+ font-family: inherit;
103
+ font-size: var(--font-size-sm, 0.8125rem);
104
+ font-weight: var(--font-weight-medium, 500);
105
+ text-align: left;
106
+ cursor: pointer;
107
+ transition:
108
+ background-color var(--speed, 160ms) var(--ease, ease),
109
+ color var(--speed, 160ms) var(--ease, ease);
110
+
111
+ &:hover {
112
+ background: color-mix(
113
+ in srgb,
114
+ var(--primary-color, #1b3933) 6%,
115
+ transparent
116
+ );
117
+ color: var(--heading-color, #111827);
118
+ }
119
+
120
+ &:focus-visible {
121
+ outline: none;
122
+ box-shadow: 0 0 0 3px
123
+ color-mix(in srgb, var(--highlight-color, #3cbf7d) 30%, transparent);
124
+ }
125
+ }
126
+
127
+ /* Selected: accent edge, firmer tint, heavier weight. Three signals, so it is
128
+ never carried by colour alone. */
129
+ .railItemActive {
130
+ border-left-color: var(--accent-color, var(--primary-color, #1b3933));
131
+ background: color-mix(
132
+ in srgb,
133
+ var(--primary-color, #1b3933) 12%,
134
+ transparent
135
+ );
136
+ color: var(--heading-color, #111827);
137
+ font-weight: var(--font-weight-semibold, 600);
138
+ }
139
+
140
+ .railEmpty {
141
+ margin: 0.5rem 0.75rem;
142
+ color: var(--muted-color, #6b7280);
143
+ font-size: 0.78rem;
144
+ }
145
+
146
+ .panel {
147
+ min-width: 0;
148
+ }
149
+
150
+ .panelHead {
151
+ padding-bottom: 1rem;
152
+
153
+ h1 {
154
+ margin: 0;
155
+ color: var(--heading-color, #111827);
156
+ font-size: 1.35rem;
157
+ font-weight: var(--font-weight-semibold, 600);
158
+ }
159
+
160
+ p {
161
+ margin: 0.25rem 0 0;
162
+ max-width: 70ch;
163
+ color: var(--muted-color, #6b7280);
164
+ font-size: 0.82rem;
165
+ line-height: 1.5;
166
+ }
167
+
168
+ /* The page title, in the rail's own group-heading treatment so it reads as
169
+ context above the section rather than as a second heading. */
170
+ .eyebrow {
171
+ margin: 0 0 0.2rem;
172
+ color: var(--muted-color, #6b7280);
173
+ font-size: 0.68rem;
174
+ font-weight: var(--font-weight-semibold, 600);
175
+ letter-spacing: 0.08em;
176
+ text-transform: uppercase;
177
+ }
178
+ }
179
+
180
+ .panelBody {
181
+ min-width: 0;
182
+
183
+ // The panels double as standalone pages and carry their own page gutters
184
+ // (CallQueueSettings, SmsLineSettings...). Embedded here the shell owns
185
+ // the gutters, so the child's horizontal padding is flattened — otherwise
186
+ // every panel body sits indented from the panel header above it.
187
+ > * {
188
+ padding-right: 0 !important;
189
+ padding-left: 0 !important;
190
+ }
191
+ }
192
+
193
+ .empty {
194
+ padding: 2rem 0;
195
+ color: var(--muted-color, #6b7280);
196
+ font-size: 0.85rem;
197
+ }
198
+
199
+ @media (max-width: 759px) {
200
+ .layout {
201
+ grid-template-columns: minmax(0, 1fr);
202
+ }
203
+
204
+ .rail {
205
+ position: static;
206
+ max-height: none;
207
+ overflow: visible;
208
+ }
209
+ }
@@ -20,13 +20,13 @@
20
20
  width: 100%;
21
21
  background: var(--item-color);
22
22
  border-radius: var(--br);
23
- border: 1px solid rgba(var(--item-color-rgb), 1.15);
23
+ border: 1px solid rgba(var(--item-color-rgb, 255, 255, 255), 1);
24
24
  box-sizing: border-box;
25
25
  overflow: visible;
26
26
  position: relative;
27
27
  padding: 2px;
28
28
  margin: 8px 0;
29
- box-shadow: 0 10px 50px rgba(var(--primary-rgb), 0.05);
29
+ box-shadow: 0 10px 50px rgba(var(--primary-rgb, 27, 57, 51), 0.05);
30
30
  }
31
31
 
32
32
  .crmtitle {
@@ -35,7 +35,7 @@
35
35
  margin: 0;
36
36
  background: white;
37
37
  border-radius: var(--br);
38
- border: 1px solid rgba(var(--primary-rgb), 0.15);
38
+ border: 1px solid rgba(var(--primary-rgb, 27, 57, 51), 0.15);
39
39
  position: relative;
40
40
  display: flex;
41
41
  align-items: center;
@@ -55,7 +55,7 @@
55
55
  }
56
56
 
57
57
  svg {
58
- color: rgba(var(--primary-rgb), 0.5);
58
+ color: rgba(var(--primary-rgb, 27, 57, 51), 0.5);
59
59
  position: relative;
60
60
  top: 2px;
61
61
  margin: 0 0.5rem;
@@ -69,7 +69,7 @@
69
69
 
70
70
  .titleInfo span {
71
71
  font-size: 0.875em;
72
- color: rgba(var(--primary-rgb), 0.65);
72
+ color: rgba(var(--primary-rgb, 27, 57, 51), 0.65);
73
73
  }
74
74
  }
75
75
 
@@ -79,7 +79,7 @@
79
79
  margin: 0;
80
80
  background: white;
81
81
  border-radius: var(--br);
82
- border: 1px solid rgba(var(--primary-rgb), 0.15);
82
+ border: 1px solid rgba(var(--primary-rgb, 27, 57, 51), 0.15);
83
83
  position: relative;
84
84
  display: flex;
85
85
  align-items: center;
@@ -99,7 +99,7 @@
99
99
  }
100
100
 
101
101
  svg {
102
- color: rgba(var(--primary-rgb), 0.5);
102
+ color: rgba(var(--primary-rgb, 27, 57, 51), 0.5);
103
103
  position: relative;
104
104
  top: 2px;
105
105
  margin: 0 0.5rem;
@@ -115,8 +115,8 @@
115
115
  align-items: center;
116
116
  flex-wrap: wrap;
117
117
  border-radius: 4px;
118
- border: 1px solid rgba(var(--primary-rgb), 0.2);
119
- box-shadow: 0px 0px 10px rgba(var(--primary-rgb), 0.25);
118
+ border: 1px solid rgba(var(--primary-rgb, 27, 57, 51), 0.2);
119
+ box-shadow: 0px 0px 10px rgba(var(--primary-rgb, 27, 57, 51), 0.25);
120
120
  padding: 0.6rem;
121
121
  box-sizing: border-box;
122
122
  cursor: grab;
@@ -0,0 +1,321 @@
1
+ /**
2
+ * Settings → Integrations.
3
+ *
4
+ * Cards on the page ground, not a card inside a card: the settings shell
5
+ * already provides the panel these sit in. Literal fallbacks on every token —
6
+ * a bare `var()` for something the host has not declared is invalid at
7
+ * computed-value time and takes the whole declaration with it.
8
+ */
9
+
10
+ .wrap {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 2rem;
14
+ }
15
+
16
+ .group {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 0.75rem;
20
+ }
21
+
22
+ .groupTitle {
23
+ margin: 0;
24
+ color: var(--muted-color, #6b7280);
25
+ font-size: 0.7rem;
26
+ font-weight: var(--font-weight-semibold, 600);
27
+ letter-spacing: 0.08em;
28
+ text-transform: uppercase;
29
+ }
30
+
31
+ .card {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: 1rem;
35
+ padding: 1.15rem;
36
+ border: 1px solid var(--border-color, rgba(43, 43, 43, 0.12));
37
+ border-radius: var(--dg-card-radius, 14px);
38
+ background: var(--surface-color, #fff);
39
+ box-shadow:
40
+ 0 1px 2px color-mix(in srgb, var(--primary-color, #1b3933) 8%, transparent),
41
+ 0 8px 24px -14px color-mix(in srgb, var(--primary-color, #1b3933) 18%, transparent);
42
+ }
43
+
44
+ .cardHead {
45
+ display: flex;
46
+ gap: 0.75rem;
47
+ align-items: flex-start;
48
+ }
49
+
50
+ .cardIcon {
51
+ display: inline-flex;
52
+ flex-shrink: 0;
53
+ align-items: center;
54
+ justify-content: center;
55
+ width: 32px;
56
+ height: 32px;
57
+ border-radius: var(--radius-sm, 8px);
58
+ background: color-mix(in srgb, var(--primary-color, #1b3933) 10%, transparent);
59
+ color: var(--primary-color, #1b3933);
60
+ }
61
+
62
+ .cardTitle {
63
+ flex: 1;
64
+ min-width: 0;
65
+
66
+ h4 {
67
+ margin: 0;
68
+ color: var(--heading-color, #111827);
69
+ font-size: 0.95rem;
70
+ font-weight: var(--font-weight-semibold, 600);
71
+ }
72
+
73
+ p {
74
+ margin: 0.2rem 0 0;
75
+ color: var(--muted-color, #6b7280);
76
+ font-size: 0.8rem;
77
+ line-height: 1.45;
78
+ }
79
+ }
80
+
81
+ .services {
82
+ font-size: 0.72rem !important;
83
+ font-weight: var(--font-weight-semibold, 600);
84
+ letter-spacing: 0.02em;
85
+ }
86
+
87
+ /* Status. Never colour alone — each tone ships with a word, and the two that
88
+ matter most also ship with a glyph. */
89
+ .badge {
90
+ display: inline-flex;
91
+ flex-shrink: 0;
92
+ gap: 0.3rem;
93
+ align-items: center;
94
+ height: max-content;
95
+ padding: 0.2rem 0.55rem;
96
+ border-radius: 999px;
97
+ font-size: 0.72rem;
98
+ font-weight: var(--font-weight-semibold, 600);
99
+ white-space: nowrap;
100
+ }
101
+
102
+ .ok {
103
+ background: color-mix(in srgb, var(--highlight-color, #3cbf7d) 18%, transparent);
104
+ color: #0f6b41;
105
+ }
106
+
107
+ .ready {
108
+ background: color-mix(in srgb, var(--primary-color, #1b3933) 12%, transparent);
109
+ color: var(--primary-color, #1b3933);
110
+ }
111
+
112
+ .warn {
113
+ background: rgba(203, 138, 20, 0.16);
114
+ color: #8a5a00;
115
+ }
116
+
117
+ .bad {
118
+ background: rgba(190, 60, 48, 0.14);
119
+ color: #9b2c22;
120
+ }
121
+
122
+ .muted {
123
+ background: rgba(43, 43, 43, 0.08);
124
+ color: var(--muted-color, #6b7280);
125
+ }
126
+
127
+ /* Two columns on a wide panel, one when the panel is narrow. Container query
128
+ rather than a viewport query: this panel sits beside a rail, so the window's
129
+ width says nothing useful about how much room the fields actually have. */
130
+ .fields {
131
+ container-type: inline-size;
132
+ display: grid;
133
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
134
+ gap: 0.85rem;
135
+ }
136
+
137
+ .field {
138
+ display: flex;
139
+ flex-direction: column;
140
+ gap: 0.3rem;
141
+ min-width: 0;
142
+
143
+ label {
144
+ display: flex;
145
+ gap: 0.4rem;
146
+ align-items: center;
147
+ color: var(--paragraph-color, #374151);
148
+ font-size: 0.78rem;
149
+ font-weight: var(--font-weight-semibold, 600);
150
+ }
151
+
152
+ input,
153
+ select {
154
+ width: 100%;
155
+ height: 36px;
156
+ padding: 0 0.6rem;
157
+ border: 1px solid var(--border-color, rgba(43, 43, 43, 0.15));
158
+ border-radius: var(--btn-br, 5px);
159
+ background: var(--background-color, #fff);
160
+ color: var(--paragraph-color, #2b2b2b);
161
+ font: inherit;
162
+ font-size: 0.82rem;
163
+
164
+ &:focus {
165
+ outline: none;
166
+ border-color: color-mix(
167
+ in srgb,
168
+ var(--primary-color, #1b3933) 45%,
169
+ var(--border-color, rgba(43, 43, 43, 0.15))
170
+ );
171
+ box-shadow: 0 0 0 3px
172
+ color-mix(in srgb, var(--highlight-color, #3cbf7d) 22%, transparent);
173
+ }
174
+
175
+ &:disabled {
176
+ background: rgba(43, 43, 43, 0.04);
177
+ cursor: not-allowed;
178
+ }
179
+ }
180
+ }
181
+
182
+ /* "Set" against a secret field. The value never reaches this page; this badge
183
+ is the only thing said about it. */
184
+ .setTag {
185
+ padding: 0.05rem 0.4rem;
186
+ border-radius: 999px;
187
+ background: color-mix(in srgb, var(--highlight-color, #3cbf7d) 20%, transparent);
188
+ color: #0f6b41;
189
+ font-size: 0.65rem;
190
+ font-weight: var(--font-weight-semibold, 600);
191
+ letter-spacing: 0.02em;
192
+ }
193
+
194
+ .help {
195
+ margin: 0;
196
+ color: var(--muted-color, #6b7280);
197
+ font-size: 0.72rem;
198
+ line-height: 1.4;
199
+ }
200
+
201
+ /* The callback URL has to be pasted into the provider's console character for
202
+ character, so it is selectable monospace rather than prose. */
203
+ .redirect {
204
+ margin: 0;
205
+ padding: 0.6rem 0.7rem;
206
+ border: 1px dashed var(--border-color, rgba(43, 43, 43, 0.2));
207
+ border-radius: var(--btn-br, 5px);
208
+ color: var(--muted-color, #6b7280);
209
+ font-size: 0.74rem;
210
+ line-height: 1.5;
211
+
212
+ code {
213
+ display: block;
214
+ margin-top: 0.3rem;
215
+ color: var(--paragraph-color, #2b2b2b);
216
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
217
+ font-size: 0.75rem;
218
+ overflow-wrap: anywhere;
219
+ user-select: all;
220
+ }
221
+ }
222
+
223
+ .testOk,
224
+ .testBad {
225
+ margin: 0;
226
+ font-size: 0.74rem;
227
+ }
228
+
229
+ .testOk { color: #0f6b41; }
230
+ .testBad { color: #9b2c22; }
231
+
232
+ .cardFoot {
233
+ display: flex;
234
+ flex-wrap: wrap;
235
+ gap: 0.5rem;
236
+ align-items: center;
237
+ padding-top: 0.85rem;
238
+ border-top: 1px solid var(--border-color, rgba(43, 43, 43, 0.1));
239
+ }
240
+
241
+ .spacer { flex: 1 1 auto; }
242
+
243
+ .docs {
244
+ display: inline-flex;
245
+ gap: 0.3rem;
246
+ align-items: center;
247
+ color: var(--muted-color, #6b7280);
248
+ font-size: 0.75rem;
249
+ text-decoration: none;
250
+
251
+ &:hover { color: var(--primary-color, #1b3933); }
252
+ }
253
+
254
+ .primary,
255
+ .secondary,
256
+ .ghost {
257
+ display: inline-flex;
258
+ gap: 0.35rem;
259
+ align-items: center;
260
+ justify-content: center;
261
+ height: 34px;
262
+ padding: 0 0.9rem;
263
+ border-radius: var(--btn-br, 5px);
264
+ font-family: inherit;
265
+ font-size: 0.78rem;
266
+ font-weight: var(--font-weight-semibold, 600);
267
+ white-space: nowrap;
268
+ cursor: pointer;
269
+
270
+ &:disabled {
271
+ opacity: 0.5;
272
+ cursor: not-allowed;
273
+ }
274
+ }
275
+
276
+ .primary {
277
+ border: 1px solid var(--primary-color, #1b3933);
278
+ background: var(--primary-color, #1b3933);
279
+ color: #fff;
280
+ }
281
+
282
+ .secondary {
283
+ border: 1px solid var(--border-color, rgba(43, 43, 43, 0.16));
284
+ background: transparent;
285
+ color: var(--paragraph-color, #2b2b2b);
286
+
287
+ &:hover:not(:disabled) {
288
+ background: var(--hover-color, rgba(27, 57, 51, 0.06));
289
+ }
290
+ }
291
+
292
+ .ghost {
293
+ border: 1px solid transparent;
294
+ background: transparent;
295
+ color: var(--muted-color, #6b7280);
296
+
297
+ &:hover:not(:disabled) {
298
+ color: #9b2c22;
299
+ background: rgba(190, 60, 48, 0.08);
300
+ }
301
+ }
302
+
303
+ .loading,
304
+ .empty {
305
+ display: flex;
306
+ gap: 0.5rem;
307
+ align-items: center;
308
+ padding: 2rem 0;
309
+ color: var(--muted-color, #6b7280);
310
+ font-size: 0.85rem;
311
+ }
312
+
313
+ .spin { animation: integrationsSpin 0.9s linear infinite; }
314
+
315
+ @keyframes integrationsSpin {
316
+ to { transform: rotate(360deg); }
317
+ }
318
+
319
+ @media (prefers-reduced-motion: reduce) {
320
+ .spin { animation: none; }
321
+ }
@@ -23,8 +23,8 @@
23
23
  align-items: center;
24
24
  flex-wrap: wrap;
25
25
  border-radius: 6px;
26
- border: 1px solid rgba(var(--primary-rgb), 0.2);
27
- box-shadow: 0px 0px 10px rgba(var(--primary-rgb), 0.1);
26
+ border: 1px solid rgba(var(--primary-rgb, 27, 57, 51), 0.2);
27
+ box-shadow: 0px 0px 10px rgba(var(--primary-rgb, 27, 57, 51), 0.1);
28
28
  padding: 0.8rem 5rem 0.8rem 2rem;
29
29
  margin-bottom: 0.5rem;
30
30
  font-size: 0.9rem;
@@ -39,8 +39,8 @@
39
39
  user-select: none;
40
40
 
41
41
  &:hover {
42
- border-color: rgba(var(--primary-rgb), 0.4);
43
- box-shadow: 0px 0px 12px rgba(var(--primary-rgb), 0.2);
42
+ border-color: rgba(var(--primary-rgb, 27, 57, 51), 0.4);
43
+ box-shadow: 0px 0px 12px rgba(var(--primary-rgb, 27, 57, 51), 0.2);
44
44
  transform: translateY(-1px);
45
45
  }
46
46