@bitbaum/accountkit 0.0.0-stage → 0.6.3

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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/dist/AccountMenu.d.ts +76 -0
  4. package/dist/AccountMenu.d.ts.map +1 -0
  5. package/dist/AccountMenu.js +156 -0
  6. package/dist/AccountMenu.js.map +1 -0
  7. package/dist/SignInError.d.ts +50 -0
  8. package/dist/SignInError.d.ts.map +1 -0
  9. package/dist/SignInError.js +34 -0
  10. package/dist/SignInError.js.map +1 -0
  11. package/dist/auth/client.d.ts +19 -0
  12. package/dist/auth/client.d.ts.map +1 -0
  13. package/dist/auth/client.js +17 -0
  14. package/dist/auth/client.js.map +1 -0
  15. package/dist/auth/factor.d.ts +9 -0
  16. package/dist/auth/factor.d.ts.map +1 -0
  17. package/dist/auth/factor.js +107 -0
  18. package/dist/auth/factor.js.map +1 -0
  19. package/dist/auth/index.d.ts +6 -0
  20. package/dist/auth/index.d.ts.map +1 -0
  21. package/dist/auth/index.js +6 -0
  22. package/dist/auth/index.js.map +1 -0
  23. package/dist/auth/labels.d.ts +114 -0
  24. package/dist/auth/labels.d.ts.map +1 -0
  25. package/dist/auth/labels.js +132 -0
  26. package/dist/auth/labels.js.map +1 -0
  27. package/dist/auth/limits.d.ts +28 -0
  28. package/dist/auth/limits.d.ts.map +1 -0
  29. package/dist/auth/limits.js +90 -0
  30. package/dist/auth/limits.js.map +1 -0
  31. package/dist/auth/mail.d.ts +10 -0
  32. package/dist/auth/mail.d.ts.map +1 -0
  33. package/dist/auth/mail.js +45 -0
  34. package/dist/auth/mail.js.map +1 -0
  35. package/dist/auth/methods.d.ts +71 -0
  36. package/dist/auth/methods.d.ts.map +1 -0
  37. package/dist/auth/methods.js +92 -0
  38. package/dist/auth/methods.js.map +1 -0
  39. package/dist/auth/next.d.ts +73 -0
  40. package/dist/auth/next.d.ts.map +1 -0
  41. package/dist/auth/next.js +131 -0
  42. package/dist/auth/next.js.map +1 -0
  43. package/dist/auth/react.d.ts +174 -0
  44. package/dist/auth/react.d.ts.map +1 -0
  45. package/dist/auth/react.js +396 -0
  46. package/dist/auth/react.js.map +1 -0
  47. package/dist/auth/recovery.d.ts +17 -0
  48. package/dist/auth/recovery.d.ts.map +1 -0
  49. package/dist/auth/recovery.js +85 -0
  50. package/dist/auth/recovery.js.map +1 -0
  51. package/dist/auth/roles.d.ts +19 -0
  52. package/dist/auth/roles.d.ts.map +1 -0
  53. package/dist/auth/roles.js +29 -0
  54. package/dist/auth/roles.js.map +1 -0
  55. package/dist/auth/schema.d.ts +1923 -0
  56. package/dist/auth/schema.d.ts.map +1 -0
  57. package/dist/auth/schema.js +120 -0
  58. package/dist/auth/schema.js.map +1 -0
  59. package/dist/auth/server.d.ts +56 -0
  60. package/dist/auth/server.d.ts.map +1 -0
  61. package/dist/auth/server.js +229 -0
  62. package/dist/auth/server.js.map +1 -0
  63. package/dist/auth/translations.d.ts +9 -0
  64. package/dist/auth/translations.d.ts.map +1 -0
  65. package/dist/auth/translations.js +513 -0
  66. package/dist/auth/translations.js.map +1 -0
  67. package/dist/identity.d.ts +50 -0
  68. package/dist/identity.d.ts.map +1 -0
  69. package/dist/identity.js +76 -0
  70. package/dist/identity.js.map +1 -0
  71. package/dist/index.d.ts +4 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +4 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/orangecat.d.ts +333 -0
  76. package/dist/orangecat.d.ts.map +1 -0
  77. package/dist/orangecat.js +508 -0
  78. package/dist/orangecat.js.map +1 -0
  79. package/dist/paths.d.ts +3 -0
  80. package/dist/paths.d.ts.map +1 -0
  81. package/dist/paths.js +11 -0
  82. package/dist/paths.js.map +1 -0
  83. package/package.json +145 -4
  84. package/styles.css +383 -0
