@tangle-network/agent-app 0.45.47 → 0.45.48
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/{DesignCanvas-P2ZVK6FM.js → DesignCanvas-QY2CA5GI.js} +2 -2
- package/dist/{DesignCanvasEditor-DGNCA54P.js → DesignCanvasEditor-CJ7PLX7A.js} +3 -3
- package/dist/{IntakeInterview-3ZIQMZS6.js → IntakeInterview-NJXKH35Q.js} +2 -2
- package/dist/InvitationsPanel-F2VY4TSL.js +9 -0
- package/dist/InviteAcceptPage-UT4452KT.js +7 -0
- package/dist/MembersPanel-N5CBOUXC.js +9 -0
- package/dist/{TimelineEditor-OTNPJ3SN.js → TimelineEditor-IYNKBSUX.js} +2 -2
- package/dist/assistant/index.d.ts +35 -10
- package/dist/assistant/index.js +234 -89
- package/dist/assistant/index.js.map +1 -1
- package/dist/chat-react/index.js +2 -1
- package/dist/chat-react/index.js.map +1 -1
- package/dist/{chunk-IUSO2XRE.js → chunk-5BACNOVR.js} +13 -14
- package/dist/chunk-5BACNOVR.js.map +1 -0
- package/dist/chunk-AULM4X7U.js +77 -0
- package/dist/chunk-AULM4X7U.js.map +1 -0
- package/dist/{chunk-ZX5UT4HF.js → chunk-C7AQW6US.js} +321 -240
- package/dist/chunk-C7AQW6US.js.map +1 -0
- package/dist/{chunk-VCPZ3HTN.js → chunk-DB2D2JBQ.js} +51 -27
- package/dist/chunk-DB2D2JBQ.js.map +1 -0
- package/dist/{chunk-TL37E5YY.js → chunk-DS2WE62K.js} +3 -3
- package/dist/{chunk-TL37E5YY.js.map → chunk-DS2WE62K.js.map} +1 -1
- package/dist/{chunk-PE67O2LH.js → chunk-GT4GTRGQ.js} +18 -13
- package/dist/chunk-GT4GTRGQ.js.map +1 -0
- package/dist/{chunk-BT4QFCTB.js → chunk-HSBJB46C.js} +13 -1
- package/dist/chunk-HSBJB46C.js.map +1 -0
- package/dist/{chunk-54FYYXAX.js → chunk-J6OJTFNE.js} +13 -10
- package/dist/chunk-J6OJTFNE.js.map +1 -0
- package/dist/chunk-MLG6XKPV.js +44 -0
- package/dist/chunk-MLG6XKPV.js.map +1 -0
- package/dist/{chunk-F4XLTVQ3.js → chunk-R6KGLGEJ.js} +18 -17
- package/dist/chunk-R6KGLGEJ.js.map +1 -0
- package/dist/{chunk-B62EZF52.js → chunk-RILGAFEL.js} +3 -3
- package/dist/{chunk-65OZT566.js → chunk-T7XPIBCX.js} +16 -14
- package/dist/chunk-T7XPIBCX.js.map +1 -0
- package/dist/{chunk-VOJB7MVG.js → chunk-XPFNEKHS.js} +70 -28
- package/dist/chunk-XPFNEKHS.js.map +1 -0
- package/dist/{chunk-GNPN6ED4.js → chunk-XVRHISF3.js} +127 -165
- package/dist/chunk-XVRHISF3.js.map +1 -0
- package/dist/design-canvas-react/index.js +14 -12
- package/dist/design-canvas-react/index.js.map +1 -1
- package/dist/design-canvas-react/lazy.js +1 -1
- package/dist/intakes-react/index.js +1 -1
- package/dist/intakes-react/lazy.js +1 -1
- package/dist/sequences-react/index.js +2 -2
- package/dist/studio/index.d.ts +13 -1
- package/dist/studio/index.js +13 -1
- package/dist/studio-react/index.js +100 -63
- package/dist/studio-react/index.js.map +1 -1
- package/dist/studio-react/studio.css +0 -56
- package/dist/teams-react/index.js +4 -3
- package/dist/teams-react/lazy.js +3 -3
- package/dist/web-react/index.d.ts +15 -11
- package/dist/web-react/index.js +6 -4
- package/dist/work-product-react/index.js +3 -21
- package/dist/work-product-react/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/InvitationsPanel-F56UOQXA.js +0 -8
- package/dist/InviteAcceptPage-P3QJC3C6.js +0 -7
- package/dist/MembersPanel-XNLF3SA4.js +0 -8
- package/dist/chunk-54FYYXAX.js.map +0 -1
- package/dist/chunk-65OZT566.js.map +0 -1
- package/dist/chunk-BT4QFCTB.js.map +0 -1
- package/dist/chunk-F4XLTVQ3.js.map +0 -1
- package/dist/chunk-GNPN6ED4.js.map +0 -1
- package/dist/chunk-IUSO2XRE.js.map +0 -1
- package/dist/chunk-PE67O2LH.js.map +0 -1
- package/dist/chunk-VCPZ3HTN.js.map +0 -1
- package/dist/chunk-VOJB7MVG.js.map +0 -1
- package/dist/chunk-ZX5UT4HF.js.map +0 -1
- /package/dist/{DesignCanvas-P2ZVK6FM.js.map → DesignCanvas-QY2CA5GI.js.map} +0 -0
- /package/dist/{DesignCanvasEditor-DGNCA54P.js.map → DesignCanvasEditor-CJ7PLX7A.js.map} +0 -0
- /package/dist/{IntakeInterview-3ZIQMZS6.js.map → IntakeInterview-NJXKH35Q.js.map} +0 -0
- /package/dist/{InvitationsPanel-F56UOQXA.js.map → InvitationsPanel-F2VY4TSL.js.map} +0 -0
- /package/dist/{InviteAcceptPage-P3QJC3C6.js.map → InviteAcceptPage-UT4452KT.js.map} +0 -0
- /package/dist/{MembersPanel-XNLF3SA4.js.map → MembersPanel-N5CBOUXC.js.map} +0 -0
- /package/dist/{TimelineEditor-OTNPJ3SN.js.map → TimelineEditor-IYNKBSUX.js.map} +0 -0
- /package/dist/{chunk-B62EZF52.js.map → chunk-RILGAFEL.js.map} +0 -0
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
// src/teams-react/components/InviteAcceptPage.tsx
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
// src/teams-react/components/BrandMark.tsx
|
|
5
|
+
import { lazy, Suspense } from "react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function MarkSpacer({ size }) {
|
|
8
|
+
return /* @__PURE__ */ jsx("span", { "aria-hidden": true, style: { display: "inline-block", width: size, height: size } });
|
|
9
|
+
}
|
|
10
|
+
var LazyKnot = lazy(async () => {
|
|
11
|
+
try {
|
|
12
|
+
const mod = await import("./brand/index.js");
|
|
13
|
+
return { default: mod.TangleKnot };
|
|
14
|
+
} catch {
|
|
15
|
+
return { default: MarkSpacer };
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
function BrandMark({ size, className }) {
|
|
19
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MarkSpacer, { size }), children: /* @__PURE__ */ jsx(LazyKnot, { size, className }) });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// src/teams-react/components/InviteAcceptPage.tsx
|
|
23
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
4
24
|
function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification }) {
|
|
5
25
|
const [accepting, setAccepting] = useState(false);
|
|
6
26
|
const [acceptError, setAcceptError] = useState(null);
|
|
@@ -8,16 +28,16 @@ function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification
|
|
|
8
28
|
const [resendingVerification, setResendingVerification] = useState(false);
|
|
9
29
|
const [verificationSent, setVerificationSent] = useState(false);
|
|
10
30
|
if (details.status === "invalid") {
|
|
11
|
-
return /* @__PURE__ */
|
|
31
|
+
return /* @__PURE__ */ jsx2(Shell, { title: "Invalid invitation", body: "This link is invalid or already used. Ask the workspace admin to send a new one.", children: /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "sign-in" }), children: "Go to sign in" }) });
|
|
12
32
|
}
|
|
13
33
|
if (details.status === "already-accepted") {
|
|
14
|
-
return /* @__PURE__ */
|
|
34
|
+
return /* @__PURE__ */ jsx2(Shell, { title: "Already accepted", body: "This invitation has already been accepted.", children: /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "open-app" }), children: "Open workspace" }) });
|
|
15
35
|
}
|
|
16
36
|
if (details.status === "expired") {
|
|
17
|
-
return /* @__PURE__ */
|
|
37
|
+
return /* @__PURE__ */ jsx2(Shell, { title: "Invitation expired", body: "This invitation has expired. Ask the workspace admin to send a new one.", children: /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "sign-in" }), children: "Go to sign in" }) });
|
|
18
38
|
}
|
|
19
39
|
if (details.status === "revoked") {
|
|
20
|
-
return /* @__PURE__ */
|
|
40
|
+
return /* @__PURE__ */ jsx2(Shell, { title: "Invitation revoked", body: "This invitation has been revoked. Ask the workspace admin to send a new one.", children: /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "sign-in" }), children: "Go to sign in" }) });
|
|
21
41
|
}
|
|
22
42
|
const workspaceName = details.workspaceName ?? "a workspace";
|
|
23
43
|
const inviterPrefix = details.inviterName ? `${details.inviterName} invited you` : "You've been invited";
|
|
@@ -27,26 +47,26 @@ function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification
|
|
|
27
47
|
/* @__PURE__ */ jsxs("p", { className: "mb-4 text-sm text-[var(--text-secondary)]", children: [
|
|
28
48
|
inviterPrefix,
|
|
29
49
|
" to join ",
|
|
30
|
-
/* @__PURE__ */
|
|
50
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-[var(--text-primary)]", children: workspaceName }),
|
|
31
51
|
roleSuffix,
|
|
32
52
|
"."
|
|
33
53
|
] }),
|
|
34
54
|
details.inviteEmail && /* @__PURE__ */ jsxs("p", { className: "mb-6 text-sm text-[var(--text-secondary)]", children: [
|
|
35
55
|
"Sign in or create an account with",
|
|
36
56
|
" ",
|
|
37
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-[var(--text-primary)]", children: details.inviteEmail }),
|
|
38
58
|
" to accept."
|
|
39
59
|
] }),
|
|
40
60
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
41
|
-
/* @__PURE__ */
|
|
42
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "sign-in" }), children: "Sign in" }),
|
|
62
|
+
/* @__PURE__ */ jsx2(SecondaryButton, { onClick: () => onNavigate({ kind: "sign-up" }), children: "Create account" })
|
|
43
63
|
] })
|
|
44
64
|
] });
|
|
45
65
|
}
|
|
46
66
|
if (accepted) {
|
|
47
|
-
return /* @__PURE__ */
|
|
67
|
+
return /* @__PURE__ */ jsx2(Shell, { title: "Welcome!", children: /* @__PURE__ */ jsxs("p", { className: "text-sm text-[var(--text-secondary)]", children: [
|
|
48
68
|
"You've joined ",
|
|
49
|
-
/* @__PURE__ */
|
|
69
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-[var(--text-primary)]", children: workspaceName }),
|
|
50
70
|
"."
|
|
51
71
|
] }) });
|
|
52
72
|
}
|
|
@@ -65,7 +85,7 @@ function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification
|
|
|
65
85
|
onNavigate({ kind: "open-app", workspaceId: result.workspaceId });
|
|
66
86
|
}
|
|
67
87
|
} catch (err) {
|
|
68
|
-
setAcceptError(err instanceof Error ? err.message : "Failed to accept
|
|
88
|
+
setAcceptError(err instanceof Error ? err.message : "Failed to accept invitation");
|
|
69
89
|
} finally {
|
|
70
90
|
setAccepting(false);
|
|
71
91
|
}
|
|
@@ -84,13 +104,13 @@ function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification
|
|
|
84
104
|
/* @__PURE__ */ jsxs("p", { className: "mb-4 text-sm text-[var(--text-secondary)]", children: [
|
|
85
105
|
inviterPrefix,
|
|
86
106
|
" to join ",
|
|
87
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-[var(--text-primary)]", children: workspaceName }),
|
|
88
108
|
roleSuffix,
|
|
89
109
|
"."
|
|
90
110
|
] }),
|
|
91
111
|
/* @__PURE__ */ jsxs("p", { className: "mb-4 text-sm text-[var(--text-secondary)]", children: [
|
|
92
112
|
"Signed in as ",
|
|
93
|
-
/* @__PURE__ */
|
|
113
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-[var(--text-primary)]", children: details.currentUserEmail })
|
|
94
114
|
] }),
|
|
95
115
|
expiryLabel && /* @__PURE__ */ jsxs("p", { className: "mb-4 text-xs text-[var(--text-muted)]", children: [
|
|
96
116
|
"This invitation expires on ",
|
|
@@ -103,13 +123,13 @@ function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification
|
|
|
103
123
|
role: "alert",
|
|
104
124
|
className: "mb-4 rounded-md border border-[var(--border-default)] px-4 py-2 text-sm text-[var(--text-warning)]",
|
|
105
125
|
children: [
|
|
106
|
-
"This
|
|
107
|
-
/* @__PURE__ */
|
|
126
|
+
"This invitation was sent to ",
|
|
127
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: details.inviteEmail }),
|
|
108
128
|
". Switch to that account to accept it."
|
|
109
129
|
]
|
|
110
130
|
}
|
|
111
131
|
),
|
|
112
|
-
needsVerification && /* @__PURE__ */
|
|
132
|
+
needsVerification && /* @__PURE__ */ jsx2(
|
|
113
133
|
"div",
|
|
114
134
|
{
|
|
115
135
|
role: "alert",
|
|
@@ -117,41 +137,45 @@ function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification
|
|
|
117
137
|
children: verificationSent ? "Verification email sent \u2014 check your inbox, then refresh this page to accept." : "Verify your email address before you can accept this invitation."
|
|
118
138
|
}
|
|
119
139
|
),
|
|
120
|
-
acceptError && /* @__PURE__ */
|
|
140
|
+
acceptError && /* @__PURE__ */ jsx2("p", { role: "alert", className: "mb-4 text-sm text-[var(--text-danger)]", children: acceptError }),
|
|
121
141
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
122
|
-
emailMismatch ? /* @__PURE__ */
|
|
142
|
+
emailMismatch ? /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "switch-account" }), children: "Switch account" }) : needsVerification ? onResendVerification ? /* @__PURE__ */ jsx2(
|
|
123
143
|
PrimaryButton,
|
|
124
144
|
{
|
|
125
145
|
onClick: () => void handleResendVerification(),
|
|
126
146
|
disabled: resendingVerification || verificationSent,
|
|
127
147
|
children: verificationSent ? "Verification sent" : resendingVerification ? "Sending\u2026" : "Resend verification email"
|
|
128
148
|
}
|
|
129
|
-
) : /* @__PURE__ */
|
|
130
|
-
/* @__PURE__ */
|
|
149
|
+
) : /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => onNavigate({ kind: "open-app" }), children: "Open app" }) : /* @__PURE__ */ jsx2(PrimaryButton, { onClick: () => void handleAccept(), disabled: accepting, children: accepting ? "Accepting\u2026" : "Accept invitation" }),
|
|
150
|
+
/* @__PURE__ */ jsx2(SecondaryButton, { onClick: () => onNavigate({ kind: "open-app" }), children: "Not now" })
|
|
131
151
|
] })
|
|
132
152
|
] });
|
|
133
153
|
}
|
|
134
154
|
function Shell({ title, body, children }) {
|
|
135
155
|
return /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-sm flex-col", children: [
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
|
|
156
|
+
/* @__PURE__ */ jsxs("span", { className: "mb-4 flex items-center gap-2 text-[var(--text-muted)]", children: [
|
|
157
|
+
/* @__PURE__ */ jsx2(BrandMark, { size: 22, className: "shrink-0" }),
|
|
158
|
+
/* @__PURE__ */ jsx2("span", { className: "text-[11px] font-semibold uppercase tracking-[0.05em]", children: "Tangle Teams" })
|
|
159
|
+
] }),
|
|
160
|
+
/* @__PURE__ */ jsx2("h1", { className: "mb-1 text-xl font-semibold tracking-tight text-[var(--text-primary)]", children: title }),
|
|
161
|
+
body && /* @__PURE__ */ jsx2("p", { className: "mb-6 text-sm text-[var(--text-secondary)]", children: body }),
|
|
138
162
|
children
|
|
139
163
|
] });
|
|
140
164
|
}
|
|
141
165
|
function PrimaryButton({ children, onClick, disabled }) {
|
|
142
|
-
return /* @__PURE__ */
|
|
166
|
+
return /* @__PURE__ */ jsx2(
|
|
143
167
|
"button",
|
|
144
168
|
{
|
|
145
169
|
type: "button",
|
|
146
170
|
onClick,
|
|
147
171
|
disabled,
|
|
148
|
-
className: "flex-1 rounded bg-[var(--brand-primary)] px-4 py-2 text-sm text-
|
|
172
|
+
className: "flex-1 rounded bg-[var(--brand-primary)] px-4 py-2 text-sm text-[hsl(var(--primary-foreground))] disabled:opacity-50",
|
|
149
173
|
children
|
|
150
174
|
}
|
|
151
175
|
);
|
|
152
176
|
}
|
|
153
177
|
function SecondaryButton({ children, onClick }) {
|
|
154
|
-
return /* @__PURE__ */
|
|
178
|
+
return /* @__PURE__ */ jsx2(
|
|
155
179
|
"button",
|
|
156
180
|
{
|
|
157
181
|
type: "button",
|
|
@@ -165,4 +189,4 @@ function SecondaryButton({ children, onClick }) {
|
|
|
165
189
|
export {
|
|
166
190
|
InviteAcceptPage
|
|
167
191
|
};
|
|
168
|
-
//# sourceMappingURL=chunk-
|
|
192
|
+
//# sourceMappingURL=chunk-DB2D2JBQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/teams-react/components/InviteAcceptPage.tsx","../src/teams-react/components/BrandMark.tsx"],"sourcesContent":["/**\n * Invite-accept surface for `/invite/:token`. Renders the invite state (valid /\n * invalid / already-accepted), handles the signed-out path (sign in or create\n * an account with the invited email), the email-mismatch path (switch account),\n * and the accept action. Callback-driven: the host supplies the resolved\n * `details` and `onAccept` / `onNavigate`, so this imports no app router or\n * fetch client. Styled with the shipped Tangle Quiet tokens (`var(--*)`).\n */\n\nimport { useState } from 'react'\nimport type { InviteAcceptPageProps } from '../contracts'\nimport { BrandMark } from './BrandMark'\n\nexport function InviteAcceptPage({ details, onAccept, onNavigate, onResendVerification }: InviteAcceptPageProps) {\n const [accepting, setAccepting] = useState(false)\n const [acceptError, setAcceptError] = useState<string | null>(null)\n const [accepted, setAccepted] = useState(false)\n const [resendingVerification, setResendingVerification] = useState(false)\n const [verificationSent, setVerificationSent] = useState(false)\n\n if (details.status === 'invalid') {\n return (\n <Shell title=\"Invalid invitation\" body=\"This link is invalid or already used. Ask the workspace admin to send a new one.\">\n <PrimaryButton onClick={() => onNavigate({ kind: 'sign-in' })}>Go to sign in</PrimaryButton>\n </Shell>\n )\n }\n\n if (details.status === 'already-accepted') {\n return (\n <Shell title=\"Already accepted\" body=\"This invitation has already been accepted.\">\n <PrimaryButton onClick={() => onNavigate({ kind: 'open-app' })}>Open workspace</PrimaryButton>\n </Shell>\n )\n }\n\n if (details.status === 'expired') {\n return (\n <Shell title=\"Invitation expired\" body=\"This invitation has expired. Ask the workspace admin to send a new one.\">\n <PrimaryButton onClick={() => onNavigate({ kind: 'sign-in' })}>Go to sign in</PrimaryButton>\n </Shell>\n )\n }\n\n if (details.status === 'revoked') {\n return (\n <Shell title=\"Invitation revoked\" body=\"This invitation has been revoked. Ask the workspace admin to send a new one.\">\n <PrimaryButton onClick={() => onNavigate({ kind: 'sign-in' })}>Go to sign in</PrimaryButton>\n </Shell>\n )\n }\n\n const workspaceName = details.workspaceName ?? 'a workspace'\n const inviterPrefix = details.inviterName ? `${details.inviterName} invited you` : \"You've been invited\"\n const roleSuffix = details.role ? ` as ${details.role}` : ''\n\n if (!details.currentUserEmail) {\n return (\n <Shell title=\"You've been invited\">\n <p className=\"mb-4 text-sm text-[var(--text-secondary)]\">\n {inviterPrefix} to join <span className=\"font-medium text-[var(--text-primary)]\">{workspaceName}</span>{roleSuffix}.\n </p>\n {details.inviteEmail && (\n <p className=\"mb-6 text-sm text-[var(--text-secondary)]\">\n Sign in or create an account with{' '}\n <span className=\"font-medium text-[var(--text-primary)]\">{details.inviteEmail}</span> to accept.\n </p>\n )}\n <div className=\"flex gap-2\">\n <PrimaryButton onClick={() => onNavigate({ kind: 'sign-in' })}>Sign in</PrimaryButton>\n <SecondaryButton onClick={() => onNavigate({ kind: 'sign-up' })}>Create account</SecondaryButton>\n </div>\n </Shell>\n )\n }\n\n if (accepted) {\n return (\n <Shell title=\"Welcome!\">\n <p className=\"text-sm text-[var(--text-secondary)]\">\n You've joined <span className=\"font-medium text-[var(--text-primary)]\">{workspaceName}</span>.\n </p>\n </Shell>\n )\n }\n\n const emailMismatch = Boolean(\n details.inviteEmail &&\n details.inviteEmail.toLowerCase() !== details.currentUserEmail.toLowerCase(),\n )\n const needsVerification = Boolean(details.needsEmailVerification) && !emailMismatch\n const expiryLabel = details.expiresAt != null\n ? new Date(details.expiresAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })\n : null\n\n async function handleAccept() {\n setAccepting(true)\n setAcceptError(null)\n try {\n const result = await onAccept()\n setAccepted(true)\n if (result && 'workspaceId' in result && result.workspaceId) {\n onNavigate({ kind: 'open-app', workspaceId: result.workspaceId })\n }\n } catch (err) {\n setAcceptError(err instanceof Error ? err.message : 'Failed to accept invitation')\n } finally {\n setAccepting(false)\n }\n }\n\n async function handleResendVerification() {\n if (!onResendVerification || resendingVerification) return\n setResendingVerification(true)\n try {\n await onResendVerification()\n setVerificationSent(true)\n } finally {\n setResendingVerification(false)\n }\n }\n\n return (\n <Shell title=\"Join workspace\">\n <p className=\"mb-4 text-sm text-[var(--text-secondary)]\">\n {inviterPrefix} to join <span className=\"font-medium text-[var(--text-primary)]\">{workspaceName}</span>{roleSuffix}.\n </p>\n <p className=\"mb-4 text-sm text-[var(--text-secondary)]\">\n Signed in as <span className=\"font-medium text-[var(--text-primary)]\">{details.currentUserEmail}</span>\n </p>\n {expiryLabel && (\n <p className=\"mb-4 text-xs text-[var(--text-muted)]\">This invitation expires on {expiryLabel}.</p>\n )}\n {emailMismatch && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-md border border-[var(--border-default)] px-4 py-2 text-sm text-[var(--text-warning)]\"\n >\n This invitation was sent to <span className=\"font-medium\">{details.inviteEmail}</span>. Switch to that account to accept it.\n </div>\n )}\n {needsVerification && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-md border border-[var(--border-default)] px-4 py-2 text-sm text-[var(--text-warning)]\"\n >\n {verificationSent\n ? 'Verification email sent — check your inbox, then refresh this page to accept.'\n : 'Verify your email address before you can accept this invitation.'}\n </div>\n )}\n {acceptError && (\n <p role=\"alert\" className=\"mb-4 text-sm text-[var(--text-danger)]\">{acceptError}</p>\n )}\n <div className=\"flex gap-2\">\n {emailMismatch ? (\n <PrimaryButton onClick={() => onNavigate({ kind: 'switch-account' })}>Switch account</PrimaryButton>\n ) : needsVerification ? (\n onResendVerification ? (\n <PrimaryButton\n onClick={() => void handleResendVerification()}\n disabled={resendingVerification || verificationSent}\n >\n {verificationSent ? 'Verification sent' : resendingVerification ? 'Sending…' : 'Resend verification email'}\n </PrimaryButton>\n ) : (\n <PrimaryButton onClick={() => onNavigate({ kind: 'open-app' })}>Open app</PrimaryButton>\n )\n ) : (\n <PrimaryButton onClick={() => void handleAccept()} disabled={accepting}>\n {accepting ? 'Accepting…' : 'Accept invitation'}\n </PrimaryButton>\n )}\n <SecondaryButton onClick={() => onNavigate({ kind: 'open-app' })}>Not now</SecondaryButton>\n </div>\n </Shell>\n )\n}\n\nfunction Shell({ title, body, children }: { title: string; body?: string; children: React.ReactNode }) {\n return (\n <div className=\"mx-auto flex w-full max-w-sm flex-col\">\n <span className=\"mb-4 flex items-center gap-2 text-[var(--text-muted)]\">\n <BrandMark size={22} className=\"shrink-0\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-[0.05em]\">Tangle Teams</span>\n </span>\n <h1 className=\"mb-1 text-xl font-semibold tracking-tight text-[var(--text-primary)]\">{title}</h1>\n {body && <p className=\"mb-6 text-sm text-[var(--text-secondary)]\">{body}</p>}\n {children}\n </div>\n )\n}\n\nfunction PrimaryButton({ children, onClick, disabled }: { children: React.ReactNode; onClick(): void; disabled?: boolean }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"flex-1 rounded bg-[var(--brand-primary)] px-4 py-2 text-sm text-[hsl(var(--primary-foreground))] disabled:opacity-50\"\n >\n {children}\n </button>\n )\n}\n\nfunction SecondaryButton({ children, onClick }: { children: React.ReactNode; onClick(): void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex-1 rounded border border-[var(--border-default)] px-4 py-2 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n >\n {children}\n </button>\n )\n}\n","/**\n * Load the canonical Tangle knot only when a teams surface renders it.\n * `/brand` imports the optional `@tangle-network/brand` peer, so a failed load\n * renders a fixed-size spacer instead of crashing the panel.\n */\n\nimport { lazy, Suspense } from 'react'\nimport type { ComponentType } from 'react'\n\nexport interface BrandMarkProps {\n size: number\n className?: string\n}\n\n/** Preserve the mark's footprint while its optional package loads or is absent. */\nfunction MarkSpacer({ size }: { size: number }) {\n return <span aria-hidden style={{ display: 'inline-block', width: size, height: size }} />\n}\n\nconst LazyKnot = lazy(async () => {\n try {\n const mod = await import('../../brand')\n return { default: mod.TangleKnot as ComponentType<BrandMarkProps> }\n } catch {\n return { default: MarkSpacer as ComponentType<BrandMarkProps> }\n }\n})\n\nexport function BrandMark({ size, className }: BrandMarkProps) {\n return (\n <Suspense fallback={<MarkSpacer size={size} />}>\n <LazyKnot size={size} className={className} />\n </Suspense>\n )\n}\n"],"mappings":"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","names":["jsx"]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
DesignCanvas,
|
|
5
5
|
PlusGlyph,
|
|
6
6
|
ShapesGlyph
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-T7XPIBCX.js";
|
|
8
8
|
import {
|
|
9
9
|
lightTheme
|
|
10
10
|
} from "./chunk-IN6LNZ7O.js";
|
|
@@ -204,7 +204,7 @@ function CanvasEmptyState({
|
|
|
204
204
|
/* @__PURE__ */ jsx("span", { className: "text-[11px] font-semibold uppercase tracking-[0.05em]", children: "Tangle Design" })
|
|
205
205
|
] }),
|
|
206
206
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
|
|
207
|
-
/* @__PURE__ */ jsx("h2", { className: "text-
|
|
207
|
+
/* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold text-[var(--text-primary)]", children: title }),
|
|
208
208
|
/* @__PURE__ */ jsx("p", { className: "text-sm leading-5 text-[var(--text-secondary)]", children: subtitle })
|
|
209
209
|
] }),
|
|
210
210
|
/* @__PURE__ */ jsx("div", { className: "grid w-full gap-2 sm:grid-cols-3", children: doors.map(({ key, label, hint, Icon, onClick }) => /* @__PURE__ */ jsxs(
|
|
@@ -1948,4 +1948,4 @@ export {
|
|
|
1948
1948
|
Workspace,
|
|
1949
1949
|
DesignCanvasEditor
|
|
1950
1950
|
};
|
|
1951
|
-
//# sourceMappingURL=chunk-
|
|
1951
|
+
//# sourceMappingURL=chunk-DS2WE62K.js.map
|