@truedat/auth 8.14.2 → 8.14.4

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 (66) hide show
  1. package/package.json +4 -4
  2. package/src/messages/en.js +6 -5
  3. package/src/messages/es.js +8 -7
  4. package/src/styles/UserCard.less +582 -0
  5. package/src/styles/UserModals.less +826 -0
  6. package/src/styles/Users.less +280 -0
  7. package/src/users/components/AdminUserRoutes.js +7 -20
  8. package/src/users/components/EditUser.js +7 -34
  9. package/src/users/components/EditUserModal.js +150 -0
  10. package/src/users/components/NewUser.js +128 -17
  11. package/src/users/components/Password.js +11 -189
  12. package/src/users/components/UserAcls.js +56 -6
  13. package/src/users/components/UserActions.js +99 -34
  14. package/src/users/components/UserCard.js +168 -22
  15. package/src/users/components/UserCards.js +273 -35
  16. package/src/users/components/UserFormFields.js +206 -0
  17. package/src/users/components/UserGroupAclRow.js +8 -2
  18. package/src/users/components/UserGroupAcls.js +2 -2
  19. package/src/users/components/UserGroupLink.js +21 -0
  20. package/src/users/components/UserInfoModal.js +268 -0
  21. package/src/users/components/UserPasswordField.js +66 -0
  22. package/src/users/components/UserPasswordModal.js +210 -0
  23. package/src/users/components/UserRoutes.js +4 -13
  24. package/src/users/components/UserTabs.js +5 -2
  25. package/src/users/components/UserTypeSelector.js +109 -0
  26. package/src/users/components/UsersAndGroups.js +39 -5
  27. package/src/users/components/UsersTable.js +234 -0
  28. package/src/users/components/__tests__/EditUser.spec.js +84 -10
  29. package/src/users/components/__tests__/NewUser.spec.js +34 -4
  30. package/src/users/components/__tests__/Password.spec.js +53 -146
  31. package/src/users/components/__tests__/UserAcls.spec.js +23 -2
  32. package/src/users/components/__tests__/UserCard.spec.js +111 -5
  33. package/src/users/components/__tests__/UserCards.spec.js +194 -0
  34. package/src/users/components/__tests__/UserGroupAclRow.spec.js +19 -1
  35. package/src/users/components/__tests__/UserModals.spec.js +507 -0
  36. package/src/users/components/__tests__/UserRoutes.spec.js +8 -3
  37. package/src/users/components/__tests__/UserTypeSelector.spec.js +32 -0
  38. package/src/users/components/__tests__/UsersAndGroups.spec.js +17 -0
  39. package/src/users/components/__tests__/__snapshots__/UserCard.spec.js.snap +64 -37
  40. package/src/users/components/__tests__/__snapshots__/UserCards.spec.js.snap +424 -75
  41. package/src/users/components/__tests__/__snapshots__/UserGroupAclRow.spec.js.snap +7 -3
  42. package/src/users/components/__tests__/__snapshots__/UserRoutes.spec.js.snap +4 -13
  43. package/src/users/hooks/useSortedGroups.js +13 -0
  44. package/src/users/hooks/useUserModalOperation.js +55 -0
  45. package/src/users/reducers/__tests__/userRedirect.spec.js +14 -3
  46. package/src/users/reducers/index.js +1 -0
  47. package/src/users/reducers/userModalOperation.js +29 -0
  48. package/src/users/reducers/userRedirect.js +5 -4
  49. package/src/users/sagas/__tests__/updateUser.spec.js +19 -1
  50. package/src/users/sagas/createUser.js +12 -5
  51. package/src/users/sagas/deleteUser.js +12 -5
  52. package/src/users/sagas/updateUser.js +19 -8
  53. package/src/users/selectors/__tests__/filterUsers.spec.js +11 -0
  54. package/src/users/selectors/__tests__/getUserAcls.spec.js +1 -0
  55. package/src/users/selectors/__tests__/getUserGroupAcls.spec.js +2 -0
  56. package/src/users/selectors/filterUsers.js +9 -1
  57. package/src/users/selectors/getUserGroupAcls.js +1 -0
  58. package/src/users/components/User.js +0 -68
  59. package/src/users/components/UserPassword.js +0 -24
  60. package/src/users/components/__tests__/User.spec.js +0 -20
  61. package/src/users/components/__tests__/UserPassword.spec.js +0 -24
  62. package/src/users/components/__tests__/__snapshots__/EditUser.spec.js.snap +0 -281
  63. package/src/users/components/__tests__/__snapshots__/NewUser.spec.js.snap +0 -321
  64. package/src/users/components/__tests__/__snapshots__/Password.spec.js.snap +0 -128
  65. package/src/users/components/__tests__/__snapshots__/User.spec.js.snap +0 -129
  66. package/src/users/components/__tests__/__snapshots__/UserPassword.spec.js.snap +0 -124
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truedat/auth",
3
- "version": "8.14.2",
3
+ "version": "8.14.4",
4
4
  "description": "Truedat Web Auth",
