@burdenoff/fe-libs 2026.601.11 → 2026.601.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/shared/actors/index.js +1 -1
  2. package/dist/shared/config/shellRoutes.d.ts.map +1 -1
  3. package/dist/shared/config/shellRoutes.js +7 -0
  4. package/dist/shared/tours/toursContext/useTourMutations.d.ts.map +1 -1
  5. package/dist/shared/tours/toursContext/useTourMutations.js +1 -10
  6. package/dist/shared.js +77 -77
  7. package/dist/sharing/AcceptSharePage.d.ts +28 -0
  8. package/dist/sharing/AcceptSharePage.d.ts.map +1 -0
  9. package/dist/sharing/AcceptSharePage.js +270 -0
  10. package/dist/sharing/MemberPicker.d.ts +26 -0
  11. package/dist/sharing/MemberPicker.d.ts.map +1 -0
  12. package/dist/sharing/MemberPicker.js +110 -0
  13. package/dist/sharing/PermissionSelect.d.ts +19 -0
  14. package/dist/sharing/PermissionSelect.d.ts.map +1 -0
  15. package/dist/sharing/PermissionSelect.js +30 -0
  16. package/dist/sharing/ShareDialog.d.ts +26 -0
  17. package/dist/sharing/ShareDialog.d.ts.map +1 -0
  18. package/dist/sharing/ShareDialog.js +318 -0
  19. package/dist/sharing/SharedWithList.d.ts +18 -0
  20. package/dist/sharing/SharedWithList.d.ts.map +1 -0
  21. package/dist/sharing/SharedWithList.js +184 -0
  22. package/dist/sharing/index.d.ts +9 -0
  23. package/dist/sharing/index.d.ts.map +1 -0
  24. package/dist/sharing/shareUrl.d.ts +20 -0
  25. package/dist/sharing/shareUrl.d.ts.map +1 -0
  26. package/dist/sharing/shareUrl.js +39 -0
  27. package/dist/sharing/types.d.ts +94 -0
  28. package/dist/sharing/types.d.ts.map +1 -0
  29. package/dist/sharing/types.js +25 -0
  30. package/dist/sharing/useWorkspaceDirectory.d.ts +43 -0
  31. package/dist/sharing/useWorkspaceDirectory.d.ts.map +1 -0
  32. package/dist/sharing/useWorkspaceDirectory.js +117 -0
  33. package/dist/sharing.d.ts +2 -0
  34. package/dist/sharing.js +9 -0
  35. package/package.json +5 -1
