@weaveprotocol/core 0.2.0 → 0.2.2

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 (71) hide show
  1. package/README.md +137 -44
  2. package/dist/doors/doors.d.ts +139 -0
  3. package/dist/doors/doors.d.ts.map +1 -0
  4. package/dist/doors/doors.js +210 -0
  5. package/dist/doors/doors.js.map +1 -0
  6. package/dist/doors/index.d.ts +9 -0
  7. package/dist/doors/index.d.ts.map +1 -0
  8. package/dist/doors/index.js +7 -0
  9. package/dist/doors/index.js.map +1 -0
  10. package/dist/elements/auth-styles.d.ts +1 -1
  11. package/dist/elements/auth-styles.d.ts.map +1 -1
  12. package/dist/elements/auth-styles.js +13 -0
  13. package/dist/elements/auth-styles.js.map +1 -1
  14. package/dist/elements/weave-auth.d.ts +2 -2
  15. package/dist/elements/weave-auth.d.ts.map +1 -1
  16. package/dist/elements/weave-auth.js +251 -119
  17. package/dist/elements/weave-auth.js.map +1 -1
  18. package/dist/identity/account-vault.d.ts +10 -3
  19. package/dist/identity/account-vault.d.ts.map +1 -1
  20. package/dist/identity/account-vault.js +10 -3
  21. package/dist/identity/account-vault.js.map +1 -1
  22. package/dist/identity/contact-key.d.ts +26 -0
  23. package/dist/identity/contact-key.d.ts.map +1 -1
  24. package/dist/identity/contact-key.js +52 -0
  25. package/dist/identity/contact-key.js.map +1 -1
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/network/index.d.ts +2 -0
  31. package/dist/network/index.d.ts.map +1 -1
  32. package/dist/network/index.js +1 -0
  33. package/dist/network/index.js.map +1 -1
  34. package/dist/network/mailbox.d.ts +49 -0
  35. package/dist/network/mailbox.d.ts.map +1 -0
  36. package/dist/network/mailbox.js +125 -0
  37. package/dist/network/mailbox.js.map +1 -0
  38. package/dist/node/host.d.ts +2 -2
  39. package/dist/node/host.d.ts.map +1 -1
  40. package/dist/node/index.d.ts +1 -1
  41. package/dist/node/index.d.ts.map +1 -1
  42. package/dist/node/node.d.ts.map +1 -1
  43. package/dist/node/node.js +320 -2
  44. package/dist/node/node.js.map +1 -1
  45. package/dist/node/types.d.ts +107 -1
  46. package/dist/node/types.d.ts.map +1 -1
  47. package/dist/schemas/contacts.d.ts +137 -0
  48. package/dist/schemas/contacts.d.ts.map +1 -1
  49. package/dist/schemas/contacts.js +63 -0
  50. package/dist/schemas/contacts.js.map +1 -1
  51. package/dist/schemas/index.d.ts +2 -2
  52. package/dist/schemas/index.d.ts.map +1 -1
  53. package/dist/schemas/index.js +1 -1
  54. package/dist/schemas/index.js.map +1 -1
  55. package/dist/session/auth.d.ts +39 -9
  56. package/dist/session/auth.d.ts.map +1 -1
  57. package/dist/session/auth.js +177 -70
  58. package/dist/session/auth.js.map +1 -1
  59. package/dist/session/connect.js +2 -2
  60. package/dist/session/credentials.d.ts +22 -6
  61. package/dist/session/credentials.d.ts.map +1 -1
  62. package/dist/session/credentials.js +35 -6
  63. package/dist/session/credentials.js.map +1 -1
  64. package/dist/session/hosting.d.ts +1 -1
  65. package/dist/session/index.d.ts +3 -3
  66. package/dist/session/index.d.ts.map +1 -1
  67. package/dist/session/index.js +2 -2
  68. package/dist/session/index.js.map +1 -1
  69. package/dist/space/notify.d.ts +1 -1
  70. package/dist/storage/blob/s3.js +1 -1
  71. package/package.json +54 -40
