@book.dev/ui 1.60.0 → 1.64.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.
Files changed (38) hide show
  1. package/dist/{EmojiGrid-xK5mPJPo.js → EmojiGrid-THzuvC4K.js} +75 -84
  2. package/dist/blockeditor/BlockEditor.d.ts +16 -0
  3. package/dist/blockeditor/EmojiMenu.d.ts +17 -0
  4. package/dist/blockeditor/__tests__/EmojiMenu.test.d.ts +1 -0
  5. package/dist/blockeditor/__tests__/readOnly.test.d.ts +1 -0
  6. package/dist/blockeditor/__tests__/titleHandoff.test.d.ts +1 -0
  7. package/dist/blockeditor/__tests__/triggerMenus.test.d.ts +1 -0
  8. package/dist/blockeditor/kit/KitFrame.d.ts +5 -0
  9. package/dist/blockeditor/kit/lock.d.ts +14 -0
  10. package/dist/components/LastEditedBy.d.ts +11 -0
  11. package/dist/components/OnboardingNudge.d.ts +11 -0
  12. package/dist/components/ShareDialog.d.ts +25 -0
  13. package/dist/components/__tests__/lastEditedBy.test.d.ts +1 -0
  14. package/dist/components/__tests__/membersSettings.test.d.ts +1 -0
  15. package/dist/components/__tests__/sharingSettings.test.d.ts +1 -0
  16. package/dist/components/settings/AccountSettings.d.ts +4 -0
  17. package/dist/components/settings/AccountSwitcher.d.ts +12 -0
  18. package/dist/components/settings/MembersSettings.d.ts +1 -0
  19. package/dist/components/settings/SharingSettings.d.ts +9 -0
  20. package/dist/emoji-Bmft6RPl.js +11 -0
  21. package/dist/{format-CLQoRoYP.js → format-D9FO3jG9.js} +114 -114
  22. package/dist/i18n/messages/en.d.ts +169 -0
  23. package/dist/index.js +7238 -5976
  24. package/dist/lib/__tests__/useCanWrite.test.d.ts +1 -0
  25. package/dist/lib/hud.d.ts +2 -2
  26. package/dist/lib/sidebarStyles.d.ts +7 -0
  27. package/dist/lib/useCanWrite.d.ts +45 -0
  28. package/dist/{lucideIcons-B6pmC-WQ.js → lucideIcons-Dv5yzk2L.js} +1916 -1016
  29. package/dist/providers/AccountProvider.d.ts +47 -7
  30. package/dist/providers/ForwardingProvider.d.ts +19 -0
  31. package/dist/providers/PlatformLibraryProvider.d.ts +20 -0
  32. package/dist/providers/__tests__/AccountProvider.test.d.ts +1 -0
  33. package/dist/providers/__tests__/forwardingAudience.test.d.ts +9 -0
  34. package/dist/providers/forwardingAudience.d.ts +165 -0
  35. package/dist/screens/pageChrome.d.ts +11 -0
  36. package/dist/style.css +1 -1
  37. package/dist/{toHtml-BoPr8Ce4.js → toHtml-DeWpCU0o.js} +2 -2
  38. package/package.json +7 -2
@@ -5,14 +5,14 @@ import { jsx as p, jsxs as m } from "react/jsx-runtime";
5
5
  import { clsx as h } from "clsx";
6
6
  import { twMerge as g } from "tailwind-merge";
7
7
  import { Cross2Icon as _ } from "@radix-ui/react-icons";
8
- import { AccountClient as v, AccountError as ee, ForwardingClient as te, defaultDatabaseSchema as y, emptyPageSnapshot as b, getServerUrlOverride as x, resolveAccountUrl as ne, setServerUrlOverride as S } from "@book.dev/sdk";
9
- import * as C from "@radix-ui/react-dialog";
10
- import { Slot as w } from "@radix-ui/react-slot";
11
- import { cva as T } from "class-variance-authority";
12
- import { useImmer as E } from "use-immer";
13
- import { Activity as D, AlarmClock as O, AlertTriangle as k, Anchor as A, Aperture as j, Archive as M, Award as N, Backpack as P, BarChart3 as re, Battery as F, Beaker as I, Bell as L, Bike as R, Binary as ie, Bird as ae, Book as z, BookOpen as oe, Bookmark as se, Box as ce, Brain as le, Briefcase as ue, Brush as de, Bug as fe, Building2 as B, Bus as pe, Cake as me, Calculator as he, Calendar as ge, Camera as _e, Car as ve, Carrot as ye, Check as be, CheckCircle2 as xe, ChefHat as Se, Cherry as Ce, Circle as we, Clapperboard as Te, Clipboard as Ee, Clock as De, Cloud as Oe, Code2 as ke, Coffee as Ae, Cog as je, Coins as Me, Compass as Ne, Cpu as Pe, CreditCard as Fe, Crown as Ie, Database as Le, Diamond as Re, Dog as ze, DollarSign as Be, Download as Ve, Droplet as He, Dumbbell as Ue, Egg as We, Eye as Ge, Feather as Ke, FileText as qe, Film as Je, Filter as Ye, Flag as Xe, Flame as Ze, FlaskConical as Qe, Flower2 as $e, Folder as et, Footprints as tt, Gamepad2 as nt, Gauge as rt, Gem as it, Gift as at, GitBranch as ot, Globe as st, GraduationCap as ct, Grid3x3 as lt, Hammer as ut, Hand as dt, Hash as ft, Headphones as pt, Heart as mt, HelpCircle as ht, Home as gt, Image as _t, Inbox as vt, Infinity as yt, Info as bt, Key as xt, Keyboard as St, Lamp as Ct, Laptop as wt, Layers as Tt, Layout as Et, Leaf as Dt, Library as Ot, Lightbulb as kt, Link as At, List as jt, Lock as Mt, Mail as Nt, Map as Pt, MapPin as Ft, Megaphone as It, MessageCircle as Lt, MessageSquare as Rt, Mic as zt, Monitor as Bt, Moon as Vt, Mountain as Ht, Mouse as Ut, Music as Wt, Navigation as Gt, Newspaper as Kt, Package as qt, Palette as Jt, PanelLeft as Yt, Paperclip as Xt, PartyPopper as Zt, PenTool as Qt, Pencil as $t, Phone as en, PieChart as tn, PiggyBank as nn, Pin as rn, Plane as an, Play as on, Plug as sn, Plus as cn, Puzzle as ln, Rabbit as un, Radio as dn, Rocket as fn, Ruler as pn, Save as mn, Scale as hn, Scissors as gn, Search as _n, Send as vn, Settings as yn, Share2 as bn, Shield as xn, ShoppingBag as Sn, ShoppingCart as Cn, Smile as wn, Snowflake as Tn, Sparkles as En, Speaker as Dn, Sprout as On, Star as kn, Sticker as An, Sun as jn, Sword as Mn, Table as Nn, Tag as Pn, Target as Fn, Tent as In, Terminal as Ln, ThumbsUp as Rn, Ticket as zn, Timer as Bn, ToggleLeft as Vn, Trash2 as Hn, TreePine as Un, TrendingUp as Wn, Trophy as Gn, Truck as Kn, Tv as qn, Umbrella as Jn, User as Yn, Users as Xn, Utensils as Zn, Video as Qn, Wallet as $n, Wand2 as er, Watch as tr, Waves as nr, Wifi as rr, Wind as ir, Wrench as ar, Zap as or } from "lucide-react";
8
+ import { AccountClient as ee, AccountError as v, ForwardingClient as te, decodeIdentity as ne, defaultDatabaseSchema as y, emptyPageSnapshot as b, getForwardingAudience as re, getServerUrlOverride as x, resolveAccountUrl as S, setForwardingAudience as C, setGuestName as w, setIdentityToken as T, setServerUrlOverride as E } from "@book.dev/sdk";
9
+ import * as D from "@radix-ui/react-dialog";
10
+ import { Slot as O } from "@radix-ui/react-slot";
11
+ import { cva as k } from "class-variance-authority";
12
+ import { useImmer as A } from "use-immer";
13
+ import { Activity as j, AlarmClock as M, AlertTriangle as N, Anchor as P, Aperture as ie, Archive as F, Award as I, Backpack as L, BarChart3 as ae, Battery as R, Beaker as z, Bell as B, Bike as oe, Binary as se, Bird as V, Book as ce, BookOpen as H, Bookmark as U, Box as W, Brain as G, Briefcase as le, Brush as ue, Bug as de, Building2 as fe, Bus as pe, Cake as me, Calculator as he, Calendar as ge, Camera as _e, Car as ve, Carrot as ye, Check as be, CheckCircle2 as xe, ChefHat as Se, Cherry as Ce, Circle as we, Clapperboard as Te, Clipboard as Ee, Clock as De, Cloud as Oe, Code2 as ke, Coffee as Ae, Cog as je, Coins as Me, Compass as Ne, Cpu as Pe, CreditCard as Fe, Crown as Ie, Database as Le, Diamond as Re, Dog as ze, DollarSign as Be, Download as Ve, Droplet as He, Dumbbell as Ue, Egg as We, Eye as Ge, Feather as Ke, FileText as qe, Film as Je, Filter as Ye, Flag as Xe, Flame as Ze, FlaskConical as Qe, Flower2 as $e, Folder as et, Footprints as tt, Gamepad2 as nt, Gauge as rt, Gem as it, Gift as at, GitBranch as ot, Globe as st, GraduationCap as ct, Grid3x3 as lt, Hammer as ut, Hand as dt, Hash as ft, Headphones as pt, Heart as mt, HelpCircle as ht, Home as gt, Image as _t, Inbox as vt, Infinity as yt, Info as bt, Key as xt, Keyboard as St, Lamp as Ct, Laptop as wt, Layers as Tt, Layout as Et, Leaf as Dt, Library as Ot, Lightbulb as kt, Link as At, List as jt, Lock as Mt, Mail as Nt, Map as Pt, MapPin as Ft, Megaphone as It, MessageCircle as Lt, MessageSquare as Rt, Mic as zt, Monitor as Bt, Moon as Vt, Mountain as Ht, Mouse as Ut, Music as Wt, Navigation as Gt, Newspaper as Kt, Package as qt, Palette as Jt, PanelLeft as Yt, Paperclip as Xt, PartyPopper as Zt, PenTool as Qt, Pencil as $t, Phone as en, PieChart as tn, PiggyBank as nn, Pin as rn, Plane as an, Play as on, Plug as sn, Plus as cn, Puzzle as ln, Rabbit as un, Radio as dn, Rocket as fn, Ruler as pn, Save as mn, Scale as hn, Scissors as gn, Search as _n, Send as vn, Settings as yn, Share2 as bn, Shield as xn, ShoppingBag as Sn, ShoppingCart as Cn, Smile as wn, Snowflake as Tn, Sparkles as En, Speaker as Dn, Sprout as On, Star as kn, Sticker as An, Sun as jn, Sword as Mn, Table as Nn, Tag as Pn, Target as Fn, Tent as In, Terminal as Ln, ThumbsUp as Rn, Ticket as zn, Timer as Bn, ToggleLeft as Vn, Trash2 as Hn, TreePine as Un, TrendingUp as Wn, Trophy as Gn, Truck as Kn, Tv as qn, Umbrella as Jn, User as Yn, Users as Xn, Utensils as Zn, Video as Qn, Wallet as $n, Wand2 as er, Watch as tr, Waves as nr, Wifi as rr, Wind as ir, Wrench as ar, Zap as or } from "lucide-react";
14
14
  //#region src/lib/utils.ts
