@xnetjs/react 2.2.0 → 2.4.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/{chunk-H44ZSIH4.js → chunk-5ILJMPKO.js} +29 -6
- package/dist/{chunk-ANCTAEML.js → chunk-CZUUWSJ7.js} +254 -116
- package/dist/{chunk-SZQNGRTO.js → chunk-KK6VADMZ.js} +1 -1
- package/dist/{chunk-HTFAHJQK.js → chunk-QSJJNEFY.js} +1 -1
- package/dist/{chunk-ZGP56IIJ.js → chunk-RW3DSDKO.js} +1 -1
- package/dist/{chunk-VZMZQTR7.js → chunk-UVJJN33U.js} +2 -2
- package/dist/core.js +3 -3
- package/dist/database.js +2 -2
- package/dist/{experimental-DyPoZcJT.d.ts → experimental-Dv0MIlsc.d.ts} +65 -3
- package/dist/experimental.d.ts +1 -1
- package/dist/experimental.js +3 -3
- package/dist/index.d.ts +7 -7
- package/dist/index.js +6 -6
- package/dist/internal.js +2 -2
- package/package.json +10 -10
|
@@ -282,13 +282,33 @@ function scheduleIdle(fn) {
|
|
|
282
282
|
import { createUCAN } from "@xnetjs/identity";
|
|
283
283
|
import { useCallback } from "react";
|
|
284
284
|
var HUB_CAPABILITIES = [
|
|
285
|
-
|
|
286
|
-
{ with: "*", can: "
|
|
287
|
-
{ with: "*", can: "
|
|
288
|
-
{ with: "*", can: "
|
|
289
|
-
{ with: "*", can: "
|
|
285
|
+
// Connection + rooms: room-level authorization happens hub-side.
|
|
286
|
+
{ with: "*", can: "hub/connect" },
|
|
287
|
+
{ with: "*", can: "hub/signal" },
|
|
288
|
+
{ with: "*", can: "hub/relay" },
|
|
289
|
+
{ with: "*", can: "hub/query" },
|
|
290
|
+
{ with: "*", can: "hub/backup" },
|
|
291
|
+
// Per-DID stores: backup blobs, files, query, search shards.
|
|
292
|
+
{ with: "*", can: "backup/read" },
|
|
293
|
+
{ with: "*", can: "backup/write" },
|
|
294
|
+
{ with: "*", can: "backup/delete" },
|
|
295
|
+
{ with: "*", can: "files/read" },
|
|
296
|
+
{ with: "*", can: "files/write" },
|
|
297
|
+
{ with: "*", can: "query/read" },
|
|
298
|
+
{ with: "*", can: "index/write" },
|
|
299
|
+
// Calls (0167) + push registration (0168) + own-usage telemetry (0187).
|
|
300
|
+
{ with: "*", can: "call/join" },
|
|
301
|
+
{ with: "*", can: "call/signal" },
|
|
302
|
+
{ with: "*", can: "notify/register" },
|
|
303
|
+
{ with: "*", can: "telemetry/ingest" }
|
|
290
304
|
];
|
|
291
305
|
var HUB_TOKEN_TTL_SECONDS = 60 * 60 * 24;
|
|
306
|
+
var mintNonce = () => {
|
|
307
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
308
|
+
return crypto.randomUUID();
|
|
309
|
+
}
|
|
310
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
311
|
+
};
|
|
292
312
|
function useHubAuthToken(input) {
|
|
293
313
|
const { authorDID, signingKey, hubUrl, autoAuth, staticHubAuthToken } = input;
|
|
294
314
|
return useCallback(async () => {
|
|
@@ -300,9 +320,12 @@ function useHubAuthToken(input) {
|
|
|
300
320
|
return createUCAN({
|
|
301
321
|
issuer: authorDID,
|
|
302
322
|
issuerKey: signingKey,
|
|
323
|
+
// The hub accepts its DID or its URL as audience (audienceAccepted);
|
|
324
|
+
// the URL is what the client reliably knows before connecting.
|
|
303
325
|
audience: hubUrl,
|
|
304
326
|
capabilities: HUB_CAPABILITIES,
|
|
305
|
-
expiration: Math.floor(Date.now() / 1e3) + HUB_TOKEN_TTL_SECONDS
|
|
327
|
+
expiration: Math.floor(Date.now() / 1e3) + HUB_TOKEN_TTL_SECONDS,
|
|
328
|
+
nonce: mintNonce()
|
|
306
329
|
});
|
|
307
330
|
}, [authorDID, autoAuth, signingKey, hubUrl, staticHubAuthToken]);
|
|
308
331
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useMutate,
|
|
3
3
|
useQuery
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RW3DSDKO.js";
|
|
5
5
|
import {
|
|
6
6
|
XNetContext,
|
|
7
7
|
downloadBackup,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
useNodeStore,
|
|
10
10
|
useSecurityContext,
|
|
11
11
|
useXNet
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-5ILJMPKO.js";
|
|
13
13
|
|
|
14
14
|
// src/hooks/useTaskProjectionSync.ts
|
|
15
15
|
import { ExternalReferenceSchema, TaskSchema, isCompletedTaskStatus } from "@xnetjs/data";
|
|
@@ -3398,9 +3398,18 @@ var TRANSITIONS = {
|
|
|
3398
3398
|
AUTHENTICATE: "authenticating",
|
|
3399
3399
|
CREATE_NEW: "authenticating",
|
|
3400
3400
|
CREATE_RECOVERABLE: "creating-recoverable",
|
|
3401
|
+
CONTINUE_WITH_ATPROTO: "atproto-ceremony",
|
|
3401
3402
|
IMPORT_EXISTING: "import-identity",
|
|
3402
3403
|
BROWSER_UNSUPPORTED: "unsupported-browser"
|
|
3403
3404
|
},
|
|
3405
|
+
"atproto-ceremony": {
|
|
3406
|
+
// The ceremony handler stores the linked handle (ATPROTO_LINKED, self-loop)
|
|
3407
|
+
// then runs the existing passkey-create flow → PASSKEY_SUCCESS.
|
|
3408
|
+
ATPROTO_LINKED: "atproto-ceremony",
|
|
3409
|
+
PASSKEY_SUCCESS: "connecting-hub",
|
|
3410
|
+
ATPROTO_CEREMONY_FAILED: "auth-error",
|
|
3411
|
+
BACK_TO_WELCOME: "welcome"
|
|
3412
|
+
},
|
|
3404
3413
|
"creating-recoverable": {
|
|
3405
3414
|
RECOVERABLE_CREATED: "show-recovery-phrase",
|
|
3406
3415
|
PASSKEY_FAILED: "auth-error",
|
|
@@ -3478,6 +3487,16 @@ function onboardingReducer(current, event) {
|
|
|
3478
3487
|
case "IMPORT_FAILED":
|
|
3479
3488
|
nextContext.error = event.error;
|
|
3480
3489
|
break;
|
|
3490
|
+
case "ATPROTO_LINKED":
|
|
3491
|
+
nextContext.atprotoDid = event.atprotoDid;
|
|
3492
|
+
nextContext.atprotoHandle = event.atprotoHandle;
|
|
3493
|
+
nextContext.atprotoDisplayName = event.displayName ?? null;
|
|
3494
|
+
nextContext.error = null;
|
|
3495
|
+
break;
|
|
3496
|
+
case "ATPROTO_CEREMONY_FAILED":
|
|
3497
|
+
nextContext.error = event.error;
|
|
3498
|
+
break;
|
|
3499
|
+
case "CONTINUE_WITH_ATPROTO":
|
|
3481
3500
|
case "CREATE_RECOVERABLE":
|
|
3482
3501
|
nextContext.error = null;
|
|
3483
3502
|
break;
|
|
@@ -3504,7 +3523,10 @@ function createInitialState(hubUrl) {
|
|
|
3504
3523
|
hubUrl: hubUrl ?? null,
|
|
3505
3524
|
error: null,
|
|
3506
3525
|
isDemo: false,
|
|
3507
|
-
recoveryPhrase: null
|
|
3526
|
+
recoveryPhrase: null,
|
|
3527
|
+
atprotoDid: null,
|
|
3528
|
+
atprotoHandle: null,
|
|
3529
|
+
atprotoDisplayName: null
|
|
3508
3530
|
}
|
|
3509
3531
|
};
|
|
3510
3532
|
}
|
|
@@ -3530,7 +3552,8 @@ var OnboardingCtx = createContext(null);
|
|
|
3530
3552
|
function OnboardingProvider({
|
|
3531
3553
|
children,
|
|
3532
3554
|
defaultHubUrl = "wss://hub.xnet.fyi",
|
|
3533
|
-
onComplete
|
|
3555
|
+
onComplete,
|
|
3556
|
+
runAtprotoCeremony
|
|
3534
3557
|
}) {
|
|
3535
3558
|
const [{ state, context }, dispatch] = useReducer(
|
|
3536
3559
|
onboardingReducer,
|
|
@@ -3659,7 +3682,44 @@ function OnboardingProvider({
|
|
|
3659
3682
|
},
|
|
3660
3683
|
[state, manager]
|
|
3661
3684
|
);
|
|
3662
|
-
|
|
3685
|
+
const startAtprotoCeremony = useCallback18(
|
|
3686
|
+
(handleOrPds) => {
|
|
3687
|
+
if (!runAtprotoCeremony || authInFlight.current) return;
|
|
3688
|
+
authInFlight.current = true;
|
|
3689
|
+
runAtprotoCeremony({ handleOrPds }).then(async (result) => {
|
|
3690
|
+
dispatch({
|
|
3691
|
+
type: "ATPROTO_LINKED",
|
|
3692
|
+
atprotoDid: result.atprotoDid,
|
|
3693
|
+
atprotoHandle: result.atprotoHandle,
|
|
3694
|
+
displayName: result.displayName
|
|
3695
|
+
});
|
|
3696
|
+
const keyBundle = await manager.create();
|
|
3697
|
+
if (result.writeBinding) {
|
|
3698
|
+
await result.writeBinding(keyBundle.identity.did, keyBundle.signingKey);
|
|
3699
|
+
}
|
|
3700
|
+
dispatch({ type: "PASSKEY_SUCCESS", identity: keyBundle.identity, keyBundle });
|
|
3701
|
+
}).catch((err) => {
|
|
3702
|
+
dispatch({
|
|
3703
|
+
type: "ATPROTO_CEREMONY_FAILED",
|
|
3704
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
3705
|
+
});
|
|
3706
|
+
}).finally(() => {
|
|
3707
|
+
authInFlight.current = false;
|
|
3708
|
+
});
|
|
3709
|
+
},
|
|
3710
|
+
[runAtprotoCeremony, manager]
|
|
3711
|
+
);
|
|
3712
|
+
const value = useMemo14(
|
|
3713
|
+
() => ({
|
|
3714
|
+
state,
|
|
3715
|
+
context,
|
|
3716
|
+
send,
|
|
3717
|
+
atprotoEnabled: Boolean(runAtprotoCeremony),
|
|
3718
|
+
startAtprotoCeremony
|
|
3719
|
+
}),
|
|
3720
|
+
[state, context, send, runAtprotoCeremony, startAtprotoCeremony]
|
|
3721
|
+
);
|
|
3722
|
+
return /* @__PURE__ */ jsx6(OnboardingCtx.Provider, { value, children });
|
|
3663
3723
|
}
|
|
3664
3724
|
function useOnboarding() {
|
|
3665
3725
|
const ctx = useContext7(OnboardingCtx);
|
|
@@ -3911,7 +3971,7 @@ function UnsupportedBrowserScreen() {
|
|
|
3911
3971
|
// src/onboarding/screens/WelcomeScreen.tsx
|
|
3912
3972
|
import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3913
3973
|
function WelcomeScreen() {
|
|
3914
|
-
const { send } = useOnboarding();
|
|
3974
|
+
const { send, atprotoEnabled } = useOnboarding();
|
|
3915
3975
|
return /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center justify-center min-h-screen bg-gradient-to-b from-background to-muted/30 text-foreground p-6", children: [
|
|
3916
3976
|
/* @__PURE__ */ jsx13("div", { className: "w-16 h-16 mb-8 rounded-2xl bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxs11(
|
|
3917
3977
|
"svg",
|
|
@@ -3961,6 +4021,14 @@ function WelcomeScreen() {
|
|
|
3961
4021
|
}
|
|
3962
4022
|
),
|
|
3963
4023
|
/* @__PURE__ */ jsx13("p", { className: "text-xs text-muted-foreground/70 text-center max-w-xs mt-2 mb-6", children: "Creates a secure passkey on your device. No passwords needed." }),
|
|
4024
|
+
atprotoEnabled && /* @__PURE__ */ jsx13(
|
|
4025
|
+
"button",
|
|
4026
|
+
{
|
|
4027
|
+
className: "text-sm text-muted-foreground hover:text-foreground transition-colors underline-offset-4 hover:underline mb-2",
|
|
4028
|
+
onClick: () => send({ type: "CONTINUE_WITH_ATPROTO" }),
|
|
4029
|
+
children: "Continue with Bluesky (or any PDS)"
|
|
4030
|
+
}
|
|
4031
|
+
),
|
|
3964
4032
|
/* @__PURE__ */ jsx13(
|
|
3965
4033
|
"button",
|
|
3966
4034
|
{
|
|
@@ -3980,13 +4048,81 @@ function WelcomeScreen() {
|
|
|
3980
4048
|
] });
|
|
3981
4049
|
}
|
|
3982
4050
|
|
|
4051
|
+
// src/onboarding/screens/AtprotoCeremonyScreen.tsx
|
|
4052
|
+
import { useState as useState24 } from "react";
|
|
4053
|
+
import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
4054
|
+
function AtprotoCeremonyScreen() {
|
|
4055
|
+
const { context, send, startAtprotoCeremony } = useOnboarding();
|
|
4056
|
+
const [handle, setHandle] = useState24("");
|
|
4057
|
+
const linked = Boolean(context.atprotoDid);
|
|
4058
|
+
const submit = () => {
|
|
4059
|
+
const value = handle.trim();
|
|
4060
|
+
if (value) startAtprotoCeremony(value);
|
|
4061
|
+
};
|
|
4062
|
+
return /* @__PURE__ */ jsxs12("div", { className: "flex flex-col items-center justify-center min-h-screen bg-background text-foreground p-6", children: [
|
|
4063
|
+
/* @__PURE__ */ jsx14("h1", { className: "text-2xl font-semibold mb-2", children: "Continue with Bluesky" }),
|
|
4064
|
+
/* @__PURE__ */ jsx14("p", { className: "text-muted-foreground text-center mb-6 max-w-sm", children: "Sign in with your ATProto handle to claim a free global name. Works with Bluesky or any PDS." }),
|
|
4065
|
+
linked ? /* @__PURE__ */ jsxs12("p", { className: "text-sm text-muted-foreground mb-6", children: [
|
|
4066
|
+
"Linked ",
|
|
4067
|
+
/* @__PURE__ */ jsxs12("span", { className: "font-medium text-foreground", children: [
|
|
4068
|
+
"@",
|
|
4069
|
+
context.atprotoHandle
|
|
4070
|
+
] }),
|
|
4071
|
+
" \u2014 finishing your passkey\u2026"
|
|
4072
|
+
] }) : /* @__PURE__ */ jsxs12("div", { className: "w-full max-w-sm", children: [
|
|
4073
|
+
/* @__PURE__ */ jsx14("label", { htmlFor: "atproto-handle", className: "sr-only", children: "ATProto handle" }),
|
|
4074
|
+
/* @__PURE__ */ jsx14(
|
|
4075
|
+
"input",
|
|
4076
|
+
{
|
|
4077
|
+
id: "atproto-handle",
|
|
4078
|
+
type: "text",
|
|
4079
|
+
inputMode: "url",
|
|
4080
|
+
autoCapitalize: "none",
|
|
4081
|
+
autoCorrect: "off",
|
|
4082
|
+
spellCheck: false,
|
|
4083
|
+
placeholder: "alice.bsky.social",
|
|
4084
|
+
value: handle,
|
|
4085
|
+
onChange: (e) => setHandle(e.target.value),
|
|
4086
|
+
onKeyDown: (e) => {
|
|
4087
|
+
if (e.key === "Enter") submit();
|
|
4088
|
+
},
|
|
4089
|
+
className: "w-full px-4 py-3 rounded-lg border border-border bg-background mb-3"
|
|
4090
|
+
}
|
|
4091
|
+
),
|
|
4092
|
+
/* @__PURE__ */ jsx14(
|
|
4093
|
+
"button",
|
|
4094
|
+
{
|
|
4095
|
+
onClick: submit,
|
|
4096
|
+
disabled: !handle.trim(),
|
|
4097
|
+
className: "w-full px-4 py-3 bg-primary text-primary-foreground rounded-lg font-medium disabled:opacity-50",
|
|
4098
|
+
children: "Continue"
|
|
4099
|
+
}
|
|
4100
|
+
)
|
|
4101
|
+
] }),
|
|
4102
|
+
context.error && /* @__PURE__ */ jsx14("p", { className: "text-sm text-destructive mt-4 max-w-sm text-center", children: context.error.message }),
|
|
4103
|
+
/* @__PURE__ */ jsxs12("p", { className: "text-xs text-muted-foreground/80 text-center max-w-xs mt-6", children: [
|
|
4104
|
+
"Your Bluesky account gives you a global name. It does ",
|
|
4105
|
+
/* @__PURE__ */ jsx14("strong", { children: "not" }),
|
|
4106
|
+
" hold or recover your xNet keys unless you later enable it as a recovery anchor."
|
|
4107
|
+
] }),
|
|
4108
|
+
/* @__PURE__ */ jsx14(
|
|
4109
|
+
"button",
|
|
4110
|
+
{
|
|
4111
|
+
className: "text-sm text-muted-foreground hover:text-foreground underline-offset-4 hover:underline mt-6",
|
|
4112
|
+
onClick: () => send({ type: "BACK_TO_WELCOME" }),
|
|
4113
|
+
children: "Back"
|
|
4114
|
+
}
|
|
4115
|
+
)
|
|
4116
|
+
] });
|
|
4117
|
+
}
|
|
4118
|
+
|
|
3983
4119
|
// src/onboarding/screens/GuardianRecoveryScreen.tsx
|
|
3984
4120
|
import { parseShare as parseShare2 } from "@xnetjs/identity";
|
|
3985
|
-
import { useMemo as useMemo15, useState as
|
|
3986
|
-
import { jsx as
|
|
4121
|
+
import { useMemo as useMemo15, useState as useState25 } from "react";
|
|
4122
|
+
import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
3987
4123
|
function GuardianRecoveryScreen() {
|
|
3988
4124
|
const { send, context } = useOnboarding();
|
|
3989
|
-
const [text, setText] =
|
|
4125
|
+
const [text, setText] = useState25("");
|
|
3990
4126
|
const { validCodes, invalidCount, threshold } = useMemo15(() => {
|
|
3991
4127
|
const lines = text.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
|
|
3992
4128
|
const valid = [];
|
|
@@ -4012,10 +4148,10 @@ function GuardianRecoveryScreen() {
|
|
|
4012
4148
|
if (threshold !== null) return `${validCodes.length} of ${threshold} needed`;
|
|
4013
4149
|
return `${validCodes.length} share${validCodes.length === 1 ? "" : "s"} pasted`;
|
|
4014
4150
|
})();
|
|
4015
|
-
return /* @__PURE__ */
|
|
4016
|
-
/* @__PURE__ */
|
|
4017
|
-
/* @__PURE__ */
|
|
4018
|
-
/* @__PURE__ */
|
|
4151
|
+
return /* @__PURE__ */ jsxs13("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
|
|
4152
|
+
/* @__PURE__ */ jsx15("h1", { className: "mb-2 text-2xl font-semibold", children: "Recover with your guardians" }),
|
|
4153
|
+
/* @__PURE__ */ jsx15("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Paste the share codes your guardians gave you \u2014 one per line. You need enough of them to restore your identity; we\u2019ll tell you when you have enough." }),
|
|
4154
|
+
/* @__PURE__ */ jsx15(
|
|
4019
4155
|
"textarea",
|
|
4020
4156
|
{
|
|
4021
4157
|
autoFocus: true,
|
|
@@ -4029,14 +4165,14 @@ function GuardianRecoveryScreen() {
|
|
|
4029
4165
|
className: "mb-2 w-80 max-w-full resize-none rounded-lg border border-border bg-muted/30 p-3 font-mono text-xs outline-none focus:border-primary"
|
|
4030
4166
|
}
|
|
4031
4167
|
),
|
|
4032
|
-
/* @__PURE__ */
|
|
4168
|
+
/* @__PURE__ */ jsx15("div", { className: "mb-4 h-5 text-xs", children: /* @__PURE__ */ jsx15(
|
|
4033
4169
|
"span",
|
|
4034
4170
|
{
|
|
4035
4171
|
className: context.error || invalidCount > 0 ? "text-destructive" : "text-muted-foreground",
|
|
4036
4172
|
children: hint
|
|
4037
4173
|
}
|
|
4038
4174
|
) }),
|
|
4039
|
-
/* @__PURE__ */
|
|
4175
|
+
/* @__PURE__ */ jsx15(
|
|
4040
4176
|
"button",
|
|
4041
4177
|
{
|
|
4042
4178
|
disabled: !canRecover,
|
|
@@ -4045,7 +4181,7 @@ function GuardianRecoveryScreen() {
|
|
|
4045
4181
|
children: "Recover my identity"
|
|
4046
4182
|
}
|
|
4047
4183
|
),
|
|
4048
|
-
/* @__PURE__ */
|
|
4184
|
+
/* @__PURE__ */ jsx15(
|
|
4049
4185
|
"button",
|
|
4050
4186
|
{
|
|
4051
4187
|
className: "text-sm text-muted-foreground transition-colors hover:text-foreground",
|
|
@@ -4058,11 +4194,11 @@ function GuardianRecoveryScreen() {
|
|
|
4058
4194
|
|
|
4059
4195
|
// src/onboarding/screens/RecoveryPhraseScreen.tsx
|
|
4060
4196
|
import { validateRecoveryPhrase } from "@xnetjs/identity";
|
|
4061
|
-
import { useMemo as useMemo16, useState as
|
|
4062
|
-
import { jsx as
|
|
4197
|
+
import { useMemo as useMemo16, useState as useState26 } from "react";
|
|
4198
|
+
import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
4063
4199
|
function RecoveryPhraseScreen() {
|
|
4064
4200
|
const { send, context } = useOnboarding();
|
|
4065
|
-
const [phrase, setPhrase] =
|
|
4201
|
+
const [phrase, setPhrase] = useState26("");
|
|
4066
4202
|
const validation = useMemo16(() => validateRecoveryPhrase(phrase), [phrase]);
|
|
4067
4203
|
const empty = phrase.trim().length === 0;
|
|
4068
4204
|
const hint = (() => {
|
|
@@ -4072,10 +4208,10 @@ function RecoveryPhraseScreen() {
|
|
|
4072
4208
|
}
|
|
4073
4209
|
return `Not in the wordlist: ${validation.unknownWords.join(", ")}`;
|
|
4074
4210
|
})();
|
|
4075
|
-
return /* @__PURE__ */
|
|
4076
|
-
/* @__PURE__ */
|
|
4077
|
-
/* @__PURE__ */
|
|
4078
|
-
/* @__PURE__ */
|
|
4211
|
+
return /* @__PURE__ */ jsxs14("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
|
|
4212
|
+
/* @__PURE__ */ jsx16("h1", { className: "mb-2 text-2xl font-semibold", children: "Enter your recovery phrase" }),
|
|
4213
|
+
/* @__PURE__ */ jsx16("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Type the recovery phrase you saved. It restores the same identity and your encrypted data on this device." }),
|
|
4214
|
+
/* @__PURE__ */ jsx16(
|
|
4079
4215
|
"textarea",
|
|
4080
4216
|
{
|
|
4081
4217
|
autoFocus: true,
|
|
@@ -4089,11 +4225,11 @@ function RecoveryPhraseScreen() {
|
|
|
4089
4225
|
className: "mb-2 w-80 max-w-full resize-none rounded-lg border border-border bg-muted/30 p-3 font-mono text-sm outline-none focus:border-primary"
|
|
4090
4226
|
}
|
|
4091
4227
|
),
|
|
4092
|
-
/* @__PURE__ */
|
|
4093
|
-
hint && /* @__PURE__ */
|
|
4094
|
-
context.error && !hint && /* @__PURE__ */
|
|
4228
|
+
/* @__PURE__ */ jsxs14("div", { className: "mb-4 h-5 text-xs", children: [
|
|
4229
|
+
hint && /* @__PURE__ */ jsx16("span", { className: "text-destructive", children: hint }),
|
|
4230
|
+
context.error && !hint && /* @__PURE__ */ jsx16("span", { className: "text-destructive", children: context.error.message })
|
|
4095
4231
|
] }),
|
|
4096
|
-
/* @__PURE__ */
|
|
4232
|
+
/* @__PURE__ */ jsx16(
|
|
4097
4233
|
"button",
|
|
4098
4234
|
{
|
|
4099
4235
|
disabled: !validation.ok,
|
|
@@ -4102,7 +4238,7 @@ function RecoveryPhraseScreen() {
|
|
|
4102
4238
|
children: "Recover my identity"
|
|
4103
4239
|
}
|
|
4104
4240
|
),
|
|
4105
|
-
/* @__PURE__ */
|
|
4241
|
+
/* @__PURE__ */ jsx16(
|
|
4106
4242
|
"button",
|
|
4107
4243
|
{
|
|
4108
4244
|
className: "text-sm text-muted-foreground transition-colors hover:text-foreground",
|
|
@@ -4114,12 +4250,12 @@ function RecoveryPhraseScreen() {
|
|
|
4114
4250
|
}
|
|
4115
4251
|
|
|
4116
4252
|
// src/onboarding/screens/ShowRecoveryPhraseScreen.tsx
|
|
4117
|
-
import { useState as
|
|
4118
|
-
import { jsx as
|
|
4253
|
+
import { useState as useState27 } from "react";
|
|
4254
|
+
import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
4119
4255
|
function ShowRecoveryPhraseScreen() {
|
|
4120
4256
|
const { send, context } = useOnboarding();
|
|
4121
|
-
const [saved, setSaved] =
|
|
4122
|
-
const [copied, setCopied] =
|
|
4257
|
+
const [saved, setSaved] = useState27(false);
|
|
4258
|
+
const [copied, setCopied] = useState27(false);
|
|
4123
4259
|
const phrase = context.recoveryPhrase ?? "";
|
|
4124
4260
|
const words = phrase.split(" ").filter(Boolean);
|
|
4125
4261
|
const copy = () => {
|
|
@@ -4128,14 +4264,14 @@ function ShowRecoveryPhraseScreen() {
|
|
|
4128
4264
|
() => setCopied(false)
|
|
4129
4265
|
);
|
|
4130
4266
|
};
|
|
4131
|
-
return /* @__PURE__ */
|
|
4132
|
-
/* @__PURE__ */
|
|
4133
|
-
/* @__PURE__ */
|
|
4134
|
-
/* @__PURE__ */
|
|
4135
|
-
/* @__PURE__ */
|
|
4136
|
-
/* @__PURE__ */
|
|
4267
|
+
return /* @__PURE__ */ jsxs15("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
|
|
4268
|
+
/* @__PURE__ */ jsx17("h1", { className: "mb-2 text-2xl font-semibold", children: "Save your recovery phrase" }),
|
|
4269
|
+
/* @__PURE__ */ jsx17("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Write these words down and keep them somewhere safe. They are the only way to recover your workspace if you lose your passkey \u2014 we can\u2019t recover them for you." }),
|
|
4270
|
+
/* @__PURE__ */ jsx17("ol", { className: "mb-3 grid w-80 max-w-full grid-cols-2 gap-x-6 gap-y-1 rounded-lg border border-border bg-muted/30 p-4 font-mono text-sm", children: words.map((word, i) => /* @__PURE__ */ jsxs15("li", { className: "flex gap-2", children: [
|
|
4271
|
+
/* @__PURE__ */ jsx17("span", { className: "w-5 select-none text-right text-muted-foreground", children: i + 1 }),
|
|
4272
|
+
/* @__PURE__ */ jsx17("span", { children: word })
|
|
4137
4273
|
] }, `${i}-${word}`)) }),
|
|
4138
|
-
/* @__PURE__ */
|
|
4274
|
+
/* @__PURE__ */ jsx17(
|
|
4139
4275
|
"button",
|
|
4140
4276
|
{
|
|
4141
4277
|
className: "mb-5 text-xs text-muted-foreground transition-colors hover:text-foreground",
|
|
@@ -4143,8 +4279,8 @@ function ShowRecoveryPhraseScreen() {
|
|
|
4143
4279
|
children: copied ? "Copied \u2713" : "Copy to clipboard"
|
|
4144
4280
|
}
|
|
4145
4281
|
),
|
|
4146
|
-
/* @__PURE__ */
|
|
4147
|
-
/* @__PURE__ */
|
|
4282
|
+
/* @__PURE__ */ jsxs15("label", { className: "mb-4 flex max-w-xs cursor-pointer items-start gap-2 text-sm text-muted-foreground", children: [
|
|
4283
|
+
/* @__PURE__ */ jsx17(
|
|
4148
4284
|
"input",
|
|
4149
4285
|
{
|
|
4150
4286
|
type: "checkbox",
|
|
@@ -4155,7 +4291,7 @@ function ShowRecoveryPhraseScreen() {
|
|
|
4155
4291
|
),
|
|
4156
4292
|
"I\u2019ve saved my recovery phrase somewhere safe."
|
|
4157
4293
|
] }),
|
|
4158
|
-
/* @__PURE__ */
|
|
4294
|
+
/* @__PURE__ */ jsx17(
|
|
4159
4295
|
"button",
|
|
4160
4296
|
{
|
|
4161
4297
|
disabled: !saved,
|
|
@@ -4168,52 +4304,54 @@ function ShowRecoveryPhraseScreen() {
|
|
|
4168
4304
|
}
|
|
4169
4305
|
|
|
4170
4306
|
// src/onboarding/OnboardingFlow.tsx
|
|
4171
|
-
import { Fragment, jsx as
|
|
4307
|
+
import { Fragment, jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
4172
4308
|
function OnboardingFlow({ connectToHub, children }) {
|
|
4173
4309
|
const { state } = useOnboarding();
|
|
4174
4310
|
switch (state) {
|
|
4175
4311
|
case "welcome":
|
|
4176
|
-
return /* @__PURE__ */
|
|
4312
|
+
return /* @__PURE__ */ jsx18(WelcomeScreen, {});
|
|
4177
4313
|
case "authenticating":
|
|
4178
|
-
return /* @__PURE__ */
|
|
4314
|
+
return /* @__PURE__ */ jsx18(AuthenticatingScreen, {});
|
|
4179
4315
|
case "auth-error":
|
|
4180
|
-
return /* @__PURE__ */
|
|
4316
|
+
return /* @__PURE__ */ jsx18(AuthErrorScreen, {});
|
|
4181
4317
|
case "unsupported-browser":
|
|
4182
|
-
return /* @__PURE__ */
|
|
4318
|
+
return /* @__PURE__ */ jsx18(UnsupportedBrowserScreen, {});
|
|
4183
4319
|
case "import-identity":
|
|
4184
|
-
return /* @__PURE__ */
|
|
4320
|
+
return /* @__PURE__ */ jsx18(ImportIdentityScreen, {});
|
|
4185
4321
|
case "qr-scan":
|
|
4186
|
-
return /* @__PURE__ */
|
|
4187
|
-
/* @__PURE__ */
|
|
4188
|
-
/* @__PURE__ */
|
|
4322
|
+
return /* @__PURE__ */ jsxs16("div", { className: "flex flex-col items-center justify-center min-h-screen bg-background text-foreground p-6", children: [
|
|
4323
|
+
/* @__PURE__ */ jsx18("h1", { className: "text-2xl font-semibold mb-2", children: "QR Scan" }),
|
|
4324
|
+
/* @__PURE__ */ jsx18("p", { className: "text-muted-foreground", children: "Coming soon \u2014 scan a QR code from another device." })
|
|
4189
4325
|
] });
|
|
4190
4326
|
case "recovery-phrase":
|
|
4191
|
-
return /* @__PURE__ */
|
|
4327
|
+
return /* @__PURE__ */ jsx18(RecoveryPhraseScreen, {});
|
|
4192
4328
|
case "guardian-recovery":
|
|
4193
|
-
return /* @__PURE__ */
|
|
4329
|
+
return /* @__PURE__ */ jsx18(GuardianRecoveryScreen, {});
|
|
4330
|
+
case "atproto-ceremony":
|
|
4331
|
+
return /* @__PURE__ */ jsx18(AtprotoCeremonyScreen, {});
|
|
4194
4332
|
case "creating-recoverable":
|
|
4195
|
-
return /* @__PURE__ */
|
|
4333
|
+
return /* @__PURE__ */ jsx18(AuthenticatingScreen, {});
|
|
4196
4334
|
case "show-recovery-phrase":
|
|
4197
|
-
return /* @__PURE__ */
|
|
4335
|
+
return /* @__PURE__ */ jsx18(ShowRecoveryPhraseScreen, {});
|
|
4198
4336
|
case "connecting-hub":
|
|
4199
|
-
return /* @__PURE__ */
|
|
4337
|
+
return /* @__PURE__ */ jsx18(HubConnectScreen, { connectToHub });
|
|
4200
4338
|
case "ready":
|
|
4201
|
-
return /* @__PURE__ */
|
|
4339
|
+
return /* @__PURE__ */ jsx18(ReadyScreen, {});
|
|
4202
4340
|
case "complete":
|
|
4203
|
-
return /* @__PURE__ */
|
|
4341
|
+
return /* @__PURE__ */ jsx18(Fragment, { children });
|
|
4204
4342
|
default:
|
|
4205
|
-
return /* @__PURE__ */
|
|
4343
|
+
return /* @__PURE__ */ jsx18(WelcomeScreen, {});
|
|
4206
4344
|
}
|
|
4207
4345
|
}
|
|
4208
4346
|
|
|
4209
4347
|
// src/onboarding/screens/SmartWelcome.tsx
|
|
4210
4348
|
import { discoverExistingPasskey } from "@xnetjs/identity";
|
|
4211
|
-
import { useEffect as useEffect20, useState as
|
|
4212
|
-
import { jsx as
|
|
4349
|
+
import { useEffect as useEffect20, useState as useState28 } from "react";
|
|
4350
|
+
import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
4213
4351
|
function SmartWelcome() {
|
|
4214
4352
|
const { send } = useOnboarding();
|
|
4215
|
-
const [checking, setChecking] =
|
|
4216
|
-
const [hasExisting, setHasExisting] =
|
|
4353
|
+
const [checking, setChecking] = useState28(true);
|
|
4354
|
+
const [hasExisting, setHasExisting] = useState28(false);
|
|
4217
4355
|
useEffect20(() => {
|
|
4218
4356
|
let cancelled = false;
|
|
4219
4357
|
discoverExistingPasskey().then((passkey) => {
|
|
@@ -4231,31 +4369,31 @@ function SmartWelcome() {
|
|
|
4231
4369
|
};
|
|
4232
4370
|
}, []);
|
|
4233
4371
|
if (checking) {
|
|
4234
|
-
return /* @__PURE__ */
|
|
4372
|
+
return /* @__PURE__ */ jsx19("div", { className: "onboarding-screen", children: /* @__PURE__ */ jsx19("p", { className: "spinner-text", children: "Checking for existing identity..." }) });
|
|
4235
4373
|
}
|
|
4236
4374
|
if (hasExisting) {
|
|
4237
4375
|
const authName = getPlatformAuthName();
|
|
4238
|
-
return /* @__PURE__ */
|
|
4239
|
-
/* @__PURE__ */
|
|
4240
|
-
/* @__PURE__ */
|
|
4376
|
+
return /* @__PURE__ */ jsxs17("div", { className: "onboarding-screen welcome-back", children: [
|
|
4377
|
+
/* @__PURE__ */ jsx19("h1", { children: "Welcome back!" }),
|
|
4378
|
+
/* @__PURE__ */ jsxs17("p", { className: "subtitle", children: [
|
|
4241
4379
|
"We found your xNet identity. Use ",
|
|
4242
4380
|
authName,
|
|
4243
4381
|
" to sign in."
|
|
4244
4382
|
] }),
|
|
4245
|
-
/* @__PURE__ */
|
|
4383
|
+
/* @__PURE__ */ jsxs17("button", { className: "primary-button", onClick: () => send({ type: "AUTHENTICATE" }), children: [
|
|
4246
4384
|
"Sign in with ",
|
|
4247
4385
|
authName
|
|
4248
4386
|
] }),
|
|
4249
|
-
/* @__PURE__ */
|
|
4387
|
+
/* @__PURE__ */ jsx19("button", { className: "text-button", onClick: () => send({ type: "CREATE_NEW" }), children: "Create a new identity instead" })
|
|
4250
4388
|
] });
|
|
4251
4389
|
}
|
|
4252
|
-
return /* @__PURE__ */
|
|
4390
|
+
return /* @__PURE__ */ jsx19(WelcomeScreen, {});
|
|
4253
4391
|
}
|
|
4254
4392
|
|
|
4255
4393
|
// src/onboarding/screens/SyncProgressOverlay.tsx
|
|
4256
4394
|
import { formatBytes as formatBytes2 } from "@xnetjs/core";
|
|
4257
4395
|
import { useEffect as useEffect21 } from "react";
|
|
4258
|
-
import { Fragment as Fragment2, jsx as
|
|
4396
|
+
import { Fragment as Fragment2, jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
4259
4397
|
function SyncProgressOverlay({
|
|
4260
4398
|
progress,
|
|
4261
4399
|
onComplete
|
|
@@ -4266,14 +4404,14 @@ function SyncProgressOverlay({
|
|
|
4266
4404
|
return () => clearTimeout(timer);
|
|
4267
4405
|
}
|
|
4268
4406
|
}, [progress.phase, onComplete]);
|
|
4269
|
-
return /* @__PURE__ */
|
|
4270
|
-
progress.phase === "connecting" && /* @__PURE__ */
|
|
4271
|
-
/* @__PURE__ */
|
|
4272
|
-
/* @__PURE__ */
|
|
4407
|
+
return /* @__PURE__ */ jsx20("div", { className: "sync-progress-overlay", children: /* @__PURE__ */ jsxs18("div", { className: "sync-card", children: [
|
|
4408
|
+
progress.phase === "connecting" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
|
|
4409
|
+
/* @__PURE__ */ jsx20("h2", { children: "Connecting to server..." }),
|
|
4410
|
+
/* @__PURE__ */ jsx20("p", { className: "spinner-text", children: "Please wait" })
|
|
4273
4411
|
] }),
|
|
4274
|
-
progress.phase === "syncing" && /* @__PURE__ */
|
|
4275
|
-
/* @__PURE__ */
|
|
4276
|
-
/* @__PURE__ */
|
|
4412
|
+
progress.phase === "syncing" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
|
|
4413
|
+
/* @__PURE__ */ jsx20("h2", { children: "Syncing your data" }),
|
|
4414
|
+
/* @__PURE__ */ jsx20("div", { className: "progress-bar", children: /* @__PURE__ */ jsx20(
|
|
4277
4415
|
"div",
|
|
4278
4416
|
{
|
|
4279
4417
|
className: "progress-fill",
|
|
@@ -4282,29 +4420,29 @@ function SyncProgressOverlay({
|
|
|
4282
4420
|
}
|
|
4283
4421
|
}
|
|
4284
4422
|
) }),
|
|
4285
|
-
/* @__PURE__ */
|
|
4423
|
+
/* @__PURE__ */ jsxs18("p", { className: "progress-text", children: [
|
|
4286
4424
|
progress.roomsSynced,
|
|
4287
4425
|
" of ",
|
|
4288
4426
|
progress.roomsTotal,
|
|
4289
4427
|
" items"
|
|
4290
4428
|
] }),
|
|
4291
|
-
/* @__PURE__ */
|
|
4429
|
+
/* @__PURE__ */ jsxs18("p", { className: "bytes-text", children: [
|
|
4292
4430
|
formatBytes2(progress.bytesReceived),
|
|
4293
4431
|
" received"
|
|
4294
4432
|
] })
|
|
4295
4433
|
] }),
|
|
4296
|
-
progress.phase === "complete" && /* @__PURE__ */
|
|
4297
|
-
/* @__PURE__ */
|
|
4298
|
-
/* @__PURE__ */
|
|
4434
|
+
progress.phase === "complete" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
|
|
4435
|
+
/* @__PURE__ */ jsx20("h2", { children: "All synced!" }),
|
|
4436
|
+
/* @__PURE__ */ jsxs18("p", { children: [
|
|
4299
4437
|
progress.roomsTotal,
|
|
4300
4438
|
" items synchronized"
|
|
4301
4439
|
] })
|
|
4302
4440
|
] }),
|
|
4303
|
-
progress.phase === "error" && /* @__PURE__ */
|
|
4304
|
-
/* @__PURE__ */
|
|
4305
|
-
/* @__PURE__ */
|
|
4306
|
-
progress.error && /* @__PURE__ */
|
|
4307
|
-
/* @__PURE__ */
|
|
4441
|
+
progress.phase === "error" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
|
|
4442
|
+
/* @__PURE__ */ jsx20("h2", { children: "Sync issue" }),
|
|
4443
|
+
/* @__PURE__ */ jsx20("p", { children: "Some data may not be up to date." }),
|
|
4444
|
+
progress.error && /* @__PURE__ */ jsx20("p", { className: "error-detail", children: progress.error.message }),
|
|
4445
|
+
/* @__PURE__ */ jsx20("button", { className: "primary-button", onClick: onComplete, children: "Continue anyway" })
|
|
4308
4446
|
] })
|
|
4309
4447
|
] }) });
|
|
4310
4448
|
}
|
|
@@ -4369,60 +4507,60 @@ function isTaskOverdue(timestamp, completed) {
|
|
|
4369
4507
|
|
|
4370
4508
|
// src/components/PageTasksPanel.tsx
|
|
4371
4509
|
import { Calendar, CheckSquare2, ChevronDown, ChevronRight, Square, Users } from "lucide-react";
|
|
4372
|
-
import { useMemo as useMemo17, useState as
|
|
4373
|
-
import { jsx as
|
|
4510
|
+
import { useMemo as useMemo17, useState as useState29 } from "react";
|
|
4511
|
+
import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
4374
4512
|
function PageTasksPanel({ pageId }) {
|
|
4375
|
-
const [expanded, setExpanded] =
|
|
4513
|
+
const [expanded, setExpanded] = useState29(true);
|
|
4376
4514
|
const { tree, loading } = useTasks({ pageId });
|
|
4377
4515
|
const rows = useMemo17(() => flattenTaskTree(tree), [tree]);
|
|
4378
|
-
return /* @__PURE__ */
|
|
4379
|
-
/* @__PURE__ */
|
|
4516
|
+
return /* @__PURE__ */ jsxs19("div", { className: "mt-8 overflow-hidden rounded-lg border border-border", children: [
|
|
4517
|
+
/* @__PURE__ */ jsx21(
|
|
4380
4518
|
"button",
|
|
4381
4519
|
{
|
|
4382
4520
|
className: "w-full cursor-pointer border-none bg-secondary p-3 px-4 text-left",
|
|
4383
4521
|
onClick: () => setExpanded((value) => !value),
|
|
4384
4522
|
type: "button",
|
|
4385
|
-
children: /* @__PURE__ */
|
|
4386
|
-
/* @__PURE__ */
|
|
4523
|
+
children: /* @__PURE__ */ jsxs19("h3", { className: "m-0 flex items-center justify-between text-sm font-semibold text-foreground", children: [
|
|
4524
|
+
/* @__PURE__ */ jsxs19("span", { children: [
|
|
4387
4525
|
"Tasks on this page (",
|
|
4388
4526
|
rows.length,
|
|
4389
4527
|
")"
|
|
4390
4528
|
] }),
|
|
4391
|
-
expanded ? /* @__PURE__ */
|
|
4529
|
+
expanded ? /* @__PURE__ */ jsx21(ChevronDown, { size: 16, className: "text-muted-foreground" }) : /* @__PURE__ */ jsx21(ChevronRight, { size: 16, className: "text-muted-foreground" })
|
|
4392
4530
|
] })
|
|
4393
4531
|
}
|
|
4394
4532
|
),
|
|
4395
|
-
expanded && /* @__PURE__ */
|
|
4533
|
+
expanded && /* @__PURE__ */ jsx21("div", { className: "p-3", children: loading ? /* @__PURE__ */ jsx21("p", { className: "m-0 text-sm text-muted-foreground", children: "Loading tasks..." }) : rows.length === 0 ? /* @__PURE__ */ jsx21("p", { className: "m-0 text-sm text-muted-foreground", children: "Checklist items on this page will appear here." }) : /* @__PURE__ */ jsx21("ul", { className: "m-0 list-none space-y-1 p-0", children: rows.map((task) => {
|
|
4396
4534
|
const dueDateLabel = formatTaskDueDate(task.dueDate);
|
|
4397
4535
|
const overdue = isTaskOverdue(task.dueDate, task.completed);
|
|
4398
|
-
return /* @__PURE__ */
|
|
4536
|
+
return /* @__PURE__ */ jsx21("li", { children: /* @__PURE__ */ jsxs19(
|
|
4399
4537
|
"div",
|
|
4400
4538
|
{
|
|
4401
4539
|
className: "flex items-start gap-2 rounded-md px-2 py-2 transition-colors hover:bg-accent/40",
|
|
4402
4540
|
style: { paddingLeft: `${task.depth * 18 + 8}px` },
|
|
4403
4541
|
children: [
|
|
4404
|
-
task.completed ? /* @__PURE__ */
|
|
4405
|
-
/* @__PURE__ */
|
|
4406
|
-
/* @__PURE__ */
|
|
4542
|
+
task.completed ? /* @__PURE__ */ jsx21(CheckSquare2, { size: 15, className: "mt-0.5 flex-shrink-0 text-primary" }) : /* @__PURE__ */ jsx21(Square, { size: 15, className: "mt-0.5 flex-shrink-0 text-muted-foreground" }),
|
|
4543
|
+
/* @__PURE__ */ jsxs19("div", { className: "min-w-0 flex-1", children: [
|
|
4544
|
+
/* @__PURE__ */ jsx21(
|
|
4407
4545
|
"div",
|
|
4408
4546
|
{
|
|
4409
4547
|
className: `text-sm ${task.completed ? "line-through text-muted-foreground" : "text-foreground"}`,
|
|
4410
4548
|
children: task.title
|
|
4411
4549
|
}
|
|
4412
4550
|
),
|
|
4413
|
-
/* @__PURE__ */
|
|
4414
|
-
dueDateLabel ? /* @__PURE__ */
|
|
4551
|
+
/* @__PURE__ */ jsxs19("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground", children: [
|
|
4552
|
+
dueDateLabel ? /* @__PURE__ */ jsxs19(
|
|
4415
4553
|
"span",
|
|
4416
4554
|
{
|
|
4417
4555
|
className: `inline-flex items-center gap-1 ${overdue ? "text-red-500" : "text-muted-foreground"}`,
|
|
4418
4556
|
children: [
|
|
4419
|
-
/* @__PURE__ */
|
|
4557
|
+
/* @__PURE__ */ jsx21(Calendar, { size: 11 }),
|
|
4420
4558
|
dueDateLabel
|
|
4421
4559
|
]
|
|
4422
4560
|
}
|
|
4423
4561
|
) : null,
|
|
4424
|
-
task.assigneeCount > 0 ? /* @__PURE__ */
|
|
4425
|
-
/* @__PURE__ */
|
|
4562
|
+
task.assigneeCount > 0 ? /* @__PURE__ */ jsxs19("span", { className: "inline-flex items-center gap-1", children: [
|
|
4563
|
+
/* @__PURE__ */ jsx21(Users, { size: 11 }),
|
|
4426
4564
|
task.assigneeCount
|
|
4427
4565
|
] }) : null
|
|
4428
4566
|
] })
|
|
@@ -4436,7 +4574,7 @@ function PageTasksPanel({ pageId }) {
|
|
|
4436
4574
|
|
|
4437
4575
|
// src/components/TaskCollectionEmbed.tsx
|
|
4438
4576
|
import { useMemo as useMemo18 } from "react";
|
|
4439
|
-
import { jsx as
|
|
4577
|
+
import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
4440
4578
|
function TaskCollectionEmbed({
|
|
4441
4579
|
currentPageId,
|
|
4442
4580
|
currentDid,
|
|
@@ -4469,33 +4607,33 @@ function TaskCollectionEmbed({
|
|
|
4469
4607
|
}));
|
|
4470
4608
|
}, [data, showHierarchy, tree]);
|
|
4471
4609
|
if (missingPageContext) {
|
|
4472
|
-
return /* @__PURE__ */
|
|
4610
|
+
return /* @__PURE__ */ jsx22("div", { className: "p-4 text-sm text-muted-foreground", children: "This view needs a page context." });
|
|
4473
4611
|
}
|
|
4474
4612
|
if (loading) {
|
|
4475
|
-
return /* @__PURE__ */
|
|
4613
|
+
return /* @__PURE__ */ jsx22("div", { className: "p-4 text-sm text-muted-foreground", children: "Loading tasks..." });
|
|
4476
4614
|
}
|
|
4477
4615
|
if (rows.length === 0) {
|
|
4478
|
-
return /* @__PURE__ */
|
|
4616
|
+
return /* @__PURE__ */ jsx22("div", { className: "p-4 text-sm text-muted-foreground", children: "No tasks match the saved filters for this view." });
|
|
4479
4617
|
}
|
|
4480
|
-
return /* @__PURE__ */
|
|
4618
|
+
return /* @__PURE__ */ jsx22("div", { className: "p-3", children: /* @__PURE__ */ jsx22("ul", { className: "m-0 list-none space-y-1 p-0", children: rows.map((task) => {
|
|
4481
4619
|
const dueDateLabel = formatTaskDueDate(task.dueDate);
|
|
4482
4620
|
const overdue = isTaskOverdue(task.dueDate, task.completed);
|
|
4483
|
-
return /* @__PURE__ */
|
|
4621
|
+
return /* @__PURE__ */ jsx22("li", { children: /* @__PURE__ */ jsxs20(
|
|
4484
4622
|
"div",
|
|
4485
4623
|
{
|
|
4486
4624
|
className: "flex items-start gap-2 rounded-lg px-2 py-2 hover:bg-accent/40",
|
|
4487
4625
|
style: { paddingLeft: `${task.depth * 18 + 8}px` },
|
|
4488
4626
|
children: [
|
|
4489
|
-
/* @__PURE__ */
|
|
4490
|
-
/* @__PURE__ */
|
|
4491
|
-
/* @__PURE__ */
|
|
4627
|
+
/* @__PURE__ */ jsx22("span", { className: task.completed ? "text-primary" : "text-muted-foreground", children: task.completed ? "\u2611" : "\u2610" }),
|
|
4628
|
+
/* @__PURE__ */ jsxs20("div", { className: "min-w-0 flex-1", children: [
|
|
4629
|
+
/* @__PURE__ */ jsx22(
|
|
4492
4630
|
"div",
|
|
4493
4631
|
{
|
|
4494
4632
|
className: task.completed ? "truncate text-sm text-muted-foreground line-through" : "truncate text-sm text-foreground",
|
|
4495
4633
|
children: task.title
|
|
4496
4634
|
}
|
|
4497
4635
|
),
|
|
4498
|
-
dueDateLabel ? /* @__PURE__ */
|
|
4636
|
+
dueDateLabel ? /* @__PURE__ */ jsx22(
|
|
4499
4637
|
"div",
|
|
4500
4638
|
{
|
|
4501
4639
|
className: overdue ? "mt-1 text-[11px] text-red-500" : "mt-1 text-[11px] text-muted-foreground",
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
flattenNode,
|
|
3
3
|
useQuery,
|
|
4
4
|
useSyncManager
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-RW3DSDKO.js";
|
|
6
6
|
import {
|
|
7
7
|
useInstrumentation
|
|
8
8
|
} from "./chunk-JCOFKBOB.js";
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
useNodeStore,
|
|
12
12
|
useXNet,
|
|
13
13
|
useXNetInternal
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-5ILJMPKO.js";
|
|
15
15
|
|
|
16
16
|
// src/hooks/useInfiniteQuery.ts
|
|
17
17
|
import { createQueryDescriptor, serializeQueryDescriptor } from "@xnetjs/data-bridge";
|
package/dist/core.js
CHANGED
|
@@ -5,16 +5,16 @@ import {
|
|
|
5
5
|
useInfiniteQuery,
|
|
6
6
|
useIsOffline,
|
|
7
7
|
useNode
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-UVJJN33U.js";
|
|
9
9
|
import {
|
|
10
10
|
useMutate,
|
|
11
11
|
useQuery
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-RW3DSDKO.js";
|
|
13
13
|
import "./chunk-JCOFKBOB.js";
|
|
14
14
|
import {
|
|
15
15
|
XNetProvider,
|
|
16
16
|
useXNet
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-5ILJMPKO.js";
|
|
18
18
|
export {
|
|
19
19
|
ErrorBoundary,
|
|
20
20
|
OfflineIndicator,
|
package/dist/database.js
CHANGED
|
@@ -1100,7 +1100,7 @@ declare function useSyncManager(): SyncManager | null;
|
|
|
1100
1100
|
* welcome → import-identity → qr-scan/recovery-phrase → connecting-hub
|
|
1101
1101
|
*/
|
|
1102
1102
|
|
|
1103
|
-
type OnboardingState = 'welcome' | 'authenticating' | 'auth-error' | 'unsupported-browser' | 'import-identity' | 'qr-scan' | 'recovery-phrase' | 'guardian-recovery' | 'creating-recoverable' | 'show-recovery-phrase' | 'connecting-hub' | 'ready' | 'complete';
|
|
1103
|
+
type OnboardingState = 'welcome' | 'authenticating' | 'auth-error' | 'unsupported-browser' | 'import-identity' | 'qr-scan' | 'recovery-phrase' | 'guardian-recovery' | 'atproto-ceremony' | 'creating-recoverable' | 'show-recovery-phrase' | 'connecting-hub' | 'ready' | 'complete';
|
|
1104
1104
|
type OnboardingEvent = {
|
|
1105
1105
|
type: 'AUTHENTICATE';
|
|
1106
1106
|
} | {
|
|
@@ -1157,6 +1157,16 @@ type OnboardingEvent = {
|
|
|
1157
1157
|
phrase: string;
|
|
1158
1158
|
} | {
|
|
1159
1159
|
type: 'PHRASE_SAVED';
|
|
1160
|
+
} | {
|
|
1161
|
+
type: 'CONTINUE_WITH_ATPROTO';
|
|
1162
|
+
} | {
|
|
1163
|
+
type: 'ATPROTO_LINKED';
|
|
1164
|
+
atprotoDid: string;
|
|
1165
|
+
atprotoHandle: string;
|
|
1166
|
+
displayName?: string;
|
|
1167
|
+
} | {
|
|
1168
|
+
type: 'ATPROTO_CEREMONY_FAILED';
|
|
1169
|
+
error: Error;
|
|
1160
1170
|
};
|
|
1161
1171
|
type OnboardingMachineContext = {
|
|
1162
1172
|
identity: Identity | null;
|
|
@@ -1166,6 +1176,11 @@ type OnboardingMachineContext = {
|
|
|
1166
1176
|
isDemo: boolean;
|
|
1167
1177
|
/** The recovery phrase to show once, after creating a recoverable identity (0243). */
|
|
1168
1178
|
recoveryPhrase: string | null;
|
|
1179
|
+
/** Linked ATProto identity from the login-door ceremony (0322/0338), if any. */
|
|
1180
|
+
atprotoDid: string | null;
|
|
1181
|
+
atprotoHandle: string | null;
|
|
1182
|
+
/** Display name pulled from the ATProto profile, to pre-fill the xNet profile. */
|
|
1183
|
+
atprotoDisplayName: string | null;
|
|
1169
1184
|
};
|
|
1170
1185
|
type OnboardingReducerState = {
|
|
1171
1186
|
state: OnboardingState;
|
|
@@ -1174,6 +1189,39 @@ type OnboardingReducerState = {
|
|
|
1174
1189
|
declare function onboardingReducer(current: OnboardingReducerState, event: OnboardingEvent): OnboardingReducerState;
|
|
1175
1190
|
declare function createInitialState(hubUrl?: string): OnboardingReducerState;
|
|
1176
1191
|
|
|
1192
|
+
/**
|
|
1193
|
+
* @xnetjs/react/onboarding - ATProto login-door ceremony contract (0322/0338).
|
|
1194
|
+
*
|
|
1195
|
+
* The actual OAuth 2.1 / PKCE / DPoP dance lives in `@atproto/oauth-client-*`,
|
|
1196
|
+
* which is heavy and browser/redirect-bound. To keep `@xnetjs/react`
|
|
1197
|
+
* dependency-light and unit-testable, the ceremony is *injected*: the host app
|
|
1198
|
+
* (apps/web, apps/electron) provides a `runAtprotoCeremony` that resolves to
|
|
1199
|
+
* the linked identity, and — after the xNet passkey identity is created — a
|
|
1200
|
+
* `writeBinding` that puts the signed `net.x.identity.binding` record into the
|
|
1201
|
+
* user's repo. The onboarding machine wires the two around the existing
|
|
1202
|
+
* passkey-create step.
|
|
1203
|
+
*/
|
|
1204
|
+
interface AtprotoCeremonyResult {
|
|
1205
|
+
/** The proven ATProto DID (`did:plc:…` / `did:web:…`). */
|
|
1206
|
+
atprotoDid: string;
|
|
1207
|
+
/** The handle the user authenticated with (e.g. `alice.bsky.social`). */
|
|
1208
|
+
atprotoHandle: string;
|
|
1209
|
+
/** Optional display name pulled from the ATProto profile, to pre-fill xNet. */
|
|
1210
|
+
displayName?: string;
|
|
1211
|
+
/**
|
|
1212
|
+
* Finish the binding once the xNet identity exists: sign
|
|
1213
|
+
* `net.x.identity.binding` with the new xNet key and `putRecord` it. Called
|
|
1214
|
+
* with the freshly created xNet DID + signing key. Optional — a login-only
|
|
1215
|
+
* flow may skip writing the binding record.
|
|
1216
|
+
*/
|
|
1217
|
+
writeBinding?: (xnetDid: string, signingKey: Uint8Array) => Promise<void>;
|
|
1218
|
+
}
|
|
1219
|
+
/** Start the ATProto OAuth ceremony for a handle/PDS the user typed. */
|
|
1220
|
+
type RunAtprotoCeremony = (input: {
|
|
1221
|
+
/** Handle or PDS host the user entered, e.g. `alice.bsky.social`. */
|
|
1222
|
+
handleOrPds: string;
|
|
1223
|
+
}) => Promise<AtprotoCeremonyResult>;
|
|
1224
|
+
|
|
1177
1225
|
/**
|
|
1178
1226
|
* @xnetjs/react/onboarding - React context provider for the onboarding flow
|
|
1179
1227
|
*/
|
|
@@ -1182,6 +1230,14 @@ type OnboardingContextValue = {
|
|
|
1182
1230
|
state: OnboardingState;
|
|
1183
1231
|
context: OnboardingMachineContext;
|
|
1184
1232
|
send: (event: OnboardingEvent) => void;
|
|
1233
|
+
/** Whether the ATProto login door is available (host supplied a ceremony). */
|
|
1234
|
+
atprotoEnabled: boolean;
|
|
1235
|
+
/**
|
|
1236
|
+
* Run the ATProto login door for a typed handle/PDS (0322/0338): OAuth
|
|
1237
|
+
* ceremony → existing passkey-create → write the binding record. No-op when
|
|
1238
|
+
* the ceremony was not provided.
|
|
1239
|
+
*/
|
|
1240
|
+
startAtprotoCeremony: (handleOrPds: string) => void;
|
|
1185
1241
|
};
|
|
1186
1242
|
type OnboardingProviderProps = {
|
|
1187
1243
|
children: ReactNode;
|
|
@@ -1189,8 +1245,14 @@ type OnboardingProviderProps = {
|
|
|
1189
1245
|
defaultHubUrl?: string;
|
|
1190
1246
|
/** Called when onboarding completes */
|
|
1191
1247
|
onComplete?: (identity: Identity, keyBundle: KeyBundle) => void;
|
|
1248
|
+
/**
|
|
1249
|
+
* ATProto login-door ceremony (0322/0338). When provided, the "Continue with
|
|
1250
|
+
* Bluesky (or any PDS)" door is offered; the host app supplies the OAuth
|
|
1251
|
+
* implementation. When omitted, the door is hidden.
|
|
1252
|
+
*/
|
|
1253
|
+
runAtprotoCeremony?: RunAtprotoCeremony;
|
|
1192
1254
|
};
|
|
1193
|
-
declare function OnboardingProvider({ children, defaultHubUrl, onComplete }: OnboardingProviderProps): JSX.Element;
|
|
1255
|
+
declare function OnboardingProvider({ children, defaultHubUrl, onComplete, runAtprotoCeremony }: OnboardingProviderProps): JSX.Element;
|
|
1194
1256
|
/**
|
|
1195
1257
|
* Access the onboarding state machine from within an OnboardingProvider.
|
|
1196
1258
|
*/
|
|
@@ -1619,4 +1681,4 @@ declare function useView(type: string): ViewContribution | undefined;
|
|
|
1619
1681
|
*/
|
|
1620
1682
|
declare function useCommand(id: string): CommandContribution | undefined;
|
|
1621
1683
|
|
|
1622
|
-
export { summarizeReactionNode as $, type AddCommentOptions as A, selectPublicInteractionMode as B, type CommentThread as C, summarizeModerationLabel as D, summarizePublicInteractionPolicy as E, type CommentVisibility as F, type FirstContactMode as G, type ModeratedCommentThread as H, type InteractionPermission as I, type ModerationFilterOptions as J, type ModerationLabelSummary as K, type PublicInteractionMode as L, type ModeratedCommentNode as M, type PublicInteractionPolicySnapshot as N, type PublicInteractionSurface as O, type PageTaskInput as P, type PublicModerationMode as Q, type ReplyContext as R, type UseModeratedThreadOptions as S, type TaskProjectionInput as T, type UseTaskProjectionSyncResult as U, type UseVisibleCommentsOptions as V, type UseVisibleCommentsResult as W, usePolicyFilteredReactionCounters as X, createReactionCounterSnapshot as Y, dedupeReactions as Z, isReactionVisible as _, type TaskTreeItem as a, type RemoteSchemaDefinition as a$, type AddReactionOptions as a0, type ReactionCounterSnapshot as a1, type ReactionNode as a2, type ReactionType as a3, type UsePolicyFilteredReactionCountersOptions as a4, type UsePolicyFilteredReactionCountersResult as a5, useMessageRequests as a6, createConversationKey as a7, createMessageRequestProperties as a8, evaluateFirstContactDecision as a9, type UseBlameResult as aA, useVerification as aB, type UseVerificationResult as aC, useHubStatus as aD, useCan as aE, type UseCanResult as aF, useCanEdit as aG, type UseCanEditResult as aH, describeGrantConsent as aI, useGrants as aJ, type GrantConsentSummary as aK, type GrantInput as aL, type UseGrantsResult as aM, summarizeAuthTrace as aN, useAuthTrace as aO, type AuthTraceSummary as aP, type UseAuthTraceResult as aQ, useBackup as aR, type UseBackupReturn as aS, useFileUpload as aT, type FileRef as aU, type UseFileUploadReturn as aV, useHubSearch as aW, type HubSearchOptions as aX, type HubSearchResult as aY, type HubSearchState as aZ, useRemoteSchema as a_, findLatestMessageRequest as aa, hasAcceptedContact as ab, summarizeMessageRequest as ac, type CreateMessageRequestOptions as ad, type FirstContactAdmission as ae, type FirstContactDecision as af, type FirstContactDecisionInput as ag, type FirstContactVisibility as ah, type MessageRequestNode as ai, type MessageRequestProperties as aj, type MessageRequestStatus as ak, type UseMessageRequestsOptions as al, type UseMessageRequestsResult as am, useCommentCount as an, useCommentCounts as ao, useHistory as ap, type UseHistoryResult as aq, useUndo as ar, type UseUndoResult as as, type UseUndoOptions as at, useAudit as au, type UseAuditResult as av, type UseAuditOptions as aw, useDiff as ax, type UseDiffResult as ay, useBlame as az, type UseFindOptions as b,
|
|
1684
|
+
export { summarizeReactionNode as $, type AddCommentOptions as A, selectPublicInteractionMode as B, type CommentThread as C, summarizeModerationLabel as D, summarizePublicInteractionPolicy as E, type CommentVisibility as F, type FirstContactMode as G, type ModeratedCommentThread as H, type InteractionPermission as I, type ModerationFilterOptions as J, type ModerationLabelSummary as K, type PublicInteractionMode as L, type ModeratedCommentNode as M, type PublicInteractionPolicySnapshot as N, type PublicInteractionSurface as O, type PageTaskInput as P, type PublicModerationMode as Q, type ReplyContext as R, type UseModeratedThreadOptions as S, type TaskProjectionInput as T, type UseTaskProjectionSyncResult as U, type UseVisibleCommentsOptions as V, type UseVisibleCommentsResult as W, usePolicyFilteredReactionCounters as X, createReactionCounterSnapshot as Y, dedupeReactions as Z, isReactionVisible as _, type TaskTreeItem as a, type RemoteSchemaDefinition as a$, type AddReactionOptions as a0, type ReactionCounterSnapshot as a1, type ReactionNode as a2, type ReactionType as a3, type UsePolicyFilteredReactionCountersOptions as a4, type UsePolicyFilteredReactionCountersResult as a5, useMessageRequests as a6, createConversationKey as a7, createMessageRequestProperties as a8, evaluateFirstContactDecision as a9, type UseBlameResult as aA, useVerification as aB, type UseVerificationResult as aC, useHubStatus as aD, useCan as aE, type UseCanResult as aF, useCanEdit as aG, type UseCanEditResult as aH, describeGrantConsent as aI, useGrants as aJ, type GrantConsentSummary as aK, type GrantInput as aL, type UseGrantsResult as aM, summarizeAuthTrace as aN, useAuthTrace as aO, type AuthTraceSummary as aP, type UseAuthTraceResult as aQ, useBackup as aR, type UseBackupReturn as aS, useFileUpload as aT, type FileRef as aU, type UseFileUploadReturn as aV, useHubSearch as aW, type HubSearchOptions as aX, type HubSearchResult as aY, type HubSearchState as aZ, useRemoteSchema as a_, findLatestMessageRequest as aa, hasAcceptedContact as ab, summarizeMessageRequest as ac, type CreateMessageRequestOptions as ad, type FirstContactAdmission as ae, type FirstContactDecision as af, type FirstContactDecisionInput as ag, type FirstContactVisibility as ah, type MessageRequestNode as ai, type MessageRequestProperties as aj, type MessageRequestStatus as ak, type UseMessageRequestsOptions as al, type UseMessageRequestsResult as am, useCommentCount as an, useCommentCounts as ao, useHistory as ap, type UseHistoryResult as aq, useUndo as ar, type UseUndoResult as as, type UseUndoOptions as at, useAudit as au, type UseAuditResult as av, type UseAuditOptions as aw, useDiff as ax, type UseDiffResult as ay, useBlame as az, type UseFindOptions as b, usePlugins as b$, type RemoteSchemaState as b0, usePeerDiscovery as b1, type DiscoveredPeer as b2, HubStatusIndicator as b3, Skeleton as b4, injectSkeletonStyles as b5, type SkeletonProps as b6, DemoBanner as b7, type DemoBannerProps as b8, DemoQuotaIndicator as b9, type OnboardingContextValue as bA, type OnboardingFlowProps as bB, type OnboardingState as bC, type OnboardingEvent as bD, type OnboardingMachineContext as bE, type OnboardingReducerState as bF, type QuickStartTemplate as bG, type SyncProgressOverlayProps as bH, type RunAtprotoCeremony as bI, type AtprotoCeremonyResult as bJ, PageTasksPanel as bK, type PageTasksPanelProps as bL, TaskCollectionEmbed as bM, type TaskCollectionEmbedProps as bN, SecurityProvider as bO, useSecurityContext as bP, useSecurityContextOptional as bQ, type SecurityContextState as bR, type SecurityContextActions as bS, type SecurityContextValue as bT, type SecurityProviderProps as bU, useSecurity as bV, type UseSecurityOptions as bW, type UseSecurityResult as bX, PluginRegistryContext as bY, usePluginRegistry as bZ, usePluginRegistryOptional as b_, type DemoQuotaIndicatorProps as ba, DemoDataExpiredScreen as bb, useDemoMode as bc, type DemoModeState as bd, type DemoLimits as be, type DemoUsage as bf, useSyncManager as bg, OnboardingProvider as bh, useOnboarding as bi, OnboardingFlow as bj, WelcomeScreen as bk, AuthenticatingScreen as bl, AuthErrorScreen as bm, UnsupportedBrowserScreen as bn, ImportIdentityScreen as bo, HubConnectScreen as bp, ReadyScreen as bq, SmartWelcome as br, SyncProgressOverlay as bs, onboardingReducer as bt, createInitialState as bu, QUICK_START_TEMPLATES as bv, getPlatformAuthName as bw, truncateDid as bx, copyToClipboard as by, type OnboardingProviderProps as bz, type UseFindResult as c, useContributions as c0, useViews as c1, useCommands as c2, useSlashCommands as c3, useSidebarItems as c4, useImporters as c5, useEditorExtensions as c6, useEditorExtensionsSafe as c7, useMergedEditorContributions as c8, mergeEditorContributions as c9, type MergedEditorContributions as ca, useView as cb, useCommand as cc, usePageTaskSync as d, type PageTaskReferenceInput as e, type UsePageTaskSyncOptions as f, type UsePageTaskSyncResult as g, useTaskProjectionSync as h, type TaskProjectionReferenceInput as i, type TaskProjectionHost as j, type UseTaskProjectionSyncOptions as k, useTasks as l, type UseTasksOptions as m, type UseTasksResult as n, useComments as o, type UseCommentsOptions as p, type UseCommentsResult as q, type CommentNode as r, useVisibleComments as s, useModeratedThread as t, useFind as u, createModerationLabelIndex as v, evaluateCommentModeration as w, evaluateInteractionPermission as x, moderateThread as y, selectActiveInteractionPolicy as z };
|
package/dist/experimental.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as AddCommentOptions, a0 as AddReactionOptions, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission,
|
|
1
|
+
export { A as AddCommentOptions, a0 as AddReactionOptions, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission, ca as MergedEditorContributions, ai as MessageRequestNode, aj as MessageRequestProperties, ak as MessageRequestStatus, M as ModeratedCommentNode, H as ModeratedCommentThread, J as ModerationFilterOptions, K as ModerationLabelSummary, bA as OnboardingContextValue, bD as OnboardingEvent, bj as OnboardingFlow, bB as OnboardingFlowProps, bE as OnboardingMachineContext, bh as OnboardingProvider, bz as OnboardingProviderProps, bF as OnboardingReducerState, bC as OnboardingState, P as PageTaskInput, e as PageTaskReferenceInput, bK as PageTasksPanel, bL as PageTasksPanelProps, bY as PluginRegistryContext, L as PublicInteractionMode, N as PublicInteractionPolicySnapshot, O as PublicInteractionSurface, Q as PublicModerationMode, bv as QUICK_START_TEMPLATES, bG as QuickStartTemplate, a1 as ReactionCounterSnapshot, a2 as ReactionNode, a3 as ReactionType, bq as ReadyScreen, a$ as RemoteSchemaDefinition, b0 as RemoteSchemaState, R as ReplyContext, bS as SecurityContextActions, bR as SecurityContextState, bT as SecurityContextValue, bO as SecurityProvider, bU as SecurityProviderProps, b4 as Skeleton, b6 as SkeletonProps, br as SmartWelcome, bs as SyncProgressOverlay, bH as SyncProgressOverlayProps, bM as TaskCollectionEmbed, bN as TaskCollectionEmbedProps, a as TaskTreeItem, bn as UnsupportedBrowserScreen, aw as UseAuditOptions, av as UseAuditResult, aQ as UseAuthTraceResult, aS as UseBackupReturn, aA as UseBlameResult, aH as UseCanEditResult, aF as UseCanResult, p as UseCommentsOptions, q as UseCommentsResult, ay as UseDiffResult, aV as UseFileUploadReturn, b as UseFindOptions, c as UseFindResult, aM as UseGrantsResult, aq as UseHistoryResult, al as UseMessageRequestsOptions, am as UseMessageRequestsResult, S as UseModeratedThreadOptions, f as UsePageTaskSyncOptions, g as UsePageTaskSyncResult, a4 as UsePolicyFilteredReactionCountersOptions, a5 as UsePolicyFilteredReactionCountersResult, bW as UseSecurityOptions, bX as UseSecurityResult, m as UseTasksOptions, n as UseTasksResult, at as UseUndoOptions, as as UseUndoResult, aC as UseVerificationResult, V as UseVisibleCommentsOptions, W as UseVisibleCommentsResult, bk as WelcomeScreen, by as copyToClipboard, a7 as createConversationKey, bu as createInitialState, a8 as createMessageRequestProperties, v as createModerationLabelIndex, Y as createReactionCounterSnapshot, Z as dedupeReactions, aI as describeGrantConsent, w as evaluateCommentModeration, a9 as evaluateFirstContactDecision, x as evaluateInteractionPermission, aa as findLatestMessageRequest, bw as getPlatformAuthName, ab as hasAcceptedContact, b5 as injectSkeletonStyles, _ as isReactionVisible, c9 as mergeEditorContributions, y as moderateThread, bt as onboardingReducer, z as selectActiveInteractionPolicy, B as selectPublicInteractionMode, aN as summarizeAuthTrace, ac as summarizeMessageRequest, D as summarizeModerationLabel, E as summarizePublicInteractionPolicy, $ as summarizeReactionNode, bx as truncateDid, au as useAudit, aO as useAuthTrace, aR as useBackup, az as useBlame, aE as useCan, aG as useCanEdit, cc as useCommand, c2 as useCommands, an as useCommentCount, ao as useCommentCounts, o as useComments, c0 as useContributions, bc as useDemoMode, ax as useDiff, c6 as useEditorExtensions, c7 as useEditorExtensionsSafe, aT as useFileUpload, u as useFind, aJ as useGrants, ap as useHistory, aW as useHubSearch, aD as useHubStatus, c8 as useMergedEditorContributions, a6 as useMessageRequests, t as useModeratedThread, bi as useOnboarding, d as usePageTaskSync, b1 as usePeerDiscovery, bZ as usePluginRegistry, b_ as usePluginRegistryOptional, b$ as usePlugins, X as usePolicyFilteredReactionCounters, a_ as useRemoteSchema, bV as useSecurity, bP as useSecurityContext, bQ as useSecurityContextOptional, c4 as useSidebarItems, c3 as useSlashCommands, bg as useSyncManager, l as useTasks, ar as useUndo, aB as useVerification, cb as useView, c1 as useViews, s as useVisibleComments } from './experimental-Dv0MIlsc.js';
|
|
2
2
|
export { i as FlattenNodeOptions, f as flattenNode, e as flattenNodes, h as flattenNodesWithSchemaCheck, g as flattenUnknownSchemaNode } from './useQuery-D7ajycrc.js';
|
|
3
3
|
export { BlobStoreForSync, ConnectionManager, ConnectionManagerConfig, ConnectionStatus, InitialSyncManager, InitialSyncMessage, METABRIDGE_ORIGIN, METABRIDGE_SEED_ORIGIN, MetaBridge, NodePool, NodePoolConfig, NodeStoreSyncProvider, NodeSyncResponse, OfflineQueue, OfflineQueueConfig, PoolEntryState, ProgressListener, QueueEntry, Registry, RegistryConfig, RegistryStorage, SerializedNodeChange, SyncLifecyclePhase, SyncLifecycleState, SyncManager, SyncManagerConfig, SyncStatus as SyncManagerStatus, SyncPhase, SyncProgress, TrackedNode, WebSocketSyncProvider, WebSocketSyncProviderOptions, createConnectionManager, createInitialSyncManager, createMetaBridge, createNodePool, createOfflineQueue, createRegistry, createSyncManager } from '@xnetjs/runtime';
|
|
4
4
|
export { I as InstrumentationContext, a as InstrumentationContextValue, Q as QueryTrackerLike, Y as YDocRegistryLike, u as useInstrumentation } from './instrumentation-CpIuG2y5.js';
|
package/dist/experimental.js
CHANGED
|
@@ -73,14 +73,14 @@ import {
|
|
|
73
73
|
useUndo,
|
|
74
74
|
useVerification,
|
|
75
75
|
useVisibleComments
|
|
76
|
-
} from "./chunk-
|
|
76
|
+
} from "./chunk-CZUUWSJ7.js";
|
|
77
77
|
import {
|
|
78
78
|
flattenNode,
|
|
79
79
|
flattenNodes,
|
|
80
80
|
flattenNodesWithSchemaCheck,
|
|
81
81
|
flattenUnknownSchemaNode,
|
|
82
82
|
useSyncManager
|
|
83
|
-
} from "./chunk-
|
|
83
|
+
} from "./chunk-RW3DSDKO.js";
|
|
84
84
|
import {
|
|
85
85
|
InstrumentationContext,
|
|
86
86
|
useInstrumentation
|
|
@@ -106,7 +106,7 @@ import {
|
|
|
106
106
|
useTelemetryReporter,
|
|
107
107
|
useView,
|
|
108
108
|
useViews
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-5ILJMPKO.js";
|
|
110
110
|
|
|
111
111
|
// src/experimental.ts
|
|
112
112
|
import { WebSocketSyncProvider } from "@xnetjs/runtime";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Q as QueryFilter, a as QueryStatus, F as FlatNode, b as QueryPlanSummary } from './useQuery-D7ajycrc.js';
|
|
2
2
|
export { i as FlattenNodeOptions, M as MigrationWarning, c as QueryListResult, d as QuerySingleResult, S as SortDirection, f as flattenNode, e as flattenNodes, h as flattenNodesWithSchemaCheck, g as flattenUnknownSchemaNode, u as useQuery } from './useQuery-D7ajycrc.js';
|
|
3
3
|
export { ErrorBoundary, ErrorBoundaryProps, InfiniteQueryFilter, InfiniteQueryPage, InfiniteQueryResult, MutateCreate, MutateDelete, MutateOp, MutateRestore, MutateUpdate, OfflineIndicator, OfflineIndicatorProps, PresenceUser, SyncStatus, UseIdentityResult, UseMutateResult, UseNodeOptions, UseNodeResult, useIdentity, useInfiniteQuery, useIsOffline, useMutate, useNode } from './core.js';
|
|
4
|
-
import { U as UseTaskProjectionSyncResult, T as TaskProjectionInput, a as TaskTreeItem } from './experimental-
|
|
5
|
-
export { A as AddCommentOptions, a0 as AddReactionOptions, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission,
|
|
4
|
+
import { U as UseTaskProjectionSyncResult, T as TaskProjectionInput, a as TaskTreeItem } from './experimental-Dv0MIlsc.js';
|
|
5
|
+
export { A as AddCommentOptions, a0 as AddReactionOptions, bJ as AtprotoCeremonyResult, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission, ca as MergedEditorContributions, ai as MessageRequestNode, aj as MessageRequestProperties, ak as MessageRequestStatus, M as ModeratedCommentNode, H as ModeratedCommentThread, J as ModerationFilterOptions, K as ModerationLabelSummary, bA as OnboardingContextValue, bD as OnboardingEvent, bj as OnboardingFlow, bB as OnboardingFlowProps, bE as OnboardingMachineContext, bh as OnboardingProvider, bz as OnboardingProviderProps, bF as OnboardingReducerState, bC as OnboardingState, P as PageTaskInput, e as PageTaskReferenceInput, bK as PageTasksPanel, bL as PageTasksPanelProps, bY as PluginRegistryContext, L as PublicInteractionMode, N as PublicInteractionPolicySnapshot, O as PublicInteractionSurface, Q as PublicModerationMode, bv as QUICK_START_TEMPLATES, bG as QuickStartTemplate, a1 as ReactionCounterSnapshot, a2 as ReactionNode, a3 as ReactionType, bq as ReadyScreen, a$ as RemoteSchemaDefinition, b0 as RemoteSchemaState, R as ReplyContext, bI as RunAtprotoCeremony, bS as SecurityContextActions, bR as SecurityContextState, bT as SecurityContextValue, bO as SecurityProvider, bU as SecurityProviderProps, b4 as Skeleton, b6 as SkeletonProps, br as SmartWelcome, bs as SyncProgressOverlay, bH as SyncProgressOverlayProps, bM as TaskCollectionEmbed, bN as TaskCollectionEmbedProps, j as TaskProjectionHost, i as TaskProjectionReferenceInput, bn as UnsupportedBrowserScreen, aw as UseAuditOptions, av as UseAuditResult, aQ as UseAuthTraceResult, aS as UseBackupReturn, aA as UseBlameResult, aH as UseCanEditResult, aF as UseCanResult, p as UseCommentsOptions, q as UseCommentsResult, ay as UseDiffResult, aV as UseFileUploadReturn, b as UseFindOptions, c as UseFindResult, aM as UseGrantsResult, aq as UseHistoryResult, al as UseMessageRequestsOptions, am as UseMessageRequestsResult, S as UseModeratedThreadOptions, f as UsePageTaskSyncOptions, g as UsePageTaskSyncResult, a4 as UsePolicyFilteredReactionCountersOptions, a5 as UsePolicyFilteredReactionCountersResult, bW as UseSecurityOptions, bX as UseSecurityResult, k as UseTaskProjectionSyncOptions, m as UseTasksOptions, n as UseTasksResult, at as UseUndoOptions, as as UseUndoResult, aC as UseVerificationResult, V as UseVisibleCommentsOptions, W as UseVisibleCommentsResult, bk as WelcomeScreen, by as copyToClipboard, a7 as createConversationKey, bu as createInitialState, a8 as createMessageRequestProperties, v as createModerationLabelIndex, Y as createReactionCounterSnapshot, Z as dedupeReactions, aI as describeGrantConsent, w as evaluateCommentModeration, a9 as evaluateFirstContactDecision, x as evaluateInteractionPermission, aa as findLatestMessageRequest, bw as getPlatformAuthName, ab as hasAcceptedContact, b5 as injectSkeletonStyles, _ as isReactionVisible, c9 as mergeEditorContributions, y as moderateThread, bt as onboardingReducer, z as selectActiveInteractionPolicy, B as selectPublicInteractionMode, aN as summarizeAuthTrace, ac as summarizeMessageRequest, D as summarizeModerationLabel, E as summarizePublicInteractionPolicy, $ as summarizeReactionNode, bx as truncateDid, au as useAudit, aO as useAuthTrace, aR as useBackup, az as useBlame, aE as useCan, aG as useCanEdit, cc as useCommand, c2 as useCommands, an as useCommentCount, ao as useCommentCounts, o as useComments, c0 as useContributions, bc as useDemoMode, ax as useDiff, c6 as useEditorExtensions, c7 as useEditorExtensionsSafe, aT as useFileUpload, u as useFind, aJ as useGrants, ap as useHistory, aW as useHubSearch, aD as useHubStatus, c5 as useImporters, c8 as useMergedEditorContributions, a6 as useMessageRequests, t as useModeratedThread, bi as useOnboarding, d as usePageTaskSync, b1 as usePeerDiscovery, bZ as usePluginRegistry, b_ as usePluginRegistryOptional, b$ as usePlugins, X as usePolicyFilteredReactionCounters, a_ as useRemoteSchema, bV as useSecurity, bP as useSecurityContext, bQ as useSecurityContextOptional, c4 as useSidebarItems, c3 as useSlashCommands, bg as useSyncManager, h as useTaskProjectionSync, l as useTasks, ar as useUndo, aB as useVerification, cb as useView, c1 as useViews, s as useVisibleComments } from './experimental-Dv0MIlsc.js';
|
|
6
6
|
import { SchemaIRI, Schema, SavedViewDescriptor, DefinedSchema, PropertyBuilder, QueryASTOrderBy, QueryASTPage, QueryASTValidationResult, QueryASTPlannerGate, QueryASTAggregateExecution, ExternalReferenceProvider, SavedViewFeedLayout, SavedViewFeedDensity, FieldType, FieldConfig, ViewType, FilterGroup, SortConfig, RowHeight, SummaryFunction, FormViewConfig, FormFieldRule, ViewGroupMeta, MapViewport, CellValue, FormSubmissionMeta, NodeId, NodeState } from '@xnetjs/data';
|
|
7
7
|
export { ColumnConfig, ColumnDefinition, ColumnType, SavedViewFeedDensity, SavedViewFeedLayout, ViewConfig, ViewType } from '@xnetjs/data';
|
|
8
8
|
import { QueryExecutionMode, QuerySourcePreference, QuerySearchFilter, QueryPageInfo, QueryMetadata, QuerySpatialFilter } from '@xnetjs/data-bridge';
|
|
@@ -576,7 +576,7 @@ interface GridViewModel {
|
|
|
576
576
|
}
|
|
577
577
|
/**
|
|
578
578
|
* The per-view presentation config a view component may patch through
|
|
579
|
-
* `setViewConfig` (exploration
|
|
579
|
+
* `setViewConfig` (exploration 0339). One node write per patch — each
|
|
580
580
|
* property merges independently (LWW) with other clients' edits.
|
|
581
581
|
*/
|
|
582
582
|
interface GridViewConfigPatch {
|
|
@@ -621,7 +621,7 @@ interface UseGridDatabaseOptions {
|
|
|
621
621
|
maxLoaded?: number;
|
|
622
622
|
/**
|
|
623
623
|
* Spatial window over two cell properties (map views, exploration
|
|
624
|
-
*
|
|
624
|
+
* 0339): only rows inside the rect are fetched. Bypasses the
|
|
625
625
|
* materialized-view cache (the rect varies per pan).
|
|
626
626
|
*/
|
|
627
627
|
spatial?: QuerySpatialFilter;
|
|
@@ -643,7 +643,7 @@ interface UseGridDatabaseResult {
|
|
|
643
643
|
/** Rows: view filters + sorts applied to the fetched window */
|
|
644
644
|
rows: GridRowModel[];
|
|
645
645
|
/**
|
|
646
|
-
* The fetch window (exploration
|
|
646
|
+
* The fetch window (exploration 0339): `size` is the row cap, `total`
|
|
647
647
|
* the full match count when the bridge reports one. Views use this to
|
|
648
648
|
* label truncation honestly instead of silently clipping.
|
|
649
649
|
*/
|
|
@@ -664,7 +664,7 @@ interface UseGridDatabaseResult {
|
|
|
664
664
|
/**
|
|
665
665
|
* Write several cells (and optionally the row's sortKey) as ONE node
|
|
666
666
|
* update — a kanban card move is exactly one write carrying the group
|
|
667
|
-
* cell + the fractional position (exploration
|
|
667
|
+
* cell + the fractional position (exploration 0339).
|
|
668
668
|
*/
|
|
669
669
|
updateRowCells: (rowId: string, cells: Record<string, CellValue>, opts?: {
|
|
670
670
|
sortKey?: string;
|
|
@@ -691,7 +691,7 @@ interface UseGridDatabaseResult {
|
|
|
691
691
|
toggleSort: (fieldId: string) => Promise<void>;
|
|
692
692
|
setFilters: (filters: FilterGroup | null) => Promise<void>;
|
|
693
693
|
setGroupBy: (fieldId: string | null) => Promise<void>;
|
|
694
|
-
/** Patch the active view's presentation config (exploration
|
|
694
|
+
/** Patch the active view's presentation config (exploration 0339) */
|
|
695
695
|
setViewConfig: (patch: GridViewConfigPatch) => Promise<void>;
|
|
696
696
|
/** Persist a group's collapsed state on the active view */
|
|
697
697
|
setGroupCollapsed: (groupKey: string, collapsed: boolean) => Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
useInfiniteQuery,
|
|
6
6
|
useIsOffline,
|
|
7
7
|
useNode
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-UVJJN33U.js";
|
|
9
9
|
import {
|
|
10
10
|
useCell,
|
|
11
11
|
useDatabase,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
useDatabaseSchema,
|
|
15
15
|
useRelatedRows,
|
|
16
16
|
useReverseRelations
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-QSJJNEFY.js";
|
|
18
18
|
import {
|
|
19
19
|
AuthErrorScreen,
|
|
20
20
|
AuthenticatingScreen,
|
|
@@ -94,7 +94,7 @@ import {
|
|
|
94
94
|
useUndo,
|
|
95
95
|
useVerification,
|
|
96
96
|
useVisibleComments
|
|
97
|
-
} from "./chunk-
|
|
97
|
+
} from "./chunk-CZUUWSJ7.js";
|
|
98
98
|
import {
|
|
99
99
|
EMPTY_PAGE_INFO,
|
|
100
100
|
computeFallbackPageInfo,
|
|
@@ -106,10 +106,10 @@ import {
|
|
|
106
106
|
useMutate,
|
|
107
107
|
useQuery,
|
|
108
108
|
useSyncManager
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-RW3DSDKO.js";
|
|
110
110
|
import {
|
|
111
111
|
useUndoScope
|
|
112
|
-
} from "./chunk-
|
|
112
|
+
} from "./chunk-KK6VADMZ.js";
|
|
113
113
|
import {
|
|
114
114
|
InstrumentationContext,
|
|
115
115
|
useInstrumentation
|
|
@@ -144,7 +144,7 @@ import {
|
|
|
144
144
|
useView,
|
|
145
145
|
useViews,
|
|
146
146
|
useXNet
|
|
147
|
-
} from "./chunk-
|
|
147
|
+
} from "./chunk-5ILJMPKO.js";
|
|
148
148
|
|
|
149
149
|
// src/hooks/useEffectiveSchema.ts
|
|
150
150
|
import {
|
package/dist/internal.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useUndoScope
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KK6VADMZ.js";
|
|
4
4
|
import {
|
|
5
5
|
InstrumentationContext,
|
|
6
6
|
useInstrumentation
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
useNodeStore,
|
|
11
11
|
useXNet,
|
|
12
12
|
useXNetInternal
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-5ILJMPKO.js";
|
|
14
14
|
export {
|
|
15
15
|
InstrumentationContext,
|
|
16
16
|
useDataBridge,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xnetjs/react",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -46,15 +46,15 @@
|
|
|
46
46
|
"y-protocols": "^1.0.6",
|
|
47
47
|
"yjs": "^13.6.24",
|
|
48
48
|
"@xnetjs/billing": "0.0.2",
|
|
49
|
-
"@xnetjs/core": "2.
|
|
50
|
-
"@xnetjs/crypto": "2.
|
|
51
|
-
"@xnetjs/data": "2.
|
|
52
|
-
"@xnetjs/data-bridge": "2.
|
|
53
|
-
"@xnetjs/history": "2.
|
|
54
|
-
"@xnetjs/identity": "2.
|
|
55
|
-
"@xnetjs/plugins": "2.
|
|
56
|
-
"@xnetjs/runtime": "0.5.
|
|
57
|
-
"@xnetjs/sync": "2.
|
|
49
|
+
"@xnetjs/core": "2.4.0",
|
|
50
|
+
"@xnetjs/crypto": "2.4.0",
|
|
51
|
+
"@xnetjs/data": "2.4.0",
|
|
52
|
+
"@xnetjs/data-bridge": "2.4.0",
|
|
53
|
+
"@xnetjs/history": "2.4.0",
|
|
54
|
+
"@xnetjs/identity": "2.4.0",
|
|
55
|
+
"@xnetjs/plugins": "2.4.0",
|
|
56
|
+
"@xnetjs/runtime": "0.5.4",
|
|
57
|
+
"@xnetjs/sync": "2.4.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react": "^18.0.0 || ^19.0.0"
|