5
5
  "sideEffects": false,
6
6
  "jsnext:main": "src/index.js",
@@ -54,14 +54,14 @@
54
54
  "@testing-library/jest-dom": "^6.6.3",
55
55
  "@testing-library/react": "^16.3.0",
56
56
  "@testing-library/user-event": "^14.6.1",
57
- "@truedat/test": "8.14.2",
57
+ "@truedat/test": "8.14.4",
58
58
  "identity-obj-proxy": "^3.0.0",
59
59
  "jest": "^29.7.0",
60
60
  "redux-saga-test-plan": "^4.0.6"
61
61
  },
62
62
  "dependencies": {
63
63
  "@apollo/client": "^3.13.8",
64
- "@truedat/core": "8.14.2",
64
+ "@truedat/core": "8.14.4",
65
65
  "auth0-js": "^10.2.0",
66
66
  "axios": "^1.20.0",
67
67
  "graphql": "^16.11.0",
@@ -90,5 +90,5 @@
90
90
  "swr": "^2.3.3"
91
91
  },
92
92
  "overrides": {},
93
- "gitHead": "3814d239579315d817ba0e3467771e6a128e5788"
93
+ "gitHead": "3f043f28fd445df46a419f7872e23fe73e00e93d"
94
94
  }
@@ -212,11 +212,11 @@ export default {
212
212
  "user.form.password": "Password",
213
213
  "user.form.password_confirmation": "Password confirmation",
214
214
  "user.form.password_confirmation.invalid": "Value does not match password",
215
- "user.form.placeholder.email": "jane.doe@truedat.net",
216
- "user.form.placeholder.external_id": "jane.doe (optional)",
217
- "user.form.placeholder.full_name": "Jane Doe",
218
- "user.form.placeholder.groups": "Select groups…",
219
- "user.form.placeholder.user_name": "jane01",
215
+ "user.form.placeholder.email": "user@example.com",
216
+ "user.form.placeholder.external_id": "Optional",
217
+ "user.form.placeholder.full_name": "Full name",
218
+ "user.form.placeholder.groups": "Select groups",
219
+ "user.form.placeholder.user_name": "Username",
220
220
  "user.form.role": "Type",
221
221
  "user.form.user_name": "Username",
222
222
  "user.group.acl": "Group Roles",
@@ -239,6 +239,7 @@ export default {
239
239
  "user.search.no_results": "No users found",
240
240
  "user.search.placeholder": "Search users…",
241
241
  "user.type.admin": "Administrator",
242
+ "user.type.agent": "Agent",
242
243
  "user.type.service": "Service Account",
243
244
  "user.type.user": "User",
244
245
  "userDomainsFilter.button": "Filter",
@@ -216,18 +216,18 @@ export default {
216
216
  "user.actions.edit_password": "Cambiar contraseña",
217
217
  "user.form.check_something": "Existen errores en el formulario",
218
218
  "user.form.email": "Email",
219
- "user.form.external_id": "Id externo",
219
+ "user.form.external_id": "ID externo",
220
220
  "user.form.full_name": "Nombre completo",
221
221
  "user.form.groups": "Grupos",
222
222
  "user.form.password": "Contraseña",
223
223
  "user.form.password_confirmation": "Confirmar contraseña",
224
224
  "user.form.password_confirmation.invalid":
225
225
  "El valor introducido no coincide con la contraseña",
226
- "user.form.placeholder.email": "elena.leon@truedat.net",
227
- "user.form.placeholder.external_id": "elena.leon",
228
- "user.form.placeholder.full_name": "Elena León",
229
- "user.form.placeholder.groups": "Seleccionar grupos…",
230
- "user.form.placeholder.user_name": "elena01",
226
+ "user.form.placeholder.email": "usuario@ejemplo.com",
227
+ "user.form.placeholder.external_id": "Opcional",
228
+ "user.form.placeholder.full_name": "Nombre completo",
229
+ "user.form.placeholder.groups": "Seleccionar grupos",
230
+ "user.form.placeholder.user_name": "Nombre de usuario",
231
231
  "user.form.role": "Tipo",
232
232
  "user.form.user_name": "Nombre de usuario",
233
233
  "user.group.acl": "Control de permisos definido por grupos",
@@ -244,12 +244,13 @@ export default {
244
244
  "user.password.new_password": "Nueva contraseña",
245
245
  "user.password.save": "Guardar",
246
246
  "user.password.success.change": "La contraseña se ha actualizado",
247
- "user.props.email": "E-mail",
247
+ "user.props.email": "Email",
248
248
  "user.props.full_name": "Nombre",
249
249
  "user.props.user_name": "Nombre de usuario",
250
250
  "user.search.no_results": "No se han encontrado usuarios",
251
251
  "user.search.placeholder": "Buscar usuarios…",
252
252
  "user.type.admin": "Administrador",
253
+ "user.type.agent": "Agente",
253
254
  "user.type.service": "Servicio",
254
255
  "user.type.user": "Usuario",
255
256
  "userDomainsFilter.button": "Filtrar",
@@ -0,0 +1,582 @@
1
+ .td-card--user {
2
+ --uc-bottom-right-radius: 1.5rem;
3
+ --uc-bottom-left-radius: 0.25rem;
4
+ --uc-top-left-radius: 1.25rem;
5
+ --uc-top-right-radius: 0.5rem;
6
+ --uc-motion-duration: 300ms;
7
+ --uc-color-motion-duration: 140ms;
8
+ --uc-highlight-motion-duration: 180ms;
9
+ --uc-actions-motion-duration: 420ms;
10
+ --uc-actions-hide-delay: 160ms;
11
+ --uc-motion-easing: cubic-bezier(0.22, 1, 0.36, 1);
12
+ width: 330px;
13
+
14
+ @media (max-width: 767px) {
15
+ width: 100%;
16
+ max-width: 330px;
17
+ }
18
+ }
19
+
20
+ .td-card--user::before {
21
+ content: "";
22
+ position: absolute;
23
+ inset: 0;
24
+ border-left: 8px solid var(--card-accent-color);
25
+ border-radius: inherit;
26
+ opacity: 0;
27
+ pointer-events: none;
28
+ transform: translateX(-8px);
29
+ transition:
30
+ opacity var(--uc-motion-duration) var(--uc-motion-easing),
31
+ transform var(--uc-motion-duration) var(--uc-motion-easing);
32
+ z-index: 1;
33
+ }
34
+
35
+ .td-card--user:hover::before,
36
+ .td-card--user:focus-within::before {
37
+ opacity: 1;
38
+ transform: translateX(0);
39
+ }
40
+
41
+ .ui.card.td-card-base.td-card--user {
42
+ --uc-action-tint: var(--card-accent-soft, rgba(100, 116, 139, 0.07));
43
+ min-height: 160px;
44
+ box-shadow: 0 2px 6px rgba(15, 23, 42, 0.15);
45
+
46
+ &::after {
47
+ content: "";
48
+ position: absolute;
49
+ inset: 0;
50
+ width: auto;
51
+ height: auto;
52
+ border-radius: inherit;
53
+ background: linear-gradient(270deg, var(--uc-action-tint), transparent 75%);
54
+ opacity: 0;
55
+ pointer-events: none;
56
+ transition: opacity var(--uc-highlight-motion-duration) ease;
57
+ }
58
+
59
+ &:hover,
60
+ &:focus-within {
61
+ box-shadow: 0 5px 14px rgba(15, 23, 42, 0.18);
62
+
63
+ &::after {
64
+ opacity: 1;
65
+ }
66
+ }
67
+ }
68
+
69
+ .td-card--user .uc-card-link::after {
70
+ content: "";
71
+ position: absolute;
72
+ inset: 0;
73
+ border-radius: inherit;
74
+ cursor: pointer;
75
+ z-index: 1;
76
+ }
77
+ .td-card--user .uc-card-link:focus-visible::after {
78
+ outline: 2px solid var(--card-accent-color);
79
+ outline-offset: 3px;
80
+ }
81
+
82
+ .td-card--user .uc-actions {
83
+ position: absolute;
84
+ top: 0.45rem;
85
+ right: -1px;
86
+ display: flex;
87
+ flex-direction: column;
88
+ align-items: flex-end;
89
+ gap: 0.25rem;
90
+ opacity: 0;
91
+ transform: translateX(0.45rem);
92
+ visibility: hidden;
93
+ transition:
94
+ opacity var(--uc-actions-motion-duration) var(--uc-motion-easing)
95
+ var(--uc-actions-hide-delay),
96
+ transform var(--uc-actions-motion-duration) var(--uc-motion-easing)
97
+ var(--uc-actions-hide-delay),
98
+ visibility 0ms linear
99
+ calc(var(--uc-actions-motion-duration) + var(--uc-actions-hide-delay));
100
+ z-index: 12;
101
+ pointer-events: none;
102
+ }
103
+
104
+ .td-card--user:hover .uc-actions,
105
+ .td-card--user:focus-within .uc-actions,
106
+ .td-card--user .uc-actions:hover,
107
+ .td-card--user .uc-actions:focus-within {
108
+ opacity: 1;
109
+ transform: translateX(0);
110
+ visibility: visible;
111
+ pointer-events: auto;
112
+ transition-delay: 0ms, 0ms, 0ms;
113
+ }
114
+
115
+ .td-card--user .uc-actions:hover,
116
+ .td-card--user .uc-actions:focus-within {
117
+ --uc-action-color: #64748b;
118
+ }
119
+
120
+ .td-card--user .uc-action-btn {
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: flex-start;
124
+ width: auto;
125
+ max-width: 1.75rem;
126
+ height: 1.75rem;
127
+ padding: 0;
128
+ background: #ffffff;
129
+ border: 1px solid #64748b;
130
+ border-radius: 0.5rem 0 0 0.5rem;
131
+ border-right-width: 0;
132
+ box-shadow: 0 6px 14px rgba(15, 23, 42, 0.14);
133
+ color: var(--uc-action-color, #9ca3af);
134
+ backface-visibility: hidden;
135
+ transition:
136
+ max-width var(--uc-actions-motion-duration) var(--uc-motion-easing),
137
+ padding var(--uc-actions-motion-duration) var(--uc-motion-easing),
138
+ color var(--uc-color-motion-duration) ease 0ms,
139
+ background-color var(--uc-color-motion-duration) ease 0ms,
140
+ border-color var(--uc-color-motion-duration) ease 0ms,
141
+ box-shadow var(--uc-color-motion-duration) ease 0ms;
142
+ cursor: pointer;
143
+ overflow: hidden;
144
+ white-space: nowrap;
145
+
146
+ &:hover,
147
+ &:focus-visible {
148
+ max-width: 14rem;
149
+ padding: 0 1rem 0 0.08rem;
150
+ box-shadow: 0 6px 14px rgba(15, 23, 42, 0.14);
151
+ }
152
+
153
+ i.icon {
154
+ flex: 0 0 1.75rem;
155
+ margin: 0;
156
+ width: 1.75rem;
157
+ font-size: 0.8rem;
158
+ line-height: 1;
159
+ }
160
+ }
161
+
162
+ .td-card--user .uc-action-label {
163
+ max-width: 0;
164
+ opacity: 0;
165
+ overflow: hidden;
166
+ font-size: 0.8rem;
167
+ font-weight: 800;
168
+ line-height: 1;
169
+ transition:
170
+ max-width var(--uc-actions-motion-duration) var(--uc-motion-easing),
171
+ opacity var(--uc-actions-motion-duration) var(--uc-motion-easing);
172
+ }
173
+
174
+ .td-card--user .uc-action-btn:hover .uc-action-label,
175
+ .td-card--user .uc-action-btn:focus-visible .uc-action-label {
176
+ max-width: 11rem;
177
+ opacity: 1;
178
+ }
179
+
180
+ .td-card--user .uc-action-btn--key:hover,
181
+ .td-card--user .uc-action-btn--key:focus-visible {
182
+ color: #7c2d12;
183
+ background-color: #fef3c7;
184
+ border-color: rgba(251, 146, 60, 0.72);
185
+ }
186
+
187
+ .ui.card.td-card-base.td-card--user:has(.uc-action-btn--key:hover),
188
+ .ui.card.td-card-base.td-card--user:has(.uc-action-btn--key:focus-visible) {
189
+ border-color: rgba(217, 119, 6, 0.7);
190
+ --uc-action-tint: rgba(217, 119, 6, 0.09);
191
+ transition:
192
+ border-color var(--uc-color-motion-duration) ease,
193
+ box-shadow var(--uc-color-motion-duration) ease;
194
+ }
195
+
196
+ .td-card--user .uc-action-btn:not(.uc-action-btn--key):hover,
197
+ .td-card--user .uc-action-btn:not(.uc-action-btn--key):focus-visible {
198
+ color: #1d4ed8;
199
+ background-color: #e8f1ff;
200
+ border-color: rgba(37, 99, 235, 0.62);
201
+ }
202
+
203
+ .ui.card.td-card-base.td-card--user:has(
204
+ .uc-action-btn:not(.uc-action-btn--key):hover
205
+ ),
206
+ .ui.card.td-card-base.td-card--user:has(
207
+ .uc-action-btn:not(.uc-action-btn--key):focus-visible
208
+ ) {
209
+ border-color: rgba(37, 99, 235, 0.7);
210
+ --uc-action-tint: rgba(37, 99, 235, 0.09);
211
+ transition:
212
+ border-color var(--uc-color-motion-duration) ease,
213
+ box-shadow var(--uc-color-motion-duration) ease;
214
+ }
215
+
216
+ .td-card--user > .content {
217
+ padding-top: 1.45em !important;
218
+ padding-bottom: 1.1em !important;
219
+ }
220
+
221
+ .td-card--user .uc-summary {
222
+ position: relative;
223
+ display: flex;
224
+ align-items: center;
225
+ gap: 0.75rem;
226
+ padding-left: 0.35rem;
227
+ padding-right: 3rem;
228
+ min-height: 3rem;
229
+ margin-top: -0.28rem;
230
+ margin-bottom: 0.3rem;
231
+ }
232
+
233
+ .td-card--user .uc-summary::before {
234
+ content: "";
235
+ position: absolute;
236
+ left: 0.35rem;
237
+ top: 50%;
238
+ width: 2.75rem;
239
+ height: 2.75rem;
240
+ border-radius: 50%;
241
+ background: var(--card-accent-color);
242
+ transform: translateY(-50%);
243
+ opacity: 0;
244
+ pointer-events: none;
245
+ transition: opacity var(--uc-motion-duration) var(--uc-motion-easing);
246
+ }
247
+
248
+ .td-card--user .uc-avatar {
249
+ position: relative;
250
+ width: 2.75rem;
251
+ height: 2.75rem;
252
+ min-width: 2.75rem;
253
+ border-radius: 50%;
254
+ background: rgba(0, 0, 0, 0.08);
255
+ color: var(--card-accent-color);
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ font-weight: 700;
260
+ font-size: 0.95rem;
261
+ text-transform: uppercase;
262
+ transition:
263
+ background var(--uc-motion-duration) var(--uc-motion-easing),
264
+ color var(--uc-motion-duration) var(--uc-motion-easing),
265
+ transform var(--uc-motion-duration) var(--uc-motion-easing);
266
+ }
267
+
268
+ .td-card--user:hover .uc-summary::before,
269
+ .td-card--user:focus-within .uc-summary::before {
270
+ opacity: 1;
271
+ }
272
+
273
+ .td-card--user:hover .uc-avatar,
274
+ .td-card--user:focus-within .uc-avatar {
275
+ background: var(--card-secondary-color);
276
+ color: #ffffff;
277
+ transform: translate(0.3rem, -0.2rem);
278
+ }
279
+
280
+ .td-card--user .uc-name {
281
+ min-width: 0;
282
+ font-weight: 800;
283
+ font-size: 18px;
284
+ color: #1e293b;
285
+ line-height: 1.25;
286
+ white-space: normal;
287
+ overflow-wrap: anywhere;
288
+ word-break: normal;
289
+ margin: 0;
290
+ transition:
291
+ color var(--uc-motion-duration) var(--uc-motion-easing),
292
+ transform var(--uc-motion-duration) var(--uc-motion-easing);
293
+ }
294
+
295
+ .td-card--user:hover .uc-name,
296
+ .td-card--user:focus-within .uc-name {
297
+ color: var(--card-secondary-color);
298
+ transform: translate(0.3rem, -0.2rem);
299
+ }
300
+
301
+ .td-card--user .uc-meta-grid {
302
+ position: relative;
303
+ display: grid;
304
+ grid-template-columns: 0.875rem minmax(0, 1fr);
305
+ grid-auto-rows: minmax(1rem, auto);
306
+ align-items: center;
307
+ column-gap: 0.4rem;
308
+ row-gap: 0.25rem;
309
+ padding-left: 0.85rem;
310
+ padding-right: 2.75rem;
311
+ margin-top: 1.65rem;
312
+ min-height: 2.2rem;
313
+ }
314
+
315
+ .td-card--user .uc-meta-grid:not(:empty)::before {
316
+ content: "";
317
+ position: absolute;
318
+ top: -0.8rem;
319
+ left: 0.35rem;
320
+ right: 2.75rem;
321
+ border-top: 1px solid #e2e8f0;
322
+ pointer-events: none;
323
+ }
324
+
325
+ .td-card--user .uc-meta-grid > i.icon {
326
+ margin: 0;
327
+ width: 0.875rem;
328
+ color: #64748b;
329
+ font-size: 0.75rem;
330
+ line-height: 1;
331
+ }
332
+
333
+ .td-card--user .uc-username {
334
+ display: block;
335
+ min-width: 0;
336
+ font-size: 11px;
337
+ color: #475569;
338
+ font-weight: 600;
339
+ line-height: 1.2;
340
+ white-space: nowrap;
341
+ overflow: hidden;
342
+ text-overflow: ellipsis;
343
+ margin: 0;
344
+ overflow-wrap: anywhere;
345
+ transition: color var(--uc-motion-duration) var(--uc-motion-easing);
346
+ }
347
+
348
+ .td-card--user .uc-email,
349
+ .td-card--user .uc-external-id {
350
+ display: block;
351
+ min-width: 0;
352
+ font-size: 11px;
353
+ color: #64748b;
354
+ font-weight: 500;
355
+ line-height: 1.2;
356
+ margin: 0;
357
+ white-space: nowrap;
358
+ overflow: hidden;
359
+ text-overflow: ellipsis;
360
+ overflow-wrap: anywhere;
361
+ transition: color var(--uc-motion-duration) var(--uc-motion-easing);
362
+ }
363
+
364
+ .td-card--user .uc-external-id {
365
+ margin-right: 3rem;
366
+ }
367
+
368
+ .td-card--user :is(.uc-username, .uc-email, .uc-external-id) {
369
+ position: relative;
370
+ z-index: 2;
371
+ }
372
+
373
+ @media (hover: hover) and (pointer: fine) {
374
+ .td-card--user
375
+ .uc-card-link:has(
376
+ :is(.uc-username, .uc-email, .uc-external-id):not(:empty):hover
377
+ )
378
+ :is(.uc-username, .uc-email, .uc-external-id) {
379
+ color: #6b7280;
380
+
381
+ &:hover {
382
+ color: #0f172a;
383
+ }
384
+ }
385
+ }
386
+
387
+ .td-card--user .uc-username:hover,
388
+ .td-card--user .uc-username:focus,
389
+ .td-card--user .uc-email:hover,
390
+ .td-card--user .uc-email:focus,
391
+ .td-card--user > .content:focus .uc-username,
392
+ .td-card--user > .content:focus .uc-email {
393
+ white-space: normal;
394
+ overflow: visible;
395
+ text-overflow: clip;
396
+ }
397
+
398
+ .td-card--user > .ui.label.overlapping.groups-badge {
399
+ position: absolute !important;
400
+ bottom: -1px !important;
401
+ right: -1px !important;
402
+ left: auto !important;
403
+ top: auto !important;
404
+ float: none;
405
+ margin: 0 !important;
406
+ border: 0 !important;
407
+ border-radius: 18px 0 var(--uc-bottom-right-radius) 0 !important;
408
+ background: #eeeeee !important;
409
+ color: #888888 !important;
410
+ font-size: 12px;
411
+ font-weight: 700;
412
+ line-height: 1;
413
+ min-width: 3.8rem;
414
+ min-height: 2rem;
415
+ justify-content: center;
416
+ padding: 0.55em 1.75em;
417
+ display: inline-flex;
418
+ align-items: center;
419
+ gap: 0.4em;
420
+ white-space: nowrap;
421
+ pointer-events: auto;
422
+ cursor: pointer;
423
+ transition:
424
+ background-color var(--uc-motion-duration) var(--uc-motion-easing),
425
+ color var(--uc-motion-duration) var(--uc-motion-easing);
426
+ z-index: 18;
427
+ }
428
+
429
+ .td-card--user > .ui.label.overlapping.groups-badge > i.icon {
430
+ margin: 0;
431
+ font-size: 0.9rem;
432
+ line-height: 1;
433
+ }
434
+
435
+ .td-card--user:hover > .ui.label.overlapping.groups-badge,
436
+ .td-card--user:focus-within > .ui.label.overlapping.groups-badge {
437
+ background: var(--card-accent-color) !important;
438
+ color: #ffffff !important;
439
+ }
440
+
441
+ .td-card--user > .ui.label.overlapping.groups-badge::before,
442
+ .td-card--user > .ui.label.overlapping.groups-badge::after {
443
+ display: none;
444
+ }
445
+
446
+ .ui.popup.uc-groups-popover {
447
+ padding: 0;
448
+ overflow: visible;
449
+ border: 1px solid var(--card-groups-popup-border-color);
450
+ border-radius: 1rem;
451
+ box-shadow: 0 18px 38px -18px rgba(15, 23, 42, 0.36);
452
+ background: var(--card-groups-popup-background);
453
+ color: var(--card-groups-popup-text-color);
454
+ transform-origin: top center;
455
+ }
456
+
457
+ .ui.popup.uc-groups-popover::before {
458
+ background: var(--card-groups-popup-background);
459
+ box-shadow: -1px -1px 0 0 var(--card-groups-popup-border-color);
460
+ }
461
+
462
+ .ui.popup.uc-groups-popover.visible {
463
+ animation: uc-groups-popover-in 180ms var(--uc-motion-easing) both;
464
+ }
465
+
466
+ @keyframes uc-groups-popover-in {
467
+ from {
468
+ opacity: 0;
469
+ transform: translateY(-4px) scale(0.97);
470
+ }
471
+
472
+ to {
473
+ opacity: 1;
474
+ transform: translateY(0) scale(1);
475
+ }
476
+ }
477
+
478
+ .uc-groups-popup {
479
+ min-width: 13rem;
480
+ max-width: 18rem;
481
+ overflow: hidden;
482
+ border-radius: 1rem;
483
+ background: var(--card-groups-popup-background);
484
+ color: var(--card-groups-popup-text-color);
485
+ }
486
+
487
+ .uc-groups-popup__header {
488
+ display: flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ gap: 0.5rem;
492
+ padding: 0.55rem 0;
493
+ background: var(--card-groups-popup-header-background);
494
+ border-bottom: 1px solid var(--card-groups-popup-border-color);
495
+ color: var(--card-groups-popup-text-color);
496
+ font-size: 0.95rem;
497
+ font-weight: 900;
498
+ line-height: 1;
499
+ }
500
+
501
+ .uc-groups-popup__header > i.icon {
502
+ margin: 0;
503
+ font-size: 0.95rem;
504
+ line-height: 1;
505
+ }
506
+
507
+ .uc-groups-popup__list {
508
+ display: grid;
509
+ gap: 0.2rem;
510
+ max-height: 14rem;
511
+ overflow-y: auto;
512
+ margin: 0;
513
+ padding: 0.25rem;
514
+ list-style: none;
515
+ }
516
+
517
+ .uc-groups-popup__item {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: 0.5rem;
521
+ min-width: 0;
522
+ padding: 0.25rem 0.35rem;
523
+ border-radius: 0.7rem;
524
+ background: var(--card-groups-popup-item-background);
525
+ border: 1px solid var(--card-groups-popup-item-border-color);
526
+ }
527
+
528
+ .uc-groups-popup__marker {
529
+ display: inline-flex;
530
+ align-items: center;
531
+ justify-content: center;
532
+ flex: 0 0 1.55rem;
533
+ width: 1.55rem;
534
+ height: 1.55rem;
535
+ border-radius: 999px;
536
+ background: var(--card-groups-popup-marker-background);
537
+ color: var(--card-groups-popup-marker-color);
538
+ font-size: 0.78rem;
539
+ font-weight: 900;
540
+ }
541
+
542
+ .uc-groups-popup__name {
543
+ min-width: 0;
544
+ overflow: hidden;
545
+ color: var(--card-groups-popup-muted-text-color);
546
+ font-size: 0.9rem;
547
+ font-weight: 700;
548
+ line-height: 1.2;
549
+ text-overflow: ellipsis;
550
+ white-space: nowrap;
551
+ }
552
+
553
+ @media (hover: none), (pointer: coarse) {
554
+ .td-card--user .uc-actions {
555
+ opacity: 1;
556
+ visibility: visible;
557
+ pointer-events: auto;
558
+ transform: none;
559
+ }
560
+ .td-card--user .uc-action-btn {
561
+ min-width: 2.75rem;
562
+ max-width: 2.75rem;
563
+ height: 2.75rem;
564
+ justify-content: center;
565
+ }
566
+ .ui.card.td-card-base.td-card--user {
567
+ min-height: 12rem;
568
+ }
569
+ }
570
+ @media (prefers-reduced-motion: reduce) {
571
+ .ui.card.td-card-base.td-card--user {
572
+ --uc-motion-duration: 0ms;
573
+ --uc-color-motion-duration: 0ms;
574
+ --uc-highlight-motion-duration: 0ms;
575
+ --uc-actions-motion-duration: 0ms;
576
+ --uc-actions-hide-delay: 0ms;
577
+ --card-motion-duration: 0ms;
578
+ }
579
+ .ui.popup.uc-groups-popover.visible {
580
+ animation: none;
581
+ }
582
+ }