@anodb/core 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui.js ADDED
@@ -0,0 +1,402 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Ready-made React components for anoDB's sharing and device features. They are plain HTML with
5
+ * `anodb-*` class names and minimal layout styles, so they fit into any design:
6
+ *
7
+ * <PairDevice /> add a device to your identity (QR code + safety code)
8
+ * <DeviceList /> your devices, with revoke
9
+ * <InviteLink space={id} /> one-time invite link + QR, and the join requests to approve
10
+ * <JoinSpace /> paste / open an invite link, see invitations by npub
11
+ * <Members space={id} /> members with roles (owners / admins can change them)
12
+ *
13
+ * Links and QR codes are ordinary `https://your-app/#anodb=…` URLs: scanning one with a phone's
14
+ * camera opens your app with the request filled in. Nothing is approved without a click, and
15
+ * pairing always shows a code to compare on both devices.
16
+ */
17
+ import qrcode from 'qrcode-generator';
18
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
19
+ import { useAnoDB } from './react.js';
20
+ const en = {
21
+ addDevice: 'Add a device',
22
+ addDeviceHint: 'On the new device, choose “This is a new device”, then scan its QR code with this device or paste its link here.',
23
+ pairingLink: 'Pairing link',
24
+ check: 'Check',
25
+ compare: 'Does the new device show this code?',
26
+ deviceName: 'Name for the new device',
27
+ approve: 'Yes, approve',
28
+ cancel: 'Cancel',
29
+ approved: 'Approved. The new device will finish setting up in a moment.',
30
+ newDevice: 'This is a new device',
31
+ newDeviceHint: 'Shows a QR code for one of your existing devices. This device then switches to that identity (its current local data is replaced).',
32
+ showQr: 'Show pairing QR code',
33
+ scanWithOther: 'Scan with your existing device, or copy the link to it. Then check that it shows this code:',
34
+ waiting: 'Waiting for approval…',
35
+ copy: 'Copy link',
36
+ copied: 'Copied',
37
+ devices: 'Your devices',
38
+ thisDevice: 'this device',
39
+ revoked: 'revoked',
40
+ revoke: 'Revoke',
41
+ confirmRevoke: 'Revoke for good?',
42
+ invite: 'Invite',
43
+ role: 'Role',
44
+ createLink: 'Create invite link',
45
+ linkHint: 'One-time link. It expires in {hours} h, and you approve each request below.',
46
+ requests: 'Join requests',
47
+ none: 'None',
48
+ approveRequest: 'Approve',
49
+ reject: 'Reject',
50
+ cannotInvite: 'Only owners and admins can invite.',
51
+ join: 'Join with a link',
52
+ inviteLink: 'Invite link',
53
+ yourName: 'Your name (shown to the admin)',
54
+ requestJoin: 'Request to join',
55
+ requested: 'Request sent. You join as soon as an admin approves it.',
56
+ joined: 'Joined',
57
+ invitations: 'Invitations',
58
+ accept: 'Accept',
59
+ decline: 'Decline',
60
+ members: 'Members',
61
+ you: 'you',
62
+ remove: 'Remove',
63
+ confirmRemove: 'Remove?',
64
+ invalidLink: 'This is not an anoDB link for this app.',
65
+ };
66
+ const ja = {
67
+ addDevice: '端末を追加',
68
+ addDeviceHint: '新しい端末で「この端末を追加する」を選び、表示された QR コードをこの端末で読み取るか、リンクをここに貼り付けてください。',
69
+ pairingLink: 'ペアリング用リンク',
70
+ check: '確認',
71
+ compare: '新しい端末に同じコードが表示されていますか?',
72
+ deviceName: '新しい端末の名前',
73
+ approve: 'はい、承認する',
74
+ cancel: 'キャンセル',
75
+ approved: '承認しました。まもなく新しい端末の設定が完了します。',
76
+ newDevice: 'この端末を追加する',
77
+ newDeviceHint: '既存の端末で読み取る QR コードを表示します。承認されると、この端末はそのアカウントに切り替わります(この端末にある今のデータは置き換わります)。',
78
+ showQr: 'ペアリング用 QR コードを表示',
79
+ scanWithOther: '既存の端末で読み取るか、リンクを送ってください。相手の端末に次のコードが出ていることを確認してください:',
80
+ waiting: '承認を待っています…',
81
+ copy: 'リンクをコピー',
82
+ copied: 'コピーしました',
83
+ devices: 'あなたの端末',
84
+ thisDevice: 'この端末',
85
+ revoked: '失効済み',
86
+ revoke: '失効',
87
+ confirmRevoke: '本当に失効させますか?',
88
+ invite: '招待',
89
+ role: '役割',
90
+ createLink: '招待リンクを作成',
91
+ linkHint: '1回限りのリンクです。{hours} 時間で期限が切れ、参加リクエストは下で1件ずつ承認します。',
92
+ requests: '参加リクエスト',
93
+ none: 'なし',
94
+ approveRequest: '承認',
95
+ reject: '拒否',
96
+ cannotInvite: '招待できるのはオーナーと管理者だけです。',
97
+ join: 'リンクで参加',
98
+ inviteLink: '招待リンク',
99
+ yourName: 'あなたの名前(管理者に表示されます)',
100
+ requestJoin: '参加をリクエスト',
101
+ requested: 'リクエストを送りました。管理者が承認すると参加できます。',
102
+ joined: '参加しました',
103
+ invitations: '招待',
104
+ accept: '参加する',
105
+ decline: '断る',
106
+ members: 'メンバー',
107
+ you: 'あなた',
108
+ remove: '外す',
109
+ confirmRemove: '外しますか?',
110
+ invalidLink: 'このアプリ用の anoDB のリンクではありません。',
111
+ };
112
+ const LABELS = { en, ja };
113
+ function detectLang() {
114
+ const l = typeof navigator !== 'undefined' ? navigator.language : '';
115
+ return /^ja/i.test(l) ? 'ja' : 'en';
116
+ }
117
+ function useLabels(p) {
118
+ return useMemo(() => ({ ...LABELS[p.lang ?? detectLang()], ...p.labels }), [p.lang, p.labels]);
119
+ }
120
+ function useSharingDB() {
121
+ return useAnoDB();
122
+ }
123
+ /**
124
+ * Re-read state that has no change event of its own (members, requests, devices…): on every
125
+ * database change and once a second. Re-renders only when the value changes.
126
+ */
127
+ export function useLive(read, deps = []) {
128
+ const db = useSharingDB();
129
+ // eslint-disable-next-line react-hooks/exhaustive-deps
130
+ const fn = useCallback(() => read(db), [db, ...deps]);
131
+ const [value, setValue] = useState(fn);
132
+ const last = useRef(JSON.stringify(value));
133
+ useEffect(() => {
134
+ const update = () => {
135
+ const v = fn();
136
+ const s = JSON.stringify(v);
137
+ if (s !== last.current) {
138
+ last.current = s;
139
+ setValue(v);
140
+ }
141
+ };
142
+ update();
143
+ const stop = db.onChange(update);
144
+ const t = setInterval(update, 1000);
145
+ return () => {
146
+ stop();
147
+ clearInterval(t);
148
+ };
149
+ }, [db, fn]);
150
+ return value;
151
+ }
152
+ // ---- links -----------------------------------------------------------------------------------
153
+ /** Wrap an `anodb://` link into an https URL of this app, so phones open it from a QR code. */
154
+ export function toAppLink(uri, base) {
155
+ const b = base ?? (typeof location !== 'undefined' ? `${location.origin}${location.pathname}` : '');
156
+ return b ? `${b}#anodb=${encodeURIComponent(uri)}` : uri;
157
+ }
158
+ /** Accepts an `anodb://…` link or an app link (`…#anodb=…`) and returns the `anodb://` link. */
159
+ export function parseAppLink(text) {
160
+ const t = text.trim();
161
+ if (t.startsWith('anodb://'))
162
+ return t;
163
+ try {
164
+ const hash = new URL(t).hash.replace(/^#/, '');
165
+ const v = new URLSearchParams(hash).get('anodb');
166
+ return v?.startsWith('anodb://') ? v : null;
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ }
172
+ /** An `anodb://<kind>` link this page was opened with (`#anodb=…`), and a way to clear it. */
173
+ export function useIncomingLink(kind) {
174
+ const [link, setLink] = useState(null);
175
+ useEffect(() => {
176
+ const read = () => {
177
+ const l = typeof location !== 'undefined' ? parseAppLink(location.href) : null;
178
+ setLink(l?.startsWith(`anodb://${kind}`) ? l : null);
179
+ };
180
+ read();
181
+ window.addEventListener('hashchange', read);
182
+ return () => window.removeEventListener('hashchange', read);
183
+ }, [kind]);
184
+ const clear = useCallback(() => {
185
+ setLink(null);
186
+ if (typeof location !== 'undefined' && location.hash.includes('anodb='))
187
+ history.replaceState(null, '', `${location.pathname}${location.search}`);
188
+ }, []);
189
+ return [link, clear];
190
+ }
191
+ // ---- building blocks -------------------------------------------------------------------------
192
+ const col = { display: 'flex', flexDirection: 'column', gap: 8 };
193
+ const row = { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' };
194
+ const list = { listStyle: 'none', padding: 0, margin: 0, display: 'flex', flexDirection: 'column', gap: 6 };
195
+ const mono = { fontFamily: 'ui-monospace, monospace', wordBreak: 'break-all', fontSize: '0.85em' };
196
+ const codeStyle = { fontFamily: 'ui-monospace, monospace', fontSize: '1.6em', letterSpacing: '0.15em', fontWeight: 700 };
197
+ /** QR code as SVG (dark modules use `currentColor`). */
198
+ export function QRCode(props) {
199
+ const { path, n } = useMemo(() => {
200
+ const qr = qrcode(0, 'M');
201
+ qr.addData(props.value);
202
+ qr.make();
203
+ const n = qr.getModuleCount();
204
+ let d = '';
205
+ for (let r = 0; r < n; r++)
206
+ for (let c = 0; c < n; c++)
207
+ if (qr.isDark(r, c))
208
+ d += `M${c + 4} ${r + 4}h1v1h-1z`;
209
+ return { path: d, n: n + 8 };
210
+ }, [props.value]);
211
+ const size = props.size ?? 200;
212
+ return (_jsxs("svg", { className: props.className ?? 'anodb-qr', width: size, height: size, viewBox: `0 0 ${n} ${n}`, role: "img", "aria-label": props.title ?? 'QR code', shapeRendering: "crispEdges", children: [_jsx("rect", { width: n, height: n, fill: "#fff" }), _jsx("path", { d: path, fill: "#000" })] }));
213
+ }
214
+ function CopyButton({ text, l }) {
215
+ const [done, setDone] = useState(false);
216
+ return (_jsx("button", { type: "button", className: "anodb-button anodb-secondary", onClick: () => void navigator.clipboard?.writeText(text).then(() => {
217
+ setDone(true);
218
+ setTimeout(() => setDone(false), 1500);
219
+ }), children: done ? l.copied : l.copy }));
220
+ }
221
+ function ErrorText({ error }) {
222
+ return error ? (_jsx("p", { className: "anodb-error", role: "alert", style: { color: '#c0392b', margin: 0 }, children: error })) : null;
223
+ }
224
+ /** A button that asks for a second click before doing something destructive. */
225
+ function ConfirmButton(props) {
226
+ const [armed, setArmed] = useState(false);
227
+ useEffect(() => {
228
+ if (!armed)
229
+ return;
230
+ const t = setTimeout(() => setArmed(false), 4000);
231
+ return () => clearTimeout(t);
232
+ }, [armed]);
233
+ return (_jsx("button", { type: "button", className: `anodb-button ${armed ? 'anodb-danger' : 'anodb-secondary'}`, onClick: () => (armed ? (setArmed(false), props.onConfirm()) : setArmed(true)), children: armed ? props.confirm : props.label }));
234
+ }
235
+ const useErr = () => {
236
+ const [error, setError] = useState(null);
237
+ const run = useCallback((p) => p.then((v) => (setError(null), v)).catch((e) => (setError(e.message), undefined)), []);
238
+ return { error, setError, run };
239
+ };
240
+ /**
241
+ * Add a device to your identity. On the existing device: scan or paste the new device's link,
242
+ * compare the code, approve. On the new device: show the QR code and wait.
243
+ */
244
+ export function PairDevice(props) {
245
+ const l = useLabels(props);
246
+ const mode = props.mode ?? 'both';
247
+ return (_jsxs("div", { className: props.className ?? 'anodb-pair', style: col, children: [mode !== 'new-device' && _jsx(ApprovePairing, { l: l }), mode !== 'approve' && _jsx(NewDevicePairing, { l: l, ...(props.onPaired ? { onPaired: props.onPaired } : {}), ...(props.linkBase ? { linkBase: props.linkBase } : {}) })] }));
248
+ }
249
+ function ApprovePairing({ l }) {
250
+ const db = useSharingDB();
251
+ const [incoming, clearIncoming] = useIncomingLink('pair');
252
+ const [text, setText] = useState('');
253
+ const [pending, setPending] = useState(null);
254
+ const [name, setName] = useState('');
255
+ const [done, setDone] = useState(false);
256
+ const { error, setError, run } = useErr();
257
+ const check = useCallback((value) => {
258
+ setDone(false);
259
+ const uri = parseAppLink(value);
260
+ if (!uri)
261
+ return setError(l.invalidLink);
262
+ try {
263
+ setPending(db.parsePairing(uri));
264
+ setError(null);
265
+ }
266
+ catch (e) {
267
+ setError(e.message);
268
+ }
269
+ }, [db, l, setError]);
270
+ useEffect(() => {
271
+ if (incoming) {
272
+ setText(incoming);
273
+ check(incoming);
274
+ }
275
+ }, [incoming, check]);
276
+ return (_jsxs("section", { className: "anodb-section", style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.addDevice }), _jsx("p", { className: "anodb-hint", style: { margin: 0 }, children: l.addDeviceHint }), !pending && (_jsxs("form", { style: row, onSubmit: (e) => {
277
+ e.preventDefault();
278
+ check(text);
279
+ }, children: [_jsx("input", { className: "anodb-input", "aria-label": l.pairingLink, placeholder: l.pairingLink, value: text, onChange: (e) => setText(e.target.value), style: { flex: 1, minWidth: 0 } }), _jsx("button", { className: "anodb-button", children: l.check })] })), pending && (_jsxs("div", { className: "anodb-confirm", style: col, children: [_jsx("span", { children: l.compare }), _jsx("span", { className: "anodb-code", style: codeStyle, children: pending.code }), _jsx("input", { className: "anodb-input", "aria-label": l.deviceName, placeholder: l.deviceName, value: name, onChange: (e) => setName(e.target.value) }), _jsxs("div", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(pending.approve(name.trim() || 'device')).then((ok) => {
280
+ if (ok === undefined)
281
+ return;
282
+ setPending(null);
283
+ setText('');
284
+ setDone(true);
285
+ clearIncoming();
286
+ }), children: l.approve }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => {
287
+ setPending(null);
288
+ clearIncoming();
289
+ }, children: l.cancel })] })] })), done && _jsx("p", { style: { margin: 0 }, children: l.approved }), _jsx(ErrorText, { error: error })] }));
290
+ }
291
+ function NewDevicePairing({ l, onPaired, linkBase }) {
292
+ const db = useSharingDB();
293
+ const [offer, setOffer] = useState(null);
294
+ const { error, run } = useErr();
295
+ const link = offer ? toAppLink(offer.uri, linkBase) : '';
296
+ return (_jsxs("section", { className: "anodb-section", style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.newDevice }), _jsx("p", { className: "anodb-hint", style: { margin: 0 }, children: l.newDeviceHint }), !offer && (_jsx("div", { children: _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => void run(db.startPairing()).then((o) => {
297
+ if (!o)
298
+ return;
299
+ setOffer(o);
300
+ void o.done.then(async () => {
301
+ if (onPaired)
302
+ return onPaired();
303
+ await db.close();
304
+ location.reload();
305
+ });
306
+ }), children: l.showQr }) })), offer && (_jsxs("div", { style: col, children: [_jsx(QRCode, { value: link, title: l.pairingLink }), _jsx("span", { style: mono, children: link }), _jsx("span", { children: l.scanWithOther }), _jsx("span", { className: "anodb-code", style: codeStyle, children: offer.code }), _jsx("div", { style: row, children: _jsx(CopyButton, { text: link, l: l }) }), _jsx("span", { className: "anodb-hint", children: l.waiting })] })), _jsx(ErrorText, { error: error })] }));
307
+ }
308
+ /** Your devices, with a revoke button for each other device. */
309
+ export function DeviceList(props) {
310
+ const l = useLabels(props);
311
+ const db = useSharingDB();
312
+ const devices = useLive((d) => d.devices());
313
+ const { error, run } = useErr();
314
+ return (_jsxs("section", { className: props.className ?? 'anodb-devices', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.devices }), _jsx("ul", { style: list, children: devices.map((d) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between', opacity: d.revoked ? 0.5 : 1 }, children: [_jsxs("span", { children: [d.name, d.current && ` (${l.thisDevice})`, d.revoked && ` — ${l.revoked}`] }), !d.current && !d.revoked && _jsx(ConfirmButton, { label: l.revoke, confirm: l.confirmRevoke, onConfirm: () => void run(db.revokeDevice(d.device)) })] }, d.device))) }), _jsx(ErrorText, { error: error })] }));
315
+ }
316
+ // ---- sharing ---------------------------------------------------------------------------------
317
+ const MANAGER = { owner: true, admin: true };
318
+ /** One-time invite link (with QR code) for a space, and the join requests waiting for approval. */
319
+ export function InviteLink(props) {
320
+ const l = useLabels(props);
321
+ const db = useSharingDB();
322
+ const me = useLive((d) => d.roleIn(props.space), [props.space]);
323
+ const roles = me === 'owner' ? ['writer', 'reader', 'admin'] : ['writer', 'reader'];
324
+ const [role, setRole] = useState('writer');
325
+ const [link, setLink] = useState(null);
326
+ const { error, run } = useErr();
327
+ const expires = props.expiresInMs ?? 24 * 3600_000;
328
+ useEffect(() => setLink(null), [props.space]);
329
+ if (!me || !MANAGER[me]) {
330
+ return (_jsx("p", { className: props.className ?? 'anodb-invite', style: { margin: 0 }, children: l.cannotInvite }));
331
+ }
332
+ return (_jsxs("section", { className: props.className ?? 'anodb-invite', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.invite }), _jsxs("div", { style: row, children: [_jsx("select", { className: "anodb-select", "aria-label": l.role, value: role, onChange: (e) => setRole(e.target.value), children: roles.map((r) => (_jsx("option", { value: r, children: r }, r))) }), _jsx("button", { className: "anodb-button", onClick: () => void run(db.createInviteLink(props.space, { role, expiresInMs: expires })).then((u) => u && setLink(toAppLink(u, props.linkBase))), children: l.createLink })] }), link && (_jsxs("div", { style: col, children: [_jsx(QRCode, { value: link, title: l.inviteLink }), _jsx("span", { style: mono, children: link }), _jsx("div", { style: row, children: _jsx(CopyButton, { text: link, l: l }) }), _jsx("span", { className: "anodb-hint", children: l.linkHint.replace('{hours}', String(Math.round(expires / 3600_000))) })] })), _jsx(ErrorText, { error: error }), props.showRequests !== false && _jsx(JoinRequests, { space: props.space, ...(props.lang ? { lang: props.lang } : {}), ...(props.labels ? { labels: props.labels } : {}) })] }));
333
+ }
334
+ /** Join requests for one space (or all spaces) with approve / reject. */
335
+ export function JoinRequests(props) {
336
+ const l = useLabels(props);
337
+ const db = useSharingDB();
338
+ const requests = useLive((d) => d.joinRequests().filter((r) => !props.space || r.space === props.space), [props.space]);
339
+ const { error, run } = useErr();
340
+ return (_jsxs("section", { className: props.className ?? 'anodb-requests', style: col, children: [_jsx("h4", { style: { margin: 0 }, children: l.requests }), requests.length === 0 && _jsx("span", { className: "anodb-hint", children: l.none }), _jsx("ul", { style: list, children: requests.map((r) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsxs("span", { children: [r.name || `${r.npub.slice(0, 12)}…`, " ", _jsx("span", { className: "anodb-badge", children: r.role })] }), _jsxs("span", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(db.approveJoinRequest(r.id)), children: l.approveRequest }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => db.rejectJoinRequest(r.id), children: l.reject })] })] }, r.id))) }), _jsx(ErrorText, { error: error })] }));
341
+ }
342
+ /** Join with an invite link (pasted or opened via QR), and accept invitations sent to your npub. */
343
+ export function JoinSpace(props) {
344
+ const l = useLabels(props);
345
+ const db = useSharingDB();
346
+ const [incoming, clearIncoming] = useIncomingLink('join');
347
+ const [text, setText] = useState('');
348
+ const [name, setName] = useState(props.defaultName ?? '');
349
+ const [sent, setSent] = useState(false);
350
+ const { error, setError, run } = useErr();
351
+ const spaces = useLive((d) => d.spaces().filter((s) => s.status === 'active').map((s) => s.id));
352
+ const before = useRef(null);
353
+ const onJoined = props.onJoined;
354
+ useEffect(() => {
355
+ if (incoming)
356
+ setText(incoming);
357
+ }, [incoming]);
358
+ useEffect(() => {
359
+ if (!before.current)
360
+ return;
361
+ const added = spaces.find((s) => !before.current.has(s));
362
+ if (added) {
363
+ before.current = null;
364
+ setSent(false);
365
+ onJoined?.(added);
366
+ }
367
+ }, [spaces, onJoined]);
368
+ return (_jsxs("section", { className: props.className ?? 'anodb-join', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.join }), _jsxs("form", { style: col, onSubmit: (e) => {
369
+ e.preventDefault();
370
+ const uri = parseAppLink(text);
371
+ if (!uri?.startsWith('anodb://join'))
372
+ return setError(l.invalidLink);
373
+ before.current = new Set(spaces);
374
+ void run(db.requestJoin(uri, name.trim())).then(() => {
375
+ setSent(true);
376
+ setText('');
377
+ clearIncoming();
378
+ });
379
+ }, children: [_jsx("input", { className: "anodb-input", "aria-label": l.inviteLink, placeholder: l.inviteLink, value: text, onChange: (e) => setText(e.target.value) }), _jsxs("div", { style: row, children: [_jsx("input", { className: "anodb-input", "aria-label": l.yourName, placeholder: l.yourName, value: name, onChange: (e) => setName(e.target.value), style: { flex: 1, minWidth: 0 } }), _jsx("button", { className: "anodb-button", children: l.requestJoin })] })] }), sent && _jsx("span", { className: "anodb-hint", children: l.requested }), _jsx(ErrorText, { error: error }), _jsx(Invitations, { ...props })] }));
380
+ }
381
+ /** Invitations sent to your npub (`db.invite(space, npub, role)`), with accept / decline. */
382
+ export function Invitations(props) {
383
+ const l = useLabels(props);
384
+ const db = useSharingDB();
385
+ const invitations = useLive((d) => d.invitations());
386
+ const { error, run } = useErr();
387
+ if (invitations.length === 0)
388
+ return null;
389
+ return (_jsxs("section", { className: "anodb-invitations", style: col, children: [_jsx("h4", { style: { margin: 0 }, children: l.invitations }), _jsx("ul", { style: list, children: invitations.map((i) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsxs("span", { children: [i.name, " ", _jsx("span", { className: "anodb-badge", children: i.role })] }), _jsxs("span", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(db.acceptInvitation(i.space)).then(() => props.onJoined?.(i.space)), children: l.accept }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => db.declineInvitation(i.space), children: l.decline })] })] }, i.space))) }), _jsx(ErrorText, { error: error })] }));
390
+ }
391
+ /** Members of a space. Owners and admins can change roles and remove members. */
392
+ export function Members(props) {
393
+ const l = useLabels(props);
394
+ const db = useSharingDB();
395
+ const members = useLive((d) => d.members(props.space), [props.space]);
396
+ const me = useLive((d) => d.roleIn(props.space), [props.space]);
397
+ const { error, run } = useErr();
398
+ const assignable = me === 'owner' ? ['admin', 'writer', 'reader'] : ['writer', 'reader'];
399
+ const canManage = (m) => m.identity !== db.pubkey && m.role !== 'owner' && (me === 'owner' || (me === 'admin' && m.role !== 'admin'));
400
+ return (_jsxs("section", { className: props.className ?? 'anodb-members', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.members }), _jsx("ul", { style: list, children: members.map((m) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsx("span", { children: props.nameOf ? props.nameOf(m) : m.identity === db.pubkey ? l.you : `${m.npub.slice(0, 12)}…` }), canManage(m) ? (_jsxs("span", { style: row, children: [_jsx("select", { className: "anodb-select", "aria-label": l.role, value: m.role, onChange: (e) => void run(db.setRole(props.space, m.identity, e.target.value)), children: assignable.map((r) => (_jsx("option", { value: r, children: r }, r))) }), _jsx(ConfirmButton, { label: l.remove, confirm: l.confirmRemove, onConfirm: () => void run(db.removeMember(props.space, m.identity)) })] })) : (_jsx("span", { className: "anodb-badge", children: m.role }))] }, m.identity))) }), _jsx(ErrorText, { error: error })] }));
401
+ }
402
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.tsx"],"names":[],"mappings":"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"}
package/docs/DECISIONS.md CHANGED
@@ -27,3 +27,4 @@
27
27
  | 20 | リリース | v0.2 土台 → v0.3 共有 → v0.4 同期と公開。v0.1 互換は捨てる(protocol v2) |