package/package.json CHANGED
@@ -1,6 +1,147 @@
1
1
  {
2
2
  "name": "@bitbaum/accountkit",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.6.3",
4
+ "description": "One account for every bitbaum product: the account menu, accounts themselves (better-auth: password, magic link, passkeys, 2FA, OIDC) and Sign in with OrangeCat. Styled from @bitbaum/design-tokens.",
5
+ "license": "MIT",
6
+ "author": "Cato",
7
+ "homepage": "https://github.com/bitbaum/accountkit#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/bitbaum/accountkit.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/bitbaum/accountkit/issues"
14
+ },
15
+ "keywords": [
16
+ "account-menu",
17
+ "avatar",
18
+ "sign-out",
19
+ "react",
20
+ "headless-auth",
21
+ "orangecat",
22
+ "oidc",
23
+ "next-auth",
24
+ "auth.js"
25
+ ],
26
+ "type": "module",
27
+ "sideEffects": [
28
+ "*.css"
29
+ ],
30
+ "packageManager": "pnpm@11.25.0",
31
+ "engines": {
32
+ "node": ">=20"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public",
36
+ "provenance": true
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "styles.css"
41
+ ],
42
+ "exports": {
43
+ ".": {
44
+ "types": "./dist/index.d.ts",
45
+ "default": "./dist/index.js"
46
+ },
47
+ "./orangecat": {
48
+ "types": "./dist/orangecat.d.ts",
49
+ "default": "./dist/orangecat.js"
50
+ },
51
+ "./styles.css": "./styles.css",
52
+ "./auth": {
53
+ "types": "./dist/auth/index.d.ts",
54
+ "default": "./dist/auth/index.js"
55
+ },
56
+ "./auth/schema": {
57
+ "types": "./dist/auth/schema.d.ts",
58
+ "default": "./dist/auth/schema.js"
59
+ },
60
+ "./auth/server": {
61
+ "types": "./dist/auth/server.d.ts",
62
+ "default": "./dist/auth/server.js"
63
+ },
64
+ "./auth/next": {
65
+ "types": "./dist/auth/next.d.ts",
66
+ "default": "./dist/auth/next.js"
67
+ },
68
+ "./auth/client": {
69
+ "types": "./dist/auth/client.d.ts",
70
+ "default": "./dist/auth/client.js"
71
+ },
72
+ "./auth/react": {
73
+ "types": "./dist/auth/react.d.ts",
74
+ "default": "./dist/auth/react.js"
75
+ },
76
+ "./auth/mail": {
77
+ "types": "./dist/auth/mail.d.ts",
78
+ "default": "./dist/auth/mail.js"
79
+ }
80
+ },
81
+ "peerDependencies": {
82
+ "@better-auth/passkey": "^1.7.10",
83
+ "better-auth": "^1.7.10",
84
+ "drizzle-orm": "^0.45.4",
85
+ "next": "^16.4.0",
86
+ "react": ">=18",
87
+ "@bitbaum/mail-kit": "^0.2.0"
88
+ },
89
+ "scripts": {
90
+ "build": "rm -rf dist && tsc -p tsconfig.json",
91
+ "lint": "eslint .",
92
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.types.json",
93
+ "test": "node --test test/*.test.js",
94
+ "check:dist": "git diff --exit-code --stat -- dist",
95
+ "verify": "pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm run build && pnpm test && pnpm run test:browser",
96
+ "format": "prettier --write .",
97
+ "format:check": "prettier --check .",
98
+ "demo": "esbuild demo/demo.tsx --bundle --jsx=automatic --format=iife --define:process.env.NODE_ENV='\"production\"' --outfile=demo/dist/demo.js --log-level=warning",
99
+ "test:browser": "pnpm run demo && node test/browser.mjs"
100
+ },
101
+ "devDependencies": {
102
+ "@auth/core": "0.41.3",
103
+ "@better-auth/passkey": "^1.7.10",
104
+ "@bitbaum/design-tokens": "github:bitbaum/design-tokens#5c31f48743dabf9294bf9380a15862b4efbc68a0",
105
+ "@bitbaum/mail-kit": "0.2.0",
106
+ "@electric-sql/pglite": "^0.5.10",
107
+ "@eslint/js": "^10.0.1",
108
+ "@types/node": "^26.4.0",
109
+ "@types/pg": "^8.23.1",
110
+ "@types/react": "^19.2.18",
111
+ "@types/react-dom": "^19.2.3",
112
+ "better-auth": "^1.7.10",
113
+ "drizzle-kit": "^0.31.11",
114
+ "drizzle-orm": "^0.45.4",
115
+ "esbuild": "^0.28.2",
116
+ "eslint": "^10.9.1",
117
+ "globals": "^17.11.0",
118
+ "next": "16.4.0",
119
+ "pg": "^8.23.1",
120
+ "playwright": "1.63.0",
121
+ "prettier": "^3.9.6",
122
+ "react": "^19.2.8",
123
+ "react-dom": "^19.2.8",
124
+ "typescript": "^6.0.3",
125
+ "typescript-eslint": "^8.68.0"
126
+ },
127
+ "peerDependenciesMeta": {
128
+ "better-auth": {
129
+ "optional": true
130
+ },
131
+ "@better-auth/passkey": {
132
+ "optional": true
133
+ },
134
+ "drizzle-orm": {
135
+ "optional": true
136
+ },
137
+ "next": {
138
+ "optional": true
139
+ },
140
+ "@bitbaum/mail-kit": {
141
+ "optional": true
142
+ }
143
+ },
144
+ "dependencies": {
145
+ "limitkit": "^0.2.0"
146
+ }
147
+ }
package/styles.css ADDED
@@ -0,0 +1,383 @@
1
+ /*
2
+ * @bitbaum/accountkit — the look of the one account menu.
3
+ *
4
+ * Every colour, radius and face is an --acct-* variable. By default they read
5
+ * @bitbaum/design-tokens' HSL-triplet variables, so apps on those tokens match
6
+ * without doing anything. An app whose variables are full colours (loki's are
7
+ * OKLCH under the same names) maps them once — `:root { --acct-panel:
8
+ * var(--surface-overlay); … }` — exactly as it does for chatkit's --ck-*.
9
+ * The BEHAVIOUR is shared and is not configurable.
10
+ *
11
+ * Non-negotiable, and why:
12
+ * - 44px touch targets on the trigger and every row (WCAG 2.5.8). Loki's
13
+ * trigger was 36px.
14
+ * - The panel never runs off a 320–390px screen: its width is capped by the
15
+ * viewport, and it aligns to the trigger's inside edge.
16
+ * - Sign-out is the last row and is never hidden behind a scroll.
17
+ */
18
+
19
+ :where(:root) {
20
+ /* Zero specificity: an app's own :root rule setting --acct-* always wins. */
21
+ --acct-panel: hsl(var(--surface-overlay, 0 0% 100%));
22
+ --acct-hover: hsl(var(--surface-hover, 0 0% 95%));
23
+ --acct-trigger-bg: hsl(var(--surface-raised, 0 0% 96%));
24
+ --acct-fg: hsl(var(--text-primary, 0 0% 10%));
25
+ --acct-fg-2: hsl(var(--text-secondary, 0 0% 30%));
26
+ --acct-fg-3: hsl(var(--text-tertiary, 0 0% 42%));
27
+ --acct-line: hsl(var(--border-subtle, 0 0% 90%));
28
+ --acct-line-2: hsl(var(--border-default, 0 0% 82%));
29
+ --acct-focus: var(--accent-primary, #ff5c00);
30
+ --acct-action: var(--accent-primary, #ff5c00);
31
+ --acct-on-action: hsl(var(--on-accent, 0 0% 100%));
32
+ --acct-danger: hsl(var(--status-negative, 0 65% 50%));
33
+ --acct-radius: var(--radius-surface, 0.75rem);
34
+ --acct-radius-sm: var(--radius-control, 0.5rem);
35
+ --acct-font: var(
36
+ --font-sans,
37
+ system-ui,
38
+ -apple-system,
39
+ "Segoe UI",
40
+ sans-serif
41
+ );
42
+ --acct-target: 2.75rem;
43
+ --acct-shadow:
44
+ 0 12px 32px -12px rgb(0 0 0 / 0.28), 0 2px 6px -2px rgb(0 0 0 / 0.12);
45
+ --acct-z: 50;
46
+ }
47
+
48
+ .acct {
49
+ position: relative;
50
+ display: inline-flex;
51
+ font-family: var(--acct-font);
52
+ }
53
+
54
+ .acct-trigger {
55
+ display: inline-flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ inline-size: var(--acct-target);
59
+ block-size: var(--acct-target);
60
+ min-inline-size: var(--acct-target);
61
+ padding: 0;
62
+ border: 1px solid var(--acct-line);
63
+ border-radius: 999px;
64
+ background: var(--acct-trigger-bg);
65
+ color: var(--acct-fg-2);
66
+ cursor: pointer;
67
+ overflow: hidden;
68
+ }
69
+ .acct-trigger:hover {
70
+ border-color: var(--acct-line-2);
71
+ color: var(--acct-fg);
72
+ }
73
+ .acct-trigger:focus-visible,
74
+ .acct-row:focus-visible {
75
+ outline: 2px solid var(--acct-focus);
76
+ outline-offset: 2px;
77
+ }
78
+
79
+ .acct-avatar {
80
+ inline-size: 100%;
81
+ block-size: 100%;
82
+ object-fit: cover;
83
+ }
84
+ .acct-initials {
85
+ font-size: 0.8125rem;
86
+ font-weight: 600;
87
+ letter-spacing: 0.02em;
88
+ }
89
+
90
+ .acct-panel {
91
+ position: absolute;
92
+ inset-block-start: calc(100% + 0.5rem);
93
+ z-index: var(--acct-z);
94
+ inline-size: min(18rem, calc(100vw - 2rem));
95
+ padding: 0.375rem;
96
+ border: 1px solid var(--acct-line);
97
+ border-radius: var(--acct-radius);
98
+ background: var(--acct-panel);
99
+ color: var(--acct-fg);
100
+ box-shadow: var(--acct-shadow);
101
+ }
102
+ .acct[data-align="end"] .acct-panel {
103
+ inset-inline-end: 0;
104
+ }
105
+ .acct[data-align="start"] .acct-panel {
106
+ inset-inline-start: 0;
107
+ }
108
+
109
+ .acct-identity {
110
+ padding: 0.625rem 0.75rem 0.75rem;
111
+ border-block-end: 1px solid var(--acct-line);
112
+ min-inline-size: 0;
113
+ }
114
+ .acct-name,
115
+ .acct-secondary {
116
+ margin: 0;
117
+ overflow: hidden;
118
+ text-overflow: ellipsis;
119
+ white-space: nowrap;
120
+ }
121
+ .acct-name {
122
+ font-size: 0.9375rem;
123
+ font-weight: 600;
124
+ }
125
+ .acct-secondary {
126
+ margin-block-start: 0.125rem;
127
+ font-size: 0.8125rem;
128
+ color: var(--acct-fg-3);
129
+ }
130
+
131
+ .acct-group {
132
+ padding-block: 0.25rem;
133
+ }
134
+ .acct-group + .acct-group {
135
+ border-block-start: 1px solid var(--acct-line);
136
+ }
137
+
138
+ .acct-row {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: 0.625rem;
142
+ inline-size: 100%;
143
+ min-block-size: var(--acct-target);
144
+ padding: 0 0.75rem;
145
+ border: 0;
146
+ border-radius: var(--acct-radius-sm);
147
+ background: transparent;
148
+ color: var(--acct-fg);
149
+ font: inherit;
150
+ font-size: 0.9375rem;
151
+ text-align: start;
152
+ text-decoration: none;
153
+ cursor: pointer;
154
+ box-sizing: border-box;
155
+ }
156
+ .acct-row:hover,
157
+ .acct-row:focus-visible {
158
+ background: var(--acct-hover);
159
+ }
160
+ .acct-row[disabled] {
161
+ cursor: progress;
162
+ opacity: 0.7;
163
+ }
164
+ .acct-icon {
165
+ display: inline-flex;
166
+ flex-shrink: 0;
167
+ color: var(--acct-fg-2);
168
+ }
169
+
170
+ .acct-extra {
171
+ padding-inline: 0.75rem;
172
+ font-size: 0.9375rem;
173
+ }
174
+
175
+ .acct-error {
176
+ margin: 0.25rem 0.75rem 0.375rem;
177
+ font-size: 0.8125rem;
178
+ color: var(--acct-danger);
179
+ }
180
+
181
+ /*
182
+ * The sign-in error screen. "Try again" is the primary action and restarts
183
+ * sign-in; "Back to the start" is a plain link. 44px targets, readable at
184
+ * 320px, no colour of its own beyond the --acct-* variables.
185
+ */
186
+ .acct-signin-error {
187
+ max-inline-size: 28rem;
188
+ margin-inline: auto;
189
+ padding-block: 4rem;
190
+ font-family: var(--acct-font);
191
+ color: var(--acct-fg);
192
+ }
193
+ .acct-signin-kicker {
194
+ margin: 0;
195
+ font-size: 0.8125rem;
196
+ font-weight: 600;
197
+ letter-spacing: 0.06em;
198
+ text-transform: uppercase;
199
+ color: var(--acct-fg-3);
200
+ }
201
+ .acct-signin-title {
202
+ margin: 0.75rem 0 0;
203
+ font-size: clamp(1.75rem, 1.4rem + 1.5vw, 2.25rem);
204
+ font-weight: 600;
205
+ line-height: 1.15;
206
+ letter-spacing: -0.02em;
207
+ text-wrap: balance;
208
+ }
209
+ .acct-signin-body {
210
+ margin: 1rem 0 0;
211
+ font-size: 1.0625rem;
212
+ line-height: 1.55;
213
+ color: var(--acct-fg-2);
214
+ }
215
+ .acct-signin-actions {
216
+ display: grid;
217
+ gap: 0.75rem;
218
+ margin-top: 2.5rem;
219
+ }
220
+ .acct-signin-actions > form {
221
+ display: contents;
222
+ }
223
+ .acct-signin-button {
224
+ display: inline-flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ inline-size: 100%;
228
+ min-block-size: var(--acct-target);
229
+ padding: 0 1.25rem;
230
+ border: 1px solid transparent;
231
+ border-radius: var(--acct-radius-sm);
232
+ background: var(--acct-action);
233
+ color: var(--acct-on-action);
234
+ font: inherit;
235
+ font-weight: 600;
236
+ text-decoration: none;
237
+ cursor: pointer;
238
+ box-sizing: border-box;
239
+ }
240
+ .acct-signin-button:hover {
241
+ filter: brightness(0.95);
242
+ }
243
+ .acct-signin-button.is-secondary {
244
+ border-color: var(--acct-line-2);
245
+ background: transparent;
246
+ color: var(--acct-fg);
247
+ }
248
+ .acct-signin-home {
249
+ display: inline-flex;
250
+ align-items: center;
251
+ justify-content: center;
252
+ min-block-size: var(--acct-target);
253
+ font-size: 0.9375rem;
254
+ font-weight: 600;
255
+ color: var(--acct-fg-2);
256
+ text-underline-offset: 0.25em;
257
+ }
258
+ .acct-signin-home:hover {
259
+ color: var(--acct-fg);
260
+ }
261
+ .acct-signin-button:focus-visible,
262
+ .acct-signin-home:focus-visible {
263
+ outline: 2px solid var(--acct-focus);
264
+ outline-offset: 2px;
265
+ }
266
+
267
+ /* ── Account screens (@bitbaum/accountkit/auth/react) ─────────────────────
268
+ Used only when a product passes no `classes` of its own. */
269
+ .acct-auth-stack {
270
+ display: grid;
271
+ gap: 1rem;
272
+ }
273
+ .acct-auth-field {
274
+ display: grid;
275
+ gap: 0.375rem;
276
+ }
277
+ .acct-auth-label {
278
+ font: 500 0.875rem/1.4 var(--acct-font);
279
+ color: var(--acct-fg);
280
+ }
281
+ .acct-auth-hint {
282
+ font: 400 0.875rem/1.5 var(--acct-font);
283
+ color: var(--acct-fg-2);
284
+ margin: 0;
285
+ }
286
+ .acct-auth-input {
287
+ min-height: var(--acct-target);
288
+ width: 100%;
289
+ box-sizing: border-box;
290
+ padding: 0 0.75rem;
291
+ font: 400 1rem/1.4 var(--acct-font);
292
+ color: var(--acct-fg);
293
+ background: var(--acct-trigger-bg);
294
+ border: 1px solid var(--acct-line-2);
295
+ border-radius: var(--acct-radius-sm);
296
+ }
297
+ .acct-auth-input:focus-visible,
298
+ .acct-auth-button:focus-visible,
299
+ .acct-auth-button-quiet:focus-visible {
300
+ outline: 2px solid var(--acct-focus);
301
+ outline-offset: 2px;
302
+ }
303
+ .acct-auth-button,
304
+ .acct-auth-button-quiet {
305
+ display: inline-flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ min-height: var(--acct-target);
309
+ padding: 0 1.25rem;
310
+ font: 500 1rem/1.3 var(--acct-font);
311
+ border-radius: var(--acct-radius-sm);
312
+ cursor: pointer;
313
+ }
314
+ .acct-auth-button {
315
+ background: var(--acct-action);
316
+ color: var(--acct-on-action);
317
+ border: 0;
318
+ }
319
+ .acct-auth-button-quiet {
320
+ background: transparent;
321
+ color: var(--acct-fg);
322
+ border: 1px solid var(--acct-line-2);
323
+ }
324
+ .acct-auth-button:disabled,
325
+ .acct-auth-button-quiet:disabled {
326
+ opacity: 0.6;
327
+ cursor: default;
328
+ }
329
+ .acct-auth-notice {
330
+ margin: 0;
331
+ padding: 0.75rem 1rem;
332
+ font: 400 0.875rem/1.5 var(--acct-font);
333
+ color: var(--acct-fg-2);
334
+ border: 1px solid var(--acct-line);
335
+ border-radius: var(--acct-radius-sm);
336
+ }
337
+ .acct-auth-error {
338
+ margin: 0;
339
+ font: 400 0.875rem/1.5 var(--acct-font);
340
+ color: var(--acct-danger);
341
+ }
342
+ .acct-auth-section {
343
+ display: grid;
344
+ gap: 1rem;
345
+ padding: 1.25rem;
346
+ border: 1px solid var(--acct-line);
347
+ border-radius: var(--acct-radius);
348
+ }
349
+ .acct-auth-section-title {
350
+ margin: 0;
351
+ font: 600 1.125rem/1.3 var(--acct-font);
352
+ color: var(--acct-fg);
353
+ }
354
+ .acct-auth-divider {
355
+ display: flex;
356
+ align-items: center;
357
+ gap: 0.75rem;
358
+ font: 500 0.75rem/1 var(--acct-font);
359
+ text-transform: uppercase;
360
+ letter-spacing: 0.08em;
361
+ color: var(--acct-fg-3);
362
+ }
363
+ .acct-auth-divider::before,
364
+ .acct-auth-divider::after {
365
+ content: "";
366
+ flex: 1;
367
+ height: 1px;
368
+ background: var(--acct-line);
369
+ }
370
+ .acct-auth-link {
371
+ color: var(--acct-fg);
372
+ text-decoration: underline;
373
+ text-underline-offset: 4px;
374
+ word-break: break-all;
375
+ }
376
+ .acct-auth-check {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 0.75rem;
380
+ min-height: var(--acct-target);
381
+ font: 400 0.875rem/1.4 var(--acct-font);
382
+ color: var(--acct-fg-2);
383
+ }