15
- function V(...e) {
15
+ function K(...e) {
16
16
  return g(h(e));
17
17
  }
18
18
  //#endregion
@@ -20,7 +20,7 @@ function V(...e) {
20
20
  var sr = o({}), cr = () => c(sr), lr = ({ value: e = {}, children: t }) => /* @__PURE__ */ p(sr.Provider, {
21
21
  value: e,
22
22
  children: t
23
- }), H = {
23
+ }), q = {
24
24
  profile: {
25
25
  name: "",
26
26
  displayName: "",
@@ -37,35 +37,39 @@ var sr = o({}), cr = () => c(sr), lr = ({ value: e = {}, children: t }) => /* @_
37
37
  function fr(e) {
38
38
  return {
39
39
  profile: {
40
- ...H.profile,
40
+ ...q.profile,
41
41
  ...e?.profile
42
42
  },
43
43
  general: {
44
- ...H.general,
44
+ ...q.general,
45
45
  ...e?.general
46
46
  },
47
47
  features: {
48
- ...H.features,
48
+ ...q.features,
49
49
  ...e?.features
50
50
  }
51
51
  };
52
52
  }
53
53
  function pr() {
54
- if (typeof window > "u") return H;
54
+ if (typeof window > "u") return q;
55
55
  try {
56
56
  let e = localStorage.getItem(dr);
57
- return e ? fr(JSON.parse(e)) : H;
57
+ return e ? fr(JSON.parse(e)) : q;
58
58
  } catch {
59
- return H;
59
+ return q;
60
60
  }
61
61
  }
62
62
  var mr = ({ children: e }) => {
63
- let [t, n] = f(H);
63
+ let [t, n] = f(q);
64
64
  l(() => {
65
65
  let e = pr();
66
- e !== H && n(e);
66
+ e !== q && n(e);
67
67
  }, []);
68
- let r = s((e) => {
68
+ let r = t.profile.displayName || t.profile.name;
69
+ l(() => {
70
+ w(r);
71
+ }, [r]);
72
+ let i = s((e) => {
69
73
  n((t) => {
70
74
  let n = {
71
75
  profile: {
@@ -86,19 +90,19 @@ var mr = ({ children: e }) => {
86
90
  } catch {}
87
91
  return n;
88
92
  });
89
- }, []), i = u(() => ({
93
+ }, []), a = u(() => ({
90
94
  preferences: t,
91
- update: r
92
- }), [t, r]);
95
+ update: i
96
+ }), [t, i]);
93
97
  return /* @__PURE__ */ p(ur.Provider, {
94
- value: i,
98
+ value: a,
95
99
  children: e
96
100
  });
97
101
  }, hr = () => {
98
102
  let e = c(ur);
99
103
  if (!e) throw Error("usePreferences must be used within a <PreferencesProvider>");
100
104
  return e;
101
- }, gr = "openbook.workspaces", U = {
105
+ }, gr = "openbook.workspaces", J = {
102
106
  id: "local",
103
107
  icon: "🏡",
104
108
  name: "My Workspace",
@@ -111,13 +115,13 @@ var mr = ({ children: e }) => {
111
115
  return e;
112
116
  }
113
117
  }, br = () => {
114
- if (typeof localStorage > "u") return [U];
115
- let e = [U];
118
+ if (typeof localStorage > "u") return [J];
119
+ let e = [J];
116
120
  try {
117
121
  let t = localStorage.getItem(gr), n = t ? JSON.parse(t) : null;
118
122
  Array.isArray(n) && n.length > 0 && (e = n);
119
123
  } catch {}
120
- e.some((e) => e.serverUrl === null) || (e = [U, ...e]);
124
+ e.some((e) => e.serverUrl === null) || (e = [J, ...e]);
121
125
  let t = x();
122
126
  return t && !e.some((e) => _r(e.serverUrl, t)) && (e = [...e, {
123
127
  id: vr(),
@@ -125,12 +129,12 @@ var mr = ({ children: e }) => {
125
129
  name: yr(t),
126
130
  serverUrl: t
127
131
  }]), e;
128
- }, W = (e) => {
129
- typeof localStorage > "u" || localStorage.setItem(gr, JSON.stringify(e));
130
132
  }, xr = (e) => {
133
+ typeof localStorage > "u" || localStorage.setItem(gr, JSON.stringify(e));
134
+ }, Sr = (e) => {
131
135
  let t = x();
132
136
  return (e.find((e) => _r(e.serverUrl, t)) ?? e[0]).id;
133
- }, Sr = (e) => {
137
+ }, Cr = (e) => {
134
138
  if (e === null) return !0;
135
139
  if (typeof e != "string") return !1;
136
140
  try {
@@ -139,28 +143,28 @@ var mr = ({ children: e }) => {
139
143
  } catch {
140
144
  return !1;
141
145
  }
142
- }, Cr = (e) => !!e && typeof e == "object" && typeof e.id == "string" && typeof e.name == "string" && Sr(e.serverUrl), wr = o({
143
- workspaces: [U],
144
- workspace: U,
146
+ }, wr = (e) => !!e && typeof e == "object" && typeof e.id == "string" && typeof e.name == "string" && Cr(e.serverUrl), Tr = o({
147
+ workspaces: [J],
148
+ workspace: J,
145
149
  selectWorkspace: () => void 0,
146
- addWorkspace: () => U,
150
+ addWorkspace: () => J,
147
151
  removeWorkspace: () => void 0,
148
152
  updateWorkspace: () => void 0,
149
153
  replaceWorkspaces: () => void 0
150
- }), Tr = () => c(wr), Er = ({ children: e }) => {
151
- let [t, n] = f([U]), [r, i] = f(U.id);
154
+ }), Er = () => c(Tr), Dr = ({ children: e }) => {
155
+ let [t, n] = f([J]), [r, i] = f(J.id);
152
156
  l(() => {
153
157
  let e = br();
154
- n(e), i(xr(e)), W(e);
158
+ n(e), i(Sr(e)), xr(e);
155
159
  }, []);
156
- let a = u(() => t.find((e) => e.id === r) ?? t[0] ?? U, [t, r]), o = s((e) => {
160
+ let a = u(() => t.find((e) => e.id === r) ?? t[0] ?? J, [t, r]), o = s((e) => {
157
161
  let n = t.find((t) => t.id === e);
158
162
  if (n) {
159
163
  if (_r(n.serverUrl, x())) {
160
164
  i(e);
161
165
  return;
162
166
  }
163
- S(n.serverUrl), typeof window < "u" && window.location.reload();
167
+ E(n.serverUrl), typeof window < "u" && window.location.reload();
164
168
  }
165
169
  }, [t]), c = s((e) => {
166
170
  let t = e.serverUrl?.trim(), r = {
@@ -171,13 +175,13 @@ var mr = ({ children: e }) => {
171
175
  };
172
176
  return n((e) => {
173
177
  let t = [...e, r];
174
- return W(t), t;
178
+ return xr(t), t;
175
179
  }), r;
176
180
  }, []), d = s((e) => {
177
181
  n((t) => {
178
182
  if (t.length <= 1 || e === r) return t;
179
183
  let n = t.filter((t) => t.id !== e);
180
- return W(n), n;
184
+ return xr(n), n;
181
185
  });
182
186
  }, [r]), m = s((e, t) => {
183
187
  n((n) => {
@@ -185,18 +189,18 @@ var mr = ({ children: e }) => {
185
189
  ...n,
186
190
  ...t
187
191
  } : n);
188
- return W(r), r;
192
+ return xr(r), r;
189
193
  });
190
194
  }, []), h = s((e) => {
191
- let t = (Array.isArray(e) ? e : []).filter(Cr);
192
- t.some((e) => e.serverUrl === null) || (t = [U, ...t]);
195
+ let t = (Array.isArray(e) ? e : []).filter(wr);
196
+ t.some((e) => e.serverUrl === null) || (t = [J, ...t]);
193
197
  let r = x();
194
198
  r && !t.some((e) => _r(e.serverUrl, r)) && (t = [...t, {
195
199
  id: vr(),
196
200
  icon: "🌐",
197
201
  name: yr(r),
198
202
  serverUrl: r
199
- }]), n(t), i(xr(t)), W(t);
203
+ }]), n(t), i(Sr(t)), xr(t);
200
204
  }, []), g = u(() => ({
201
205
  workspaces: t,
202
206
  workspace: a,
@@ -214,597 +218,47 @@ var mr = ({ children: e }) => {
214
218
  m,
215
219
  h
216
220
  ]);
217
- return /* @__PURE__ */ p(wr.Provider, {
221
+ return /* @__PURE__ */ p(Tr.Provider, {
218
222
  value: g,
219
223
  children: e
220
224
  });
221
- }, Dr = o(null), G = "openbook.account", Or = "openbook.deviceId", kr = "openbook.account", Ar = "openbook.account.handoff";
222
- function jr(e, t, n) {
223
- let r = {
224
- type: "openbook-account-token",
225
- token: e,
226
- state: t
227
- };
228
- if (n === "broadcast") try {
229
- let e = new BroadcastChannel(kr);
230
- e.postMessage(r), e.close();
231
- } catch {}
232
- try {
233
- n === "storage" && localStorage.setItem(Ar, JSON.stringify(r));
234
- } catch {}
235
- }
236
- function Mr(e) {
237
- let t = (e ?? "").trim();
238
- if (!t) return null;
239
- let n = t.match(/[#?&]token=([^&\s#]+)/) ?? t.match(/^token=([^&\s#]+)/);
240
- if (n) try {
241
- return decodeURIComponent(n[1]);
242
- } catch {
243
- return n[1];
244
- }
245
- return /\s/.test(t) || t.includes("://") ? null : t;
246
- }
247
- var Nr = () => typeof crypto < "u" && "randomUUID" in crypto ? crypto.randomUUID().replace(/-/g, "") : Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2);
248
- function Pr() {
249
- if (typeof localStorage > "u") return "web";
250
- let e = localStorage.getItem(Or);
251
- return e || (e = Nr().slice(0, 12), localStorage.setItem(Or, e)), e;
252
- }
253
- function Fr() {
254
- if (typeof localStorage > "u") return null;
255
- try {
256
- let e = localStorage.getItem(G);
257
- if (!e) return null;
258
- let t = JSON.parse(e);
259
- return t && typeof t.token == "string" && t.token ? t : null;
260
- } catch {
261
- return null;
262
- }
263
- }
264
- var Ir = "openbook.account.pending", Lr = 600 * 1e3;
265
- function Rr(e) {
266
- try {
267
- sessionStorage.setItem(Ir, JSON.stringify({
268
- state: e,
269
- at: Date.now()
270
- }));
271
- } catch {}
272
- }
273
- function zr() {
274
- try {
275
- let e = sessionStorage.getItem(Ir);
276
- if (!e) return null;
277
- let t = JSON.parse(e);
278
- if (typeof t.state == "string" && typeof t.at == "number" && Date.now() - t.at < Lr) return t.state;
279
- } catch {}
280
- return null;
281
- }
282
- function Br() {
283
- try {
284
- sessionStorage.removeItem(Ir);
285
- } catch {}
286
- }
287
- var Vr = ({ children: e }) => {
288
- let { account: t } = cr(), { preferences: n, update: r } = hr(), { workspaces: i, replaceWorkspaces: a } = Tr(), [o, c] = f("disconnected"), [m, h] = f(null), [g, _] = f(null), [te, y] = f(null), b = u(() => new v(), []), x = u(() => ne(), []), S = u(() => `OpenBook ${t?.redirectUri?.startsWith("openbook:") ? "Desktop" : "Web"} · ${Pr()}`, [t]), C = d(null), w = d(null), T = d({
289
- preferences: n,
290
- workspaces: i
291
- });
292
- T.current = {
293
- preferences: n,
294
- workspaces: i
295
- };
296
- let E = s(() => ({
297
- preferences: T.current.preferences,
298
- workspaces: T.current.workspaces
299
- }), []), D = s((e, t) => {
300
- let n = {
301
- token: e,
302
- connectedAt: Date.now(),
303
- lastServerUpdatedAt: t
304
- };
305
- try {
306
- localStorage.setItem(G, JSON.stringify(n));
307
- } catch {}
308
- h(e), _(t);
309
- }, []), O = s((e) => {
310
- e.preferences && typeof e.preferences == "object" && r(e.preferences), Array.isArray(e.workspaces) && a(e.workspaces);
311
- }, [r, a]), k = s(async (e) => {
312
- c("syncing"), y(null);
313
- try {
314
- let { settings: t, updatedAt: n } = await b.getSettings(e);
315
- if (n === null || !t.preferences && !t.workspaces) {
316
- let t = E(), n = await b.putSettings(e, t);
317
- w.current = JSON.stringify(t), D(e, n.updatedAt);
318
- } else O(t), w.current = JSON.stringify(t), D(e, n);
319
- c("connected");
320
- } catch (t) {
321
- if (t instanceof ee && t.status === 401) {
322
- try {
323
- localStorage.removeItem(G);
324
- } catch {}
325
- h(null), c("error"), y("That sign-in was rejected. Please try again.");
326
- } else c(e ? "error" : "disconnected"), y("Could not reach account.book.pub. Check your connection.");
327
- }
328
- }, [
329
- b,
330
- E,
331
- O,
332
- D
333
- ]), A = s((e, t) => {
334
- let n = C.current ?? zr();
335
- !e || !n || !t || t !== n || (C.current = null, Br(), k(e));
336
- }, [k]);
337
- l(() => {
338
- if (t?.onCallback) return t.onCallback(({ token: e, state: t }) => A(e, t));
339
- if (typeof window > "u") return;
340
- let e = (e) => {
341
- let t = e;
342
- t?.type === "openbook-account-token" && typeof t.token == "string" && A(t.token, t.state ?? "");
343
- }, n = typeof BroadcastChannel < "u" ? new BroadcastChannel(kr) : null;
344
- n?.addEventListener("message", (t) => e(t.data));
345
- let r = (t) => {
346
- if (t.key === "openbook.account.handoff" && t.newValue) try {
347
- e(JSON.parse(t.newValue));
348
- } catch {}
349
- };
350
- window.addEventListener("storage", r);
351
- try {
352
- let t = localStorage.getItem(Ar);
353
- t && (localStorage.removeItem(Ar), e(JSON.parse(t)));
354
- } catch {}
355
- return () => {
356
- n?.close(), window.removeEventListener("storage", r);
357
- };
358
- }, [t, A]);
359
- let j = d(k);
360
- j.current = k, l(() => {
361
- let e = Fr();
362
- e && (h(e.token), _(e.lastServerUpdatedAt), j.current(e.token));
363
- }, []), l(() => {
364
- if (!m) return;
365
- let e = {
366
- preferences: n,
367
- workspaces: i
368
- }, t = JSON.stringify(e);
369
- if (t === w.current) return;
370
- let r = setTimeout(() => {
371
- c("syncing"), b.putSettings(m, e).then((e) => {
372
- w.current = t, _(e.updatedAt), c("connected"), y(null);
373
- let n = Fr();
374
- if (n) try {
375
- localStorage.setItem(G, JSON.stringify({
376
- ...n,
377
- lastServerUpdatedAt: e.updatedAt
378
- }));
379
- } catch {}
380
- }).catch(() => {
381
- c("error"), y("Sync failed — will retry on the next change.");
382
- });
383
- }, 1200);
384
- return () => clearTimeout(r);
385
- }, [
386
- m,
387
- n,
388
- i,
389
- b
390
- ]);
391
- let M = s(() => {
392
- let e = Nr();
393
- C.current = e, Rr(e), c("connecting"), y(null);
394
- let n = t?.redirectUri ?? (typeof window < "u" ? `${window.location.origin}/account/callback` : ""), r = b.connectUrl({
395
- redirectUri: n,
396
- state: e,
397
- name: S
398
- });
399
- t?.openSignIn ? t.openSignIn(r) : typeof window < "u" && (window.open(r, "openbook-signin", "width=520,height=720") || (window.location.href = r));
400
- }, [
401
- b,
402
- S,
403
- t
404
- ]), N = s((e) => {
405
- let t = Mr(e);
406
- if (!t) {
407
- c((e) => m ? e : "error"), y("That doesn’t look like a valid code. Paste the code (or the whole openbook:// link) from the browser.");
408
- return;
409
- }
410
- C.current = null, Br(), c("connecting"), y(null), k(t);
411
- }, [k, m]), P = s(() => {
412
- C.current = null, Br(), c((e) => m ? e : "disconnected"), y(null);
413
- }, [m]), re = s(() => {
414
- try {
415
- localStorage.removeItem(G);
416
- } catch {}
417
- C.current = null, Br(), w.current = null, h(null), _(null), y(null), c("disconnected");
418
- }, []), F = s(() => {
419
- m && k(m);
420
- }, [m, k]), I = u(() => ({
421
- status: o,
422
- connected: !!m && (o === "connected" || o === "syncing"),
423
- token: m,
424
- deviceName: S,
425
- lastSyncedAt: g,
426
- error: te,
427
- accountUrl: x,
428
- signIn: M,
429
- submitCode: N,
430
- cancel: P,
431
- signOut: re,
432
- syncNow: F
433
- }), [
434
- o,
435
- m,
436
- S,
437
- g,
438
- te,
439
- x,
440
- M,
441
- N,
442
- P,
443
- re,
444
- F
445
- ]);
446
- return /* @__PURE__ */ p(Dr.Provider, {
447
- value: I,
448
- children: e
449
- });
450
- }, Hr = () => {
451
- let e = c(Dr);
452
- if (!e) throw Error("useAccount must be used within an <AccountProvider>");
453
- return e;
454
- }, Ur = C.Root, Wr = C.Trigger, Gr = C.Portal, Kr = i.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ p(C.Overlay, {
455
- ref: n,
456
- className: V("fixed inset-0 z-50 bg-background/80 backdrop-blur-[var(--overlay-blur)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", e),
457
- ...t
458
- }));
459
- Kr.displayName = C.Overlay.displayName;
460
- var qr = i.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */ m(Gr, { children: [/* @__PURE__ */ p(Kr, {}), /* @__PURE__ */ p("div", {
461
- className: "fixed inset-0 z-50 flex items-center justify-center p-4",
462
- children: /* @__PURE__ */ m(C.Content, {
463
- ref: r,
464
- className: V("relative grid w-full max-w-lg gap-4 border bg-background p-6 shadow-overlay duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg", e),
465
- ...n,
466
- children: [t, /* @__PURE__ */ m(C.Close, {
467
- className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-hover data-[state=open]:text-muted-foreground",
468
- children: [/* @__PURE__ */ p(_, { className: "h-4 w-4" }), /* @__PURE__ */ p("span", {
469
- className: "sr-only",
470
- children: "Close"
471
- })]
472
- })]
473
- })
474
- })] }));
475
- qr.displayName = C.Content.displayName;
476
- var Jr = ({ className: e, ...t }) => /* @__PURE__ */ p("div", {
477
- className: V("flex flex-col space-y-1.5 text-center sm:text-left", e),
478
- ...t
479
- });
480
- Jr.displayName = "DialogHeader";
481
- var Yr = ({ className: e, ...t }) => /* @__PURE__ */ p("div", {
482
- className: V("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", e),
483
- ...t
484
- });
485
- Yr.displayName = "DialogFooter";
486
- var Xr = i.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ p(C.Title, {
487
- ref: n,
488
- className: V("text-lg font-semibold leading-none tracking-tight", e),
489
- ...t
490
- }));
491
- Xr.displayName = C.Title.displayName;
492
- var Zr = i.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ p(C.Description, {
493
- ref: n,
494
- className: V("text-sm text-muted-foreground", e),
495
- ...t
496
- }));
497
- Zr.displayName = C.Description.displayName;
498
- //#endregion
499
- //#region src/components/ui/button.tsx
500
- var Qr = T("inline-flex items-center justify-center rounded-md text-sm font-medium transition-[color,background-color,border-color,box-shadow,transform] active:scale-[0.97] focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100", {
501
- variants: {
502
- variant: {
503
- default: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",
504
- destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90",
505
- outline: "border border-input bg-transparent shadow-xs hover:bg-hover hover:text-accent-foreground",
506
- secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
507
- ghost: "hover:bg-hover hover:text-accent-foreground",
508
- link: "text-primary underline-offset-4 hover:underline"
225
+ }, Or = {
226
+ common: {
227
+ cancel: "Cancel",
228
+ close: "Close",
229
+ delete: "Delete",
230
+ save: "Save",
231
+ add: "Add",
232
+ remove: "Remove",
233
+ untitled: "Untitled",
234
+ settings: "Settings"
235
+ },
236
+ settings: {
237
+ title: "Settings",
238
+ comingSoon: "These settings are coming soon.",
239
+ fullscreen: "Full screen",
240
+ exitFullscreen: "Exit full screen",
241
+ enterFullscreen: "Enter full screen",
242
+ closeSettings: "Close settings",
243
+ section: {
244
+ preferences: "Preferences",
245
+ account: "Account",
246
+ workspace: "Workspace"
509
247
  },
510
- size: {
511
- default: "h-9 px-4 py-2",
512
- sm: "h-8 rounded-md px-3 text-xs",
513
- lg: "h-10 rounded-md px-8",
514
- icon: "h-9 w-9"
515
- }
516
- },
517
- defaultVariants: {
518
- variant: "default",
519
- size: "default"
520
- }
521
- }), $r = i.forwardRef(({ className: e, variant: t, size: n, asChild: r = !1, ...i }, a) => /* @__PURE__ */ p(r ? w : "button", {
522
- className: V(Qr({
523
- variant: t,
524
- size: n,
525
- className: e
526
- })),
527
- ref: a,
528
- ...i
529
- }));
530
- $r.displayName = "Button";
531
- //#endregion
532
- //#region src/providers/ConfirmProvider.tsx
533
- var ei = o(null);
534
- function ti({ children: e }) {
535
- let [t, n] = f(null), r = d(null), i = s((e) => {
536
- r.current?.(e), r.current = null, n(null);
537
- }, []), a = s((e) => (r.current?.(!1), new Promise((t) => {
538
- r.current = t, n(e);
539
- })), []), o = s((e) => {
540
- e || i(!1);
541
- }, [i]);
542
- return /* @__PURE__ */ m(ei.Provider, {
543
- value: a,
544
- children: [e, /* @__PURE__ */ p(Ur, {
545
- open: t !== null,
546
- onOpenChange: o,
547
- children: t && /* @__PURE__ */ m(qr, {
548
- className: "sm:max-w-[420px]",
549
- children: [/* @__PURE__ */ m(Jr, { children: [/* @__PURE__ */ p(Xr, { children: t.title }), t.description && /* @__PURE__ */ p(Zr, { children: t.description })] }), /* @__PURE__ */ m(Yr, { children: [!t.hideCancel && /* @__PURE__ */ p($r, {
550
- variant: "outline",
551
- onClick: () => i(!1),
552
- children: t.cancelText ?? "Cancel"
553
- }), /* @__PURE__ */ p($r, {
554
- variant: t.destructive ? "destructive" : "default",
555
- onClick: () => i(!0),
556
- children: t.confirmText ?? "Confirm"
557
- })] })]
558
- })
559
- })]
560
- });
561
- }
562
- function ni() {
563
- let e = c(ei);
564
- if (!e) throw Error("useConfirm must be used within a <ConfirmProvider>");
565
- return e;
566
- }
567
- //#endregion
568
- //#region src/providers/ForwardingProvider.tsx
569
- var ri = "openbook.forwarding.enabled", ii = o({
570
- supported: !1,
571
- enabled: !1,
572
- status: "idle",
573
- host: null,
574
- busy: !1,
575
- error: null,
576
- enable: async () => void 0,
577
- disable: () => void 0
578
- }), ai = () => typeof localStorage < "u" && localStorage.getItem(ri) === "1", oi = (e) => {
579
- typeof localStorage < "u" && localStorage.setItem(ri, e ? "1" : "0");
580
- }, si = ({ children: e }) => {
581
- let { forwarding: t } = cr(), { connected: n, token: r, accountUrl: i, signIn: a } = Hr(), o = !!t, c = d(null), [m, h] = f(() => ai()), [g, _] = f("idle"), [v, ee] = f(null), [y, b] = f(!1), [x, ne] = f(null);
582
- l(() => {
583
- t && t.keyStore.load().then((e) => e && ee(e.host)).catch(() => void 0);
584
- }, [t]);
585
- let S = s(async () => {
586
- if (!(!t || !r || c.current)) {
587
- b(!0), ne(null);
588
- try {
589
- let e = new te({
590
- accountUrl: i,
591
- authToken: r,
592
- keyStore: t.keyStore,
593
- localOrigin: "",
594
- localFetchImpl: t.localFetch,
595
- onStatus: _
596
- });
597
- c.current = e;
598
- let { host: n } = await e.start();
599
- ee(n);
600
- } catch (e) {
601
- c.current = null, _("offline"), ne(e instanceof Error ? e.message : String(e));
602
- } finally {
603
- b(!1);
604
- }
605
- }
606
- }, [
607
- t,
608
- r,
609
- i
610
- ]);
611
- l(() => {
612
- o && m && n && r && !c.current && S();
613
- }, [
614
- o,
615
- m,
616
- n,
617
- r,
618
- S
619
- ]), l(() => () => c.current?.stop(), []);
620
- let C = s(async () => {
621
- if (!n || !r) {
622
- a();
623
- return;
624
- }
625
- h(!0), oi(!0), await S();
626
- }, [
627
- n,
628
- r,
629
- a,
630
- S
631
- ]), w = s(() => {
632
- c.current?.stop(), c.current = null, _("offline"), h(!1), oi(!1);
633
- }, []), T = u(() => ({
634
- supported: o,
635
- enabled: m,
636
- status: g,
637
- host: v,
638
- busy: y,
639
- error: x,
640
- enable: C,
641
- disable: w
642
- }), [
643
- o,
644
- m,
645
- g,
646
- v,
647
- y,
648
- x,
649
- C,
650
- w
651
- ]);
652
- return /* @__PURE__ */ p(ii.Provider, {
653
- value: T,
654
- children: e
655
- });
656
- }, ci = () => c(ii), li = [
657
- {
658
- id: "preferences",
659
- tabs: [
660
- "general",
661
- "appearance",
662
- "customisation"
663
- ]
664
- },
665
- {
666
- id: "account",
667
- tabs: [
668
- "profile",
669
- "signup",
670
- "signin",
671
- "support"
672
- ]
673
- },
674
- {
675
- id: "workspace",
676
- tabs: [
677
- "connection",
678
- "integrations",
679
- "extensions",
680
- "ai",
681
- "admin"
682
- ]
683
- }
684
- ], ui = li.flatMap((e) => e.tabs), di = li[0].tabs[0], fi = (e) => typeof e == "string" && ui.includes(e), pi = {
685
- server: "connection",
686
- backup: "admin"
687
- }, mi = (e) => fi(e) ? e : typeof e == "string" && e in pi ? pi[e] : di, K = {
688
- commandPalette: { open: !1 },
689
- settings: {
690
- open: !1,
691
- mode: "modal",
692
- tab: di
693
- },
694
- present: {
695
- open: !1,
696
- mode: "fullscreen",
697
- pageId: null
698
- },
699
- sideNav: {
700
- open: !0,
701
- docked: !0
702
- },
703
- trash: { open: !1 },
704
- templates: { open: !1 },
705
- ai: { open: !1 },
706
- agent: { open: !1 }
707
- }, hi = () => {
708
- if (typeof window > "u" || localStorage.getItem("hud") === null) return K;
709
- let e = JSON.parse(localStorage.getItem("hud") ?? "{}"), t = {
710
- ...K.settings,
711
- ...e.settings
712
- };
713
- return {
714
- commandPalette: {
715
- ...K.commandPalette,
716
- ...e.commandPalette
717
- },
718
- settings: {
719
- ...t,
720
- tab: mi(t.tab)
721
- },
722
- sideNav: {
723
- ...K.sideNav,
724
- ...e.sideNav
725
- },
726
- trash: { open: !1 },
727
- templates: { open: !1 },
728
- ai: { open: !1 },
729
- agent: { open: !1 },
730
- present: { ...K.present }
731
- };
732
- }, gi = (e) => {
733
- let t = {
734
- ...e,
735
- settings: {
736
- ...e.settings,
737
- open: !1
738
- },
739
- trash: { open: !1 },
740
- templates: { open: !1 },
741
- ai: { open: !1 },
742
- agent: { open: !1 },
743
- present: { ...K.present }
744
- };
745
- localStorage.setItem("hud", JSON.stringify(t));
746
- }, _i = o({
747
- hud: K,
748
- setHud: () => !1
749
- }), vi = () => c(_i), yi = ({ children: e }) => {
750
- let [t, n] = E(hi), r = a.useRef(typeof window < "u" && localStorage.getItem("hud") !== null);
751
- a.useEffect(() => {
752
- gi(t);
753
- }, [t]), a.useEffect(() => {
754
- !r.current && window.innerWidth < 768 && n((e) => (e.sideNav.open = !1, e.sideNav.docked = !1, e));
755
- }, [n]);
756
- let i = a.useCallback((e) => {
757
- t.sideNav.docked || (e.clientX > 320 || e.clientX <= 1 ? n((e) => (e.sideNav.open = !1, e)) : e.clientX < 16 && n((e) => (e.sideNav.open = !0, e)));
758
- }, [
759
- t,
760
- t.sideNav,
761
- n
762
- ]);
763
- a.useEffect(() => (document.addEventListener("mousemove", i), () => document.removeEventListener("mousemove", i)), [i]);
764
- let o = {
765
- hud: t,
766
- setHud: n
767
- };
768
- return /* @__PURE__ */ p(_i.Provider, {
769
- value: o,
770
- children: e
771
- });
772
- }, bi = {
773
- common: {
774
- cancel: "Cancel",
775
- close: "Close",
776
- delete: "Delete",
777
- save: "Save",
778
- add: "Add",
779
- remove: "Remove",
780
- untitled: "Untitled",
781
- settings: "Settings"
782
- },
783
- settings: {
784
- title: "Settings",
785
- comingSoon: "These settings are coming soon.",
786
- fullscreen: "Full screen",
787
- exitFullscreen: "Exit full screen",
788
- enterFullscreen: "Enter full screen",
789
- closeSettings: "Close settings",
790
- section: {
791
- preferences: "Preferences",
792
- account: "Account",
793
- workspace: "Workspace"
794
- },
795
- tab: {
796
- general: "General",
797
- profile: "Profile",
798
- appearance: "Appearance",
799
- customisation: "Customisation",
800
- signup: "Sign up",
801
- signin: "Sign-in & email",
802
- support: "Support OpenBook",
803
- connection: "Connection",
804
- integrations: "Integrations",
805
- extensions: "Extensions",
806
- ai: "AI",
807
- admin: "Admin"
248
+ tab: {
249
+ general: "General",
250
+ profile: "Profile",
251
+ appearance: "Appearance",
252
+ customisation: "Customisation",
253
+ signup: "Sign up",
254
+ signin: "Sign-in & email",
255
+ support: "Support OpenBook",
256
+ connection: "Connection",
257
+ members: "Members",
258
+ integrations: "Integrations",
259
+ extensions: "Extensions",
260
+ ai: "AI",
261
+ admin: "Admin"
808
262
  }
809
263
  },
810
264
  appearance: {
@@ -932,6 +386,51 @@ var ri = "openbook.forwarding.enabled", ii = o({
932
386
  linkToPage: "Link to page"
933
387
  }
934
388
  },
389
+ share: {
390
+ open: "Share",
391
+ title: "Share this page",
392
+ description: "Choose who can access this page, and invite people to view or edit it.",
393
+ loadError: "Couldn’t load sharing settings for this page.",
394
+ unclaimedNotice: "Sharing takes effect once you claim this instance. Until then, anyone who can reach it can view and edit — these settings are saved but not yet enforced.",
395
+ enforcementCaveat: "People you invite may not be able to open this page through its published book.pub link yet — that’s rolling out. Direct access is already limited as set here.",
396
+ scopeLabel: "Who can access",
397
+ scope: {
398
+ inherit: "Workspace default",
399
+ inheritHint: "Follows the workspace’s default access setting.",
400
+ public: "Anyone with the link",
401
+ publicHint: "Visible to anyone, including people who aren’t signed in.",
402
+ authenticated: "Anyone signed in",
403
+ authenticatedHint: "Limits viewing to people who are signed in.",
404
+ members: "Workspace members",
405
+ membersHint: "Limits viewing to members of this workspace.",
406
+ restricted: "Only people invited",
407
+ restrictedHint: "Limits access to you and the people you invite below."
408
+ },
409
+ addLabel: "Invite people",
410
+ addPlaceholder: "Email or handle",
411
+ levelLabel: "Access level",
412
+ levelRead: "Can view",
413
+ levelWrite: "Can edit",
414
+ peopleLabel: "People with access",
415
+ loadingPeople: "Loading people…",
416
+ noPeople: "No one’s been invited yet.",
417
+ remove: "Remove {name}",
418
+ linkHints: {
419
+ inherit: "People with workspace access can open this link.",
420
+ public: "Anyone with the link can open this page.",
421
+ authenticated: "Anyone signed in who opens this link can view this page.",
422
+ members: "Only workspace members who open this link can view this page.",
423
+ restricted: "Only the people you invite can open this link."
424
+ },
425
+ copyLink: "Copy link",
426
+ copied: "Copied",
427
+ error: {
428
+ network: "Couldn’t reach the server. Check your connection and try again.",
429
+ forbidden: "You don’t have permission to change sharing for this page.",
430
+ notFound: "This page no longer exists.",
431
+ generic: "Something went wrong. Please try again."
432
+ }
433
+ },
935
434
  command: {
936
435
  title: "Command palette",
937
436
  placeholder: "Search pages or run a command…",
@@ -1106,8 +605,38 @@ var ri = "openbook.forwarding.enabled", ii = o({
1106
605
  confirmBody: "Restoring in place will replace the current content of {count} pages. This can’t be undone.",
1107
606
  confirmBodyNone: "No existing pages match — these will be added as new pages.",
1108
607
  confirmOverwrite: "Overwrite"
608
+ },
609
+ schedule: {
610
+ heading: "Scheduled backups",
611
+ intro: "Automatic snapshots on a rolling schedule — kept alongside your manual exports, with older ones pruned for you.",
612
+ webOnly: "Scheduled backups run in the desktop app or on a connected server. In the browser, use Export above to save a copy.",
613
+ enable: "Enable scheduled backups",
614
+ enableHint: "When on, OpenBook writes snapshots to the folder below and keeps a rolling set per interval.",
615
+ cadenceDaily: "Daily",
616
+ cadenceWeekly: "Weekly",
617
+ cadenceMonthly: "Monthly",
618
+ cadenceYearly: "Yearly",
619
+ keptLast: "Last {when} · {count} kept",
620
+ never: "No backup yet",
621
+ backupNow: "Back up now",
622
+ backingUp: "Backing up…",
623
+ ranNow: "Backed up — {file}",
624
+ folder: "Backup folder"
1109
625
  }
1110
626
  },
627
+ storage: {
628
+ heading: "Storage",
629
+ intro: "Compact the local database to reclaim disk space. Editing leaves behind storage overhead that this rewrites away; the app pauses briefly while it runs.",
630
+ compact: "Compact database",
631
+ compacting: "Compacting…",
632
+ confirmTitle: "Compact the database?",
633
+ confirmBody: "This rewrites the local database to reclaim space and may take a moment. The app will pause until it finishes.",
634
+ confirmAction: "Compact",
635
+ reclaimed: "Reclaimed {amount} — database is now {size}.",
636
+ alreadyCompact: "Already compact — nothing to reclaim ({size}).",
637
+ unavailable: "Compaction isn’t available for this server.",
638
+ failed: "Compaction failed: {error}"
639
+ },
1111
640
  workspace: {
1112
641
  workspaces: "Workspaces",
1113
642
  addWorkspace: "Add a workspace…",
@@ -1655,6 +1184,33 @@ var ri = "openbook.forwarding.enabled", ii = o({
1655
1184
  manualPlaceholder: "Paste your code or openbook://auth-callback#token=… link",
1656
1185
  manualSubmit: "Sign in with code"
1657
1186
  },
1187
+ switcher: {
1188
+ heading: "Accounts",
1189
+ activeAccount: "Active account",
1190
+ active: "Active",
1191
+ syncing: "Syncing…",
1192
+ error: "Needs attention",
1193
+ dormant: "Signed in",
1194
+ switchTo: "Switch to {name}",
1195
+ addAnother: "Add another account",
1196
+ removeAccount: "Remove {name} from this device",
1197
+ removeConfirmTitle: "Remove {name}?",
1198
+ removeConfirmBody: "This forgets {name} on this device only — sign in again any time to restore it. Your other accounts and your local data are untouched.",
1199
+ signOutActiveHint: "Sign out forgets the active account on this device; your other accounts stay signed in. To fully revoke a device, remove it in your account dashboard."
1200
+ },
1201
+ error: {
1202
+ rejected: "That sign-in was rejected. Please try again.",
1203
+ rejectedReauth: "That sign-in was rejected. Please sign in again.",
1204
+ unreachable: "Could not reach account.book.pub. Check your connection.",
1205
+ syncFailed: "Sync failed — will retry on the next change.",
1206
+ invalidCode: "That doesn’t look like a valid code. Paste the code (or the whole openbook:// link) from the browser."
1207
+ },
1208
+ nudge: {
1209
+ title: "Sync and publish",
1210
+ body: "Sign up free to keep your preferences and workspaces in sync across devices — then publish your work to the web. Local-first stays the default.",
1211
+ cta: "Get started free",
1212
+ dismiss: "Dismiss"
1213
+ },
1658
1214
  support: {
1659
1215
  title: "Support OpenBook",
1660
1216
  description: "OpenBook is independent and open source. Sharing it and sending feedback helps it grow. Sponsorship options are on the way."
@@ -1672,6 +1228,14 @@ var ri = "openbook.forwarding.enabled", ii = o({
1672
1228
  copy: "Copy",
1673
1229
  copied: "Copied",
1674
1230
  failed: "Couldn’t register: {error}",
1231
+ partialUnscoped: "Forwarding is on, but your account did not issue a site-scoped owner token, so strict audience isolation stays off (a token minted for a different site is still rejected, and the tunnel works normally).",
1232
+ ensureRescope: "Forwarding resumed, but this session could not scope your owner token to the site yet. Your existing access is unchanged; sign in again if a request is refused.",
1233
+ bindFailed: "Forwarding is on, but securing the site audience didn’t finish: {error}",
1234
+ unbindHeld: "Couldn’t fully relax the audience binding while turning forwarding off: {error}",
1235
+ claimWarning: "The first time you turn this on, this device’s books are claimed to your account and made private — only you and members you invite can open them. This can’t be undone.",
1236
+ claimRefusedUnverified: "To publish, your account identity needs to be verified first.",
1237
+ refreshIdentity: "Refresh identity",
1238
+ claimFailed: "Couldn’t claim this device for your account, so it wasn’t published. Try again.",
1675
1239
  status: {
1676
1240
  live: "Live",
1677
1241
  connecting: "Connecting",
@@ -1716,6 +1280,64 @@ var ri = "openbook.forwarding.enabled", ii = o({
1716
1280
  changeFolder: "Change…",
1717
1281
  reveal: "Reveal in Finder"
1718
1282
  },
1283
+ sharing: {
1284
+ title: "Guests & access",
1285
+ description: "Control what people who haven’t signed in can do on this shared workspace. Your own access is never affected.",
1286
+ youUser: "You’re acting as {name}.",
1287
+ youGuestNamed: "You’re editing as guest “{name}”.",
1288
+ youGuestAnon: "You’re editing as an anonymous guest.",
1289
+ guestAccess: "Guest access",
1290
+ guestAccessHint: "Applies to anyone reaching this workspace without signing in — over the network or a shared ✦.book.pub link.",
1291
+ guestWrite: "Read & edit",
1292
+ guestRead: "Read only",
1293
+ guestOff: "No access",
1294
+ ownerLocked: "Only the workspace owner can change this.",
1295
+ saveError: "Couldn’t update access — {error}"
1296
+ },
1297
+ members: {
1298
+ title: "Members",
1299
+ description: "People with a role on this workspace. Invite by email or handle, change who can manage, and remove access.",
1300
+ youUser: "You’re signed in as {name}.",
1301
+ youGuest: "You’re browsing as a guest.",
1302
+ loading: "Loading members…",
1303
+ empty: "No members yet. Invite someone above to get started.",
1304
+ loadError: "Couldn’t load members — {error}",
1305
+ retry: "Try again",
1306
+ unavailable: "This workspace’s server doesn’t support members yet.",
1307
+ lockedTitle: "Members are managed by admins",
1308
+ locked: "Ask a workspace admin to invite you or change a role.",
1309
+ lockedRoleOwner: "You can’t change the owner’s role",
1310
+ lockedRoleSelf: "You can’t change your own role here",
1311
+ lockedRemoveOwner: "You can’t remove the owner",
1312
+ lockedRemoveSelf: "You can’t remove yourself",
1313
+ inviteLabel: "Invite a member",
1314
+ inviteHint: "Enter an email address or a handle (iss#sub). An email invite is claimed when that person first signs in.",
1315
+ invitePlaceholder: "name@example.com or iss#sub",
1316
+ inviteRole: "Role for the invite",
1317
+ invite: "Invite",
1318
+ inviteError: "Couldn’t invite — {error}",
1319
+ listLabel: "Current members",
1320
+ roleAdmin: "Admin",
1321
+ roleViewer: "Viewer",
1322
+ changeRole: "Change role for {name}",
1323
+ statusActive: "Active",
1324
+ statusInvited: "Invited",
1325
+ statusSuspended: "Suspended",
1326
+ you: "You",
1327
+ owner: "Owner",
1328
+ remove: "Remove {name}",
1329
+ removeTitle: "Remove {name}?",
1330
+ removeBody: "They’ll lose their role on this workspace. An email invite can be re-sent later.",
1331
+ removeConfirm: "Remove",
1332
+ actionError: "Couldn’t update member — {error}"
1333
+ },
1334
+ provenance: {
1335
+ editedBy: "Edited by {name}",
1336
+ justNow: "just now",
1337
+ aGuest: "a guest",
1338
+ someone: "someone",
1339
+ unverified: "unverified identity"
1340
+ },
1719
1341
  integrations: {
1720
1342
  title: "Integrations",
1721
1343
  description: "Connect OpenBook to other tools. Integrations aren’t available yet — this is where they’ll live."
@@ -1732,7 +1354,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
1732
1354
  resetConfirmBody: "This clears appearance, language, and layout settings on this device and reloads. Your pages and workspaces are not affected.",
1733
1355
  resetConfirmButton: "Reset"
1734
1356
  }
1735
- }, xi = {
1357
+ }, kr = {
1736
1358
  common: {
1737
1359
  cancel: "Abbrechen",
1738
1360
  close: "Schließen",
@@ -1764,6 +1386,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
1764
1386
  signin: "Anmeldung & E-Mail",
1765
1387
  support: "OpenBook unterstützen",
1766
1388
  connection: "Verbindung",
1389
+ members: "Mitglieder",
1767
1390
  integrations: "Integrationen",
1768
1391
  extensions: "Erweiterungen",
1769
1392
  ai: "KI",
@@ -1838,6 +1461,51 @@ var ri = "openbook.forwarding.enabled", ii = o({
1838
1461
  linkToPage: "Mit Seite verknüpfen"
1839
1462
  }
1840
1463
  },
1464
+ share: {
1465
+ open: "Teilen",
1466
+ title: "Diese Seite teilen",
1467
+ description: "Lege fest, wer auf diese Seite zugreifen darf, und lade Personen zum Ansehen oder Bearbeiten ein.",
1468
+ loadError: "Die Freigabeeinstellungen für diese Seite konnten nicht geladen werden.",
1469
+ unclaimedNotice: "Die Freigabe wird erst wirksam, wenn du diese Instanz beanspruchst. Bis dahin kann jede Person mit Zugriff ansehen und bearbeiten — diese Einstellungen werden gespeichert, aber noch nicht durchgesetzt.",
1470
+ enforcementCaveat: "Von dir eingeladene Personen können diese Seite über ihren veröffentlichten book.pub-Link möglicherweise noch nicht öffnen — das wird gerade ausgerollt. Der direkte Zugriff ist bereits wie hier festgelegt eingeschränkt.",
1471
+ scopeLabel: "Wer hat Zugriff",
1472
+ scope: {
1473
+ inherit: "Arbeitsbereich-Standard",
1474
+ inheritHint: "Folgt der Standard-Zugriffseinstellung des Arbeitsbereichs.",
1475
+ public: "Alle mit dem Link",
1476
+ publicHint: "Für alle sichtbar, auch für nicht angemeldete Personen.",
1477
+ authenticated: "Alle Angemeldeten",
1478
+ authenticatedHint: "Beschränkt das Ansehen auf angemeldete Personen.",
1479
+ members: "Arbeitsbereich-Mitglieder",
1480
+ membersHint: "Beschränkt das Ansehen auf Mitglieder dieses Arbeitsbereichs.",
1481
+ restricted: "Nur eingeladene Personen",
1482
+ restrictedHint: "Beschränkt den Zugriff auf dich und die unten eingeladenen Personen."
1483
+ },
1484
+ addLabel: "Personen einladen",
1485
+ addPlaceholder: "E-Mail oder Handle",
1486
+ levelLabel: "Zugriffsebene",
1487
+ levelRead: "Kann ansehen",
1488
+ levelWrite: "Kann bearbeiten",
1489
+ peopleLabel: "Personen mit Zugriff",
1490
+ loadingPeople: "Personen werden geladen …",
1491
+ noPeople: "Es wurde noch niemand eingeladen.",
1492
+ remove: "{name} entfernen",
1493
+ linkHints: {
1494
+ inherit: "Personen mit Arbeitsbereich-Zugriff können diesen Link öffnen.",
1495
+ public: "Jede Person mit dem Link kann diese Seite öffnen.",
1496
+ authenticated: "Jede angemeldete Person, die diesen Link öffnet, kann diese Seite ansehen.",
1497
+ members: "Nur Arbeitsbereich-Mitglieder, die diesen Link öffnen, können diese Seite ansehen.",
1498
+ restricted: "Nur die von dir eingeladenen Personen können diesen Link öffnen."
1499
+ },
1500
+ copyLink: "Link kopieren",
1501
+ copied: "Kopiert",
1502
+ error: {
1503
+ network: "Server nicht erreichbar. Prüfe deine Verbindung und versuche es erneut.",
1504
+ forbidden: "Du hast keine Berechtigung, die Freigabe dieser Seite zu ändern.",
1505
+ notFound: "Diese Seite existiert nicht mehr.",
1506
+ generic: "Etwas ist schiefgelaufen. Bitte versuche es erneut."
1507
+ }
1508
+ },
1841
1509
  command: {
1842
1510
  title: "Befehlspalette",
1843
1511
  search: "Suchen",
@@ -2347,11 +2015,64 @@ var ri = "openbook.forwarding.enabled", ii = o({
2347
2015
  title: "Anmeldung & E-Mail",
2348
2016
  description: "E-Mail und verbundene Anmeldung (Google, GitHub, Apple) kommen mit den Konten. Es gibt noch nichts, wo man sich anmelden könnte."
2349
2017
  },
2018
+ switcher: {
2019
+ heading: "Konten",
2020
+ activeAccount: "Aktives Konto",
2021
+ active: "Aktiv",
2022
+ syncing: "Wird synchronisiert…",
2023
+ error: "Aktion erforderlich",
2024
+ dormant: "Angemeldet",
2025
+ switchTo: "Zu {name} wechseln",
2026
+ addAnother: "Weiteres Konto hinzufügen",
2027
+ removeAccount: "{name} von diesem Gerät entfernen",
2028
+ removeConfirmTitle: "{name} entfernen?",
2029
+ removeConfirmBody: "Damit wird {name} nur auf diesem Gerät vergessen – melde dich jederzeit wieder an, um es wiederherzustellen. Deine anderen Konten und lokalen Daten bleiben unberührt.",
2030
+ signOutActiveHint: "Beim Abmelden wird das aktive Konto auf diesem Gerät vergessen; deine anderen Konten bleiben angemeldet. Um ein Gerät vollständig zu widerrufen, entferne es im Konto-Dashboard."
2031
+ },
2032
+ error: {
2033
+ rejected: "Diese Anmeldung wurde abgelehnt. Bitte versuche es erneut.",
2034
+ rejectedReauth: "Diese Anmeldung wurde abgelehnt. Bitte melde dich erneut an.",
2035
+ unreachable: "account.book.pub war nicht erreichbar. Prüfe deine Verbindung.",
2036
+ syncFailed: "Synchronisierung fehlgeschlagen – wird bei der nächsten Änderung erneut versucht.",
2037
+ invalidCode: "Das sieht nicht nach einem gültigen Code aus. Füge den Code (oder den ganzen openbook://-Link) aus dem Browser ein."
2038
+ },
2039
+ nudge: {
2040
+ title: "Synchronisieren und veröffentlichen",
2041
+ body: "Registriere dich kostenlos, damit deine Einstellungen und Arbeitsbereiche geräteübergreifend synchron bleiben – danach kannst du deine Arbeit im Web veröffentlichen. Local-First bleibt Standard.",
2042
+ cta: "Kostenlos starten",
2043
+ dismiss: "Schließen"
2044
+ },
2350
2045
  support: {
2351
2046
  title: "OpenBook unterstützen",
2352
2047
  description: "OpenBook ist unabhängig und quelloffen. Es zu teilen und Feedback zu senden hilft beim Wachsen. Sponsoring-Optionen sind in Arbeit."
2353
2048
  }
2354
2049
  },
2050
+ forwarding: {
2051
+ title: "Ins Web weiterleiten",
2052
+ description: "Sichere dir eine private ✦.book.pub-Adresse, die die Bücher dieses Geräts in jedem Browser öffnet — nichts zu hosten, nichts im Netzwerk freizugeben.",
2053
+ toggle: "Dieses Gerät weiterleiten",
2054
+ signInHint: "Melde dich zuerst bei deinem Konto an, um eine Adresse zu sichern.",
2055
+ signIn: "Anmelden",
2056
+ registering: "Verbinden…",
2057
+ address: "Deine Adresse",
2058
+ addressHint: "Öffnet die Bücher dieses Geräts in jedem Browser, solange es online ist.",
2059
+ copy: "Kopieren",
2060
+ copied: "Kopiert",
2061
+ failed: "Registrierung fehlgeschlagen: {error}",
2062
+ partialUnscoped: "Die Weiterleitung ist aktiv, aber dein Konto hat kein auf die Site begrenztes Owner-Token ausgestellt, daher bleibt die strikte Audience-Isolierung aus (ein für eine andere Site ausgestelltes Token wird weiterhin abgewiesen, und der Tunnel funktioniert normal).",
2063
+ ensureRescope: "Die Weiterleitung wurde fortgesetzt, aber diese Sitzung konnte dein Owner-Token noch nicht auf die Site begrenzen. Dein bestehender Zugriff bleibt unverändert; melde dich erneut an, falls eine Anfrage abgelehnt wird.",
2064
+ bindFailed: "Die Weiterleitung ist aktiv, aber das Absichern der Site-Audience wurde nicht abgeschlossen: {error}",
2065
+ unbindHeld: "Die Audience-Bindung konnte beim Ausschalten der Weiterleitung nicht vollständig gelöst werden: {error}",
2066
+ claimWarning: "Beim ersten Einschalten werden die Bücher dieses Geräts deinem Konto zugeordnet und privat geschaltet — nur du und von dir eingeladene Mitglieder können sie öffnen. Das lässt sich nicht rückgängig machen.",
2067
+ claimRefusedUnverified: "Zum Veröffentlichen muss die Identität deines Kontos zuerst verifiziert werden.",
2068
+ refreshIdentity: "Identität aktualisieren",
2069
+ claimFailed: "Dieses Gerät konnte deinem Konto nicht zugeordnet werden und wurde daher nicht veröffentlicht. Versuche es erneut.",
2070
+ status: {
2071
+ live: "Live",
2072
+ connecting: "Verbinden",
2073
+ offline: "Offline"
2074
+ }
2075
+ },
2355
2076
  connection: {
2356
2077
  title: "Verbindung",
2357
2078
  description: "Wähle, wo dieses Gerät Seiten liest und schreibt.",
@@ -2387,6 +2108,43 @@ var ri = "openbook.forwarding.enabled", ii = o({
2387
2108
  resetConfirmBody: "Dies löscht Darstellungs-, Sprach- und Layout-Einstellungen auf diesem Gerät und lädt neu. Deine Seiten und Arbeitsbereiche sind nicht betroffen.",
2388
2109
  resetConfirmButton: "Zurücksetzen"
2389
2110
  },
2111
+ members: {
2112
+ title: "Mitglieder",
2113
+ description: "Personen mit einer Rolle in diesem Arbeitsbereich. Lade per E-Mail oder Handle ein, ändere die Verwaltung und entferne Zugriff.",
2114
+ youUser: "Du bist angemeldet als {name}.",
2115
+ youGuest: "Du bist als Gast unterwegs.",
2116
+ loading: "Mitglieder werden geladen…",
2117
+ empty: "Noch keine Mitglieder. Lade oben jemanden ein, um zu beginnen.",
2118
+ loadError: "Mitglieder konnten nicht geladen werden — {error}",
2119
+ retry: "Erneut versuchen",
2120
+ unavailable: "Der Server dieses Arbeitsbereichs unterstützt noch keine Mitglieder.",
2121
+ lockedTitle: "Mitglieder werden von Admins verwaltet",
2122
+ locked: "Bitte eine Admin-Person, dich einzuladen oder eine Rolle zu ändern.",
2123
+ lockedRoleOwner: "Die Rolle des Eigentümers kannst du nicht ändern",
2124
+ lockedRoleSelf: "Deine eigene Rolle kannst du hier nicht ändern",
2125
+ lockedRemoveOwner: "Den Eigentümer kannst du nicht entfernen",
2126
+ lockedRemoveSelf: "Dich selbst kannst du nicht entfernen",
2127
+ inviteLabel: "Mitglied einladen",
2128
+ inviteHint: "Gib eine E-Mail-Adresse oder ein Handle (iss#sub) ein. Eine E-Mail-Einladung wird bei der ersten Anmeldung übernommen.",
2129
+ invitePlaceholder: "name@example.com oder iss#sub",
2130
+ inviteRole: "Rolle für die Einladung",
2131
+ invite: "Einladen",
2132
+ inviteError: "Einladung fehlgeschlagen — {error}",
2133
+ listLabel: "Aktuelle Mitglieder",
2134
+ roleAdmin: "Admin",
2135
+ roleViewer: "Betrachter",
2136
+ changeRole: "Rolle ändern für {name}",
2137
+ statusActive: "Aktiv",
2138
+ statusInvited: "Eingeladen",
2139
+ statusSuspended: "Gesperrt",
2140
+ you: "Du",
2141
+ owner: "Eigentümer",
2142
+ remove: "{name} entfernen",
2143
+ removeTitle: "{name} entfernen?",
2144
+ removeBody: "Die Person verliert ihre Rolle in diesem Arbeitsbereich. Eine E-Mail-Einladung kann später erneut gesendet werden.",
2145
+ removeConfirm: "Entfernen",
2146
+ actionError: "Mitglied konnte nicht aktualisiert werden — {error}"
2147
+ },
2390
2148
  properties: {
2391
2149
  owner: "Verantwortlich",
2392
2150
  setOwner: "Verantwortliche Person festlegen",
@@ -2402,7 +2160,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
2402
2160
  noBacklinks: "Noch keine Backlinks",
2403
2161
  refresh: "Aktualisieren"
2404
2162
  }
2405
- }, Si = {
2163
+ }, Ar = {
2406
2164
  common: {
2407
2165
  cancel: "キャンセル",
2408
2166
  close: "閉じる",
@@ -2434,6 +2192,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
2434
2192
  signin: "サインインとメール",
2435
2193
  support: "OpenBook を支援",
2436
2194
  connection: "接続",
2195
+ members: "メンバー",
2437
2196
  integrations: "連携",
2438
2197
  extensions: "拡張機能",
2439
2198
  ai: "AI",
@@ -2508,6 +2267,51 @@ var ri = "openbook.forwarding.enabled", ii = o({
2508
2267
  linkToPage: "ページにリンク"
2509
2268
  }
2510
2269
  },
2270
+ share: {
2271
+ open: "共有",
2272
+ title: "このページを共有",
2273
+ description: "このページにアクセスできる人を選び、閲覧または編集に招待します。",
2274
+ loadError: "このページの共有設定を読み込めませんでした。",
2275
+ unclaimedNotice: "共有はこのインスタンスを要求したあとに有効になります。それまでは、アクセスできる人なら誰でも閲覧・編集できます。設定は保存されますが、まだ適用されません。",
2276
+ enforcementCaveat: "招待した人は、公開された book.pub リンクからこのページをまだ開けない場合があります — 現在順次対応中です。直接アクセスはここで設定したとおりすでに制限されています。",
2277
+ scopeLabel: "アクセスできる人",
2278
+ scope: {
2279
+ inherit: "ワークスペースの既定",
2280
+ inheritHint: "ワークスペースの既定のアクセス設定に従います。",
2281
+ public: "リンクを知っている全員",
2282
+ publicHint: "サインインしていない人を含め、誰でも閲覧できます。",
2283
+ authenticated: "サインイン済みの全員",
2284
+ authenticatedHint: "閲覧をサインイン済みの人に制限します。",
2285
+ members: "ワークスペースのメンバー",
2286
+ membersHint: "閲覧をこのワークスペースのメンバーに制限します。",
2287
+ restricted: "招待した人のみ",
2288
+ restrictedHint: "アクセスをあなたと下で招待した人に制限します。"
2289
+ },
2290
+ addLabel: "人を招待",
2291
+ addPlaceholder: "メールまたはハンドル",
2292
+ levelLabel: "アクセス権限",
2293
+ levelRead: "閲覧可能",
2294
+ levelWrite: "編集可能",
2295
+ peopleLabel: "アクセスできる人",
2296
+ loadingPeople: "読み込み中…",
2297
+ noPeople: "まだ誰も招待されていません。",
2298
+ remove: "{name} を削除",
2299
+ linkHints: {
2300
+ inherit: "ワークスペースにアクセスできる人はこのリンクを開けます。",
2301
+ public: "リンクを知っている人なら誰でもこのページを開けます。",
2302
+ authenticated: "サインイン済みの人がこのリンクを開くと、このページを閲覧できます。",
2303
+ members: "このリンクを開いたワークスペースのメンバーのみがこのページを閲覧できます。",
2304
+ restricted: "あなたが招待した人のみがこのリンクを開けます。"
2305
+ },
2306
+ copyLink: "リンクをコピー",
2307
+ copied: "コピーしました",
2308
+ error: {
2309
+ network: "サーバーに接続できませんでした。接続を確認して、もう一度お試しください。",
2310
+ forbidden: "このページの共有を変更する権限がありません。",
2311
+ notFound: "このページは存在しません。",
2312
+ generic: "問題が発生しました。もう一度お試しください。"
2313
+ }
2314
+ },
2511
2315
  command: {
2512
2316
  title: "コマンドパレット",
2513
2317
  search: "検索",
@@ -3017,11 +2821,64 @@ var ri = "openbook.forwarding.enabled", ii = o({
3017
2821
  title: "サインインとメール",
3018
2822
  description: "メールと連携サインイン(Google、GitHub、Apple)はアカウントとともに登場します。まだサインインできる先はありません。"
3019
2823
  },
2824
+ switcher: {
2825
+ heading: "アカウント",
2826
+ activeAccount: "使用中のアカウント",
2827
+ active: "使用中",
2828
+ syncing: "同期中…",
2829
+ error: "対応が必要",
2830
+ dormant: "サインイン済み",
2831
+ switchTo: "{name} に切り替える",
2832
+ addAnother: "別のアカウントを追加",
2833
+ removeAccount: "{name} をこの端末から削除",
2834
+ removeConfirmTitle: "{name} を削除しますか?",
2835
+ removeConfirmBody: "この端末から {name} を解除するだけです。いつでも再度サインインすれば復元できます。他のアカウントやローカルデータには影響しません。",
2836
+ signOutActiveHint: "サインアウトすると、この端末で使用中のアカウントが解除されます。他のアカウントはサインインしたままです。端末を完全に無効化するには、アカウントのダッシュボードから削除してください。"
2837
+ },
2838
+ error: {
2839
+ rejected: "サインインが拒否されました。もう一度お試しください。",
2840
+ rejectedReauth: "サインインが拒否されました。もう一度サインインしてください。",
2841
+ unreachable: "account.book.pub に接続できませんでした。接続を確認してください。",
2842
+ syncFailed: "同期に失敗しました。次の変更時に再試行します。",
2843
+ invalidCode: "有効なコードではないようです。ブラウザからコード(または openbook:// リンク全体)を貼り付けてください。"
2844
+ },
2845
+ nudge: {
2846
+ title: "同期して公開",
2847
+ body: "無料で登録すると、設定とワークスペースを端末間で同期できます。そのうえで、作品をウェブに公開できます。ローカルファーストが既定のままです。",
2848
+ cta: "無料で始める",
2849
+ dismiss: "閉じる"
2850
+ },
3020
2851
  support: {
3021
2852
  title: "OpenBook を支援",
3022
2853
  description: "OpenBook は独立したオープンソースです。共有やフィードバックが成長を助けます。スポンサーの仕組みも準備中です。"
3023
2854
  }
3024
2855
  },
2856
+ forwarding: {
2857
+ partialUnscoped: "転送は有効ですが、アカウントがサイト用にスコープされたオーナートークンを発行しなかったため、厳格なオーディエンス分離はオフのままです(別のサイト向けに発行されたトークンは引き続き拒否され、トンネルは正常に動作します)。",
2858
+ ensureRescope: "転送を再開しましたが、このセッションではオーナートークンをまだサイトにスコープできませんでした。既存のアクセスは変わりません。リクエストが拒否される場合は、もう一度サインインしてください。",
2859
+ bindFailed: "転送は有効ですが、サイトのオーディエンスの保護を完了できませんでした: {error}",
2860
+ unbindHeld: "転送をオフにする際に、オーディエンスのバインドを完全に解除できませんでした: {error}",
2861
+ title: "ウェブに転送",
2862
+ description: "プライベートな ✦.book.pub アドレスを取得すると、このデバイスのブックをどのブラウザーからでも開けます。ホスティングもネットワークでの公開も不要です。",
2863
+ toggle: "このデバイスを転送",
2864
+ signInHint: "アドレスを取得するには、まずアカウントにサインインしてください。",
2865
+ signIn: "サインイン",
2866
+ registering: "接続中…",
2867
+ address: "あなたのアドレス",
2868
+ addressHint: "オンラインの間、このデバイスのブックをどのブラウザーからでも開けます。",
2869
+ copy: "コピー",
2870
+ copied: "コピーしました",
2871
+ failed: "登録できませんでした: {error}",
2872
+ claimWarning: "初めてオンにすると、このデバイスのブックはあなたのアカウントに紐付けられ、非公開になります。あなたと招待したメンバーだけが開けます。この操作は取り消せません。",
2873
+ claimRefusedUnverified: "公開するには、まずアカウントのアイデンティティを検証する必要があります。",
2874
+ refreshIdentity: "アイデンティティを更新",
2875
+ claimFailed: "このデバイスをあなたのアカウントに紐付けできず、公開されませんでした。もう一度お試しください。",
2876
+ status: {
2877
+ live: "稼働中",
2878
+ connecting: "接続中",
2879
+ offline: "オフライン"
2880
+ }
2881
+ },
3025
2882
  connection: {
3026
2883
  title: "接続",
3027
2884
  description: "このデバイスがページを読み書きする場所を選びます。",
@@ -3057,6 +2914,43 @@ var ri = "openbook.forwarding.enabled", ii = o({
3057
2914
  resetConfirmBody: "このデバイスの外観・言語・レイアウト設定を消去して再読み込みします。ページとワークスペースには影響しません。",
3058
2915
  resetConfirmButton: "リセット"
3059
2916
  },
2917
+ members: {
2918
+ title: "メンバー",
2919
+ description: "このワークスペースで役割を持つ人。メールまたはハンドルで招待し、管理権限を変更したり、アクセスを削除したりできます。",
2920
+ youUser: "{name} としてサインインしています。",
2921
+ youGuest: "ゲストとして閲覧しています。",
2922
+ loading: "メンバーを読み込み中…",
2923
+ empty: "まだメンバーがいません。上から誰かを招待して始めましょう。",
2924
+ loadError: "メンバーを読み込めませんでした — {error}",
2925
+ retry: "再試行",
2926
+ unavailable: "このワークスペースのサーバーはまだメンバーに対応していません。",
2927
+ lockedTitle: "メンバーは管理者が管理します",
2928
+ locked: "管理者に招待や役割の変更を依頼してください。",
2929
+ lockedRoleOwner: "オーナーの役割は変更できません",
2930
+ lockedRoleSelf: "自分の役割はここでは変更できません",
2931
+ lockedRemoveOwner: "オーナーは削除できません",
2932
+ lockedRemoveSelf: "自分自身は削除できません",
2933
+ inviteLabel: "メンバーを招待",
2934
+ inviteHint: "メールアドレスまたはハンドル(iss#sub)を入力します。メール招待は、その人が初めてサインインしたときに引き継がれます。",
2935
+ invitePlaceholder: "name@example.com または iss#sub",
2936
+ inviteRole: "招待の役割",
2937
+ invite: "招待",
2938
+ inviteError: "招待できませんでした — {error}",
2939
+ listLabel: "現在のメンバー",
2940
+ roleAdmin: "管理者",
2941
+ roleViewer: "閲覧者",
2942
+ changeRole: "{name} の役割を変更",
2943
+ statusActive: "アクティブ",
2944
+ statusInvited: "招待済み",
2945
+ statusSuspended: "停止中",
2946
+ you: "あなた",
2947
+ owner: "オーナー",
2948
+ remove: "{name} を削除",
2949
+ removeTitle: "{name} を削除しますか?",
2950
+ removeBody: "この人はこのワークスペースでの役割を失います。メール招待は後で再送できます。",
2951
+ removeConfirm: "削除",
2952
+ actionError: "メンバーを更新できませんでした — {error}"
2953
+ },
3060
2954
  properties: {
3061
2955
  owner: "担当者",
3062
2956
  setOwner: "担当者を設定",
@@ -3072,7 +2966,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
3072
2966
  noBacklinks: "バックリンクはまだありません",
3073
2967
  refresh: "更新"
3074
2968
  }
3075
- }, Ci = {
2969
+ }, jr = {
3076
2970
  common: {
3077
2971
  cancel: "取消",
3078
2972
  close: "关闭",
@@ -3104,6 +2998,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
3104
2998
  signin: "登录与邮箱",
3105
2999
  support: "支持 OpenBook",
3106
3000
  connection: "连接",
3001
+ members: "成员",
3107
3002
  integrations: "集成",
3108
3003
  extensions: "扩展",
3109
3004
  ai: "AI",
@@ -3178,6 +3073,51 @@ var ri = "openbook.forwarding.enabled", ii = o({
3178
3073
  linkToPage: "链接到页面"
3179
3074
  }
3180
3075
  },
3076
+ share: {
3077
+ open: "共享",
3078
+ title: "共享此页面",
3079
+ description: "选择谁可以访问此页面,并邀请他人查看或编辑。",
3080
+ loadError: "无法加载此页面的共享设置。",
3081
+ unclaimedNotice: "共享将在你认领此实例后生效。在此之前,任何能够访问它的人都可以查看和编辑——这些设置已保存,但尚未强制执行。",
3082
+ enforcementCaveat: "你邀请的人可能还无法通过已发布的 book.pub 链接打开此页面——此功能正在逐步推出。直接访问已按此处的设置受到限制。",
3083
+ scopeLabel: "谁可以访问",
3084
+ scope: {
3085
+ inherit: "工作区默认",
3086
+ inheritHint: "沿用工作区的默认访问设置。",
3087
+ public: "任何获得链接的人",
3088
+ publicHint: "所有人可见,包括未登录的人。",
3089
+ authenticated: "任何已登录的人",
3090
+ authenticatedHint: "将查看权限限制为已登录的人。",
3091
+ members: "工作区成员",
3092
+ membersHint: "将查看权限限制为此工作区的成员。",
3093
+ restricted: "仅受邀请的人",
3094
+ restrictedHint: "将访问权限限制为你和下面邀请的人。"
3095
+ },
3096
+ addLabel: "邀请他人",
3097
+ addPlaceholder: "电子邮件或用户名",
3098
+ levelLabel: "访问权限",
3099
+ levelRead: "可查看",
3100
+ levelWrite: "可编辑",
3101
+ peopleLabel: "有权访问的人",
3102
+ loadingPeople: "正在加载…",
3103
+ noPeople: "尚未邀请任何人。",
3104
+ remove: "移除 {name}",
3105
+ linkHints: {
3106
+ inherit: "拥有工作区访问权限的人可以打开此链接。",
3107
+ public: "任何获得链接的人都可以打开此页面。",
3108
+ authenticated: "任何已登录的人打开此链接即可查看此页面。",
3109
+ members: "只有打开此链接的工作区成员才能查看此页面。",
3110
+ restricted: "只有你邀请的人才能打开此链接。"
3111
+ },
3112
+ copyLink: "复制链接",
3113
+ copied: "已复制",
3114
+ error: {
3115
+ network: "无法连接服务器。请检查你的网络连接后重试。",
3116
+ forbidden: "你没有权限更改此页面的共享设置。",
3117
+ notFound: "此页面已不存在。",
3118
+ generic: "出现了一些问题。请重试。"
3119
+ }
3120
+ },
3181
3121
  command: {
3182
3122
  title: "命令面板",
3183
3123
  search: "搜索",
@@ -3687,11 +3627,64 @@ var ri = "openbook.forwarding.enabled", ii = o({
3687
3627
  title: "登录与邮箱",
3688
3628
  description: "邮箱和第三方登录(Google、GitHub、Apple)将随账户一起推出。目前还没有可登录的对象。"
3689
3629
  },
3630
+ switcher: {
3631
+ heading: "账户",
3632
+ activeAccount: "当前账户",
3633
+ active: "使用中",
3634
+ syncing: "同步中…",
3635
+ error: "需要处理",
3636
+ dormant: "已登录",
3637
+ switchTo: "切换到 {name}",
3638
+ addAnother: "添加另一个账户",
3639
+ removeAccount: "从此设备移除 {name}",
3640
+ removeConfirmTitle: "移除 {name}?",
3641
+ removeConfirmBody: "这只会在此设备上忘记 {name}——随时重新登录即可恢复。你的其他账户和本地数据不受影响。",
3642
+ signOutActiveHint: "退出登录会在此设备上忘记当前账户;你的其他账户仍保持登录。若要彻底吊销某台设备,请在账户面板中将其移除。"
3643
+ },
3644
+ error: {
3645
+ rejected: "此次登录被拒绝。请重试。",
3646
+ rejectedReauth: "此次登录被拒绝。请重新登录。",
3647
+ unreachable: "无法连接 account.book.pub。请检查你的网络连接。",
3648
+ syncFailed: "同步失败——将在下次更改时重试。",
3649
+ invalidCode: "这看起来不是有效的代码。请粘贴浏览器中的代码(或完整的 openbook:// 链接)。"
3650
+ },
3651
+ nudge: {
3652
+ title: "同步并发布",
3653
+ body: "免费注册即可让你的偏好设置和工作区在多设备间保持同步——随后即可将你的作品发布到网络上。本地优先仍是默认。",
3654
+ cta: "免费开始",
3655
+ dismiss: "关闭"
3656
+ },
3690
3657
  support: {
3691
3658
  title: "支持 OpenBook",
3692
3659
  description: "OpenBook 是独立的开源项目。分享它并提供反馈有助于它成长。赞助方式即将推出。"
3693
3660
  }
3694
3661
  },
3662
+ forwarding: {
3663
+ partialUnscoped: "转发已开启,但你的账户未签发限定到本站点的所有者令牌,因此严格的受众隔离仍处于关闭状态(为其他站点签发的令牌仍会被拒绝,隧道可正常使用)。",
3664
+ ensureRescope: "转发已恢复,但本次会话尚无法将你的所有者令牌限定到该站点。你现有的访问不受影响;若请求被拒绝,请重新登录。",
3665
+ bindFailed: "转发已开启,但未能完成站点受众的加固:{error}",
3666
+ unbindHeld: "关闭转发时未能完全解除受众绑定:{error}",
3667
+ title: "转发到网络",
3668
+ description: "获取一个私有的 ✦.book.pub 地址,即可在任意浏览器中打开本设备的图书 —— 无需托管,也无需在网络中暴露。",
3669
+ toggle: "转发本设备",
3670
+ signInHint: "请先登录你的账户以获取地址。",
3671
+ signIn: "登录",
3672
+ registering: "连接中…",
3673
+ address: "你的地址",
3674
+ addressHint: "只要设备在线,就能在任意浏览器中打开本设备的图书。",
3675
+ copy: "复制",
3676
+ copied: "已复制",
3677
+ failed: "注册失败:{error}",
3678
+ claimWarning: "首次开启时,本设备的图书将归属到你的账户并默认设为私有 —— 只有你和你邀请的成员可以打开。此操作无法撤销。",
3679
+ claimRefusedUnverified: "要发布,需先验证你的账户身份。",
3680
+ refreshIdentity: "刷新身份",
3681
+ claimFailed: "无法将本设备归属到你的账户,因此未发布。请重试。",
3682
+ status: {
3683
+ live: "在线",
3684
+ connecting: "连接中",
3685
+ offline: "离线"
3686
+ }
3687
+ },
3695
3688
  connection: {
3696
3689
  title: "连接",
3697
3690
  description: "选择本设备读写页面的位置。",
@@ -3727,6 +3720,43 @@ var ri = "openbook.forwarding.enabled", ii = o({
3727
3720
  resetConfirmBody: "这将清除本设备上的外观、语言和布局设置并重新加载。你的页面和工作区不受影响。",
3728
3721
  resetConfirmButton: "重置"
3729
3722
  },
3723
+ members: {
3724
+ title: "成员",
3725
+ description: "在此工作区拥有角色的人员。可通过邮箱或句柄邀请、更改管理权限并移除访问权限。",
3726
+ youUser: "你已登录为 {name}。",
3727
+ youGuest: "你正在以访客身份浏览。",
3728
+ loading: "正在加载成员…",
3729
+ empty: "还没有成员。在上方邀请某人即可开始。",
3730
+ loadError: "无法加载成员 — {error}",
3731
+ retry: "重试",
3732
+ unavailable: "此工作区的服务器尚不支持成员功能。",
3733
+ lockedTitle: "成员由管理员管理",
3734
+ locked: "请联系工作区管理员邀请你或更改角色。",
3735
+ lockedRoleOwner: "无法更改所有者的角色",
3736
+ lockedRoleSelf: "无法在此更改你自己的角色",
3737
+ lockedRemoveOwner: "无法移除所有者",
3738
+ lockedRemoveSelf: "无法移除你自己",
3739
+ inviteLabel: "邀请成员",
3740
+ inviteHint: "输入邮箱地址或句柄(iss#sub)。邮箱邀请将在对方首次登录时生效。",
3741
+ invitePlaceholder: "name@example.com 或 iss#sub",
3742
+ inviteRole: "邀请的角色",
3743
+ invite: "邀请",
3744
+ inviteError: "无法邀请 — {error}",
3745
+ listLabel: "当前成员",
3746
+ roleAdmin: "管理员",
3747
+ roleViewer: "查看者",
3748
+ changeRole: "更改 {name} 的角色",
3749
+ statusActive: "活跃",
3750
+ statusInvited: "已邀请",
3751
+ statusSuspended: "已暂停",
3752
+ you: "你",
3753
+ owner: "所有者",
3754
+ remove: "移除 {name}",
3755
+ removeTitle: "移除 {name}?",
3756
+ removeBody: "此人将失去在此工作区的角色。邮箱邀请稍后可重新发送。",
3757
+ removeConfirm: "移除",
3758
+ actionError: "无法更新成员 — {error}"
3759
+ },
3730
3760
  properties: {
3731
3761
  owner: "负责人",
3732
3762
  setOwner: "设置负责人",
@@ -3742,7 +3772,7 @@ var ri = "openbook.forwarding.enabled", ii = o({
3742
3772
  noBacklinks: "还没有反向链接",
3743
3773
  refresh: "刷新"
3744
3774
  }
3745
- }, wi = [
3775
+ }, Mr = [
3746
3776
  {
3747
3777
  code: "en",
3748
3778
  name: "English"
@@ -3760,77 +3790,677 @@ var ri = "openbook.forwarding.enabled", ii = o({
3760
3790
  name: "中文"
3761
3791
  }
3762
3792
  ];
3763
- function q(e, t = "", n = {}) {
3793
+ function Nr(e, t = "", n = {}) {
3764
3794
  for (let [r, i] of Object.entries(e)) {
3765
3795
  let e = t ? `${t}.${r}` : r;
3766
- typeof i == "string" ? n[e] = i : i && typeof i == "object" && q(i, e, n);
3796
+ typeof i == "string" ? n[e] = i : i && typeof i == "object" && Nr(i, e, n);
3767
3797
  }
3768
3798
  return n;
3769
3799
  }
3770
- var Ti = {
3771
- en: q(bi),
3772
- de: q(xi),
3773
- ja: q(Si),
3774
- zh: q(Ci)
3800
+ var Pr = {
3801
+ en: Nr(Or),
3802
+ de: Nr(kr),
3803
+ ja: Nr(Ar),
3804
+ zh: Nr(jr)
3775
3805
  };
3776
- function Ei(e, t) {
3806
+ function Fr(e, t) {
3777
3807
  return e.replace(/\{(\w+)\}/g, (e, n) => n in t ? String(t[n]) : `{${n}}`);
3778
3808
  }
3779
- var Di = "en", Oi = () => Di, ki = (e) => {
3780
- Di = e;
3781
- }, Ai = new Set([
3809
+ var Ir = "en", Lr = () => Ir, Rr = (e) => {
3810
+ Ir = e;
3811
+ }, zr = new Set([
3782
3812
  "en",
3783
3813
  "de",
3784
3814
  "ja",
3785
3815
  "zh"
3786
3816
  ]);
3787
- function ji(e) {
3817
+ function Br(e) {
3788
3818
  let t = (e ?? "").toLowerCase().split("-")[0];
3789
- return Ai.has(t) ? t : "en";
3819
+ return zr.has(t) ? t : "en";
3820
+ }
3821
+ function Y(e, t) {
3822
+ let n = e, r = Pr[Ir][n] ?? Pr.en[n] ?? n;
3823
+ return t ? Fr(r, t) : r;
3824
+ }
3825
+ //#endregion
3826
+ //#region src/providers/AccountProvider.tsx
3827
+ var Vr = o(null), Hr = "openbook.deviceId", Ur = "openbook.accounts", Wr = "openbook.accounts.active", Gr = "openbook.account", Kr = "openbook.account.token.", qr = "openbook.account", Jr = "openbook.account.handoff";
3828
+ function Yr(e, t, n) {
3829
+ let r = {
3830
+ type: "openbook-account-token",
3831
+ token: e,
3832
+ state: t
3833
+ };
3834
+ if (n === "broadcast") try {
3835
+ let e = new BroadcastChannel(qr);
3836
+ e.postMessage(r), e.close();
3837
+ } catch {}
3838
+ try {
3839
+ n === "storage" && localStorage.setItem(Jr, JSON.stringify(r));
3840
+ } catch {}
3841
+ }
3842
+ function Xr(e) {
3843
+ let t = (e ?? "").trim();
3844
+ if (!t) return null;
3845
+ let n = t.match(/[#?&]token=([^&\s#]+)/) ?? t.match(/^token=([^&\s#]+)/);
3846
+ if (n) try {
3847
+ return decodeURIComponent(n[1]);
3848
+ } catch {
3849
+ return n[1];
3850
+ }
3851
+ return /\s/.test(t) || t.includes("://") ? null : t;
3790
3852
  }
3791
- function Mi(e, t) {
3792
- let n = e, r = Ti[Di][n] ?? Ti.en[n] ?? n;
3793
- return t ? Ei(r, t) : r;
3853
+ var Zr = () => typeof crypto < "u" && "randomUUID" in crypto ? crypto.randomUUID().replace(/-/g, "") : Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2);
3854
+ function Qr() {
3855
+ if (typeof localStorage > "u") return "web";
3856
+ let e = localStorage.getItem(Hr);
3857
+ return e || (e = Zr().slice(0, 12), localStorage.setItem(Hr, e)), e;
3858
+ }
3859
+ var $r = () => Zr().slice(0, 12);
3860
+ function ei(e) {
3861
+ try {
3862
+ return new URL(e).host || e;
3863
+ } catch {
3864
+ return e.replace(/^https?:\/\//, "");
3865
+ }
3866
+ }
3867
+ function ti() {
3868
+ if (typeof localStorage > "u") return [];
3869
+ try {
3870
+ let e = localStorage.getItem(Ur);
3871
+ if (!e) return [];
3872
+ let t = JSON.parse(e);
3873
+ return Array.isArray(t) ? t.filter((e) => !!e && typeof e.id == "string") : [];
3874
+ } catch {
3875
+ return [];
3876
+ }
3877
+ }
3878
+ function ni(e) {
3879
+ try {
3880
+ localStorage.setItem(Ur, JSON.stringify(e));
3881
+ } catch {}
3882
+ }
3883
+ function ri() {
3884
+ if (typeof localStorage > "u") return null;
3885
+ try {
3886
+ return localStorage.getItem(Wr) || null;
3887
+ } catch {
3888
+ return null;
3889
+ }
3890
+ }
3891
+ function ii(e) {
3892
+ try {
3893
+ e ? localStorage.setItem(Wr, e) : localStorage.removeItem(Wr);
3894
+ } catch {}
3895
+ }
3896
+ function ai() {
3897
+ if (typeof localStorage > "u") return null;
3898
+ try {
3899
+ let e = localStorage.getItem(Gr);
3900
+ if (!e) return null;
3901
+ let t = JSON.parse(e);
3902
+ return t && typeof t.token == "string" && t.token ? {
3903
+ token: t.token,
3904
+ connectedAt: t.connectedAt,
3905
+ lastServerUpdatedAt: t.lastServerUpdatedAt ?? null
3906
+ } : null;
3907
+ } catch {
3908
+ return null;
3909
+ }
3910
+ }
3911
+ function oi() {
3912
+ return {
3913
+ async get(e) {
3914
+ try {
3915
+ return typeof localStorage < "u" ? localStorage.getItem(Kr + e) : null;
3916
+ } catch {
3917
+ return null;
3918
+ }
3919
+ },
3920
+ async set(e, t) {
3921
+ try {
3922
+ localStorage.setItem(Kr + e, t);
3923
+ } catch {}
3924
+ },
3925
+ async delete(e) {
3926
+ try {
3927
+ localStorage.removeItem(Kr + e);
3928
+ } catch {}
3929
+ }
3930
+ };
3931
+ }
3932
+ var si = "openbook.account.pending", ci = 600 * 1e3;
3933
+ function li(e) {
3934
+ try {
3935
+ sessionStorage.setItem(si, JSON.stringify({
3936
+ state: e,
3937
+ at: Date.now()
3938
+ }));
3939
+ } catch {}
3940
+ }
3941
+ function ui() {
3942
+ try {
3943
+ let e = sessionStorage.getItem(si);
3944
+ if (!e) return null;
3945
+ let t = JSON.parse(e);
3946
+ if (typeof t.state == "string" && typeof t.at == "number" && Date.now() - t.at < ci) return t.state;
3947
+ } catch {}
3948
+ return null;
3949
+ }
3950
+ function di() {
3951
+ try {
3952
+ sessionStorage.removeItem(si);
3953
+ } catch {}
3954
+ }
3955
+ function fi() {
3956
+ let e = x();
3957
+ if (e) try {
3958
+ return new URL(e).host || void 0;
3959
+ } catch {
3960
+ return;
3961
+ }
3962
+ }
3963
+ var pi = ({ children: e }) => {
3964
+ let { account: t } = cr(), { preferences: n, update: r } = hr(), { workspaces: i, replaceWorkspaces: a } = Er(), [o, c] = f("disconnected"), [m, h] = f(null), [g, _] = f(null), [te, y] = f(null), [b, x] = f(() => ti()), [C, w] = f(() => ri()), E = u(() => new ee(), []), D = u(() => S(), []), O = u(() => `OpenBook ${t?.redirectUri?.startsWith("openbook:") ? "Desktop" : "Web"} · ${Qr()}`, [t]), k = u(() => t?.secretStore ?? oi(), [t]), A = d(k);
3965
+ A.current = k;
3966
+ let j = d(null), M = d(null), N = d(/* @__PURE__ */ new Map()), P = d(0), ie = d({
3967
+ preferences: n,
3968
+ workspaces: i
3969
+ });
3970
+ ie.current = {
3971
+ preferences: n,
3972
+ workspaces: i
3973
+ };
3974
+ let F = s(() => ({
3975
+ preferences: ie.current.preferences,
3976
+ workspaces: ie.current.workspaces
3977
+ }), []), I = d(b);
3978
+ I.current = b;
3979
+ let L = s((e) => {
3980
+ I.current = e, x(e), ni(e);
3981
+ }, []), ae = s((e) => L([...I.current.filter((t) => t.id !== e.id), e]), [L]), R = s((e, t) => L(I.current.map((n) => n.id === e ? {
3982
+ ...n,
3983
+ ...t
3984
+ } : n)), [L]), z = d(C);
3985
+ z.current = C;
3986
+ let B = s((e) => {
3987
+ z.current = e, w(e), ii(e);
3988
+ }, []), oe = s((e) => {
3989
+ e.preferences && typeof e.preferences == "object" && r(e.preferences), Array.isArray(e.workspaces) && a(e.workspaces);
3990
+ }, [r, a]), se = s(async (e, t) => {
3991
+ let { settings: n, updatedAt: r } = await E.getSettings(e);
3992
+ if (r === null || !n.preferences && !n.workspaces) {
3993
+ if (t) {
3994
+ let t = F(), n = await E.putSettings(e, t);
3995
+ return M.current = JSON.stringify(t), n.updatedAt;
3996
+ }
3997
+ return M.current = JSON.stringify(F()), r;
3998
+ }
3999
+ return oe(n), M.current = JSON.stringify(n), r;
4000
+ }, [
4001
+ E,
4002
+ F,
4003
+ oe
4004
+ ]), V = d(null), ce = s(async (e) => {
4005
+ try {
4006
+ let t = re() ?? fi(), n = await E.getIdentityToken(e, t);
4007
+ if (T(n?.identity ?? null), V.current && clearTimeout(V.current), !n) return null;
4008
+ let r = Math.max(3e4, new Date(n.expiresAt).getTime() - Date.now() - 6e4);
4009
+ V.current = setTimeout(() => void H.current(e), r);
4010
+ let i = ne(n.identity);
4011
+ return i ? {
4012
+ subject: `${i.claims.iss}#${i.claims.sub}`,
4013
+ email: i.claims.email ? i.claims.email.toLowerCase() : null,
4014
+ name: i.claims.name ?? null,
4015
+ aud: i.claims.aud ?? null
4016
+ } : null;
4017
+ } catch {
4018
+ return null;
4019
+ }
4020
+ }, [E]), H = d(ce);
4021
+ H.current = ce;
4022
+ let U = s(() => {
4023
+ V.current && clearTimeout(V.current), V.current = null, T(null);
4024
+ }, []), W = d(async () => {}), G = d(async () => {});
4025
+ G.current = s(async (e) => {
4026
+ let t = z.current === e;
4027
+ t && U();
4028
+ try {
4029
+ await A.current.delete(e);
4030
+ } catch {}
4031
+ N.current.delete(e);
4032
+ let n = I.current.filter((t) => t.id !== e);
4033
+ if (L(n), !t) return;
4034
+ let r = n[0];
4035
+ if (r) {
4036
+ let e = N.current.get(r.id) ?? await A.current.get(r.id);
4037
+ if (e) {
4038
+ await W.current(r.id, e);
4039
+ return;
4040
+ }
4041
+ }
4042
+ M.current = null, h(null), _(null), B(null), c("disconnected");
4043
+ }, [
4044
+ L,
4045
+ B,
4046
+ U
4047
+ ]), W.current = s(async (e, t) => {
4048
+ P.current += 1, c("syncing"), y(null), B(e), h(t), N.current.set(e, t);
4049
+ try {
4050
+ let n = await se(t, !1);
4051
+ R(e, { lastServerUpdatedAt: n }), _(n), c("connected");
4052
+ let r = await H.current(t);
4053
+ if (r) {
4054
+ let t = I.current.find((t) => t.id === e);
4055
+ R(e, {
4056
+ email: r.email,
4057
+ subject: r.subject,
4058
+ name: r.email ?? r.name ?? t?.name ?? ei(D)
4059
+ });
4060
+ }
4061
+ } catch (t) {
4062
+ t instanceof v && t.status === 401 ? (c("error"), y(Y("account.error.rejectedReauth")), await G.current(e)) : (c("error"), y(Y("account.error.unreachable")));
4063
+ } finally {
4064
+ P.current = Math.max(0, P.current - 1);
4065
+ }
4066
+ }, [
4067
+ B,
4068
+ se,
4069
+ R,
4070
+ D
4071
+ ]);
4072
+ let le = s(async (e) => {
4073
+ P.current += 1;
4074
+ let t = I.current.length === 0;
4075
+ c("syncing"), y(null);
4076
+ try {
4077
+ let n = await se(e, t), r = await H.current(e), i = r?.subject ? I.current.find((e) => e.subject === r.subject) : I.current.find((e) => e.subject === null && e.accountUrl === D), a = i?.id ?? $r(), o = {
4078
+ id: a,
4079
+ name: r?.email ?? r?.name ?? i?.name ?? ei(D),
4080
+ email: r?.email ?? null,
4081
+ subject: r?.subject ?? i?.subject ?? null,
4082
+ accountUrl: D,
4083
+ connectedAt: Date.now(),
4084
+ lastServerUpdatedAt: n
4085
+ };
4086
+ await k.set(a, e), N.current.set(a, e), ae(o), B(a), h(e), _(n), c("connected");
4087
+ } catch (e) {
4088
+ e instanceof v && e.status === 401 ? (U(), c("error"), y(Y("account.error.rejected"))) : (c(z.current ? "connected" : "disconnected"), y(Y("account.error.unreachable")));
4089
+ } finally {
4090
+ P.current = Math.max(0, P.current - 1);
4091
+ }
4092
+ }, [
4093
+ se,
4094
+ k,
4095
+ ae,
4096
+ B,
4097
+ U,
4098
+ D
4099
+ ]), ue = s((e, t) => {
4100
+ let n = j.current ?? ui();
4101
+ !e || !n || !t || t !== n || (j.current = null, di(), le(e));
4102
+ }, [le]);
4103
+ l(() => {
4104
+ if (t?.onCallback) return t.onCallback(({ token: e, state: t }) => ue(e, t));
4105
+ if (typeof window > "u") return;
4106
+ let e = (e) => {
4107
+ let t = e;
4108
+ t?.type === "openbook-account-token" && typeof t.token == "string" && ue(t.token, t.state ?? "");
4109
+ }, n = typeof BroadcastChannel < "u" ? new BroadcastChannel(qr) : null;
4110
+ n?.addEventListener("message", (t) => e(t.data));
4111
+ let r = (t) => {
4112
+ if (t.key === "openbook.account.handoff" && t.newValue) try {
4113
+ e(JSON.parse(t.newValue));
4114
+ } catch {}
4115
+ };
4116
+ window.addEventListener("storage", r);
4117
+ try {
4118
+ let t = localStorage.getItem(Jr);
4119
+ t && (localStorage.removeItem(Jr), e(JSON.parse(t)));
4120
+ } catch {}
4121
+ return () => {
4122
+ n?.close(), window.removeEventListener("storage", r);
4123
+ };
4124
+ }, [t, ue]), l(() => {
4125
+ (async () => {
4126
+ let e = ti(), t = ri();
4127
+ if (e.length === 0) {
4128
+ let n = ai();
4129
+ if (n) {
4130
+ let r = $r(), i = {
4131
+ id: r,
4132
+ name: ei(S()),
4133
+ email: null,
4134
+ subject: null,
4135
+ accountUrl: S(),
4136
+ connectedAt: n.connectedAt ?? Date.now(),
4137
+ lastServerUpdatedAt: n.lastServerUpdatedAt ?? null
4138
+ }, a = !1;
4139
+ try {
4140
+ await A.current.set(r, n.token), a = !0;
4141
+ } catch {}
4142
+ if (a) {
4143
+ e = [i], t = r, ni(e), ii(t);
4144
+ try {
4145
+ localStorage.removeItem(Gr);
4146
+ } catch {}
4147
+ }
4148
+ }
4149
+ }
4150
+ !t && e.length && (t = e[0].id), e.length && (I.current = e, x(e));
4151
+ let n = t ? e.find((e) => e.id === t) : void 0;
4152
+ if (!n) return;
4153
+ B(n.id), _(n.lastServerUpdatedAt);
4154
+ let r = await A.current.get(n.id);
4155
+ r && await W.current(n.id, r);
4156
+ })();
4157
+ }, []), l(() => {
4158
+ if (!m || P.current > 0) return;
4159
+ let e = {
4160
+ preferences: n,
4161
+ workspaces: i
4162
+ }, t = JSON.stringify(e);
4163
+ if (t === M.current) return;
4164
+ let r = setTimeout(() => {
4165
+ t === M.current || P.current > 0 || (c("syncing"), E.putSettings(m, e).then((e) => {
4166
+ M.current = t, _(e.updatedAt), c("connected"), y(null);
4167
+ let n = z.current;
4168
+ n && R(n, { lastServerUpdatedAt: e.updatedAt });
4169
+ }).catch(() => {
4170
+ c("error"), y(Y("account.error.syncFailed"));
4171
+ }));
4172
+ }, 1200);
4173
+ return () => clearTimeout(r);
4174
+ }, [
4175
+ m,
4176
+ n,
4177
+ i,
4178
+ E,
4179
+ R
4180
+ ]);
4181
+ let de = s(() => {
4182
+ let e = Zr();
4183
+ j.current = e, li(e), c("connecting"), y(null);
4184
+ let n = t?.redirectUri ?? (typeof window < "u" ? `${window.location.origin}/account/callback` : ""), r = E.connectUrl({
4185
+ redirectUri: n,
4186
+ state: e,
4187
+ name: O
4188
+ });
4189
+ t?.openSignIn ? t.openSignIn(r) : typeof window < "u" && (window.open(r, "openbook-signin", "width=520,height=720") || (window.location.href = r));
4190
+ }, [
4191
+ E,
4192
+ O,
4193
+ t
4194
+ ]), fe = s((e) => {
4195
+ let t = Xr(e);
4196
+ if (!t) {
4197
+ c((e) => m ? e : "error"), y(Y("account.error.invalidCode"));
4198
+ return;
4199
+ }
4200
+ j.current = null, di(), c("connecting"), y(null), le(t);
4201
+ }, [le, m]), pe = s(() => {
4202
+ j.current = null, di(), c((e) => m ? e : "disconnected"), y(null);
4203
+ }, [m]), me = s(() => {
4204
+ j.current = null, di(), M.current = null, y(null);
4205
+ let e = z.current;
4206
+ e ? G.current(e) : (U(), h(null), _(null), c("disconnected"));
4207
+ }, [U]), he = s(() => {
4208
+ let e = z.current;
4209
+ e && m && W.current(e, m);
4210
+ }, [m]), ge = s((e) => {
4211
+ e !== z.current && I.current.some((t) => t.id === e) && (async () => {
4212
+ U();
4213
+ let t = N.current.get(e) ?? await A.current.get(e);
4214
+ if (!t) {
4215
+ await G.current(e);
4216
+ return;
4217
+ }
4218
+ await W.current(e, t);
4219
+ })();
4220
+ }, [U]), _e = s((e) => {
4221
+ G.current(e);
4222
+ }, []), ve = u(() => b.map((e) => ({
4223
+ id: e.id,
4224
+ name: e.name,
4225
+ email: e.email,
4226
+ accountUrl: e.accountUrl,
4227
+ status: e.id === C ? o : "connected"
4228
+ })), [
4229
+ b,
4230
+ C,
4231
+ o
4232
+ ]), ye = u(() => b.find((e) => e.id === C)?.accountUrl ?? D, [
4233
+ b,
4234
+ C,
4235
+ D
4236
+ ]), be = s(async () => m ? (await H.current(m))?.aud ?? null : null, [m]), xe = u(() => ({
4237
+ status: o,
4238
+ connected: !!m && (o === "connected" || o === "syncing"),
4239
+ token: m,
4240
+ deviceName: O,
4241
+ lastSyncedAt: g,
4242
+ error: te,
4243
+ accountUrl: ye,
4244
+ signIn: de,
4245
+ submitCode: fe,
4246
+ cancel: pe,
4247
+ signOut: me,
4248
+ syncNow: he,
4249
+ accounts: ve,
4250
+ activeAccountId: C,
4251
+ setActiveAccount: ge,
4252
+ addAccount: de,
4253
+ removeAccount: _e,
4254
+ remintIdentity: be
4255
+ }), [
4256
+ o,
4257
+ m,
4258
+ O,
4259
+ g,
4260
+ te,
4261
+ ye,
4262
+ de,
4263
+ fe,
4264
+ pe,
4265
+ me,
4266
+ he,
4267
+ ve,
4268
+ C,
4269
+ ge,
4270
+ _e,
4271
+ be
4272
+ ]);
4273
+ return /* @__PURE__ */ p(Vr.Provider, {
4274
+ value: xe,
4275
+ children: e
4276
+ });
4277
+ }, mi = () => {
4278
+ let e = c(Vr);
4279
+ if (!e) throw Error("useAccount must be used within an <AccountProvider>");
4280
+ return e;
4281
+ }, hi = D.Root, gi = D.Trigger, _i = D.Portal, vi = i.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ p(D.Overlay, {
4282
+ ref: n,
4283
+ className: K("fixed inset-0 z-50 bg-background/80 backdrop-blur-[var(--overlay-blur)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", e),
4284
+ ...t
4285
+ }));
4286
+ vi.displayName = D.Overlay.displayName;
4287
+ var yi = i.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */ m(_i, { children: [/* @__PURE__ */ p(vi, {}), /* @__PURE__ */ p("div", {
4288
+ className: "fixed inset-0 z-50 flex items-center justify-center p-4",
4289
+ children: /* @__PURE__ */ m(D.Content, {
4290
+ ref: r,
4291
+ className: K("relative grid w-full max-w-lg gap-4 border bg-background p-6 shadow-overlay duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg", e),
4292
+ ...n,
4293
+ children: [t, /* @__PURE__ */ m(D.Close, {
4294
+ className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-hover data-[state=open]:text-muted-foreground",
4295
+ children: [/* @__PURE__ */ p(_, { className: "h-4 w-4" }), /* @__PURE__ */ p("span", {
4296
+ className: "sr-only",
4297
+ children: "Close"
4298
+ })]
4299
+ })]
4300
+ })
4301
+ })] }));
4302
+ yi.displayName = D.Content.displayName;
4303
+ var bi = ({ className: e, ...t }) => /* @__PURE__ */ p("div", {
4304
+ className: K("flex flex-col space-y-1.5 text-center sm:text-left", e),
4305
+ ...t
4306
+ });
4307
+ bi.displayName = "DialogHeader";
4308
+ var xi = ({ className: e, ...t }) => /* @__PURE__ */ p("div", {
4309
+ className: K("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", e),
4310
+ ...t
4311
+ });
4312
+ xi.displayName = "DialogFooter";
4313
+ var Si = i.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ p(D.Title, {
4314
+ ref: n,
4315
+ className: K("text-lg font-semibold leading-none tracking-tight", e),
4316
+ ...t
4317
+ }));
4318
+ Si.displayName = D.Title.displayName;
4319
+ var Ci = i.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ p(D.Description, {
4320
+ ref: n,
4321
+ className: K("text-sm text-muted-foreground", e),
4322
+ ...t
4323
+ }));
4324
+ Ci.displayName = D.Description.displayName;
4325
+ //#endregion
4326
+ //#region src/components/ui/button.tsx
4327
+ var wi = k("inline-flex items-center justify-center rounded-md text-sm font-medium transition-[color,background-color,border-color,box-shadow,transform] active:scale-[0.97] focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100", {
4328
+ variants: {
4329
+ variant: {
4330
+ default: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",
4331
+ destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90",
4332
+ outline: "border border-input bg-transparent shadow-xs hover:bg-hover hover:text-accent-foreground",
4333
+ secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
4334
+ ghost: "hover:bg-hover hover:text-accent-foreground",
4335
+ link: "text-primary underline-offset-4 hover:underline"
4336
+ },
4337
+ size: {
4338
+ default: "h-9 px-4 py-2",
4339
+ sm: "h-8 rounded-md px-3 text-xs",
4340
+ lg: "h-10 rounded-md px-8",
4341
+ icon: "h-9 w-9"
4342
+ }
4343
+ },
4344
+ defaultVariants: {
4345
+ variant: "default",
4346
+ size: "default"
4347
+ }
4348
+ }), Ti = i.forwardRef(({ className: e, variant: t, size: n, asChild: r = !1, ...i }, a) => /* @__PURE__ */ p(r ? O : "button", {
4349
+ className: K(wi({
4350
+ variant: t,
4351
+ size: n,
4352
+ className: e
4353
+ })),
4354
+ ref: a,
4355
+ ...i
4356
+ }));
4357
+ Ti.displayName = "Button";
4358
+ //#endregion
4359
+ //#region src/providers/ConfirmProvider.tsx
4360
+ var Ei = o(null);
4361
+ function Di({ children: e }) {
4362
+ let [t, n] = f(null), r = d(null), i = s((e) => {
4363
+ r.current?.(e), r.current = null, n(null);
4364
+ }, []), a = s((e) => (r.current?.(!1), new Promise((t) => {
4365
+ r.current = t, n(e);
4366
+ })), []), o = s((e) => {
4367
+ e || i(!1);
4368
+ }, [i]);
4369
+ return /* @__PURE__ */ m(Ei.Provider, {
4370
+ value: a,
4371
+ children: [e, /* @__PURE__ */ p(hi, {
4372
+ open: t !== null,
4373
+ onOpenChange: o,
4374
+ children: t && /* @__PURE__ */ m(yi, {
4375
+ className: "sm:max-w-[420px]",
4376
+ children: [/* @__PURE__ */ m(bi, { children: [/* @__PURE__ */ p(Si, { children: t.title }), t.description && /* @__PURE__ */ p(Ci, { children: t.description })] }), /* @__PURE__ */ m(xi, { children: [!t.hideCancel && /* @__PURE__ */ p(Ti, {
4377
+ variant: "outline",
4378
+ onClick: () => i(!1),
4379
+ children: t.cancelText ?? "Cancel"
4380
+ }), /* @__PURE__ */ p(Ti, {
4381
+ variant: t.destructive ? "destructive" : "default",
4382
+ onClick: () => i(!0),
4383
+ children: t.confirmText ?? "Confirm"
4384
+ })] })]
4385
+ })
4386
+ })]
4387
+ });
4388
+ }
4389
+ function Oi() {
4390
+ let e = c(Ei);
4391
+ if (!e) throw Error("useConfirm must be used within a <ConfirmProvider>");
4392
+ return e;
4393
+ }
4394
+ //#endregion
4395
+ //#region src/providers/forwardingAudience.ts
4396
+ var ki = (e) => e instanceof Error ? e.message : String(e), Ai = "Forwarding is on, but your account did not issue a site-scoped owner token, so strict audience isolation stays off (a token minted for a different site is still rejected, and the tunnel works normally).", ji = "Forwarding resumed, but this session could not scope your owner token to the site yet. Your existing access is unchanged; sign in again if a request is refused.";
4397
+ async function Mi(e, t) {
4398
+ try {
4399
+ return await t.setInstancePolicy({
4400
+ audience: e,
4401
+ requireAudience: !1
4402
+ }), t.setLocalAudience(e), await t.remintIdentity() === e ? (await t.setInstancePolicy({ requireAudience: !0 }), { status: "bound" }) : {
4403
+ status: "partial",
4404
+ code: "partialUnscoped",
4405
+ reason: Ai
4406
+ };
4407
+ } catch (e) {
4408
+ try {
4409
+ await t.setInstancePolicy({ requireAudience: !1 });
4410
+ } catch {}
4411
+ return {
4412
+ status: "failed",
4413
+ code: "bindFailed",
4414
+ reason: ki(e)
4415
+ };
4416
+ }
4417
+ }
4418
+ async function Ni(e, t) {
4419
+ let n = null;
4420
+ try {
4421
+ n = await t.getInstanceInfo();
4422
+ } catch {
4423
+ n = null;
4424
+ }
4425
+ return n && n.audience === e && n.requireAudience ? (t.setLocalAudience(e), await t.remintIdentity() === e ? { status: "bound" } : {
4426
+ status: "partial",
4427
+ code: "ensureRescope",
4428
+ reason: ji
4429
+ }) : Mi(e, t);
3794
4430
  }
3795
- //#endregion
3796
- //#region src/providers/I18nProvider.tsx
3797
- var Ni = o(null), Pi = "openbook.locale";
3798
- function Fi() {
3799
- if (typeof window > "u") return "en";
4431
+ var Pi = "To publish, your account identity needs to be verified first.", Fi = "Couldn’t claim this device for your account, so it wasn’t published. Try again.";
4432
+ async function Ii(e) {
4433
+ let t = await e.getInstanceInfo();
4434
+ if (t.ownerSubject) return { status: "already" };
4435
+ if (t.you.verifiedVia !== "jws") return {
4436
+ status: "refused",
4437
+ code: "unverified",
4438
+ reason: Pi
4439
+ };
3800
4440
  try {
3801
- let e = localStorage.getItem(Pi);
3802
- if (e) return ji(e);
4441
+ if ((await e.setInstancePolicy({ ownerSubject: t.you.subject })).ownerSubject) return { status: "claimed" };
3803
4442
  } catch {}
3804
- return ji(navigator.language);
4443
+ return (await e.getInstanceInfo()).ownerSubject ? { status: "claimed" } : {
4444
+ status: "refused",
4445
+ code: "claim-failed",
4446
+ reason: Fi
4447
+ };
3805
4448
  }
3806
- var Ii = ({ children: e }) => {
3807
- let [t, n] = f("en");
3808
- l(() => {
3809
- let e = Fi();
3810
- e !== "en" && n(e);
3811
- }, []), Oi() !== t && ki(t), l(() => {
3812
- typeof document < "u" && (document.documentElement.lang = t);
3813
- }, [t]);
3814
- let r = s((e) => {
3815
- n(e);
3816
- try {
3817
- localStorage.setItem(Pi, e);
3818
- } catch {}
3819
- }, []), i = u(() => ({
3820
- locale: t,
3821
- setLocale: r,
3822
- t: Mi,
3823
- locales: wi
3824
- }), [t, r]);
3825
- return /* @__PURE__ */ p(Ni.Provider, {
3826
- value: i,
3827
- children: e
3828
- });
3829
- }, Li = () => {
3830
- let e = c(Ni);
3831
- if (!e) throw Error("useTranslation must be used within an <I18nProvider>");
3832
- return e;
3833
- }, Ri = o(null), zi = ({ client: e, children: t }) => /* @__PURE__ */ p(Ri.Provider, {
4449
+ async function Li(e) {
4450
+ try {
4451
+ await e.setInstancePolicy({ requireAudience: !1 });
4452
+ } catch (e) {
4453
+ return {
4454
+ status: "held",
4455
+ code: "unbindHeld",
4456
+ reason: ki(e)
4457
+ };
4458
+ }
4459
+ return e.setLocalAudience(null), await e.remintIdentity(), { status: "relaxed" };
4460
+ }
4461
+ //#endregion
4462
+ //#region src/data/DataProvider.tsx
4463
+ var Ri = o(null), zi = ({ client: e, children: t }) => /* @__PURE__ */ p(Ri.Provider, {
3834
4464
  value: e,
3835
4465
  children: t
3836
4466
  }), Bi = () => {
@@ -3865,154 +4495,424 @@ var Ii = ({ children: e }) => {
3865
4495
  if (typeof localStorage > "u") throw Error("getOrCreateCurrentPageId requires a browser environment");
3866
4496
  let e = localStorage.getItem(Hi);
3867
4497
  return e || (e = crypto.randomUUID(), localStorage.setItem(Hi, e)), e;
3868
- }, J = null, Gi = /* @__PURE__ */ new Set(), Ki = (e) => {
3869
- J = e, Gi.forEach((e) => e());
3870
- }, qi = (e) => (Gi.add(e), () => Gi.delete(e)), Ji = {
3871
- createSubpage: (e, t) => J ? J.createSubpage(e, t) : Promise.reject(/* @__PURE__ */ Error("page links not ready")),
3872
- openPage: (e, t) => J?.openPage(e, t),
3873
- label: (e) => J?.label(e) ?? "Untitled",
3874
- icon: (e) => J?.icon(e) ?? "📄",
3875
- searchPages: (e, t) => J?.searchPages(e, t) ?? [],
3876
- createPage: (e) => J ? J.createPage(e) : Promise.reject(/* @__PURE__ */ Error("page links not ready"))
3877
- }, Yi = "openbook.recents";
3878
- function Xi(e, t, n = 12) {
4498
+ }, Gi = "openbook.forwarding.enabled", Ki = o({
4499
+ supported: !1,
4500
+ enabled: !1,
4501
+ status: "idle",
4502
+ host: null,
4503
+ busy: !1,
4504
+ error: null,
4505
+ audienceNotice: null,
4506
+ claimRefusal: null,
4507
+ enable: async () => void 0,
4508
+ disable: () => void 0
4509
+ }), qi = () => typeof localStorage < "u" && localStorage.getItem(Gi) === "1", Ji = (e) => {
4510
+ typeof localStorage < "u" && localStorage.setItem(Gi, e ? "1" : "0");
4511
+ }, Yi = ({ children: e }) => {
4512
+ let { forwarding: t } = cr(), { connected: n, token: r, accountUrl: i, signIn: a, remintIdentity: o } = mi(), c = Bi(), m = !!t, h = d(null), [g, _] = f(() => qi()), [ee, v] = f("idle"), [ne, y] = f(null), [b, re] = f(!1), [x, S] = f(null), [w, T] = f(null), [E, D] = f(null);
4513
+ l(() => {
4514
+ t && t.keyStore.load().then((e) => e && y(e.host)).catch(() => void 0);
4515
+ }, [t]);
4516
+ let O = u(() => ({
4517
+ setInstancePolicy: (e) => c.setInstancePolicy(e),
4518
+ getInstanceInfo: () => c.getInstanceInfo(),
4519
+ remintIdentity: () => o(),
4520
+ setLocalAudience: C
4521
+ }), [c, o]), k = s(async (e) => {
4522
+ let t = await Ni(e, O);
4523
+ T(t.status === "bound" ? null : {
4524
+ code: t.code,
4525
+ detail: t.reason
4526
+ });
4527
+ }, [O]), A = s(async () => {
4528
+ if (!(!t || !r || h.current)) {
4529
+ re(!0), S(null), T(null), D(null);
4530
+ try {
4531
+ let e = await Ii(O);
4532
+ if (e.status === "refused") {
4533
+ _(!1), Ji(!1), v("offline"), D(e.code);
4534
+ return;
4535
+ }
4536
+ let n = new te({
4537
+ accountUrl: i,
4538
+ authToken: r,
4539
+ keyStore: t.keyStore,
4540
+ localOrigin: "",
4541
+ localFetchImpl: t.localFetch,
4542
+ onStatus: v
4543
+ });
4544
+ h.current = n;
4545
+ let { host: a } = await n.start();
4546
+ y(a), await k(a);
4547
+ } catch (e) {
4548
+ h.current = null, v("offline"), S(e instanceof Error ? e.message : String(e));
4549
+ } finally {
4550
+ re(!1);
4551
+ }
4552
+ }
4553
+ }, [
4554
+ t,
4555
+ r,
4556
+ i,
4557
+ k,
4558
+ O
4559
+ ]);
4560
+ l(() => {
4561
+ m && g && n && r && !h.current && A();
4562
+ }, [
4563
+ m,
4564
+ g,
4565
+ n,
4566
+ r,
4567
+ A
4568
+ ]), l(() => () => h.current?.stop(), []);
4569
+ let j = s(async () => {
4570
+ if (!n || !r) {
4571
+ a();
4572
+ return;
4573
+ }
4574
+ _(!0), Ji(!0), await A();
4575
+ }, [
4576
+ n,
4577
+ r,
4578
+ a,
4579
+ A
4580
+ ]), M = s(() => {
4581
+ h.current?.stop(), h.current = null, v("offline"), _(!1), Ji(!1), T(null), D(null), (async () => {
4582
+ let e = await Li(O);
4583
+ e.status === "held" && T({
4584
+ code: e.code,
4585
+ detail: e.reason
4586
+ });
4587
+ })();
4588
+ }, [O]), N = u(() => ({
4589
+ supported: m,
4590
+ enabled: g,
4591
+ status: ee,
4592
+ host: ne,
4593
+ busy: b,
4594
+ error: x,
4595
+ audienceNotice: w,
4596
+ claimRefusal: E,
4597
+ enable: j,
4598
+ disable: M
4599
+ }), [
4600
+ m,
4601
+ g,
4602
+ ee,
4603
+ ne,
4604
+ b,
4605
+ x,
4606
+ w,
4607
+ E,
4608
+ j,
4609
+ M
4610
+ ]);
4611
+ return /* @__PURE__ */ p(Ki.Provider, {
4612
+ value: N,
4613
+ children: e
4614
+ });
4615
+ }, Xi = () => c(Ki), Zi = [
4616
+ {
4617
+ id: "preferences",
4618
+ tabs: [
4619
+ "general",
4620
+ "appearance",
4621
+ "customisation"
4622
+ ]
4623
+ },
4624
+ {
4625
+ id: "account",
4626
+ tabs: [
4627
+ "profile",
4628
+ "signup",
4629
+ "signin",
4630
+ "support"
4631
+ ]
4632
+ },
4633
+ {
4634
+ id: "workspace",
4635
+ tabs: [
4636
+ "connection",
4637
+ "members",
4638
+ "integrations",
4639
+ "extensions",
4640
+ "ai",
4641
+ "admin"
4642
+ ]
4643
+ }
4644
+ ], Qi = Zi.flatMap((e) => e.tabs), $i = Zi[0].tabs[0], ea = (e) => typeof e == "string" && Qi.includes(e), ta = {
4645
+ server: "connection",
4646
+ backup: "admin"
4647
+ }, na = (e) => ea(e) ? e : typeof e == "string" && e in ta ? ta[e] : $i, ra = {
4648
+ commandPalette: { open: !1 },
4649
+ settings: {
4650
+ open: !1,
4651
+ mode: "modal",
4652
+ tab: $i
4653
+ },
4654
+ present: {
4655
+ open: !1,
4656
+ mode: "fullscreen",
4657
+ pageId: null
4658
+ },
4659
+ sideNav: {
4660
+ open: !0,
4661
+ docked: !0
4662
+ },
4663
+ trash: { open: !1 },
4664
+ templates: { open: !1 },
4665
+ ai: { open: !1 },
4666
+ agent: { open: !1 }
4667
+ }, ia = () => {
4668
+ if (typeof window > "u" || localStorage.getItem("hud") === null) return ra;
4669
+ let e = JSON.parse(localStorage.getItem("hud") ?? "{}"), t = {
4670
+ ...ra.settings,
4671
+ ...e.settings
4672
+ };
4673
+ return {
4674
+ commandPalette: {
4675
+ ...ra.commandPalette,
4676
+ ...e.commandPalette
4677
+ },
4678
+ settings: {
4679
+ ...t,
4680
+ tab: na(t.tab)
4681
+ },
4682
+ sideNav: {
4683
+ ...ra.sideNav,
4684
+ ...e.sideNav
4685
+ },
4686
+ trash: { open: !1 },
4687
+ templates: { open: !1 },
4688
+ ai: { open: !1 },
4689
+ agent: { open: !1 },
4690
+ present: { ...ra.present }
4691
+ };
4692
+ }, aa = (e) => {
4693
+ let t = {
4694
+ ...e,
4695
+ settings: {
4696
+ ...e.settings,
4697
+ open: !1
4698
+ },
4699
+ trash: { open: !1 },
4700
+ templates: { open: !1 },
4701
+ ai: { open: !1 },
4702
+ agent: { open: !1 },
4703
+ present: { ...ra.present }
4704
+ };
4705
+ localStorage.setItem("hud", JSON.stringify(t));
4706
+ }, oa = o({
4707
+ hud: ra,
4708
+ setHud: () => !1
4709
+ }), sa = () => c(oa), ca = ({ children: e }) => {
4710
+ let [t, n] = A(ia), r = a.useRef(typeof window < "u" && localStorage.getItem("hud") !== null);
4711
+ a.useEffect(() => {
4712
+ aa(t);
4713
+ }, [t]), a.useEffect(() => {
4714
+ !r.current && window.innerWidth < 768 && n((e) => (e.sideNav.open = !1, e.sideNav.docked = !1, e));
4715
+ }, [n]);
4716
+ let i = a.useCallback((e) => {
4717
+ t.sideNav.docked || (e.clientX > 320 || e.clientX <= 1 ? n((e) => (e.sideNav.open = !1, e)) : e.clientX < 16 && n((e) => (e.sideNav.open = !0, e)));
4718
+ }, [
4719
+ t,
4720
+ t.sideNav,
4721
+ n
4722
+ ]);
4723
+ a.useEffect(() => (document.addEventListener("mousemove", i), () => document.removeEventListener("mousemove", i)), [i]);
4724
+ let o = {
4725
+ hud: t,
4726
+ setHud: n
4727
+ };
4728
+ return /* @__PURE__ */ p(oa.Provider, {
4729
+ value: o,
4730
+ children: e
4731
+ });
4732
+ }, la = o(null), ua = "openbook.locale";
4733
+ function da() {
4734
+ if (typeof window > "u") return "en";
4735
+ try {
4736
+ let e = localStorage.getItem(ua);
4737
+ if (e) return Br(e);
4738
+ } catch {}
4739
+ return Br(navigator.language);
4740
+ }
4741
+ var fa = ({ children: e }) => {
4742
+ let [t, n] = f("en");
4743
+ l(() => {
4744
+ let e = da();
4745
+ e !== "en" && n(e);
4746
+ }, []), Lr() !== t && Rr(t), l(() => {
4747
+ typeof document < "u" && (document.documentElement.lang = t);
4748
+ }, [t]);
4749
+ let r = s((e) => {
4750
+ n(e);
4751
+ try {
4752
+ localStorage.setItem(ua, e);
4753
+ } catch {}
4754
+ }, []), i = u(() => ({
4755
+ locale: t,
4756
+ setLocale: r,
4757
+ t: Y,
4758
+ locales: Mr
4759
+ }), [t, r]);
4760
+ return /* @__PURE__ */ p(la.Provider, {
4761
+ value: i,
4762
+ children: e
4763
+ });
4764
+ }, pa = () => {
4765
+ let e = c(la);
4766
+ if (!e) throw Error("useTranslation must be used within an <I18nProvider>");
4767
+ return e;
4768
+ }, X = null, ma = /* @__PURE__ */ new Set(), ha = (e) => {
4769
+ X = e, ma.forEach((e) => e());
4770
+ }, ga = (e) => (ma.add(e), () => ma.delete(e)), _a = {
4771
+ createSubpage: (e, t) => X ? X.createSubpage(e, t) : Promise.reject(/* @__PURE__ */ Error("page links not ready")),
4772
+ openPage: (e, t) => X?.openPage(e, t),
4773
+ label: (e) => X?.label(e) ?? "Untitled",
4774
+ icon: (e) => X?.icon(e) ?? "📄",
4775
+ searchPages: (e, t) => X?.searchPages(e, t) ?? [],
4776
+ createPage: (e) => X ? X.createPage(e) : Promise.reject(/* @__PURE__ */ Error("page links not ready"))
4777
+ }, va = "openbook.recents";
4778
+ function ya(e, t, n = 12) {
3879
4779
  return [t, ...e.filter((e) => e !== t)].slice(0, n);
3880
4780
  }
3881
- var Zi = () => {
4781
+ var ba = () => {
3882
4782
  if (typeof localStorage > "u") return [];
3883
4783
  try {
3884
- let e = localStorage.getItem(Yi), t = e ? JSON.parse(e) : [];
4784
+ let e = localStorage.getItem(va), t = e ? JSON.parse(e) : [];
3885
4785
  return Array.isArray(t) ? t.filter((e) => typeof e == "string") : [];
3886
4786
  } catch {
3887
4787
  return [];
3888
4788
  }
3889
- }, Qi = /* @__PURE__ */ new Set(), $i = (e) => {
3890
- typeof localStorage < "u" && localStorage.setItem(Yi, JSON.stringify(e)), Qi.forEach((e) => e());
3891
- }, ea = () => Zi(), ta = (e) => {
3892
- let t = Xi(Zi(), e), n = Zi();
3893
- n[0] === e && n.length === t.length || $i(t);
3894
- }, na = (e) => (Qi.add(e), () => Qi.delete(e)), ra = "home", ia = "flow", aa = "config", oa = "customise", sa = "review", ca = "agent", la = {
4789
+ }, xa = /* @__PURE__ */ new Set(), Sa = (e) => {
4790
+ typeof localStorage < "u" && localStorage.setItem(va, JSON.stringify(e)), xa.forEach((e) => e());
4791
+ }, Ca = () => ba(), wa = (e) => {
4792
+ let t = ya(ba(), e), n = ba();
4793
+ n[0] === e && n.length === t.length || Sa(t);
4794
+ }, Ta = (e) => (xa.add(e), () => xa.delete(e)), Ea = "home", Da = "flow", Oa = "config", ka = "customise", Aa = "review", ja = "agent", Ma = {
3895
4795
  actions: !0,
3896
4796
  recents: !0,
3897
4797
  favorites: !0,
3898
4798
  edited: !0
3899
- }, ua = "openbook.home.widgets";
3900
- function da() {
4799
+ }, Na = "openbook.home.widgets";
4800
+ function Pa() {
3901
4801
  try {
3902
- let e = typeof localStorage < "u" ? localStorage.getItem(ua) : null, t = e ? JSON.parse(e) : {};
4802
+ let e = typeof localStorage < "u" ? localStorage.getItem(Na) : null, t = e ? JSON.parse(e) : {};
3903
4803
  return {
3904
- ...la,
4804
+ ...Ma,
3905
4805
  ...t
3906
4806
  };
3907
4807
  } catch {
3908
- return la;
4808
+ return Ma;
3909
4809
  }
3910
4810
  }
3911
- function fa(e) {
4811
+ function Fa(e) {
3912
4812
  try {
3913
- localStorage.setItem(ua, JSON.stringify(e));
4813
+ localStorage.setItem(Na, JSON.stringify(e));
3914
4814
  } catch {}
3915
4815
  }
3916
- function pa(e) {
4816
+ function Ia(e) {
3917
4817
  return e >= 5 && e < 12 ? "morning" : e >= 12 && e < 18 ? "afternoon" : "evening";
3918
4818
  }
3919
4819
  //#endregion
3920
4820
  //#region src/blockeditor/kit/kitPanel.ts
3921
- var ma = null, ha = /* @__PURE__ */ new Set(), ga = null, _a = /* @__PURE__ */ new Set(), va = null, ya = null, ba = (e) => e.forEach((e) => e());
3922
- function xa(e, t) {
3923
- ma = {
4821
+ var La = null, Ra = /* @__PURE__ */ new Set(), za = null, Ba = /* @__PURE__ */ new Set(), Va = null, Ha = null, Ua = (e) => e.forEach((e) => e());
4822
+ function Wa(e, t) {
4823
+ La = {
3924
4824
  blockId: e,
3925
4825
  title: t
3926
- }, ba(ha), va?.(e);
4826
+ }, Ua(Ra), Va?.(e);
3927
4827
  }
3928
- function Sa(e) {
3929
- ma && (ma = null, ba(ha), e?.keepPane || ya?.());
4828
+ function Ga(e) {
4829
+ La && (La = null, Ua(Ra), e?.keepPane || Ha?.());
3930
4830
  }
3931
- var Ca = () => ma;
3932
- function wa(e) {
3933
- return ha.add(e), () => ha.delete(e);
4831
+ var Ka = () => La;
4832
+ function qa(e) {
4833
+ return Ra.add(e), () => Ra.delete(e);
3934
4834
  }
3935
- function Ta(e) {
3936
- ga !== e && (ga = e, ba(_a));
4835
+ function Ja(e) {
4836
+ za !== e && (za = e, Ua(Ba));
3937
4837
  }
3938
- var Ea = () => ga;
3939
- function Da(e) {
3940
- return _a.add(e), () => _a.delete(e);
4838
+ var Ya = () => za;
4839
+ function Xa(e) {
4840
+ return Ba.add(e), () => Ba.delete(e);
3941
4841
  }
3942
- function Oa(e, t) {
3943
- return va = e, ya = t, () => {
3944
- va === e && (va = null), ya === t && (ya = null);
4842
+ function Za(e, t) {
4843
+ return Va = e, Ha = t, () => {
4844
+ Va === e && (Va = null), Ha === t && (Ha = null);
3945
4845
  };
3946
4846
  }
3947
4847
  //#endregion
3948
4848
  //#region src/lib/favorites.ts
3949
- var ka = "openbook.favorites";
3950
- function Aa(e, t) {
4849
+ var Qa = "openbook.favorites";
4850
+ function $a(e, t) {
3951
4851
  return e.includes(t) ? e.filter((e) => e !== t) : [t, ...e];
3952
4852
  }
3953
- var ja = () => {
4853
+ var eo = () => {
3954
4854
  if (typeof localStorage > "u") return [];
3955
4855
  try {
3956
- let e = localStorage.getItem(ka), t = e ? JSON.parse(e) : [];
4856
+ let e = localStorage.getItem(Qa), t = e ? JSON.parse(e) : [];
3957
4857
  return Array.isArray(t) ? t.filter((e) => typeof e == "string") : [];
3958
4858
  } catch {
3959
4859
  return [];
3960
4860
  }
3961
- }, Ma = /* @__PURE__ */ new Set(), Na = (e) => {
3962
- typeof localStorage < "u" && localStorage.setItem(ka, JSON.stringify(e)), Ma.forEach((e) => e());
3963
- }, Pa = () => ja(), Fa = (e) => ja().includes(e), Ia = (e) => Na(Aa(ja(), e)), La = (e) => {
3964
- let t = ja();
3965
- t.includes(e) && Na(t.filter((t) => t !== e));
3966
- }, Ra = (e) => (Ma.add(e), () => Ma.delete(e)), za = 0, Ba = () => (za += 1, `tab_${typeof crypto < "u" && "randomUUID" in crypto ? crypto.randomUUID().slice(0, 8) : `${za}`}`), Va = (e, t = null) => ({
3967
- id: Ba(),
4861
+ }, to = /* @__PURE__ */ new Set(), no = (e) => {
4862
+ typeof localStorage < "u" && localStorage.setItem(Qa, JSON.stringify(e)), to.forEach((e) => e());
4863
+ }, ro = () => eo(), io = (e) => eo().includes(e), ao = (e) => no($a(eo(), e)), oo = (e) => {
4864
+ let t = eo();
4865
+ t.includes(e) && no(t.filter((t) => t !== e));
4866
+ }, so = (e) => (to.add(e), () => to.delete(e)), co = 0, lo = () => (co += 1, `tab_${typeof crypto < "u" && "randomUUID" in crypto ? crypto.randomUUID().slice(0, 8) : `${co}`}`), uo = (e, t = null) => ({
4867
+ id: lo(),
3968
4868
  history: [e],
3969
4869
  index: 0,
3970
4870
  split: t && t !== e ? t : null,
3971
4871
  focused: "primary"
3972
- }), Y = (e) => e.history[e.index], Ha = (e) => e.split !== null, Ua = (e) => {
4872
+ }), fo = (e) => e.history[e.index], po = (e) => e.split !== null, mo = (e) => {
3973
4873
  let t = [{
3974
4874
  id: "primary",
3975
- pageId: Y(e)
4875
+ pageId: fo(e)
3976
4876
  }];
3977
4877
  return e.split !== null && t.push({
3978
4878
  id: "secondary",
3979
4879
  pageId: e.split
3980
4880
  }), t;
3981
- }, Wa = (e) => e.focused === "secondary" && e.split !== null ? e.split : Y(e), Ga = (e, t) => {
3982
- if (Y(e) === t) return e;
4881
+ }, ho = (e) => e.focused === "secondary" && e.split !== null ? e.split : fo(e), go = (e, t) => {
4882
+ if (fo(e) === t) return e;
3983
4883
  let n = e.history.slice(0, e.index + 1);
3984
4884
  return n.push(t), {
3985
4885
  ...e,
3986
4886
  history: n,
3987
4887
  index: n.length - 1
3988
4888
  };
3989
- }, Ka = (e, t, n) => t === "secondary" && Ha(e) ? e.split === n ? e : {
4889
+ }, _o = (e, t, n) => t === "secondary" && po(e) ? e.split === n ? e : {
3990
4890
  ...e,
3991
4891
  split: n
3992
- } : Ga(e, n), qa = (e, t) => Ka(e, e.focused, t), Ja = (e, t) => {
4892
+ } : go(e, n), vo = (e, t) => _o(e, e.focused, t), yo = (e, t) => {
3993
4893
  let n = e.index + t;
3994
4894
  return n >= 0 && n < e.history.length ? {
3995
4895
  ...e,
3996
4896
  index: n
3997
4897
  } : e;
3998
- }, Ya = (e, t) => ({
4898
+ }, bo = (e, t) => ({
3999
4899
  ...e,
4000
4900
  split: t,
4001
4901
  focused: "secondary"
4002
- }), Xa = (e) => Ha(e) ? {
4902
+ }), xo = (e) => po(e) ? {
4003
4903
  ...e,
4004
4904
  split: null,
4005
4905
  focused: "primary"
4006
- } : e, Za = (e, t) => t === "secondary" ? Xa(e) : Ha(e) ? {
4906
+ } : e, So = (e, t) => t === "secondary" ? xo(e) : po(e) ? {
4007
4907
  ...e,
4008
4908
  history: [e.split],
4009
4909
  index: 0,
4010
4910
  split: null,
4011
4911
  focused: "primary"
4012
- } : e, Qa = (e, t) => t === e.focused ? e : {
4912
+ } : e, Co = (e, t) => t === e.focused ? e : {
4013
4913
  ...e,
4014
4914
  focused: t
4015
- }, $a = (e, t) => {
4915
+ }, wo = (e, t) => {
4016
4916
  let n = e.history.filter(t), r = e;
4017
4917
  if (n.length !== e.history.length) {
4018
4918
  if (n.length === 0) return null;
@@ -4027,55 +4927,55 @@ var ja = () => {
4027
4927
  split: null,
4028
4928
  focused: "primary"
4029
4929
  }), r;
4030
- }, eo = (e, t = null) => {
4031
- let n = Va(e, t);
4930
+ }, To = (e, t = null) => {
4931
+ let n = uo(e, t);
4032
4932
  return {
4033
4933
  tabs: [n],
4034
4934
  activeTabId: n.id
4035
4935
  };
4036
- }, X = (e) => e.tabs.find((t) => t.id === e.activeTabId) ?? e.tabs[0], Z = (e, t) => {
4037
- let n = X(e), r = t(n);
4936
+ }, Z = (e) => e.tabs.find((t) => t.id === e.activeTabId) ?? e.tabs[0], Q = (e, t) => {
4937
+ let n = Z(e), r = t(n);
4038
4938
  return r === n ? e : {
4039
4939
  ...e,
4040
4940
  tabs: e.tabs.map((e) => e.id === n.id ? r : e)
4041
4941
  };
4042
- }, to = (e) => Y(e), no = (e) => Y(X(e)), ro = (e) => Ua(X(e)), io = (e) => Wa(X(e)), ao = (e) => X(e).focused, oo = (e) => X(e).split !== null, so = (e) => X(e).index > 0, co = (e) => {
4043
- let t = X(e);
4942
+ }, Eo = (e) => fo(e), Do = (e) => fo(Z(e)), Oo = (e) => mo(Z(e)), ko = (e) => ho(Z(e)), Ao = (e) => Z(e).focused, jo = (e) => Z(e).split !== null, Mo = (e) => Z(e).index > 0, No = (e) => {
4943
+ let t = Z(e);
4044
4944
  return t.index < t.history.length - 1;
4045
- }, lo = (e, t) => Z(e, (e) => qa(e, t)), uo = (e, t, n) => Z(e, (e) => {
4046
- let r = t === "secondary" && Ha(e) ? "secondary" : "primary";
4047
- return Ka(Qa(e, r), r, n);
4048
- }), fo = (e) => Z(e, (e) => Ja(e, -1)), po = (e) => Z(e, (e) => Ja(e, 1)), mo = (e, t) => Z(e, (e) => Ya(e, t)), ho = (e) => Z(e, Xa), go = (e, t) => Z(e, (e) => Za(e, t)), _o = (e, t) => Z(e, (e) => Qa(e, t)), vo = (e, t) => {
4049
- let n = Va(t);
4945
+ }, Po = (e, t) => Q(e, (e) => vo(e, t)), Fo = (e, t, n) => Q(e, (e) => {
4946
+ let r = t === "secondary" && po(e) ? "secondary" : "primary";
4947
+ return _o(Co(e, r), r, n);
4948
+ }), Io = (e) => Q(e, (e) => yo(e, -1)), Lo = (e) => Q(e, (e) => yo(e, 1)), Ro = (e, t) => Q(e, (e) => bo(e, t)), zo = (e) => Q(e, xo), Bo = (e, t) => Q(e, (e) => So(e, t)), Vo = (e, t) => Q(e, (e) => Co(e, t)), Ho = (e, t) => {
4949
+ let n = uo(t);
4050
4950
  return {
4051
4951
  tabs: [...e.tabs, n],
4052
4952
  activeTabId: n.id
4053
4953
  };
4054
- }, yo = (e, t) => e.tabs.some((e) => e.id === t) ? {
4954
+ }, Uo = (e, t) => e.tabs.some((e) => e.id === t) ? {
4055
4955
  ...e,
4056
4956
  activeTabId: t
4057
- } : e, bo = (e, t) => {
4957
+ } : e, Wo = (e, t) => {
4058
4958
  if (e.tabs.length <= 1) return e;
4059
4959
  let n = e.tabs.findIndex((e) => e.id === t), r = e.tabs.filter((e) => e.id !== t);
4060
4960
  return {
4061
4961
  tabs: r,
4062
4962
  activeTabId: e.activeTabId === t ? r[Math.min(n, r.length - 1)].id : e.activeTabId
4063
4963
  };
4064
- }, xo = (e, t, n) => {
4964
+ }, Go = (e, t, n) => {
4065
4965
  let r = !1, i = [];
4066
4966
  for (let n of e.tabs) {
4067
- let e = $a(n, t);
4967
+ let e = wo(n, t);
4068
4968
  e === null ? r = !0 : (e !== n && (r = !0), i.push(e));
4069
4969
  }
4070
- return i.length === 0 ? n ? eo(n) : e : r ? {
4970
+ return i.length === 0 ? n ? To(n) : e : r ? {
4071
4971
  tabs: i,
4072
4972
  activeTabId: i.some((t) => t.id === e.activeTabId) ? e.activeTabId : i[0].id
4073
4973
  } : e;
4074
- }, So = o(null), Co = () => {
4075
- let e = c(So);
4974
+ }, Ko = o(null), qo = () => {
4975
+ let e = c(Ko);
4076
4976
  if (!e) throw Error("useNavigation must be used within a <NavigationProvider>");
4077
4977
  return e;
4078
- }, wo = "openbook.currentPageId", To = () => {
4978
+ }, Jo = "openbook.currentPageId", Yo = () => {
4079
4979
  if (typeof window > "u") return {
4080
4980
  page: null,
4081
4981
  split: null
@@ -4085,68 +4985,68 @@ var ja = () => {
4085
4985
  page: e.get("page"),
4086
4986
  split: e.get("split")
4087
4987
  };
4088
- }, Eo = (e, t) => {
4988
+ }, Xo = (e, t) => {
4089
4989
  if (typeof window > "u") return;
4090
4990
  let n = new URL(window.location.href);
4091
4991
  n.searchParams.set("page", e), t ? n.searchParams.set("split", t) : n.searchParams.delete("split"), window.history.replaceState(null, "", `${n.pathname}${n.search}${n.hash}`);
4092
4992
  try {
4093
- localStorage.setItem(wo, e);
4993
+ localStorage.setItem(Jo, e);
4094
4994
  } catch {}
4095
- }, Do = (e) => {
4995
+ }, Zo = (e) => {
4096
4996
  let t = new URL(window.location.href);
4097
4997
  return t.searchParams.set("page", e), t.searchParams.delete("split"), t.toString();
4098
- }, Oo = () => {
4998
+ }, Qo = () => {
4099
4999
  try {
4100
- return typeof localStorage < "u" ? localStorage.getItem(wo) : null;
5000
+ return typeof localStorage < "u" ? localStorage.getItem(Jo) : null;
4101
5001
  } catch {
4102
5002
  return null;
4103
5003
  }
4104
- }, ko = ({ children: i }) => {
4105
- let a = Bi(), o = cr(), [c, m] = f([]), [h, g] = f(null), [_, v] = f({}), [ee, te] = f(!0), [x, ne] = f(null), S = d(null), C = d(/* @__PURE__ */ new Set());
5004
+ }, $o = ({ children: i }) => {
5005
+ let a = Bi(), o = cr(), [c, m] = f([]), [h, g] = f(null), [_, ee] = f({}), [v, te] = f(!0), [ne, re] = f(null), x = d(null), S = d(/* @__PURE__ */ new Set());
4106
5006
  l(() => {
4107
5007
  if (!h) return;
4108
- let e = X(h).split, t = e === "config" || e === "customise" || e === "review";
4109
- Eo(no(h), t ? null : e);
5008
+ let e = Z(h).split, t = e === "config" || e === "customise" || e === "review";
5009
+ Xo(Do(h), t ? null : e);
4110
5010
  }, [h]);
4111
- let w = s((e) => {
5011
+ let C = s((e) => {
4112
5012
  g((t) => t && e(t));
4113
- }, []), T = s(async () => {
5013
+ }, []), w = s(async () => {
4114
5014
  let e = await a.listPages();
4115
5015
  return m(e), e;
4116
- }, [a]), E = s((e) => w((t) => lo(t, e)), [w]), D = s((e, t) => w((n) => uo(n, t, e)), [w]), O = s(() => w(fo), [w]), k = s(() => w(po), [w]), A = s((e) => w((t) => _o(t, e)), [w]), j = s((e) => w((t) => mo(t, e)), [w]), M = s(() => w(ho), [w]), N = s((e) => w((t) => go(t, e)), [w]), P = s((e) => w((t) => yo(t, e)), [w]), re = s((e) => w((t) => bo(t, e)), [w]), F = s((e) => g((t) => t && xo(t, (t) => t !== e, c[0]?.id ?? null)), [c]), I = s((e, t) => {
5016
+ }, [a]), T = s((e) => C((t) => Po(t, e)), [C]), E = s((e, t) => C((n) => Fo(n, t, e)), [C]), D = s(() => C(Io), [C]), O = s(() => C(Lo), [C]), k = s((e) => C((t) => Vo(t, e)), [C]), A = s((e) => C((t) => Ro(t, e)), [C]), j = s(() => C(zo), [C]), M = s((e) => C((t) => Bo(t, e)), [C]), N = s((e) => C((t) => Uo(t, e)), [C]), P = s((e) => C((t) => Wo(t, e)), [C]), ie = s((e) => g((t) => t && Go(t, (t) => t !== e, c[0]?.id ?? null)), [c]), F = s((e, t) => {
4117
5017
  if (t === "tab") {
4118
- o.tabs?.inWindow ? w((t) => vo(t, e)) : typeof window < "u" && window.open(Do(e), "_blank", "noopener");
5018
+ o.tabs?.inWindow ? C((t) => Ho(t, e)) : typeof window < "u" && window.open(Zo(e), "_blank", "noopener");
4119
5019
  return;
4120
5020
  }
4121
- o.tabs ? o.tabs.openWindow(e) : typeof window < "u" && window.open(Do(e), "_blank", "noopener,popup,width=1280,height=860");
4122
- }, [o, w]), L = s((e, t) => {
4123
- v((n) => {
5021
+ o.tabs ? o.tabs.openWindow(e) : typeof window < "u" && window.open(Zo(e), "_blank", "noopener,popup,width=1280,height=860");
5022
+ }, [o, C]), I = s((e, t) => {
5023
+ ee((n) => {
4124
5024
  let r = t && t.trim().length > 0 ? t : "Untitled";
4125
5025
  return n[e] === r ? n : {
4126
5026
  ...n,
4127
5027
  [e]: r
4128
5028
  };
4129
5029
  });
4130
- }, []), R = s((e) => {
4131
- if (e === "home") return Mi("nav.home");
4132
- if (e === "flow") return Mi("flow.title");
5030
+ }, []), L = s((e) => {
5031
+ if (e === "home") return Y("nav.home");
5032
+ if (e === "flow") return Y("flow.title");
4133
5033
  if (e === "config") return "Settings";
4134
5034
  if (e === "customise") return "Customise";
4135
5035
  if (e === "review") return "Review";
4136
5036
  let t = c.find((t) => t.id === e);
4137
5037
  return t ? t.name && t.name.trim().length > 0 ? t.name : "Untitled" : _[e] ?? "Untitled";
4138
- }, [c, _]), ie = s(async (e = null, t = null) => {
5038
+ }, [c, _]), ae = s(async (e = null, t = null) => {
4139
5039
  let n = await a.savePage({
4140
5040
  name: e,
4141
5041
  data: b(),
4142
5042
  parentId: t
4143
5043
  });
4144
- return await T(), E(n.id), n.id;
5044
+ return await w(), T(n.id), n.id;
4145
5045
  }, [
4146
5046
  a,
4147
- T,
4148
- E
4149
- ]), ae = s(async (e = null) => {
5047
+ w,
5048
+ T
5049
+ ]), R = s(async (e = null) => {
4150
5050
  let t = await a.savePage({
4151
5051
  name: null,
4152
5052
  data: b(),
@@ -4156,11 +5056,11 @@ var ja = () => {
4156
5056
  pageId: t.id,
4157
5057
  name: null,
4158
5058
  schema: y()
4159
- }), await T(), E(t.id), t.id;
5059
+ }), await w(), T(t.id), t.id;
4160
5060
  }, [
4161
5061
  a,
4162
- T,
4163
- E
5062
+ w,
5063
+ T
4164
5064
  ]), z = s(async (e, t = "page") => {
4165
5065
  let n = await a.savePage({
4166
5066
  name: null,
@@ -4171,18 +5071,18 @@ var ja = () => {
4171
5071
  pageId: n.id,
4172
5072
  name: null,
4173
5073
  schema: y()
4174
- }), await T(), n.id;
4175
- }, [a, T]), oe = s(async (e) => {
5074
+ }), await w(), n.id;
5075
+ }, [a, w]), B = s(async (e) => {
4176
5076
  let t = await a.savePage({
4177
5077
  name: null,
4178
5078
  data: b()
4179
5079
  });
4180
- await T(), I(t.id, e);
5080
+ await w(), F(t.id, e);
4181
5081
  }, [
4182
5082
  a,
4183
- T,
4184
- I
4185
- ]), se = s(async (t) => {
5083
+ w,
5084
+ F
5085
+ ]), oe = s(async (t) => {
4186
5086
  let r = await a.getPage(t);
4187
5087
  if (!r) return;
4188
5088
  let i = r.name && r.name.trim().length > 0 ? `${r.name} (copy)` : null, o = await a.savePage({
@@ -4190,57 +5090,57 @@ var ja = () => {
4190
5090
  data: r.data,
4191
5091
  parentId: r.parentId
4192
5092
  }), s = e(t);
4193
- s && n(o.id, s), await T(), E(o.id);
5093
+ s && n(o.id, s), await w(), T(o.id);
4194
5094
  }, [
4195
5095
  a,
4196
- T,
4197
- E
4198
- ]), ce = s(async (e) => {
4199
- await a.deletePage(e), La(e);
4200
- let t = await T();
4201
- g((n) => n && xo(n, (t) => t !== e, t[0]?.id ?? null));
4202
- }, [a, T]), le = s(async (e, t) => {
4203
- await a.renamePage(e, t), L(e, t), await T();
5096
+ w,
5097
+ T
5098
+ ]), se = s(async (e) => {
5099
+ await a.deletePage(e), oo(e);
5100
+ let t = await w();
5101
+ g((n) => n && Go(n, (t) => t !== e, t[0]?.id ?? null));
5102
+ }, [a, w]), V = s(async (e, t) => {
5103
+ await a.renamePage(e, t), I(e, t), await w();
4204
5104
  }, [
4205
5105
  a,
4206
- T,
4207
- L
4208
- ]), ue = s(async (e, t, n) => {
5106
+ w,
5107
+ I
5108
+ ]), ce = s(async (e, t, n) => {
4209
5109
  await a.movePage(e, {
4210
5110
  parentId: t,
4211
5111
  orderedIds: n
4212
- }), await T();
4213
- }, [a, T]), de = s((e, n) => {
5112
+ }), await w();
5113
+ }, [a, w]), H = s((e, n) => {
4214
5114
  let r = e.trim().toLowerCase(), i = c.filter((e) => !n?.databasesOnly || e.hostedDatabaseId).map((e) => ({
4215
5115
  id: e.id,
4216
- label: R(e.id),
5116
+ label: L(e.id),
4217
5117
  icon: t(e.id)
4218
5118
  })).filter((e) => r === "" || e.label.toLowerCase().includes(r)), a = (e) => {
4219
5119
  let t = e.toLowerCase();
4220
5120
  return t === r ? 2 : +!!t.startsWith(r);
4221
5121
  };
4222
5122
  return i.sort((e, t) => a(t.label) - a(e.label)).slice(0, 8);
4223
- }, [c, R]), fe = s(async (e) => {
5123
+ }, [c, L]), U = s(async (e) => {
4224
5124
  let t = await a.savePage({
4225
5125
  name: e.trim() || null,
4226
5126
  data: b()
4227
5127
  });
4228
- return await T(), t.id;
4229
- }, [a, T]);
5128
+ return await w(), t.id;
5129
+ }, [a, w]);
4230
5130
  l(() => {
4231
- S.current ||= (async () => {
5131
+ x.current ||= (async () => {
4232
5132
  try {
4233
5133
  let e = await a.listPages();
4234
5134
  e.length === 0 && (await a.savePage({
4235
5135
  name: null,
4236
5136
  data: b()
4237
- }), e = await a.listPages()), m(e), C.current = new Set(e.map((e) => e.id));
4238
- let t = new Set(e.map((e) => e.id)), n = async (e) => e ? e === "home" || e === "flow" || t.has(e) ? e : await a.getPage(e) === null ? null : e : null, { page: r, split: i } = To(), o = await n(r);
4239
- o ||= await n(Oo()), o ||= e[0]?.id ?? null;
5137
+ }), e = await a.listPages()), m(e), S.current = new Set(e.map((e) => e.id));
5138
+ let t = new Set(e.map((e) => e.id)), n = async (e) => e ? e === "home" || e === "flow" || t.has(e) ? e : await a.getPage(e) === null ? null : e : null, { page: r, split: i } = Yo(), o = await n(r);
5139
+ o ||= await n(Qo()), o ||= e[0]?.id ?? null;
4240
5140
  let s = o ? await n(i && i !== o ? i : null) : null;
4241
- g(o ? eo(o, s) : null);
5141
+ g(o ? To(o, s) : null);
4242
5142
  } catch (e) {
4243
- ne(e instanceof Error ? e.message : String(e));
5143
+ re(e instanceof Error ? e.message : String(e));
4244
5144
  } finally {
4245
5145
  te(!1);
4246
5146
  }
@@ -4249,119 +5149,119 @@ var ja = () => {
4249
5149
  r(c);
4250
5150
  }, [c]), l(() => a.subscribePages((e) => {
4251
5151
  m(e);
4252
- let t = new Set(e.map((e) => e.id)), n = [...C.current].filter((e) => !t.has(e));
4253
- if (C.current = t, n.length === 0) return;
4254
- n.forEach(La);
5152
+ let t = new Set(e.map((e) => e.id)), n = [...S.current].filter((e) => !t.has(e));
5153
+ if (S.current = t, n.length === 0) return;
5154
+ n.forEach(oo);
4255
5155
  let r = new Set(n);
4256
- g((t) => t && xo(t, (e) => !r.has(e), e[0]?.id ?? null));
4257
- }), [a]), l(() => (Ki({
5156
+ g((t) => t && Go(t, (e) => !r.has(e), e[0]?.id ?? null));
5157
+ }), [a]), l(() => (ha({
4258
5158
  createSubpage: (e, t) => z(e, t),
4259
- openPage: (e, t) => t ? D(e, t) : E(e),
4260
- label: (e) => R(e),
5159
+ openPage: (e, t) => t ? E(e, t) : T(e),
5160
+ label: (e) => L(e),
4261
5161
  icon: (e) => t(e),
4262
- searchPages: de,
4263
- createPage: fe
4264
- }), () => Ki(null)), [
5162
+ searchPages: H,
5163
+ createPage: U
5164
+ }), () => ha(null)), [
4265
5165
  z,
5166
+ T,
4266
5167
  E,
4267
- D,
4268
- R,
4269
- de,
4270
- fe
4271
- ]), l(() => Oa(() => j(aa), () => M()), [j, M]), l(() => {
4272
- c.length !== 0 && v((e) => {
5168
+ L,
5169
+ H,
5170
+ U
5171
+ ]), l(() => Za(() => A(Oa), () => j()), [A, j]), l(() => {
5172
+ c.length !== 0 && ee((e) => {
4273
5173
  let t = { ...e };
4274
5174
  for (let e of c) t[e.id] = e.name && e.name.trim().length > 0 ? e.name : "Untitled";
4275
5175
  return t;
4276
5176
  });
4277
5177
  }, [c]);
4278
- let B = h ? io(h) : null, pe = h ? no(h) : null;
5178
+ let W = h ? ko(h) : null, G = h ? Do(h) : null;
4279
5179
  l(() => {
4280
- B && B !== "home" && B !== "flow" && B !== "config" && B !== "customise" && B !== "review" && ta(B);
4281
- }, [B]);
4282
- let me = h ? ro(h) : [], he = h ? ao(h) : "primary", ge = h ? oo(h) : !1, _e = h ? so(h) : !1, ve = h ? co(h) : !1, ye = o.tabs?.inWindow ?? !1, be = h ? h.tabs.map((e) => ({
5180
+ W && W !== "home" && W !== "flow" && W !== "config" && W !== "customise" && W !== "review" && wa(W);
5181
+ }, [W]);
5182
+ let le = h ? Oo(h) : [], ue = h ? Ao(h) : "primary", de = h ? jo(h) : !1, fe = h ? Mo(h) : !1, pe = h ? No(h) : !1, me = o.tabs?.inWindow ?? !1, he = h ? h.tabs.map((e) => ({
4283
5183
  id: e.id,
4284
- pageId: to(e)
4285
- })) : [], xe = h?.activeTabId ?? "", Se = u(() => ({
5184
+ pageId: Eo(e)
5185
+ })) : [], ge = h?.activeTabId ?? "", _e = u(() => ({
4286
5186
  pages: c,
4287
- currentPageId: B,
4288
- primaryPageId: pe,
4289
- loading: ee,
4290
- error: x,
4291
- inWindowTabs: ye,
4292
- tabs: be,
4293
- activeTabId: xe,
4294
- selectTab: P,
4295
- closeTab: re,
4296
- panes: me,
4297
- focusedPaneId: he,
4298
- splitOpen: ge,
4299
- focusPane: A,
4300
- openInSplit: j,
4301
- closeSplit: M,
4302
- closePane: N,
4303
- openInNew: I,
4304
- newPageIn: oe,
4305
- closePage: F,
4306
- pageLabel: R,
4307
- setPageHint: L,
4308
- selectPage: E,
4309
- selectPageInPane: D,
4310
- goBack: O,
4311
- goForward: k,
4312
- canGoBack: _e,
4313
- canGoForward: ve,
4314
- createPage: ie,
4315
- createDatabasePage: ae,
5187
+ currentPageId: W,
5188
+ primaryPageId: G,
5189
+ loading: v,
5190
+ error: ne,
5191
+ inWindowTabs: me,
5192
+ tabs: he,
5193
+ activeTabId: ge,
5194
+ selectTab: N,
5195
+ closeTab: P,
5196
+ panes: le,
5197
+ focusedPaneId: ue,
5198
+ splitOpen: de,
5199
+ focusPane: k,
5200
+ openInSplit: A,
5201
+ closeSplit: j,
5202
+ closePane: M,
5203
+ openInNew: F,
5204
+ newPageIn: B,
5205
+ closePage: ie,
5206
+ pageLabel: L,
5207
+ setPageHint: I,
5208
+ selectPage: T,
5209
+ selectPageInPane: E,
5210
+ goBack: D,
5211
+ goForward: O,
5212
+ canGoBack: fe,
5213
+ canGoForward: pe,
5214
+ createPage: ae,
5215
+ createDatabasePage: R,
4316
5216
  createSubpage: z,
4317
- duplicatePage: se,
4318
- deletePage: ce,
4319
- renamePage: le,
4320
- movePage: ue,
4321
- reload: T
5217
+ duplicatePage: oe,
5218
+ deletePage: se,
5219
+ renamePage: V,
5220
+ movePage: ce,
5221
+ reload: w
4322
5222
  }), [
4323
5223
  c,
4324
- B,
4325
- pe,
4326
- ee,
4327
- x,
4328
- ye,
4329
- be,
4330
- xe,
4331
- P,
4332
- re,
5224
+ W,
5225
+ G,
5226
+ v,
5227
+ ne,
4333
5228
  me,
4334
5229
  he,
4335
5230
  ge,
5231
+ N,
5232
+ P,
5233
+ le,
5234
+ ue,
5235
+ de,
5236
+ k,
4336
5237
  A,
4337
5238
  j,
4338
5239
  M,
4339
- N,
4340
- I,
4341
- oe,
4342
5240
  F,
4343
- R,
5241
+ B,
5242
+ ie,
4344
5243
  L,
5244
+ I,
5245
+ T,
4345
5246
  E,
4346
5247
  D,
4347
5248
  O,
4348
- k,
4349
- _e,
4350
- ve,
4351
- ie,
5249
+ fe,
5250
+ pe,
4352
5251
  ae,
5252
+ R,
4353
5253
  z,
5254
+ oe,
4354
5255
  se,
5256
+ V,
4355
5257
  ce,
4356
- le,
4357
- ue,
4358
- T
5258
+ w
4359
5259
  ]);
4360
- return /* @__PURE__ */ p(So.Provider, {
4361
- value: Se,
5260
+ return /* @__PURE__ */ p(Ko.Provider, {
5261
+ value: _e,
4362
5262
  children: i
4363
5263
  });
4364
- }, Ao = {
5264
+ }, es = {
4365
5265
  background: "0 0% 100%",
4366
5266
  foreground: "34 9% 19%",
4367
5267
  card: "0 0% 100%",
@@ -4388,7 +5288,7 @@ var ja = () => {
4388
5288
  brand: "207 76% 47%",
4389
5289
  brandForeground: "0 0% 100%",
4390
5290
  brandSubtle: "207 86% 95%"
4391
- }, jo = {
5291
+ }, ts = {
4392
5292
  background: "0 0% 13%",
4393
5293
  foreground: "0 0% 82%",
4394
5294
  card: "0 0% 16%",
@@ -4416,7 +5316,7 @@ var ja = () => {
4416
5316
  brandForeground: "0 0% 100%",
4417
5317
  brandSubtle: "208 48% 22%"
4418
5318
  };
4419
- function Q(e, t, n, r, i) {
5319
+ function $(e, t, n, r, i) {
4420
5320
  let a = (e, t) => ({
4421
5321
  ...e,
4422
5322
  primary: t.primary,
@@ -4431,19 +5331,19 @@ function Q(e, t, n, r, i) {
4431
5331
  nameKey: `theme.${e}`,
4432
5332
  group: t,
4433
5333
  neutral: i,
4434
- light: a(Ao, n),
4435
- dark: a(jo, r)
5334
+ light: a(es, n),
5335
+ dark: a(ts, r)
4436
5336
  };
4437
5337
  }
4438
- var Mo = "default", $ = [
5338
+ var ns = "default", rs = [
4439
5339
  {
4440
5340
  id: "default",
4441
5341
  nameKey: "theme.default",
4442
5342
  group: "bold",
4443
- light: Ao,
4444
- dark: jo
5343
+ light: es,
5344
+ dark: ts
4445
5345
  },
4446
- Q("sandstone", "gray", {
5346
+ $("sandstone", "gray", {
4447
5347
  primary: "28 12% 34%",
4448
5348
  brandSubtle: "30 24% 92%"
4449
5349
  }, {
@@ -4451,7 +5351,7 @@ var Mo = "default", $ = [
4451
5351
  primaryForeground: "30 16% 12%",
4452
5352
  brandSubtle: "30 12% 22%"
4453
5353
  }, "warm"),
4454
- Q("graphite", "gray", {
5354
+ $("graphite", "gray", {
4455
5355
  primary: "0 0% 34%",
4456
5356
  brandSubtle: "0 0% 92%"
4457
5357
  }, {
@@ -4459,7 +5359,7 @@ var Mo = "default", $ = [
4459
5359
  primaryForeground: "0 0% 12%",
4460
5360
  brandSubtle: "0 0% 22%"
4461
5361
  }, "neutral"),
4462
- Q("slate", "gray", {
5362
+ $("slate", "gray", {
4463
5363
  primary: "220 14% 36%",
4464
5364
  brandSubtle: "216 24% 92%"
4465
5365
  }, {
@@ -4467,49 +5367,49 @@ var Mo = "default", $ = [
4467
5367
  primaryForeground: "220 22% 12%",
4468
5368
  brandSubtle: "218 16% 22%"
4469
5369
  }, "cool"),
4470
- Q("ocean", "bold", {
5370
+ $("ocean", "bold", {
4471
5371
  primary: "221 83% 53%",
4472
5372
  brandSubtle: "221 86% 95%"
4473
5373
  }, {
4474
5374
  primary: "217 91% 60%",
4475
5375
  brandSubtle: "221 55% 21%"
4476
5376
  }),
4477
- Q("forest", "bold", {
5377
+ $("forest", "bold", {
4478
5378
  primary: "142 71% 38%",
4479
5379
  brandSubtle: "142 60% 94%"
4480
5380
  }, {
4481
5381
  primary: "142 65% 45%",
4482
5382
  brandSubtle: "142 40% 18%"
4483
5383
  }),
4484
- Q("violet", "bold", {
5384
+ $("violet", "bold", {
4485
5385
  primary: "262 83% 58%",
4486
5386
  brandSubtle: "262 80% 96%"
4487
5387
  }, {
4488
5388
  primary: "263 70% 55%",
4489
5389
  brandSubtle: "263 45% 24%"
4490
5390
  }),
4491
- Q("sunset", "bold", {
5391
+ $("sunset", "bold", {
4492
5392
  primary: "25 95% 53%",
4493
5393
  brandSubtle: "28 90% 94%"
4494
5394
  }, {
4495
5395
  primary: "21 90% 50%",
4496
5396
  brandSubtle: "25 60% 22%"
4497
5397
  }),
4498
- Q("rose", "bold", {
5398
+ $("rose", "bold", {
4499
5399
  primary: "346 77% 50%",
4500
5400
  brandSubtle: "346 80% 96%"
4501
5401
  }, {
4502
5402
  primary: "346 75% 55%",
4503
5403
  brandSubtle: "346 45% 24%"
4504
5404
  }),
4505
- Q("teal", "bold", {
5405
+ $("teal", "bold", {
4506
5406
  primary: "174 72% 38%",
4507
5407
  brandSubtle: "174 60% 93%"
4508
5408
  }, {
4509
5409
  primary: "173 70% 46%",
4510
5410
  brandSubtle: "174 45% 18%"
4511
5411
  }),
4512
- Q("amber", "bold", {
5412
+ $("amber", "bold", {
4513
5413
  primary: "38 92% 48%",
4514
5414
  primaryForeground: "30 40% 14%",
4515
5415
  brandSubtle: "40 90% 92%"
@@ -4518,7 +5418,7 @@ var Mo = "default", $ = [
4518
5418
  primaryForeground: "30 45% 12%",
4519
5419
  brandSubtle: "38 55% 20%"
4520
5420
  }),
4521
- Q("pastel-sky", "pastel", {
5421
+ $("pastel-sky", "pastel", {
4522
5422
  primary: "205 74% 70%",
4523
5423
  primaryForeground: "205 50% 22%",
4524
5424
  brandSubtle: "205 70% 95%"
@@ -4527,7 +5427,7 @@ var Mo = "default", $ = [
4527
5427
  primaryForeground: "205 45% 14%",
4528
5428
  brandSubtle: "205 38% 24%"
4529
5429
  }),
4530
- Q("pastel-mint", "pastel", {
5430
+ $("pastel-mint", "pastel", {
4531
5431
  primary: "152 48% 66%",
4532
5432
  primaryForeground: "152 45% 20%",
4533
5433
  brandSubtle: "152 50% 94%"
@@ -4536,7 +5436,7 @@ var Mo = "default", $ = [
4536
5436
  primaryForeground: "152 45% 12%",
4537
5437
  brandSubtle: "152 32% 22%"
4538
5438
  }),
4539
- Q("pastel-lavender", "pastel", {
5439
+ $("pastel-lavender", "pastel", {
4540
5440
  primary: "258 60% 76%",
4541
5441
  primaryForeground: "258 45% 28%",
4542
5442
  brandSubtle: "258 60% 96%"
@@ -4545,7 +5445,7 @@ var Mo = "default", $ = [
4545
5445
  primaryForeground: "258 40% 14%",
4546
5446
  brandSubtle: "258 35% 26%"
4547
5447
  }),
4548
- Q("pastel-rose", "pastel", {
5448
+ $("pastel-rose", "pastel", {
4549
5449
  primary: "344 72% 78%",
4550
5450
  primaryForeground: "344 50% 30%",
4551
5451
  brandSubtle: "344 72% 96%"
@@ -4554,7 +5454,7 @@ var Mo = "default", $ = [
4554
5454
  primaryForeground: "344 45% 14%",
4555
5455
  brandSubtle: "344 38% 26%"
4556
5456
  }),
4557
- Q("pastel-peach", "pastel", {
5457
+ $("pastel-peach", "pastel", {
4558
5458
  primary: "24 84% 74%",
4559
5459
  primaryForeground: "20 55% 28%",
4560
5460
  brandSubtle: "26 84% 94%"
@@ -4563,7 +5463,7 @@ var Mo = "default", $ = [
4563
5463
  primaryForeground: "20 50% 14%",
4564
5464
  brandSubtle: "24 45% 24%"
4565
5465
  }),
4566
- Q("pastel-butter", "pastel", {
5466
+ $("pastel-butter", "pastel", {
4567
5467
  primary: "46 80% 70%",
4568
5468
  primaryForeground: "40 55% 24%",
4569
5469
  brandSubtle: "46 84% 92%"
@@ -4572,11 +5472,11 @@ var Mo = "default", $ = [
4572
5472
  primaryForeground: "40 50% 12%",
4573
5473
  brandSubtle: "44 42% 22%"
4574
5474
  })
4575
- ], No = {
5475
+ ], is = {
4576
5476
  warm: "sandstone",
4577
5477
  neutral: "graphite",
4578
5478
  cool: "slate"
4579
- }, Po = (e) => $.find((t) => t.id === e) ?? $.find((t) => t.id === No[e]) ?? $[0], Fo = {
5479
+ }, as = (e) => rs.find((t) => t.id === e) ?? rs.find((t) => t.id === is[e]) ?? rs[0], os = {
4580
5480
  gray: {
4581
5481
  light: "0 0% 96.5%",
4582
5482
  dark: "0 0% 15%"
@@ -4609,17 +5509,17 @@ var Mo = "default", $ = [
4609
5509
  light: "330 58% 97.5%",
4610
5510
  dark: "330 24% 15.5%"
4611
5511
  }
4612
- }, Io = {
4613
- themeId: Mo,
5512
+ }, ss = {
5513
+ themeId: ns,
4614
5514
  interfaceIntensity: 2,
4615
5515
  controlIntensity: 2,
4616
5516
  blurOverlays: !1
4617
5517
  };
4618
- function Lo(e) {
5518
+ function cs(e) {
4619
5519
  let t = { ...e };
4620
- return t.tint !== void 0 && t.interfaceIntensity === void 0 && (t.interfaceIntensity = t.tint), t.accentIntensity !== void 0 && t.controlIntensity === void 0 && (t.controlIntensity = t.accentIntensity), typeof t.themeId == "string" && No[t.themeId] && (t.themeId = No[t.themeId]), delete t.tint, delete t.accentIntensity, delete t.neutral, delete t.tintedSidebar, t;
5520
+ return t.tint !== void 0 && t.interfaceIntensity === void 0 && (t.interfaceIntensity = t.tint), t.accentIntensity !== void 0 && t.controlIntensity === void 0 && (t.controlIntensity = t.accentIntensity), typeof t.themeId == "string" && is[t.themeId] && (t.themeId = is[t.themeId]), delete t.tint, delete t.accentIntensity, delete t.neutral, delete t.tintedSidebar, t;
4621
5521
  }
4622
- function Ro(e, t) {
5522
+ function ls(e, t) {
4623
5523
  if (!t) return e;
4624
5524
  let n = { ...e };
4625
5525
  for (let e of Object.keys(t)) {
@@ -4628,8 +5528,8 @@ function Ro(e, t) {
4628
5528
  }
4629
5529
  return n;
4630
5530
  }
4631
- var zo = (e, t, n) => Math.min(n, Math.max(t, e));
4632
- function Bo(e) {
5531
+ var us = (e, t, n) => Math.min(n, Math.max(t, e));
5532
+ function ds(e) {
4633
5533
  let [t, n, r] = e.replace(/%/g, "").trim().split(/\s+/).map(Number);
4634
5534
  return {
4635
5535
  h: t || 0,
@@ -4637,37 +5537,37 @@ function Bo(e) {
4637
5537
  l: r || 0
4638
5538
  };
4639
5539
  }
4640
- var Vo = (e) => String(Number.isInteger(e) ? e : Math.round(e * 10) / 10), Ho = ({ h: e, s: t, l: n }) => `${Vo((e % 360 + 360) % 360)} ${Vo(zo(t, 0, 100))}% ${Vo(zo(n, 0, 100))}%`, Uo = (e) => Bo(e).h, Wo = [
5540
+ var fs = (e) => String(Number.isInteger(e) ? e : Math.round(e * 10) / 10), ps = ({ h: e, s: t, l: n }) => `${fs((e % 360 + 360) % 360)} ${fs(us(t, 0, 100))}% ${fs(us(n, 0, 100))}%`, ms = (e) => ds(e).h, hs = [
4641
5541
  0,
4642
5542
  .55,
4643
5543
  1,
4644
5544
  1.5
4645
- ], Go = [
5545
+ ], gs = [
4646
5546
  0,
4647
5547
  0,
4648
5548
  0,
4649
5549
  3
4650
- ], Ko = [
5550
+ ], _s = [
4651
5551
  0,
4652
5552
  0,
4653
5553
  0,
4654
5554
  6
4655
- ], qo = [
5555
+ ], vs = [
4656
5556
  0,
4657
5557
  .55,
4658
5558
  1,
4659
5559
  1.7
4660
- ], Jo = [
5560
+ ], ys = [
4661
5561
  0,
4662
5562
  0,
4663
5563
  0,
4664
5564
  6
4665
- ], Yo = [
5565
+ ], bs = [
4666
5566
  0,
4667
5567
  0,
4668
5568
  0,
4669
5569
  11
4670
- ], Xo = {
5570
+ ], xs = {
4671
5571
  background: .35,
4672
5572
  card: .35,
4673
5573
  popover: .32,
@@ -4677,32 +5577,32 @@ var Vo = (e) => String(Number.isInteger(e) ? e : Math.round(e * 10) / 10), Ho =
4677
5577
  border: .85,
4678
5578
  sheet1: 1.2,
4679
5579
  sheet2: 1.3
4680
- }, Zo = Object.keys(Xo), Qo = {
5580
+ }, Ss = Object.keys(xs), Cs = {
4681
5581
  warm: 40,
4682
5582
  cool: 220,
4683
5583
  neutral: 0
4684
5584
  };
4685
- function $o(e, t) {
4686
- let n = Po(e.themeId), r = t === "dark" ? n.dark : n.light, i = { ...r }, a = Uo(r.primary), o = n.neutral ?? "warm", s = Qo[o], c = o === "neutral", l = (t === "dark" ? Ko : Go)[e.interfaceIntensity];
4687
- for (let t of Zo) {
4688
- let n = Bo(r[t]), a = Xo[t], o = c ? 0 : Math.max(n.s * Wo[e.interfaceIntensity], l * a);
4689
- i[t] = Ho({
5585
+ function ws(e, t) {
5586
+ let n = as(e.themeId), r = t === "dark" ? n.dark : n.light, i = { ...r }, a = ms(r.primary), o = n.neutral ?? "warm", s = Cs[o], c = o === "neutral", l = (t === "dark" ? _s : gs)[e.interfaceIntensity];
5587
+ for (let t of Ss) {
5588
+ let n = ds(r[t]), a = xs[t], o = c ? 0 : Math.max(n.s * hs[e.interfaceIntensity], l * a);
5589
+ i[t] = ps({
4690
5590
  h: c ? n.h : s,
4691
5591
  s: o,
4692
5592
  l: n.l
4693
5593
  });
4694
5594
  }
4695
5595
  {
4696
- let n = Bo(r.accent), a = (t === "dark" ? Yo : Jo)[e.controlIntensity], o = c ? 0 : Math.max(n.s * qo[e.controlIntensity], a);
4697
- i.accent = Ho({
5596
+ let n = ds(r.accent), a = (t === "dark" ? bs : ys)[e.controlIntensity], o = c ? 0 : Math.max(n.s * vs[e.controlIntensity], a);
5597
+ i.accent = ps({
4698
5598
  h: c ? n.h : s,
4699
5599
  s: o,
4700
5600
  l: n.l
4701
5601
  });
4702
5602
  }
4703
- e.background && Fo[e.background] && (i.background = Fo[e.background][t]);
5603
+ e.background && os[e.background] && (i.background = os[e.background][t]);
4704
5604
  {
4705
- let n = Wo[e.interfaceIntensity], r = t === "dark" ? {
5605
+ let n = hs[e.interfaceIntensity], r = t === "dark" ? {
4706
5606
  s1: 34,
4707
5607
  l1: 16,
4708
5608
  s2: 40,
@@ -4713,11 +5613,11 @@ function $o(e, t) {
4713
5613
  s2: 50,
4714
5614
  l2: 90.5
4715
5615
  };
4716
- i.sheet1 = Ho({
5616
+ i.sheet1 = ps({
4717
5617
  h: a,
4718
5618
  s: c ? 0 : r.s1 * n,
4719
5619
  l: r.l1
4720
- }), i.sheet2 = Ho({
5620
+ }), i.sheet2 = ps({
4721
5621
  h: a,
4722
5622
  s: c ? 0 : r.s2 * n,
4723
5623
  l: r.l2
@@ -4725,50 +5625,50 @@ function $o(e, t) {
4725
5625
  }
4726
5626
  return i;
4727
5627
  }
4728
- var es = (e) => `--${e.replace(/([A-Z0-9])/g, "-$1").toLowerCase()}`;
4729
- function ts(e, t) {
4730
- let n = $o(e, t), r = {};
4731
- for (let [e, t] of Object.entries(n)) r[es(e)] = t;
5628
+ var Ts = (e) => `--${e.replace(/([A-Z0-9])/g, "-$1").toLowerCase()}`;
5629
+ function Es(e, t) {
5630
+ let n = ws(e, t), r = {};
5631
+ for (let [e, t] of Object.entries(n)) r[Ts(e)] = t;
4732
5632
  return r;
4733
5633
  }
4734
- function ns(e, t, n) {
5634
+ function Ds(e, t, n) {
4735
5635
  let r = n ?? (typeof document > "u" ? null : document.documentElement);
4736
5636
  if (!r) return;
4737
- let i = $o(e, t);
4738
- for (let [e, t] of Object.entries(i)) r.style.setProperty(es(e), t);
5637
+ let i = ws(e, t);
5638
+ for (let [e, t] of Object.entries(i)) r.style.setProperty(Ts(e), t);
4739
5639
  }
4740
5640
  //#endregion
4741
5641
  //#region src/providers/ThemeProvider.tsx
4742
- var rs = "openbook.appearance", is = "openbook.theme";
4743
- function as() {
4744
- if (typeof window > "u") return Io;
5642
+ var Os = "openbook.appearance", ks = "openbook.theme";
5643
+ function As() {
5644
+ if (typeof window > "u") return ss;
4745
5645
  try {
4746
- let e = localStorage.getItem(rs);
5646
+ let e = localStorage.getItem(Os);
4747
5647
  if (e) return {
4748
- ...Io,
4749
- ...Lo(JSON.parse(e))
5648
+ ...ss,
5649
+ ...cs(JSON.parse(e))
4750
5650
  };
4751
5651
  } catch {}
4752
- let e = localStorage.getItem(is);
5652
+ let e = localStorage.getItem(ks);
4753
5653
  return e ? {
4754
- ...Io,
5654
+ ...ss,
4755
5655
  themeId: e
4756
- } : Io;
5656
+ } : ss;
4757
5657
  }
4758
- var os = {
5658
+ var js = {
4759
5659
  mode: "system",
4760
5660
  colorScheme: "light",
4761
5661
  setMode: () => null,
4762
- appearance: Io,
5662
+ appearance: ss,
4763
5663
  setAppearance: () => null,
4764
- themeId: Mo,
5664
+ themeId: ns,
4765
5665
  setThemeId: () => null,
4766
- themes: $
4767
- }, ss = a.createContext(os);
4768
- function cs({ children: e, defaultColorMode: t = "system", storageKey: n = "theme", ...r }) {
4769
- let [i, o] = a.useState(() => typeof window < "u" && localStorage.getItem(n) || t), [s, c] = a.useState("light"), [l, u] = a.useState(as), d = i === "system" ? s : i;
5666
+ themes: rs
5667
+ }, Ms = a.createContext(js);
5668
+ function Ns({ children: e, defaultColorMode: t = "system", storageKey: n = "theme", ...r }) {
5669
+ let [i, o] = a.useState(() => typeof window < "u" && localStorage.getItem(n) || t), [s, c] = a.useState("light"), [l, u] = a.useState(As), d = i === "system" ? s : i;
4770
5670
  a.useEffect(() => {
4771
- ns(l, d);
5671
+ Ds(l, d);
4772
5672
  }, [l, d]), a.useEffect(() => {
4773
5673
  typeof document > "u" || document.documentElement.style.setProperty("--overlay-blur", l.blurOverlays ? "8px" : "0px");
4774
5674
  }, [l.blurOverlays]), a.useEffect(() => {
@@ -4789,7 +5689,7 @@ function cs({ children: e, defaultColorMode: t = "system", storageKey: n = "them
4789
5689
  ...e
4790
5690
  };
4791
5691
  try {
4792
- localStorage.setItem(rs, JSON.stringify(n));
5692
+ localStorage.setItem(Os, JSON.stringify(n));
4793
5693
  } catch {}
4794
5694
  return n;
4795
5695
  });
@@ -4803,27 +5703,27 @@ function cs({ children: e, defaultColorMode: t = "system", storageKey: n = "them
4803
5703
  setAppearance: f,
4804
5704
  themeId: l.themeId,
4805
5705
  setThemeId: (e) => f({ themeId: e }),
4806
- themes: $
5706
+ themes: rs
4807
5707
  };
4808
- return /* @__PURE__ */ p(ss.Provider, {
5708
+ return /* @__PURE__ */ p(Ms.Provider, {
4809
5709
  ...r,
4810
5710
  value: m,
4811
5711
  children: e
4812
5712
  });
4813
5713
  }
4814
- var ls = () => {
4815
- let e = a.useContext(ss);
5714
+ var Ps = () => {
5715
+ let e = a.useContext(Ms);
4816
5716
  if (e === void 0) throw Error("useTheme must be used within a ThemeProvider");
4817
5717
  return e;
4818
- }, us = "lucide:", ds = (e) => !!e && e.startsWith("lucide:"), fs = (e) => !e || ds(e) ? "" : e, ps = {
5718
+ }, Fs = "lucide:", Is = (e) => !!e && e.startsWith("lucide:"), Ls = (e) => !e || Is(e) ? "" : e, Rs = {
4819
5719
  Star: kn,
4820
5720
  Heart: mt,
4821
- Bookmark: se,
5721
+ Bookmark: U,
4822
5722
  Flag: Xe,
4823
5723
  Pin: rn,
4824
5724
  Tag: Pn,
4825
5725
  Crown: Ie,
4826
- Award: N,
5726
+ Award: I,
4827
5727
  Trophy: Gn,
4828
5728
  Gem: it,
4829
5729
  Diamond: Re,
@@ -4840,21 +5740,21 @@ var ls = () => {
4840
5740
  Infinity: yt,
4841
5741
  FileText: qe,
4842
5742
  Folder: et,
4843
- Book: z,
4844
- BookOpen: oe,
5743
+ Book: ce,
5744
+ BookOpen: H,
4845
5745
  Library: Ot,
4846
5746
  Newspaper: Kt,
4847
5747
  Clipboard: Ee,
4848
5748
  List: jt,
4849
- Archive: M,
5749
+ Archive: F,
4850
5750
  Inbox: vt,
4851
- Briefcase: ue,
5751
+ Briefcase: le,
4852
5752
  Calendar: ge,
4853
5753
  Clock: De,
4854
- AlarmClock: O,
5754
+ AlarmClock: M,
4855
5755
  Timer: Bn,
4856
5756
  Paperclip: Xt,
4857
- BarChart3: re,
5757
+ BarChart3: ae,
4858
5758
  PieChart: tn,
4859
5759
  TrendingUp: Wn,
4860
5760
  Table: Nn,
@@ -4874,9 +5774,9 @@ var ls = () => {
4874
5774
  Code2: ke,
4875
5775
  Terminal: Ln,
4876
5776
  Cpu: Pe,
4877
- Binary: ie,
5777
+ Binary: se,
4878
5778
  GitBranch: ot,
4879
- Bug: fe,
5779
+ Bug: de,
4880
5780
  Cog: je,
4881
5781
  Settings: yn,
4882
5782
  Wrench: ar,
@@ -4894,7 +5794,7 @@ var ls = () => {
4894
5794
  MessageCircle: Lt,
4895
5795
  MessageSquare: Rt,
4896
5796
  Send: vn,
4897
- Bell: L,
5797
+ Bell: B,
4898
5798
  Megaphone: It,
4899
5799
  Phone: en,
4900
5800
  Share2: bn,
@@ -4914,15 +5814,15 @@ var ls = () => {
4914
5814
  Play: on,
4915
5815
  Gamepad2: nt,
4916
5816
  Palette: Jt,
4917
- Brush: de,
5817
+ Brush: ue,
4918
5818
  PenTool: Qt,
4919
5819
  Pencil: $t,
4920
- Aperture: j,
5820
+ Aperture: ie,
4921
5821
  User: Yn,
4922
5822
  Users: Xn,
4923
5823
  Hand: dt,
4924
5824
  Eye: Ge,
4925
- Brain: le,
5825
+ Brain: G,
4926
5826
  Footprints: tt,
4927
5827
  GraduationCap: ct,
4928
5828
  Dumbbell: Ue,
@@ -4941,7 +5841,7 @@ var ls = () => {
4941
5841
  Wind: ir,
4942
5842
  Umbrella: Jn,
4943
5843
  Feather: Ke,
4944
- Bird: ae,
5844
+ Bird: V,
4945
5845
  Dog: ze,
4946
5846
  Rabbit: un,
4947
5847
  Coffee: Ae,
@@ -4951,10 +5851,10 @@ var ls = () => {
4951
5851
  Carrot: ye,
4952
5852
  Cherry: Ce,
4953
5853
  Egg: We,
4954
- Beaker: I,
5854
+ Beaker: z,
4955
5855
  FlaskConical: Qe,
4956
5856
  Home: gt,
4957
- Building2: B,
5857
+ Building2: fe,
4958
5858
  Tent: In,
4959
5859
  MapPin: Ft,
4960
5860
  Map: Pt,
@@ -4964,14 +5864,14 @@ var ls = () => {
4964
5864
  Plane: an,
4965
5865
  Car: ve,
4966
5866
  Bus: pe,
4967
- Bike: R,
5867
+ Bike: oe,
4968
5868
  Truck: Kn,
4969
- Anchor: A,
4970
- Backpack: P,
5869
+ Anchor: P,
5870
+ Backpack: L,
4971
5871
  Ticket: zn,
4972
5872
  Lamp: Ct,
4973
5873
  Lightbulb: kt,
4974
- Box: ce,
5874
+ Box: W,
4975
5875
  Package: qt,
4976
5876
  Puzzle: ln,
4977
5877
  Ruler: pn,
@@ -4979,9 +5879,9 @@ var ls = () => {
4979
5879
  Sword: Mn,
4980
5880
  Sticker: An,
4981
5881
  Watch: tr,
4982
- Battery: F,
5882
+ Battery: R,
4983
5883
  Wand2: er,
4984
- Activity: D,
5884
+ Activity: j,
4985
5885
  Search: _n,
4986
5886
  Filter: Ye,
4987
5887
  Plus: cn,
@@ -4990,14 +5890,14 @@ var ls = () => {
4990
5890
  Trash2: Hn,
4991
5891
  Info: bt,
4992
5892
  HelpCircle: ht,
4993
- AlertTriangle: k,
5893
+ AlertTriangle: N,
4994
5894
  ToggleLeft: Vn,
4995
5895
  PanelLeft: Yt,
4996
5896
  Layout: Et,
4997
5897
  Circle: we
4998
- }, ms = Object.keys(ps);
4999
- function hs(e) {
5000
- return ps[e.startsWith("lucide:") ? e.slice(7) : e] ?? null;
5898
+ }, zs = Object.keys(Rs);
5899
+ function Bs(e) {
5900
+ return Rs[e.startsWith("lucide:") ? e.slice(7) : e] ?? null;
5001
5901
  }
5002
5902
  //#endregion
5003
- export { li as $, oa as A, lr as At, Ji as B, Ea as C, Er as Ct, Da as D, dr as Dt, wa as E, H as Et, pa as F, Bi as G, zi as H, da as I, Li as J, Vi as K, fa as L, ia as M, V as Mt, ra as N, ca as O, mr as Ot, sa as P, vi as Q, ea as R, Ca as S, wr as St, Ta as T, yr as Tt, Wi as U, qi as V, Ui as W, _i as X, Mi as Y, yi as Z, Fa as _, Ar as _t, ds as a, ni as at, Ia as b, jr as bt, ls as c, qr as ct, Po as d, Jr as dt, ui as et, Ro as f, Kr as ft, Co as g, kr as gt, ko as h, Wr as ht, us as i, ti as it, la as j, cr as jt, aa as k, hr as kt, Fo as l, Zr as lt, $ as m, Xr as mt, ms as n, si as nt, fs as o, $r as ot, Lo as p, Gr as pt, Ii as q, hs as r, ci as rt, cs as s, Ur as st, ps as t, fi as tt, ts as u, Yr as ut, Pa as v, Vr as vt, xa as w, Tr as wt, Sa as x, Hr as xt, Ra as y, Mr as yt, na as z };
5903
+ export { Wi as $, ka as A, lr as At, _a as B, Ya as C, Dr as Ct, Xa as D, dr as Dt, qa as E, q as Et, Ia as F, ca as G, fa as H, Pa as I, Qi as J, sa as K, Fa as L, Da as M, K as Mt, Ea as N, ja as O, mr as Ot, Aa as P, zi as Q, Ca as R, Ka as S, Tr as St, Ja as T, yr as Tt, pa as U, ga as V, oa as W, Yi as X, ea as Y, Xi as Z, io as _, pi as _t, Is as a, Ti as at, ao as b, mi as bt, Ps as c, Ci as ct, as as d, vi as dt, Ui as et, ls as f, _i as ft, qo as g, Jr as gt, $o as h, qr as ht, Fs as i, Oi as it, Ma as j, cr as jt, Oa as k, hr as kt, os as l, xi as lt, rs as m, gi as mt, zs as n, Vi as nt, Ls as o, hi as ot, cs as p, Si as pt, Zi as q, Bs as r, Di as rt, Ns as s, yi as st, Rs as t, Bi as tt, Es as u, bi as ut, ro as v, Xr as vt, Wa as w, Er as wt, Ga as x, Y as xt, so as y, Yr as yt, Ta as z };