@@ -0,0 +1,110 @@
1
+ import { cn as e } from "../lib/utils.js";
2
+ import { Command as t, CommandEmpty as n, CommandGroup as r, CommandInput as i, CommandItem as a, CommandList as o } from "../ui/command.js";
3
+ import { ActorIdentity as s } from "../shared/actors/ActorIdentity.js";
4
+ import { useWorkspaceDirectory as c } from "./useWorkspaceDirectory.js";
5
+ import { useMemo as l, useState as u } from "react";
6
+ import { Mail as d, UserPlus as f, X as p } from "lucide-react";
7
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
8
+ //#region src/sharing/MemberPicker.tsx
9
+ var g = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
10
+ function _(e) {
11
+ return {
12
+ actorId: e.id,
13
+ actorType: "user",
14
+ displayName: e.name,
15
+ secondaryLabel: e.email || e.id,
16
+ email: e.email || void 0,
17
+ avatarUrl: e.avatar,
18
+ resolved: !0
19
+ };
20
+ }
21
+ var v = ({ workspaceId: v, onSelect: y, multiple: b = !1, excludeIds: x = [], authToken: S, apiGatewayUrl: C, className: w }) => {
22
+ let { members: T, search: E, loading: D } = c({
23
+ workspaceId: v,
24
+ authToken: S,
25
+ apiGatewayUrl: C
26
+ }), [O, k] = u(""), [A, j] = u([]), M = l(() => new Set(x), [x]), N = l(() => new Set(A.map((e) => e.userId).filter((e) => !!e)), [A]), P = l(() => new Set(A.map((e) => e.email.toLowerCase())), [A]), F = T.filter((e) => !M.has(e.id) && !N.has(e.id)), I = O.trim(), L = g.test(I), R = T.some((e) => e.email.toLowerCase() === I.toLowerCase()), z = L && !R && !P.has(I.toLowerCase()), B = (e) => {
27
+ b && j((t) => t.some((t) => e.userId && t.userId === e.userId || t.email.toLowerCase() === e.email.toLowerCase()) ? t : [...t, e]), k(""), E(""), y(e);
28
+ }, V = (e) => {
29
+ j((t) => t.filter((t) => !(e.userId && t.userId === e.userId || t.email.toLowerCase() === e.email.toLowerCase())));
30
+ };
31
+ return /* @__PURE__ */ h("div", {
32
+ className: e("space-y-2", w),
33
+ children: [b && A.length > 0 ? /* @__PURE__ */ m("div", {
34
+ className: "flex flex-wrap gap-2",
35
+ "data-testid": "share-member-chips",
36
+ children: A.map((e) => /* @__PURE__ */ h("span", {
37
+ className: "inline-flex items-center gap-1.5 rounded-full border border-border-subtle bg-bg-sunken px-2 py-1 text-xs text-text-primary",
38
+ "data-testid": "share-member-chip",
39
+ children: [e.displayName, /* @__PURE__ */ m("button", {
40
+ type: "button",
41
+ onClick: () => V(e),
42
+ "aria-label": `Remove ${e.displayName}`,
43
+ className: "text-text-tertiary transition-colors hover:text-text-primary",
44
+ children: /* @__PURE__ */ m(p, { className: "size-3" })
45
+ })]
46
+ }, e.userId ?? e.email))
47
+ }) : null, /* @__PURE__ */ h(t, {
48
+ className: "rounded-md border border-border-default bg-bg-surface",
49
+ shouldFilter: !1,
50
+ children: [/* @__PURE__ */ m(i, {
51
+ "data-testid": "share-member-picker-input",
52
+ placeholder: "Search members or type an email…",
53
+ value: O,
54
+ onValueChange: (e) => {
55
+ k(e), E(e);
56
+ }
57
+ }), /* @__PURE__ */ h(o, { children: [
58
+ D && F.length === 0 ? /* @__PURE__ */ m("div", {
59
+ className: "py-6 text-center text-sm text-text-secondary",
60
+ children: "Loading members…"
61
+ }) : null,
62
+ !D && F.length === 0 && !z ? /* @__PURE__ */ m(n, { children: "No members found." }) : null,
63
+ z ? /* @__PURE__ */ m(r, {
64
+ heading: "Invite by email",
65
+ children: /* @__PURE__ */ h(a, {
66
+ value: `invite:${I}`,
67
+ "data-testid": "share-member-invite-email",
68
+ onSelect: () => B({
69
+ email: I,
70
+ displayName: I
71
+ }),
72
+ children: [
73
+ /* @__PURE__ */ m(d, { className: "size-4 text-text-secondary" }),
74
+ /* @__PURE__ */ h("span", {
75
+ className: "flex flex-col",
76
+ children: [/* @__PURE__ */ m("span", {
77
+ className: "text-sm text-text-primary",
78
+ children: I
79
+ }), /* @__PURE__ */ m("span", {
80
+ className: "text-xs text-text-secondary",
81
+ children: "Will be invited by email"
82
+ })]
83
+ }),
84
+ /* @__PURE__ */ m(f, { className: "ml-auto size-4 text-text-secondary" })
85
+ ]
86
+ })
87
+ }) : null,
88
+ F.length > 0 ? /* @__PURE__ */ m(r, {
89
+ heading: "Members",
90
+ children: F.map((e) => /* @__PURE__ */ m(a, {
91
+ value: `${e.name} ${e.email} ${e.id}`,
92
+ "data-testid": "share-member-row",
93
+ onSelect: () => B({
94
+ userId: e.id,
95
+ email: e.email,
96
+ displayName: e.name
97
+ }),
98
+ children: /* @__PURE__ */ m(s, {
99
+ profile: _(e),
100
+ variant: "inline",
101
+ hideIdDrilldown: !0
102
+ })
103
+ }, e.id))
104
+ }) : null
105
+ ] })]
106
+ })]
107
+ });
108
+ };
109
+ //#endregion
110
+ export { v as MemberPicker };
@@ -0,0 +1,19 @@
1
+ import { FC } from 'react';
2
+ import { ShareRole } from './types';
3
+ export interface PermissionSelectProps {
4
+ value: ShareRole;
5
+ /** Subset of canonical roles to offer (order preserved). */
6
+ roles: ShareRole[];
7
+ onChange: (role: ShareRole) => void;
8
+ disabled?: boolean;
9
+ className?: string;
10
+ /** Test id applied to the trigger (defaults to `share-permission-select`). */
11
+ testId?: string;
12
+ }
13
+ /**
14
+ * Role selector built on the shared `Select` primitive. Each option shows the
15
+ * role label plus a one-line description so the grantee's effective access is
16
+ * obvious without leaving the dialog.
17
+ */
18
+ export declare const PermissionSelect: FC<PermissionSelectProps>;
19
+ //# sourceMappingURL=PermissionSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionSelect.d.ts","sourceRoot":"","sources":["../../src/sharing/PermissionSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,4DAA4D;IAC5D,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAyBtD,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { Select as e, SelectContent as t, SelectItem as n, SelectTrigger as r, SelectValue as i } from "../ui/select.js";
2
+ import { roleDescription as a, roleLabel as o } from "./types.js";
3
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
4
+ //#region src/sharing/PermissionSelect.tsx
5
+ var l = ({ value: l, roles: u, onChange: d, disabled: f, className: p, testId: m = "share-permission-select" }) => /* @__PURE__ */ c(e, {
6
+ value: l,
7
+ onValueChange: (e) => d(e),
8
+ disabled: f,
9
+ children: [/* @__PURE__ */ s(r, {
10
+ className: p,
11
+ "data-testid": m,
12
+ "aria-label": "Permission",
13
+ children: /* @__PURE__ */ s(i, {})
14
+ }), /* @__PURE__ */ s(t, { children: u.map((e) => /* @__PURE__ */ s(n, {
15
+ value: e,
16
+ "data-testid": `share-permission-option-${e}`,
17
+ children: /* @__PURE__ */ c("span", {
18
+ className: "flex flex-col",
19
+ children: [/* @__PURE__ */ s("span", {
20
+ className: "text-sm font-medium text-text-primary",
21
+ children: o(e)
22
+ }), /* @__PURE__ */ s("span", {
23
+ className: "text-xs text-text-secondary",
24
+ children: a(e)
25
+ })]
26
+ })
27
+ }, e)) })]
28
+ });
29
+ //#endregion
30
+ export { l as PermissionSelect };
@@ -0,0 +1,26 @@
1
+ import { FC } from 'react';
2
+ import { ShareController, ShareResourceRef } from './types';
3
+ export interface ShareDialogProps {
4
+ resource: ShareResourceRef;
5
+ controller: ShareController;
6
+ open: boolean;
7
+ onOpenChange: (open: boolean) => void;
8
+ /** Workspace scope used by the member picker + identity resolution. */
9
+ workspaceId?: string;
10
+ authToken?: string;
11
+ apiGatewayUrl?: string;
12
+ }
13
+ /**
14
+ * Generic, controller-driven share dialog. Visibility-mode tabs are derived
15
+ * from {@link ShareController.capabilities} and the resource's `vibeId`:
16
+ *
17
+ * - **Private** — sets visibility to PRIVATE.
18
+ * - **Specific people** — member picker + permission + optional message/expiry
19
+ * → `createUserShare`.
20
+ * - **Everyone with Vibe** — only when `resource.vibeId` and
21
+ * `capabilities.supportsVibeShare` → sets visibility to SHARED_WITH_VIBE.
22
+ * - **Public link** — only when `capabilities.supportsLink` → role + expiry →
23
+ * `createLinkShare` + copy URL.
24
+ */
25
+ export declare const ShareDialog: FC<ShareDialogProps>;
26
+ //# sourceMappingURL=ShareDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareDialog.d.ts","sourceRoot":"","sources":["../../src/sharing/ShareDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAkB9D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAa,MAAM,SAAS,CAAC;AAI5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0BD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAmU5C,CAAC"}
@@ -0,0 +1,318 @@
1
+ import { cn as e } from "../lib/utils.js";
2
+ import { ResponsiveDialog as t, ResponsiveDialogContent as n, ResponsiveDialogHeader as r, ResponsiveDialogTitle as i } from "../ui/responsive-dialog.js";
3
+ import { Button as a } from "../ui/button.js";
4
+ import { Input as o } from "../ui/input.js";
5
+ import { Label as s } from "../ui/label.js";
6
+ import { Textarea as ee } from "../ui/textarea.js";
7
+ import { MemberPicker as te } from "./MemberPicker.js";
8
+ import { PermissionSelect as c } from "./PermissionSelect.js";
9
+ import { copyTextToClipboard as l, normalizeShareUrl as u } from "./shareUrl.js";
10
+ import { SharedWithList as ne } from "./SharedWithList.js";
11
+ import { useEffect as re, useMemo as d, useState as f } from "react";
12
+ import { Check as p, Copy as m, Globe as ie, Link2 as h, Lock as g, Users as _ } from "lucide-react";
13
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
+ //#region src/sharing/ShareDialog.tsx
15
+ var b = [
16
+ {
17
+ value: "never",
18
+ label: "No expiry",
19
+ hours: null
20
+ },
21
+ {
22
+ value: "24",
23
+ label: "24 hours",
24
+ hours: 24
25
+ },
26
+ {
27
+ value: "72",
28
+ label: "3 days",
29
+ hours: 72
30
+ },
31
+ {
32
+ value: "168",
33
+ label: "7 days",
34
+ hours: 168
35
+ },
36
+ {
37
+ value: "720",
38
+ label: "30 days",
39
+ hours: 720
40
+ }
41
+ ];
42
+ function x(e) {
43
+ if (e != null) return new Date(Date.now() + e * 60 * 60 * 1e3).toISOString();
44
+ }
45
+ function S(e) {
46
+ return e[0] ?? "VIEWER";
47
+ }
48
+ var C = ({ resource: C, controller: w, open: T, onOpenChange: ae, workspaceId: E, authToken: D, apiGatewayUrl: O }) => {
49
+ let { capabilities: k } = w, A = !!C.vibeId && k.supportsVibeShare, j = d(() => {
50
+ let e = ["private"];
51
+ return k.supportsUsers && e.push("users"), A && e.push("vibe"), k.supportsLink && e.push("link"), e;
52
+ }, [
53
+ k.supportsUsers,
54
+ k.supportsLink,
55
+ A
56
+ ]), M = d(() => k.supportsUsers ? "users" : j[0] ?? "private", [j, k.supportsUsers]), [N, P] = f(M), [F, I] = f(null), [L, R] = f(S(k.roles)), [z, B] = f(""), [V, H] = f("never"), [U, W] = f(!1), [G, K] = f(S(k.roles)), [q, oe] = f("never"), [J, Y] = f(null), [X, Z] = f(!1), [Q, $] = f(!1);
57
+ re(() => {
58
+ T ? (P(M), w.refetch()) : (I(null), B(""), Y(null), Z(!1));
59
+ }, [T, M]);
60
+ let se = (e) => {
61
+ P(e), e === "private" ? w.setVisibility?.("PRIVATE") : e === "vibe" && w.setVisibility?.("SHARED_WITH_VIBE");
62
+ }, ce = async () => {
63
+ if (F?.email) {
64
+ W(!0);
65
+ try {
66
+ await w.createUserShare({
67
+ email: F.email,
68
+ role: L,
69
+ message: z.trim() || void 0,
70
+ expiresAt: k.supportsExpiry ? x(b.find((e) => e.value === V)?.hours ?? null) : void 0
71
+ }), I(null), B(""), w.refetch();
72
+ } finally {
73
+ W(!1);
74
+ }
75
+ }
76
+ }, le = async () => {
77
+ if (w.createLinkShare) {
78
+ $(!0);
79
+ try {
80
+ Y(u((await w.createLinkShare({
81
+ role: G,
82
+ expiresAt: k.supportsExpiry ? x(b.find((e) => e.value === q)?.hours ?? null) ?? null : null
83
+ })).shareUrl)), w.refetch();
84
+ } finally {
85
+ $(!1);
86
+ }
87
+ }
88
+ }, ue = async () => {
89
+ J && await l(J).then(() => !0, () => !1) && (Z(!0), setTimeout(() => Z(!1), 2e3));
90
+ }, de = {
91
+ private: {
92
+ label: "Private",
93
+ icon: g,
94
+ testId: "share-tab-private"
95
+ },
96
+ users: {
97
+ label: "Specific people",
98
+ icon: _,
99
+ testId: "share-tab-users"
100
+ },
101
+ vibe: {
102
+ label: "Everyone with Vibe",
103
+ icon: _,
104
+ testId: "share-tab-vibe"
105
+ },
106
+ link: {
107
+ label: "Public link",
108
+ icon: h,
109
+ testId: "share-tab-link"
110
+ }
111
+ };
112
+ return /* @__PURE__ */ v(t, {
113
+ open: T,
114
+ onOpenChange: ae,
115
+ children: /* @__PURE__ */ y(n, {
116
+ className: "sm:max-w-xl",
117
+ "data-testid": "share-dialog",
118
+ children: [
119
+ /* @__PURE__ */ v(r, { children: /* @__PURE__ */ y(i, { children: [
120
+ "Share “",
121
+ C.name,
122
+ "”"
123
+ ] }) }),
124
+ /* @__PURE__ */ v("div", {
125
+ className: "flex flex-wrap gap-1 rounded-lg bg-bg-sunken p-1",
126
+ role: "tablist",
127
+ "aria-label": "Sharing visibility",
128
+ children: j.map((t) => {
129
+ let n = de[t], r = n.icon, i = N === t;
130
+ return /* @__PURE__ */ y("button", {
131
+ type: "button",
132
+ role: "tab",
133
+ "aria-selected": i,
134
+ "data-testid": n.testId,
135
+ onClick: () => se(t),
136
+ className: e("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors", i ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
137
+ children: [/* @__PURE__ */ v(r, { className: "size-4" }), n.label]
138
+ }, t);
139
+ })
140
+ }),
141
+ /* @__PURE__ */ y("div", {
142
+ className: "space-y-4 py-2",
143
+ children: [
144
+ N === "private" ? /* @__PURE__ */ y("div", {
145
+ className: "flex items-start gap-3 rounded-md border border-border-subtle bg-bg-sunken px-3 py-3",
146
+ children: [/* @__PURE__ */ v(g, { className: "mt-0.5 size-4 text-text-secondary" }), /* @__PURE__ */ y("p", {
147
+ className: "text-sm text-text-secondary",
148
+ children: [
149
+ "Only you can access this ",
150
+ C.type,
151
+ ". Choose another mode to grant access."
152
+ ]
153
+ })]
154
+ }) : null,
155
+ N === "users" ? /* @__PURE__ */ y("div", {
156
+ className: "space-y-4",
157
+ children: [
158
+ /* @__PURE__ */ v(te, {
159
+ workspaceId: E ?? "",
160
+ authToken: D,
161
+ apiGatewayUrl: O,
162
+ onSelect: I
163
+ }),
164
+ F ? /* @__PURE__ */ y("div", {
165
+ className: "rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary",
166
+ children: ["Inviting ", /* @__PURE__ */ v("span", {
167
+ className: "font-medium",
168
+ children: F.displayName
169
+ })]
170
+ }) : null,
171
+ /* @__PURE__ */ y("div", {
172
+ className: "space-y-2",
173
+ children: [/* @__PURE__ */ v(s, {
174
+ htmlFor: "share-role",
175
+ children: "Permission"
176
+ }), /* @__PURE__ */ v(c, {
177
+ value: L,
178
+ roles: k.roles,
179
+ onChange: R
180
+ })]
181
+ }),
182
+ k.supportsExpiry ? /* @__PURE__ */ y("div", {
183
+ className: "space-y-2",
184
+ children: [/* @__PURE__ */ v(s, {
185
+ htmlFor: "share-user-expiry",
186
+ children: "Access expires"
187
+ }), /* @__PURE__ */ v("select", {
188
+ id: "share-user-expiry",
189
+ value: V,
190
+ onChange: (e) => H(e.target.value),
191
+ "data-testid": "share-user-expiry",
192
+ className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
193
+ children: b.map((e) => /* @__PURE__ */ v("option", {
194
+ value: e.value,
195
+ children: e.label
196
+ }, e.value))
197
+ })]
198
+ }) : null,
199
+ /* @__PURE__ */ y("div", {
200
+ className: "space-y-2",
201
+ children: [/* @__PURE__ */ v(s, {
202
+ htmlFor: "share-message",
203
+ children: "Message (optional)"
204
+ }), /* @__PURE__ */ v(ee, {
205
+ id: "share-message",
206
+ value: z,
207
+ onChange: (e) => B(e.target.value),
208
+ placeholder: "Add a note to the invitation…",
209
+ rows: 2
210
+ })]
211
+ }),
212
+ /* @__PURE__ */ v(a, {
213
+ type: "button",
214
+ "data-testid": "share-invite-submit",
215
+ disabled: !F?.email || U,
216
+ onClick: () => {
217
+ ce();
218
+ },
219
+ className: "w-full",
220
+ children: U ? "Sharing…" : "Share"
221
+ })
222
+ ]
223
+ }) : null,
224
+ N === "vibe" ? /* @__PURE__ */ y("div", {
225
+ className: "flex items-start gap-3 rounded-md border border-border-subtle bg-bg-sunken px-3 py-3",
226
+ children: [/* @__PURE__ */ v(_, { className: "mt-0.5 size-4 text-text-secondary" }), /* @__PURE__ */ y("p", {
227
+ className: "text-sm text-text-secondary",
228
+ children: [
229
+ "Everyone with access to this Vibe can open this ",
230
+ C.type,
231
+ "."
232
+ ]
233
+ })]
234
+ }) : null,
235
+ N === "link" ? /* @__PURE__ */ y("div", {
236
+ className: "space-y-4",
237
+ children: [
238
+ /* @__PURE__ */ y("div", {
239
+ className: "flex items-start gap-3 rounded-md border border-border-subtle bg-bg-sunken px-3 py-3",
240
+ children: [/* @__PURE__ */ v(ie, { className: "mt-0.5 size-4 text-text-secondary" }), /* @__PURE__ */ y("p", {
241
+ className: "text-sm text-text-secondary",
242
+ children: [
243
+ "Anyone with the link can access this ",
244
+ C.type,
245
+ " with the chosen permission."
246
+ ]
247
+ })]
248
+ }),
249
+ /* @__PURE__ */ y("div", {
250
+ className: "space-y-2",
251
+ children: [/* @__PURE__ */ v(s, {
252
+ htmlFor: "share-link-role",
253
+ children: "Permission"
254
+ }), /* @__PURE__ */ v(c, {
255
+ value: G,
256
+ roles: k.roles,
257
+ onChange: K,
258
+ testId: "share-link-permission-select"
259
+ })]
260
+ }),
261
+ k.supportsExpiry ? /* @__PURE__ */ y("div", {
262
+ className: "space-y-2",
263
+ children: [/* @__PURE__ */ v(s, {
264
+ htmlFor: "share-link-expiry",
265
+ children: "Link expires"
266
+ }), /* @__PURE__ */ v("select", {
267
+ id: "share-link-expiry",
268
+ value: q,
269
+ onChange: (e) => oe(e.target.value),
270
+ "data-testid": "share-link-expiry",
271
+ className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
272
+ children: b.map((e) => /* @__PURE__ */ v("option", {
273
+ value: e.value,
274
+ children: e.label
275
+ }, e.value))
276
+ })]
277
+ }) : null,
278
+ J ? /* @__PURE__ */ y("div", {
279
+ className: "flex items-center gap-2 rounded-md border border-status-success-border bg-status-success-bg-subtle px-3 py-2",
280
+ children: [/* @__PURE__ */ v(o, {
281
+ value: J,
282
+ readOnly: !0,
283
+ "aria-label": "Share link",
284
+ className: "flex-1"
285
+ }), /* @__PURE__ */ y(a, {
286
+ type: "button",
287
+ "data-testid": "share-copy-link",
288
+ onClick: () => {
289
+ ue();
290
+ },
291
+ children: [v(X ? p : m, { className: "size-4" }), X ? "Copied" : "Copy"]
292
+ })]
293
+ }) : /* @__PURE__ */ y(a, {
294
+ type: "button",
295
+ "data-testid": "share-create-link",
296
+ disabled: Q || !w.createLinkShare,
297
+ onClick: () => {
298
+ le();
299
+ },
300
+ className: "w-full",
301
+ children: [/* @__PURE__ */ v(h, { className: "size-4" }), Q ? "Creating…" : "Create link"]
302
+ })
303
+ ]
304
+ }) : null
305
+ ]
306
+ }),
307
+ /* @__PURE__ */ v(ne, {
308
+ controller: w,
309
+ workspaceId: E,
310
+ authToken: D,
311
+ apiGatewayUrl: O
312
+ })
313
+ ]
314
+ })
315
+ });
316
+ };
317
+ //#endregion
318
+ export { C as ShareDialog };
@@ -0,0 +1,18 @@
1
+ import { FC } from 'react';
2
+ import { ShareController } from './types';
3
+ export interface SharedWithListProps {
4
+ controller: ShareController;
5
+ /** Workspace scope for resolving grantee identities. */
6
+ workspaceId?: string;
7
+ authToken?: string;
8
+ apiGatewayUrl?: string;
9
+ className?: string;
10
+ }
11
+ /**
12
+ * Renders the current grants (user rows) and public links for a shared
13
+ * resource. User rows show identity + status, an inline {@link PermissionSelect}
14
+ * (when the controller supports `updateRole`) and a revoke action. Link rows
15
+ * surface a copy-link button, expiry, and revoke.
16
+ */
17
+ export declare const SharedWithList: FC<SharedWithListProps>;
18
+ //# sourceMappingURL=SharedWithList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedWithList.d.ts","sourceRoot":"","sources":["../../src/sharing/SharedWithList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAU1C,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,SAAS,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,eAAe,CAAC;IAC5B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2DD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAoKlD,CAAC"}