28
28
  | 21 | 大きなファイル(2026-11-10 追加) | **Blossom** に端末側で暗号化して保存し、参照だけを DB に。複数サーバーへミラー、ハッシュ検証、ファイルごとの使い捨て鍵で認可(アップロードした端末だけ削除可)。暗号文を拒否するサーバーを Content-Type の偽装で回避することはしない |
29
29
  | 22 | 通信経路(2026-11-10 追加) | **WebRTC を主、リレーを予備**に。シグナリングは Nostr リレー(nostr-p2p、public 化)。既定は**自分の端末同士だけ**直接接続、他メンバーとは `p2p.mode: 'members'` で(IP が見えるため)。全端末が ack したときだけリレー保存を省く |
30
+ | 23 | 型と UI(2026-11-10 追加) | Kysely の結果は **boolean → true/false、json → 値**(クエリの構文木から列の型を解決。生 SQL は SQLite の値のまま)。共有・端末追加の **React 部品を同梱**(`<PairDevice />` など)。リンクと QR は `https://アプリ/#anodb=…` で、開いても**クリックなしでは承認しない**・ペアリングは必ずコード照合 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anodb/core",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Absolutely No DB — a decentralized, local-first database over Nostr. Zero servers to run. Zero servers to trust.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -57,7 +57,8 @@
57
57
  "@noble/hashes": "^2.4.0",
58
58
  "kysely": "^0.29.8",
59
59
  "nostr-p2p": "^0.1.1",
60
- "nostr-tools": "^2.26.0"
60
+ "nostr-tools": "^2.26.0",
61
+ "qrcode-generator": "^2.0.4"
61
62
  },
62
63
  "devDependencies": {
63
64
  "@types/node": "^26.6.6",