@@ -0,0 +1,210 @@
1
+ import { contactKeyPair, contactPublicKey, isContactPublicKey, openSealed, sealFor, signWithScalar, verifyWithPoint } from '../identity/contact-key.js';
2
+ import { didToPublicKey } from '../identity/did.js';
3
+ import { resolveDelegationRoot, UCAN_CLOCK_SKEW_SECONDS } from '../identity/ucan.js';
4
+ import { isAgentNote } from '../identity/agent-note.js';
5
+ import { canonicalize } from '../schema/expression.js';
6
+ import { parseSpaceInvite } from '../space/space-manager.js';
7
+ import { checkSpace } from '../space/space-access.js';
8
+ import { checkRelays } from '../space/roles.js';
9
+ import { sha256 } from '../utils/hash.js';
10
+ import { base64UrlDecode, base64UrlEncode, utf8Decode, utf8Encode } from '../utils/encoding.js';
11
+ /** A door names at most this many relays: enough that one going away doesn't matter */
12
+ export const MAX_DOOR_RELAYS = 3;
13
+ /** How long a knock waits in a mailbox, and so how old one may be when opened */
14
+ export const KNOCK_TTL_SECONDS = 14 * 24 * 3600;
15
+ /**
16
+ * How far a knock's own time may be from when the relay took it. A knock is
17
+ * dropped as soon as it is signed, so its time is checked against the relay's
18
+ * — which the knocker can't choose — and a note that ran out can't be used by
19
+ * dating a knock back to when it was good.
20
+ */
21
+ export const KNOCK_DROP_WINDOW_SECONDS = 600;
22
+ const MAX_NAME = 64;
23
+ const MAX_NOTE = 2000;
24
+ const MAX_INVITE = 6000;
25
+ const MAX_PROOF = 4096;
26
+ /** Cuts text to at most `max` characters without splitting one (a surrogate pair stays whole) */
27
+ export function clip(text, max) {
28
+ const chars = Array.from(text);
29
+ return chars.length <= max ? text : chars.slice(0, max).join('');
30
+ }
31
+ /** Encodes a door code: what goes in a link or a QR code */
32
+ export function encodeDoorCode(code) {
33
+ const problem = checkDoorCode({ v: 1, ...code });
34
+ if (problem)
35
+ throw new Error(problem);
36
+ return base64UrlEncode(utf8Encode(canonicalize({ v: 1, key: code.key, sign: code.sign, relays: [...code.relays], ...(code.name ? { name: code.name } : {}) })));
37
+ }
38
+ /**
39
+ * Reads a door code, or a link carrying one after `#door=` or `door=`.
40
+ * @throws When it isn't one, saying why
41
+ */
42
+ export function parseDoorCode(text) {
43
+ const trimmed = text.trim();
44
+ const found = /(?:^|[#?&])door=([A-Za-z0-9_-]+)/.exec(trimmed);
45
+ const raw = found ? found[1] : trimmed;
46
+ let parsed;
47
+ try {
48
+ parsed = JSON.parse(utf8Decode(base64UrlDecode(raw)));
49
+ }
50
+ catch {
51
+ throw new Error('That is not a door code — it may be cut short.');
52
+ }
53
+ const problem = checkDoorCode(parsed);
54
+ if (problem)
55
+ throw new Error(`That door code doesn't work: ${problem}`);
56
+ const code = parsed;
57
+ return Object.freeze({ v: 1, key: code.key, sign: code.sign, relays: Object.freeze([...code.relays]), ...(code.name ? { name: code.name } : {}) });
58
+ }
59
+ /** Why a value is not a door code, or null */
60
+ export function checkDoorCode(value) {
61
+ const code = value;
62
+ if (!code || typeof code !== 'object' || code.v !== 1)
63
+ return 'it is not a version 1 door';
64
+ if (!isContactPublicKey(code.key))
65
+ return 'its key is not a P-256 public key';
66
+ if (!isContactPublicKey(code.sign) || code.sign === code.key)
67
+ return 'its signing key is not a P-256 public key of its own';
68
+ if (!Array.isArray(code.relays) || code.relays.length === 0 || code.relays.length > MAX_DOOR_RELAYS) {
69
+ return `it names 1–${MAX_DOOR_RELAYS} relays`;
70
+ }
71
+ const relays = checkRelays(code.relays);
72
+ if (relays)
73
+ return relays;
74
+ if (code.name !== undefined && (typeof code.name !== 'string' || Array.from(code.name).length > MAX_NAME))
75
+ return `its name is text of at most ${MAX_NAME} characters`;
76
+ return null;
77
+ }
78
+ /**
79
+ * The mailbox topic of a door: a hash of its signing key. The relay can't tell
80
+ * whose door it is, and can check that whoever clears it holds that key.
81
+ */
82
+ export async function doorTopic(sign) {
83
+ return base64UrlEncode(await sha256(utf8Encode(`weave/door-topic/v1|${sign}`)));
84
+ }
85
+ /**
86
+ * What a door's owner signs to clear knocks from a relay's mailbox: the topic,
87
+ * the relay's one-time challenge, and which knocks (`*` for all of them).
88
+ */
89
+ export const purgeMessage = (topic, nonce, ids) => utf8Encode(`weave/door-purge/v1|${topic}|${nonce}|${ids ? [...ids].sort().join(',') : '*'}`);
90
+ /** Signs a relay's purge challenge with the door's signing key */
91
+ export function signPurge(signKey, topic, nonce, ids) {
92
+ return signWithScalar(signKey, purgeMessage(topic, nonce, ids));
93
+ }
94
+ /**
95
+ * The answer to a knock: the door's owner, signing with the door's signing key
96
+ * that the account which joined the space for two is theirs. Without it,
97
+ * whoever joined first — someone the invite was passed on to — would be taken
98
+ * for the person behind the door.
99
+ */
100
+ const answerMessage = (pairSpace, did) => utf8Encode(`weave/knock-answer/v1|${pairSpace}|${did}`);
101
+ export function signAnswer(signKey, pairSpace, did) {
102
+ return signWithScalar(signKey, answerMessage(pairSpace, did));
103
+ }
104
+ export function checkAnswer(sign, pairSpace, did, signature) {
105
+ return verifyWithPoint(sign, answerMessage(pairSpace, did), signature);
106
+ }
107
+ /** A knock's id: the hash of its sealed blob, as relays file it */
108
+ export async function knockId(blob) {
109
+ return base64UrlEncode(await sha256(utf8Encode(blob)));
110
+ }
111
+ const knockContext = (door) => `weave/knock/v1|${door}`;
112
+ /**
113
+ * Makes a knock: the body, signed by the session key, sealed to the door key.
114
+ * @returns The sealed blob, for relays' mailboxes
115
+ */
116
+ export async function sealKnock(door, knock, session, provider) {
117
+ const note = knock.note ? clip(knock.note.trim(), MAX_NOTE) : undefined;
118
+ const body = {
119
+ v: 1,
120
+ door,
121
+ from: knock.from,
122
+ name: clip(knock.name.trim(), MAX_NAME) || 'Someone',
123
+ invite: knock.invite,
124
+ ...(note ? { note } : {}),
125
+ at: Math.floor(Date.now() / 1000),
126
+ session: session.did,
127
+ proof: session.proof,
128
+ };
129
+ const sig = base64UrlEncode(await provider.sign(session.key, utf8Encode(canonicalize(body))));
130
+ return sealFor(door, { body, sig }, knockContext(door));
131
+ }
132
+ /**
133
+ * Opens a knock left on a door, and checks it through: sealed to this door;
134
+ * signed by a session key that its account's note vouches for, for the whole
135
+ * account and not by an agent; signed when the relay took it; recent; and
136
+ * carrying an invite to a private space that account made.
137
+ * @param doorKey The door key's private scalar (`deriveDoorKeyBytes`)
138
+ * @param receivedAt When the relay took it, ms, as `fetch` says
139
+ * @returns The knock, or null when it is anything less
140
+ */
141
+ export async function openKnock(doorKey, blob, receivedAt, provider) {
142
+ const door = contactPublicKey(doorKey);
143
+ const opened = (await openSealed((await contactKeyPair(doorKey)).privateKey, blob, knockContext(door)));
144
+ const body = opened?.body;
145
+ if (!body || typeof opened.sig !== 'string')
146
+ return null;
147
+ if (body.v !== 1 || body.door !== door)
148
+ return null;
149
+ if (typeof body.from !== 'string' || typeof body.session !== 'string' || typeof body.name !== 'string')
150
+ return null;
151
+ if (Array.from(body.name).length > MAX_NAME)
152
+ return null;
153
+ if (typeof body.invite !== 'string' || body.invite.length > MAX_INVITE)
154
+ return null;
155
+ if (typeof body.proof !== 'string' || body.proof.length > MAX_PROOF)
156
+ return null;
157
+ if (body.note !== undefined && (typeof body.note !== 'string' || Array.from(body.note).length > MAX_NOTE))
158
+ return null;
159
+ if (!Number.isSafeInteger(body.at) || !Number.isFinite(receivedAt))
160
+ return null;
161
+ const now = Math.floor(Date.now() / 1000);
162
+ if (body.at > now + UCAN_CLOCK_SKEW_SECONDS || body.at < now - KNOCK_TTL_SECONDS)
163
+ return null;
164
+ // Signed when it was dropped, not dated back to when a note was still good.
165
+ const dropped = Math.floor(receivedAt / 1000);
166
+ if (body.at > dropped + UCAN_CLOCK_SKEW_SECONDS || body.at < dropped - KNOCK_DROP_WINDOW_SECONDS)
167
+ return null;
168
+ // Signed by the session key it names…
169
+ let signed = false;
170
+ try {
171
+ const key = await provider.importPublicKey(didToPublicKey(body.session).publicKeyBytes);
172
+ signed = await provider.verify(key, base64UrlDecode(opened.sig), utf8Encode(canonicalize(body)));
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ if (!signed)
178
+ return null;
179
+ // …which the account it claims had delegated to when it signed. Agents never knock.
180
+ if (isAgentNote(body.proof))
181
+ return null;
182
+ const chain = await resolveDelegationRoot(body.proof, () => null, provider, { at: body.at }).catch(() => null);
183
+ if (!chain?.valid || chain.audience !== body.session || chain.rootDid !== body.from)
184
+ return null;
185
+ // Knocking makes a space and hands out its invite: only a note for the whole
186
+ // account, to write, may. An app given one space, or only to read, may not.
187
+ if (!chain.capabilities.some((capability) => capability.with === '*' && (capability.can === 'expression/*' || capability.can === '*')))
188
+ return null;
189
+ // A private space the knocker made, with its key: anything else isn't a space for two from them.
190
+ let invited;
191
+ try {
192
+ invited = parseSpaceInvite(body.invite);
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ if (invited.space.creator !== body.from || invited.space.visibility !== 'private' || !invited.key)
198
+ return null;
199
+ if ((await checkSpace(invited.space)) !== null)
200
+ return null;
201
+ return Object.freeze({
202
+ from: body.from,
203
+ name: clip(body.name, MAX_NAME) || 'Someone',
204
+ ...(body.note ? { note: body.note } : {}),
205
+ invite: body.invite,
206
+ pairSpace: invited.space.id,
207
+ at: body.at * 1000,
208
+ });
209
+ }
210
+ //# sourceMappingURL=doors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doors.js","sourceRoot":"","sources":["../../src/doors/doors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @module doors
3
+ * Doors and knocks — see `doors.ts`, and `node.doors` for the API an app uses.
4
+ */
5
+ export { encodeDoorCode, parseDoorCode, checkDoorCode, doorTopic, knockId, sealKnock, openKnock, signPurge, purgeMessage, signAnswer, checkAnswer, clip, KNOCK_DROP_WINDOW_SECONDS, MAX_DOOR_RELAYS, KNOCK_TTL_SECONDS, } from './doors.js';
6
+ export type { DoorCode, KnockBody, OpenedKnock } from './doors.js';
7
+ export { createMailboxClient } from '../network/mailbox.js';
8
+ export type { MailboxClient, MailboxOptions, MailItem } from '../network/mailbox.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,aAAa,EACb,SAAS,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,IAAI,EACJ,yBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module doors
3
+ * Doors and knocks — see `doors.ts`, and `node.doors` for the API an app uses.
4
+ */
5
+ export { encodeDoorCode, parseDoorCode, checkDoorCode, doorTopic, knockId, sealKnock, openKnock, signPurge, purgeMessage, signAnswer, checkAnswer, clip, KNOCK_DROP_WINDOW_SECONDS, MAX_DOOR_RELAYS, KNOCK_TTL_SECONDS, } from './doors.js';
6
+ export { createMailboxClient } from '../network/mailbox.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,aAAa,EACb,SAAS,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,IAAI,EACJ,yBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -14,5 +14,5 @@
14
14
  * not a media query — so the same element fits a full page, a modal or a side
15
15
  * panel without being told which.
16
16
  */
17
- export declare const AUTH_CSS = "\nweave-auth {\n --weave-ink: #000;\n --weave-body: #171717;\n --weave-muted: #666;\n --weave-faint: #8f8f8f;\n --weave-surface: #fff;\n --weave-sunken: #fafafa;\n --weave-line: #eaeaea;\n --weave-line-strong: #d4d4d4;\n --weave-accent: #000;\n --weave-accent-hover: #383838;\n --weave-on-accent: #fff;\n --weave-danger: #e5484d;\n --weave-danger-soft: #fff0f0;\n --weave-radius: 6px;\n --weave-font: \"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n --weave-mono: \"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n\n display: block;\n container-type: inline-size;\n color: var(--weave-body);\n font-family: var(--weave-font);\n font-size: 14px;\n letter-spacing: -0.006em;\n -webkit-font-smoothing: antialiased;\n}\nweave-auth[hidden] { display: none; }\nweave-auth *, weave-auth *::before, weave-auth *::after { box-sizing: border-box; }\nweave-auth :is(h1, p) { margin: 0; }\n\nweave-auth .wa-card { width: 100%; max-width: 380px; margin: 0 auto; }\nweave-auth .wa-wordmark { display: flex; align-items: center; gap: 8px; margin-bottom: 40px; color: var(--weave-ink); font-weight: 600; font-size: 16px; letter-spacing: -0.03em; }\nweave-auth .wa-title { font-size: 28px; font-weight: 600; letter-spacing: -0.04em; color: var(--weave-ink); margin-bottom: 8px; line-height: 1.2; }\nweave-auth .wa-subtitle { font-size: 15px; color: var(--weave-muted); margin-bottom: 32px; line-height: 1.5; }\nweave-auth .wa-hint { font-size: 14px; color: var(--weave-muted); margin-bottom: 20px; line-height: 1.6; }\nweave-auth .wa-small { font-size: 13px; color: var(--weave-muted); margin-top: 8px; line-height: 1.6; }\nweave-auth .wa-error { color: var(--weave-danger); font-size: 14px; font-weight: 500; }\nweave-auth .wa-error-box { margin-top: 16px; padding: 12px 14px; border-radius: var(--weave-radius); background: var(--weave-danger-soft); }\n\nweave-auth .wa-form { display: flex; flex-direction: column; gap: 8px; }\nweave-auth .wa-form + .wa-form { margin-top: 10px; }\nweave-auth input {\n width: 100%; height: 40px; padding: 0 12px;\n border-radius: var(--weave-radius); border: 1px solid var(--weave-line-strong);\n background: var(--weave-surface); color: var(--weave-ink);\n font: inherit; font-size: 14px; outline: none;\n transition: border-color .15s ease, box-shadow .15s ease;\n}\nweave-auth input::placeholder { color: var(--weave-faint); }\nweave-auth input:focus { border-color: var(--weave-muted); box-shadow: 0 0 0 3px rgba(0, 0, 0, .06); }\nweave-auth .wa-offscreen {\n position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;\n overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;\n}\n\nweave-auth button { font: inherit; transition: background-color .15s ease, border-color .15s ease, color .15s ease; }\nweave-auth button:not(:disabled) { cursor: pointer; }\nweave-auth button:disabled { opacity: .5; cursor: not-allowed; }\nweave-auth :focus-visible { outline: 2px solid var(--weave-ink); outline-offset: 2px; }\nweave-auth button:focus:not(:focus-visible) { outline: none; }\n\nweave-auth .wa-button {\n width: 100%; height: 40px; padding: 0 16px;\n border-radius: var(--weave-radius); border: 1px solid transparent;\n background: var(--weave-accent); color: var(--weave-on-accent);\n font-size: 14px; font-weight: 500;\n}\nweave-auth .wa-button:not(:disabled):hover { background: var(--weave-accent-hover); }\nweave-auth .wa-link {\n background: none; border: none; padding: 4px 0; margin-right: 12px;\n color: var(--weave-muted); font-size: 13px; font-weight: 500; text-align: left;\n}\nweave-auth .wa-link:not(:disabled):hover { color: var(--weave-ink); }\nweave-auth .wa-links { display: flex; flex-wrap: wrap; margin-top: 10px; }\n\nweave-auth .wa-options { display: flex; flex-direction: column; gap: 12px; }\nweave-auth .wa-option {\n display: flex; flex-direction: column; gap: 4px; width: 100%; padding: 16px;\n text-align: left; border-radius: var(--weave-radius);\n border: 1px solid var(--weave-line); background: var(--weave-surface); color: var(--weave-body);\n}\nweave-auth .wa-option:not(:disabled):hover { background: var(--weave-sunken); border-color: var(--weave-line-strong); }\nweave-auth .wa-option-title { display: flex; align-items: center; gap: 8px; font-weight: 500; color: var(--weave-ink); }\nweave-auth .wa-option-text { color: var(--weave-muted); font-size: 13px; line-height: 1.5; }\nweave-auth .wa-badge {\n font-size: 11px; font-weight: 500; padding: 1px 8px; border-radius: 999px;\n background: var(--weave-sunken); border: 1px solid var(--weave-line); color: var(--weave-muted);\n}\n\nweave-auth .wa-account { padding: 12px 0; border-top: 1px solid var(--weave-line); }\nweave-auth .wa-account:last-of-type { border-bottom: 1px solid var(--weave-line); margin-bottom: 8px; }\nweave-auth .wa-account-row {\n display: flex; align-items: center; gap: 10px; width: 100%; padding: 6px 8px; margin: 0 -8px;\n width: calc(100% + 16px); text-align: left;\n background: none; border: 1px solid transparent; border-radius: var(--weave-radius); color: var(--weave-body);\n}\nweave-auth .wa-account-row:not(:disabled):hover { background: var(--weave-sunken); }\nweave-auth .wa-account-name { display: block; font-weight: 600; color: var(--weave-ink); }\nweave-auth .wa-account-did { display: block; font-size: 12px; color: var(--weave-faint); font-family: var(--weave-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\nweave-auth .wa-account-body { margin-top: 10px; }\nweave-auth .wa-avatar { flex-shrink: 0; display: block; border-radius: 8px; }\n\nweave-auth .wa-code {\n display: block; margin-top: 16px; padding: 12px; border-radius: var(--weave-radius);\n background: var(--weave-sunken); border: 1px solid var(--weave-line);\n font-family: var(--weave-mono); font-size: 13px; color: var(--weave-ink);\n word-break: break-all; user-select: all;\n}\n\nweave-auth .wa-info { position: relative; display: inline; }\nweave-auth .wa-info-button {\n display: inline-flex; align-items: center; justify-content: center;\n width: 16px; height: 16px; padding: 0; margin-left: 6px; vertical-align: text-bottom;\n border-radius: 999px; border: 1px solid var(--weave-line-strong); background: none;\n color: var(--weave-faint); font-size: 10px; font-weight: 700; line-height: 1;\n}\nweave-auth .wa-popover {\n position: absolute; z-index: 30; top: 22px; left: 0; width: min(260px, 80cqi);\n padding: 12px 14px; border-radius: var(--weave-radius);\n background: var(--weave-surface); border: 1px solid var(--weave-line);\n box-shadow: 0 12px 28px -12px rgba(15, 17, 21, .22);\n font-size: 12.5px; line-height: 1.6; color: var(--weave-muted); font-weight: 400;\n}\nweave-auth .wa-popover[hidden] { display: none; }\n\n@container (max-width: 340px) {\n weave-auth .wa-title { font-size: 24px; }\n weave-auth .wa-subtitle { margin-bottom: 24px; }\n weave-auth .wa-wordmark { margin-bottom: 28px; }\n weave-auth .wa-popover { left: auto; right: -8px; }\n}\n";
17
+ export declare const AUTH_CSS = "\nweave-auth {\n --weave-ink: #000;\n --weave-body: #171717;\n --weave-muted: #666;\n --weave-faint: #8f8f8f;\n --weave-surface: #fff;\n --weave-sunken: #fafafa;\n --weave-line: #eaeaea;\n --weave-line-strong: #d4d4d4;\n --weave-accent: #000;\n --weave-accent-hover: #383838;\n --weave-on-accent: #fff;\n --weave-danger: #e5484d;\n --weave-danger-soft: #fff0f0;\n --weave-radius: 6px;\n --weave-font: \"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n --weave-mono: \"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n\n display: block;\n container-type: inline-size;\n color: var(--weave-body);\n font-family: var(--weave-font);\n font-size: 14px;\n letter-spacing: -0.006em;\n -webkit-font-smoothing: antialiased;\n}\nweave-auth[hidden] { display: none; }\nweave-auth *, weave-auth *::before, weave-auth *::after { box-sizing: border-box; }\nweave-auth :is(h1, p) { margin: 0; }\n\nweave-auth .wa-card { width: 100%; max-width: 380px; margin: 0 auto; }\nweave-auth .wa-wordmark { display: flex; align-items: center; gap: 8px; margin-bottom: 40px; color: var(--weave-ink); font-weight: 600; font-size: 16px; letter-spacing: -0.03em; }\nweave-auth .wa-title { font-size: 28px; font-weight: 600; letter-spacing: -0.04em; color: var(--weave-ink); margin-bottom: 8px; line-height: 1.2; }\nweave-auth .wa-subtitle { font-size: 15px; color: var(--weave-muted); margin-bottom: 32px; line-height: 1.5; }\nweave-auth .wa-hint { font-size: 14px; color: var(--weave-muted); margin-bottom: 20px; line-height: 1.6; }\nweave-auth .wa-small { font-size: 13px; color: var(--weave-muted); margin-top: 8px; line-height: 1.6; }\nweave-auth .wa-error { color: var(--weave-danger); font-size: 14px; font-weight: 500; }\nweave-auth .wa-error-box { margin-top: 16px; padding: 12px 14px; border-radius: var(--weave-radius); background: var(--weave-danger-soft); }\n\nweave-auth .wa-form { display: flex; flex-direction: column; gap: 8px; }\nweave-auth .wa-form + .wa-form { margin-top: 10px; }\nweave-auth input {\n width: 100%; height: 40px; padding: 0 12px;\n border-radius: var(--weave-radius); border: 1px solid var(--weave-line-strong);\n background: var(--weave-surface); color: var(--weave-ink);\n font: inherit; font-size: 14px; outline: none;\n transition: border-color .15s ease, box-shadow .15s ease;\n}\nweave-auth input::placeholder { color: var(--weave-faint); }\nweave-auth input:focus { border-color: var(--weave-muted); box-shadow: 0 0 0 3px rgba(0, 0, 0, .06); }\nweave-auth .wa-offscreen {\n position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;\n overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;\n}\n\nweave-auth button { font: inherit; transition: background-color .15s ease, border-color .15s ease, color .15s ease; }\nweave-auth button:not(:disabled) { cursor: pointer; }\nweave-auth button:disabled { opacity: .5; cursor: not-allowed; }\nweave-auth :focus-visible { outline: 2px solid var(--weave-ink); outline-offset: 2px; }\nweave-auth button:focus:not(:focus-visible) { outline: none; }\n\nweave-auth .wa-button {\n width: 100%; height: 40px; padding: 0 16px;\n border-radius: var(--weave-radius); border: 1px solid transparent;\n background: var(--weave-accent); color: var(--weave-on-accent);\n font-size: 14px; font-weight: 500;\n}\nweave-auth .wa-button:not(:disabled):hover { background: var(--weave-accent-hover); }\nweave-auth .wa-link {\n background: none; border: none; padding: 4px 0; margin-right: 12px;\n color: var(--weave-muted); font-size: 13px; font-weight: 500; text-align: left;\n}\nweave-auth .wa-link:not(:disabled):hover { color: var(--weave-ink); }\nweave-auth .wa-links { display: flex; flex-wrap: wrap; margin-top: 10px; }\n\nweave-auth .wa-options { display: flex; flex-direction: column; gap: 12px; }\nweave-auth .wa-option {\n display: flex; flex-direction: column; gap: 4px; width: 100%; padding: 16px;\n text-align: left; border-radius: var(--weave-radius);\n border: 1px solid var(--weave-line); background: var(--weave-surface); color: var(--weave-body);\n}\nweave-auth .wa-option:not(:disabled):hover { background: var(--weave-sunken); border-color: var(--weave-line-strong); }\nweave-auth .wa-option-title { display: flex; align-items: center; gap: 8px; font-weight: 500; color: var(--weave-ink); }\nweave-auth .wa-option-text { color: var(--weave-muted); font-size: 13px; line-height: 1.5; }\nweave-auth .wa-badge {\n font-size: 11px; font-weight: 500; padding: 1px 8px; border-radius: 999px;\n background: var(--weave-sunken); border: 1px solid var(--weave-line); color: var(--weave-muted);\n}\n\nweave-auth .wa-account { padding: 12px 0; border-top: 1px solid var(--weave-line); }\nweave-auth .wa-account:last-of-type { border-bottom: 1px solid var(--weave-line); margin-bottom: 8px; }\nweave-auth .wa-account-row {\n display: flex; align-items: center; gap: 10px; width: 100%; padding: 6px 8px; margin: 0 -8px;\n width: calc(100% + 16px); text-align: left;\n background: none; border: 1px solid transparent; border-radius: var(--weave-radius); color: var(--weave-body);\n}\nweave-auth .wa-account-row:not(:disabled):hover { background: var(--weave-sunken); }\nweave-auth .wa-account-name { display: block; font-weight: 600; color: var(--weave-ink); }\nweave-auth .wa-account-did { display: block; font-size: 12px; color: var(--weave-faint); font-family: var(--weave-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\nweave-auth .wa-account-body { margin-top: 10px; }\nweave-auth .wa-avatar { flex-shrink: 0; display: block; border-radius: 8px; }\n\nweave-auth .wa-code {\n display: block; margin-top: 16px; padding: 12px; border-radius: var(--weave-radius);\n background: var(--weave-sunken); border: 1px solid var(--weave-line);\n font-family: var(--weave-mono); font-size: 13px; color: var(--weave-ink);\n word-break: break-all; user-select: all;\n}\n\nweave-auth .wa-code-large { font-size: 17px; letter-spacing: 0.04em; text-align: center; padding: 16px 12px; margin-top: 0; }\nweave-auth .wa-row { display: flex; gap: 8px; margin-top: 10px; }\nweave-auth .wa-secondary {\n flex: 1; height: 36px; padding: 0 12px;\n border-radius: var(--weave-radius); border: 1px solid var(--weave-line-strong);\n background: var(--weave-surface); color: var(--weave-ink); font-size: 13px; font-weight: 500;\n}\nweave-auth .wa-secondary:not(:disabled):hover { background: var(--weave-sunken); }\nweave-auth .wa-check { display: flex; align-items: flex-start; gap: 10px; margin: 20px 0 16px; font-size: 14px; line-height: 1.5; color: var(--weave-body); cursor: pointer; }\nweave-auth .wa-check input { width: 16px; height: 16px; margin: 3px 0 0; padding: 0; flex-shrink: 0; accent-color: var(--weave-accent); box-shadow: none; }\nweave-auth .wa-label { font-size: 13px; color: var(--weave-muted); }\nweave-auth .wa-steps { margin: 0 0 20px; padding-left: 20px; font-size: 14px; line-height: 1.6; color: var(--weave-body); }\n\nweave-auth .wa-info { position: relative; display: inline; }\nweave-auth .wa-info-button {\n display: inline-flex; align-items: center; justify-content: center;\n width: 16px; height: 16px; padding: 0; margin-left: 6px; vertical-align: text-bottom;\n border-radius: 999px; border: 1px solid var(--weave-line-strong); background: none;\n color: var(--weave-faint); font-size: 10px; font-weight: 700; line-height: 1;\n}\nweave-auth .wa-popover {\n position: absolute; z-index: 30; top: 22px; left: 0; width: min(260px, 80cqi);\n padding: 12px 14px; border-radius: var(--weave-radius);\n background: var(--weave-surface); border: 1px solid var(--weave-line);\n box-shadow: 0 12px 28px -12px rgba(15, 17, 21, .22);\n font-size: 12.5px; line-height: 1.6; color: var(--weave-muted); font-weight: 400;\n}\nweave-auth .wa-popover[hidden] { display: none; }\n\n@container (max-width: 340px) {\n weave-auth .wa-title { font-size: 24px; }\n weave-auth .wa-subtitle { margin-bottom: 24px; }\n weave-auth .wa-wordmark { margin-bottom: 28px; }\n weave-auth .wa-popover { left: auto; right: -8px; }\n}\n";
18
18
  //# sourceMappingURL=auth-styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-styles.d.ts","sourceRoot":"","sources":["../../src/elements/auth-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,27NAoIpB,CAAC"}
1
+ {"version":3,"file":"auth-styles.d.ts","sourceRoot":"","sources":["../../src/elements/auth-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,i+PAiJpB,CAAC"}
@@ -124,6 +124,19 @@ weave-auth .wa-code {
124
124
  word-break: break-all; user-select: all;
125
125
  }
126
126
 
127
+ weave-auth .wa-code-large { font-size: 17px; letter-spacing: 0.04em; text-align: center; padding: 16px 12px; margin-top: 0; }
128
+ weave-auth .wa-row { display: flex; gap: 8px; margin-top: 10px; }
129
+ weave-auth .wa-secondary {
130
+ flex: 1; height: 36px; padding: 0 12px;
131
+ border-radius: var(--weave-radius); border: 1px solid var(--weave-line-strong);
132
+ background: var(--weave-surface); color: var(--weave-ink); font-size: 13px; font-weight: 500;
133
+ }
134
+ weave-auth .wa-secondary:not(:disabled):hover { background: var(--weave-sunken); }
135
+ weave-auth .wa-check { display: flex; align-items: flex-start; gap: 10px; margin: 20px 0 16px; font-size: 14px; line-height: 1.5; color: var(--weave-body); cursor: pointer; }
136
+ weave-auth .wa-check input { width: 16px; height: 16px; margin: 3px 0 0; padding: 0; flex-shrink: 0; accent-color: var(--weave-accent); box-shadow: none; }
137
+ weave-auth .wa-label { font-size: 13px; color: var(--weave-muted); }
138
+ weave-auth .wa-steps { margin: 0 0 20px; padding-left: 20px; font-size: 14px; line-height: 1.6; color: var(--weave-body); }
139
+
127
140
  weave-auth .wa-info { position: relative; display: inline; }
128
141
  weave-auth .wa-info-button {
129
142
  display: inline-flex; align-items: center; justify-content: center;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-styles.js","sourceRoot":"","sources":["../../src/elements/auth-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoIvB,CAAC"}
1
+ {"version":3,"file":"auth-styles.js","sourceRoot":"","sources":["../../src/elements/auth-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiJvB,CAAC"}
@@ -18,8 +18,8 @@
18
18
  *
19
19
  * It draws into its own light DOM, not a shadow root, on purpose: password
20
20
  * managers find and fill forms in the page far more reliably than forms inside
21
- * a shadow root, and the account password living in a password manager is the
22
- * point of the whole design. Its styles are scoped to the element instead.
21
+ * a shadow root, and the everyday password living in a password manager is
22
+ * much of the point. Its styles are scoped to the element instead.
23
23
  *
24
24
  * It fills whatever box it is put in — a page, a modal, a panel — and draws
25
25
  * nothing once signed in; the host decides what happens then.
@@ -1 +1 @@
1
- {"version":3,"file":"weave-auth.d.ts","sourceRoot":"","sources":["../../src/elements/weave-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAmD,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOxH,mCAAmC;AACnC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACvC;AAED,QAAA,MAAM,IAAI,EAA2C,OAAO,WAAW,CAAC;AAyGxE,qBAAa,gBAAiB,SAAQ,IAAI;;IAYxC,6HAA6H;IAC7H,IAAI,IAAI,IAAI,SAAS,CASpB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAIvB;IAED,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;CAygB7B;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,SAAe,GAAG,IAAI,CAGxD;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,gBAAgB,CAAC;KAChC;IACD,UAAU,mBAAmB;QAC3B,eAAe,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;KACvD;CACF"}
1
+ {"version":3,"file":"weave-auth.d.ts","sourceRoot":"","sources":["../../src/elements/weave-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAwE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAO7I,mCAAmC;AACnC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACvC;AAED,QAAA,MAAM,IAAI,EAA2C,OAAO,WAAW,CAAC;AAmHxE,qBAAa,gBAAiB,SAAQ,IAAI;;IAgBxC,6HAA6H;IAC7H,IAAI,IAAI,IAAI,SAAS,CASpB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAIvB;IAED,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;CAusB7B;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,SAAe,GAAG,IAAI,CAGxD;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,gBAAgB,CAAC;KAChC;IACD,UAAU,mBAAmB;QAC3B,eAAe,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;KACvD;CACF"}