@arbidocs/blocks 0.4.129 → 0.4.130

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 (173) hide show
  1. package/README.md +4 -3
  2. package/dist/agents/index.cjs +216 -216
  3. package/dist/agents/index.js +5 -5
  4. package/dist/calendar/CalendarPrint.d.ts +25 -0
  5. package/dist/calendar/booking-slots.d.ts +21 -0
  6. package/dist/calendar/index.cjs +381 -97
  7. package/dist/calendar/index.cjs.map +1 -1
  8. package/dist/calendar/index.d.ts +4 -0
  9. package/dist/calendar/index.js +277 -3
  10. package/dist/calendar/index.js.map +1 -1
  11. package/dist/calendar/print-layout.d.ts +16 -0
  12. package/dist/calendar/printCalendar.d.ts +6 -0
  13. package/dist/calls/composite-canvas.d.ts +52 -0
  14. package/dist/calls/index.cjs +376 -3
  15. package/dist/calls/index.cjs.map +1 -1
  16. package/dist/calls/index.d.ts +3 -0
  17. package/dist/calls/index.js +360 -5
  18. package/dist/calls/index.js.map +1 -1
  19. package/dist/calls/ringtone.d.ts +16 -0
  20. package/dist/calls/voice-levels.d.ts +32 -0
  21. package/dist/chat/ThreadVisualizer.d.ts +28 -0
  22. package/dist/chat/index.cjs +93 -77
  23. package/dist/chat/index.d.ts +2 -0
  24. package/dist/chat/index.js +2 -2
  25. package/dist/chat/open-document.d.ts +5 -1
  26. package/dist/chat/thread-diagram.d.ts +26 -0
  27. package/dist/{chunk-DQCYCEDR.js → chunk-2Q7FDZAY.js} +3 -3
  28. package/dist/{chunk-DQCYCEDR.js.map → chunk-2Q7FDZAY.js.map} +1 -1
  29. package/dist/{chunk-S7PSMMRG.js → chunk-444XKG46.js} +3 -3
  30. package/dist/{chunk-S7PSMMRG.js.map → chunk-444XKG46.js.map} +1 -1
  31. package/dist/{chunk-7423V6RM.cjs → chunk-4QIIDXLF.cjs} +8 -8
  32. package/dist/{chunk-7423V6RM.cjs.map → chunk-4QIIDXLF.cjs.map} +1 -1
  33. package/dist/{chunk-OYMWV45N.js → chunk-4RLCRFZS.js} +63 -13
  34. package/dist/chunk-4RLCRFZS.js.map +1 -0
  35. package/dist/{chunk-DZYAAL4H.cjs → chunk-4S5IDT5F.cjs} +231 -2
  36. package/dist/chunk-4S5IDT5F.cjs.map +1 -0
  37. package/dist/{chunk-CJBN5HIS.js → chunk-4UMXQPNA.js} +20 -8
  38. package/dist/chunk-4UMXQPNA.js.map +1 -0
  39. package/dist/{chunk-IBZJYCYM.js → chunk-66TA5IBN.js} +17 -25
  40. package/dist/chunk-66TA5IBN.js.map +1 -0
  41. package/dist/{chunk-OR4CO743.cjs → chunk-AAFX64WD.cjs} +3 -3
  42. package/dist/{chunk-OR4CO743.cjs.map → chunk-AAFX64WD.cjs.map} +1 -1
  43. package/dist/{chunk-MUMH3Z6K.cjs → chunk-ARDHLU73.cjs} +61 -11
  44. package/dist/chunk-ARDHLU73.cjs.map +1 -0
  45. package/dist/{chunk-TGWTLNXW.cjs → chunk-BIXHB4LV.cjs} +3 -2
  46. package/dist/{chunk-TGWTLNXW.cjs.map → chunk-BIXHB4LV.cjs.map} +1 -1
  47. package/dist/chunk-C4WSHRR6.cjs +166 -0
  48. package/dist/chunk-C4WSHRR6.cjs.map +1 -0
  49. package/dist/{chunk-ZAVEMQ37.cjs → chunk-DWZXSPMB.cjs} +3 -3
  50. package/dist/{chunk-ZAVEMQ37.cjs.map → chunk-DWZXSPMB.cjs.map} +1 -1
  51. package/dist/{chunk-5HFPRI3W.js → chunk-FUTMU4FR.js} +3 -3
  52. package/dist/{chunk-5HFPRI3W.js.map → chunk-FUTMU4FR.js.map} +1 -1
  53. package/dist/{chunk-5Y7JRY7Y.js → chunk-GDBDHOI4.js} +3 -3
  54. package/dist/{chunk-5Y7JRY7Y.js.map → chunk-GDBDHOI4.js.map} +1 -1
  55. package/dist/{chunk-TGJNPKST.js → chunk-GTCC2VAR.js} +3 -3
  56. package/dist/{chunk-TGJNPKST.js.map → chunk-GTCC2VAR.js.map} +1 -1
  57. package/dist/{chunk-3BJLNKOB.cjs → chunk-GZPTWHP5.cjs} +22 -10
  58. package/dist/chunk-GZPTWHP5.cjs.map +1 -0
  59. package/dist/{chunk-OUW6G4O2.cjs → chunk-HFGXA5CL.cjs} +4 -4
  60. package/dist/{chunk-OUW6G4O2.cjs.map → chunk-HFGXA5CL.cjs.map} +1 -1
  61. package/dist/{chunk-SWQX6CTT.cjs → chunk-JKB7WT7L.cjs} +2 -2
  62. package/dist/chunk-JKB7WT7L.cjs.map +1 -0
  63. package/dist/{chunk-S6BOINC4.cjs → chunk-OGBXV326.cjs} +7 -7
  64. package/dist/{chunk-S6BOINC4.cjs.map → chunk-OGBXV326.cjs.map} +1 -1
  65. package/dist/{chunk-DJM7DLCT.cjs → chunk-OPTBQSCV.cjs} +3 -3
  66. package/dist/{chunk-DJM7DLCT.cjs.map → chunk-OPTBQSCV.cjs.map} +1 -1
  67. package/dist/{chunk-GFYGYME3.js → chunk-OQ7RUNOC.js} +3 -3
  68. package/dist/{chunk-GFYGYME3.js.map → chunk-OQ7RUNOC.js.map} +1 -1
  69. package/dist/{chunk-NYHGG2IA.cjs → chunk-QDEODGXE.cjs} +5 -5
  70. package/dist/{chunk-NYHGG2IA.cjs.map → chunk-QDEODGXE.cjs.map} +1 -1
  71. package/dist/{chunk-6BTCDKCK.js → chunk-QYTYW74G.js} +4 -4
  72. package/dist/{chunk-6BTCDKCK.js.map → chunk-QYTYW74G.js.map} +1 -1
  73. package/dist/{chunk-A7NCSZAP.cjs → chunk-QZTNTP75.cjs} +17 -25
  74. package/dist/chunk-QZTNTP75.cjs.map +1 -0
  75. package/dist/{chunk-OB5F4577.cjs → chunk-R26BK7YL.cjs} +4 -4
  76. package/dist/{chunk-OB5F4577.cjs.map → chunk-R26BK7YL.cjs.map} +1 -1
  77. package/dist/{chunk-A2YAC22G.js → chunk-RI6DZA5X.js} +3 -3
  78. package/dist/{chunk-A2YAC22G.js.map → chunk-RI6DZA5X.js.map} +1 -1
  79. package/dist/{chunk-H2KQ6OSU.js → chunk-SZX44LCT.js} +230 -5
  80. package/dist/chunk-SZX44LCT.js.map +1 -0
  81. package/dist/{chunk-7QDX2CO4.cjs → chunk-TP6PLDNM.cjs} +4 -4
  82. package/dist/{chunk-7QDX2CO4.cjs.map → chunk-TP6PLDNM.cjs.map} +1 -1
  83. package/dist/{chunk-JLTXVW25.cjs → chunk-TT6XV6WM.cjs} +17 -17
  84. package/dist/{chunk-JLTXVW25.cjs.map → chunk-TT6XV6WM.cjs.map} +1 -1
  85. package/dist/{chunk-HSFLEVZY.js → chunk-UMIY4SQS.js} +6 -6
  86. package/dist/{chunk-HSFLEVZY.js.map → chunk-UMIY4SQS.js.map} +1 -1
  87. package/dist/{chunk-ECERC6TI.js → chunk-VHJHY7TT.js} +3 -3
  88. package/dist/{chunk-ECERC6TI.js.map → chunk-VHJHY7TT.js.map} +1 -1
  89. package/dist/{chunk-D3N67Q4D.js → chunk-W3VYZXNS.js} +3 -3
  90. package/dist/{chunk-D3N67Q4D.js.map → chunk-W3VYZXNS.js.map} +1 -1
  91. package/dist/{chunk-JK45LSIH.cjs → chunk-WXYQ66KC.cjs} +5 -5
  92. package/dist/{chunk-JK45LSIH.cjs.map → chunk-WXYQ66KC.cjs.map} +1 -1
  93. package/dist/{chunk-ZCF2JJFA.js → chunk-Y3KA6X7B.js} +3 -3
  94. package/dist/{chunk-ZCF2JJFA.js.map → chunk-Y3KA6X7B.js.map} +1 -1
  95. package/dist/{chunk-GYCQ3FNL.js → chunk-YBLIKTJK.js} +2 -2
  96. package/dist/chunk-YBLIKTJK.js.map +1 -0
  97. package/dist/chunk-YNIBUKV5.js +163 -0
  98. package/dist/chunk-YNIBUKV5.js.map +1 -0
  99. package/dist/citations/index.cjs +12 -11
  100. package/dist/citations/index.js +3 -2
  101. package/dist/collaboration/index.cjs +42 -42
  102. package/dist/collaboration/index.js +2 -2
  103. package/dist/connect/docx.cjs +7 -5
  104. package/dist/connect/docx.cjs.map +1 -1
  105. package/dist/connect/docx.js +6 -4
  106. package/dist/connect/docx.js.map +1 -1
  107. package/dist/connect/index.cjs +237 -194
  108. package/dist/connect/index.cjs.map +1 -1
  109. package/dist/connect/index.d.ts +1 -1
  110. package/dist/connect/index.js +190 -147
  111. package/dist/connect/index.js.map +1 -1
  112. package/dist/connection/ConnectedSettings.d.ts +46 -20
  113. package/dist/connection/ConnectionProvider.d.ts +5 -0
  114. package/dist/connection/mail/ConnectedMailComposer.d.ts +2 -3
  115. package/dist/connection/mail/ConnectedMailbox.d.ts +2 -3
  116. package/dist/connection/mail/MailComposerForm.d.ts +2 -3
  117. package/dist/connection/mail/index.d.ts +2 -2
  118. package/dist/connection/mail/mailbox.d.ts +1 -4
  119. package/dist/connection/mail/types.d.ts +0 -8
  120. package/dist/facts/fact-citations.d.ts +56 -0
  121. package/dist/facts/fact-table-column-resize.d.ts +18 -0
  122. package/dist/facts/index.cjs +197 -10
  123. package/dist/facts/index.cjs.map +1 -1
  124. package/dist/facts/index.d.ts +2 -0
  125. package/dist/facts/index.js +182 -6
  126. package/dist/facts/index.js.map +1 -1
  127. package/dist/files/index.cjs +4 -4
  128. package/dist/files/index.js +3 -3
  129. package/dist/home/index.cjs +20 -19
  130. package/dist/home/index.cjs.map +1 -1
  131. package/dist/home/index.js +5 -4
  132. package/dist/home/index.js.map +1 -1
  133. package/dist/index.cjs +485 -469
  134. package/dist/index.d.ts +2 -1
  135. package/dist/index.js +13 -13
  136. package/dist/provider/BlocksProvider.d.ts +39 -4
  137. package/dist/provider/dialogs.d.ts +31 -0
  138. package/dist/retrieval/index.cjs +5 -4
  139. package/dist/retrieval/index.js +3 -2
  140. package/dist/settings/MoreInfo.d.ts +25 -0
  141. package/dist/settings/PlanCard.d.ts +1 -1
  142. package/dist/settings/index.cjs +106 -252
  143. package/dist/settings/index.cjs.map +1 -1
  144. package/dist/settings/index.d.ts +1 -1
  145. package/dist/settings/index.js +71 -216
  146. package/dist/settings/index.js.map +1 -1
  147. package/dist/shell/index.cjs +48 -47
  148. package/dist/shell/index.js +4 -3
  149. package/dist/studio/index.cjs +15 -14
  150. package/dist/studio/index.cjs.map +1 -1
  151. package/dist/studio/index.js +7 -6
  152. package/dist/studio/index.js.map +1 -1
  153. package/dist/workflow-canvas/index.cjs +14 -14
  154. package/dist/workflow-canvas/index.js +6 -6
  155. package/dist/workspaces/index.cjs +3 -3
  156. package/dist/workspaces/index.js +2 -2
  157. package/node_modules/@arbidocs/coedit/package.json +1 -1
  158. package/package.json +9 -4
  159. package/dist/chunk-3BJLNKOB.cjs.map +0 -1
  160. package/dist/chunk-76JDDMSP.js +0 -31
  161. package/dist/chunk-76JDDMSP.js.map +0 -1
  162. package/dist/chunk-A7NCSZAP.cjs.map +0 -1
  163. package/dist/chunk-C54XEN5T.cjs +0 -34
  164. package/dist/chunk-C54XEN5T.cjs.map +0 -1
  165. package/dist/chunk-CJBN5HIS.js.map +0 -1
  166. package/dist/chunk-DZYAAL4H.cjs.map +0 -1
  167. package/dist/chunk-GYCQ3FNL.js.map +0 -1
  168. package/dist/chunk-H2KQ6OSU.js.map +0 -1
  169. package/dist/chunk-IBZJYCYM.js.map +0 -1
  170. package/dist/chunk-MUMH3Z6K.cjs.map +0 -1
  171. package/dist/chunk-OYMWV45N.js.map +0 -1
  172. package/dist/chunk-SWQX6CTT.cjs.map +0 -1
  173. package/dist/settings/FirmPool.d.ts +0 -82
@@ -49,20 +49,23 @@ function userFromProfile(profile, externalId) {
49
49
  function ConnectionProvider({
50
50
  config,
51
51
  children
52
+ }) {
53
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.ArbiSessionStateProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(SessionConnectionProvider, { config, children }) });
54
+ }
55
+ function SessionConnectionProvider({
56
+ config,
57
+ children
52
58
  }) {
53
59
  const arbi = react$1.useArbi();
60
+ const session = react$1.useArbiSessionStore();
54
61
  const isLiveConfigured = config.apiUrl.length > 0;
55
62
  const demoWorkspaceId = config.demoWorkspaceId ?? "demo-workspace";
56
63
  const [status, setStatus] = react.useState(
57
64
  isLiveConfigured ? "connecting" : "disconnected"
58
65
  );
59
66
  const [user, setUser] = react.useState(null);
60
- const [workspaceId, setWorkspaceIdState] = react.useState(null);
61
- const workspaceIdRef = react.useRef(null);
62
- const selectWorkspaceId = react.useCallback((id) => {
63
- workspaceIdRef.current = id;
64
- setWorkspaceIdState(id);
65
- }, []);
67
+ const workspaceId = react$1.useArbiSessionState((s) => s.workspaceId);
68
+ const selectWorkspaceId = session.setWorkspaceId;
66
69
  const [mode, setMode] = react.useState("demo");
67
70
  const [error, setError] = react.useState(null);
68
71
  const storageUserRef = react.useRef(null);
@@ -186,9 +189,9 @@ function ConnectionProvider({
186
189
  );
187
190
  const ensureWorkspaceOpen = react.useCallback(async () => {
188
191
  if (mode !== "live" || !arbi.isLoggedIn) return;
189
- const id = workspaceIdRef.current ?? readPersistedWorkspace(config.apiUrl, storageUserRef.current) ?? config.workspaceId;
192
+ const id = session.getState().workspaceId ?? readPersistedWorkspace(config.apiUrl, storageUserRef.current) ?? config.workspaceId;
190
193
  if (id) await arbi.selectWorkspace(id);
191
- }, [arbi, mode, config.apiUrl, config.workspaceId]);
194
+ }, [arbi, session, mode, config.apiUrl, config.workspaceId]);
192
195
  const value = react.useMemo(
193
196
  () => ({
194
197
  mode,
@@ -225,7 +228,54 @@ function ConnectionProvider({
225
228
  ensureWorkspaceOpen
226
229
  ]
227
230
  );
228
- return /* @__PURE__ */ jsxRuntime.jsx(ConnectionContext.Provider, { value, children });
231
+ const account = useConnectionAccount(arbi, user, logout);
232
+ return /* @__PURE__ */ jsxRuntime.jsx(ConnectionContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.AccountClientProvider, { client: account, enabled: status === "authenticated", children }) });
233
+ }
234
+ function useConnectionAccount(arbi, user, logout) {
235
+ const userRef = react.useRef(user);
236
+ const logoutRef = react.useRef(logout);
237
+ logoutRef.current = logout;
238
+ const listeners = react.useRef(/* @__PURE__ */ new Set());
239
+ react.useEffect(() => {
240
+ userRef.current = user;
241
+ listeners.current.forEach((listener) => listener());
242
+ }, [user]);
243
+ return react.useMemo(() => {
244
+ const base = react$1.arbiAccountClient(arbi);
245
+ return {
246
+ ...base,
247
+ profile: () => {
248
+ const own = base.profile();
249
+ const fallback = userRef.current;
250
+ if (own || !fallback) return own;
251
+ return {
252
+ ...react$1.toProfileView({
253
+ givenName: "",
254
+ familyName: null,
255
+ picture: fallback.picture ?? null,
256
+ email: fallback.email,
257
+ isSso: false
258
+ }),
259
+ fullName: fallback.name
260
+ };
261
+ },
262
+ onProfileChange: (listener) => {
263
+ listeners.current.add(listener);
264
+ const off = base.onProfileChange(listener);
265
+ return () => {
266
+ listeners.current.delete(listener);
267
+ off();
268
+ };
269
+ },
270
+ signOut: async ({ everywhere } = {}) => {
271
+ try {
272
+ if (everywhere) await arbi.sessions.logoutAll();
273
+ } finally {
274
+ logoutRef.current();
275
+ }
276
+ }
277
+ };
278
+ }, [arbi]);
229
279
  }
230
280
  function useConnection() {
231
281
  const ctx = react.useContext(ConnectionContext);
@@ -238,5 +288,5 @@ exports.ConnectionProvider = ConnectionProvider;
238
288
  exports.SESSION_EXPIRED_MESSAGE = SESSION_EXPIRED_MESSAGE;
239
289
  exports.isAuthenticated = isAuthenticated;
240
290
  exports.useConnection = useConnection;
241
- //# sourceMappingURL=chunk-MUMH3Z6K.cjs.map
242
- //# sourceMappingURL=chunk-MUMH3Z6K.cjs.map
291
+ //# sourceMappingURL=chunk-ARDHLU73.cjs.map
292
+ //# sourceMappingURL=chunk-ARDHLU73.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connection/ConnectionProvider.tsx"],"names":["createContext","ArbiSessionStateProvider","jsx","useArbi","useArbiSessionStore","useState","useArbiSessionState","useRef","useEffect","useCallback","useMemo","AccountClientProvider","arbiAccountClient","toProfileView","useContext"],"mappings":"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","file":"chunk-ARDHLU73.cjs","sourcesContent":["/**\n * The demo/live connection layer for a host app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo workspace. Host-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link ArbiConnectionConfig}.\n */\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport {\n AccountClientProvider,\n ArbiSessionStateProvider,\n arbiAccountClient,\n toProfileView,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n type AccountClient,\n type LoginProfile,\n type ProfileView,\n} from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, ArbiConnectionConfig } from './types'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n /** The selected workspace: the session state's (`useArbiSessionState`), set by `setWorkspace`. */\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n /**\n * The deployment domain the user's keys are derived for (`arbi.getDeploymentDomain()`), for the\n * document tools' e-signing. `undefined` in demo mode.\n */\n deploymentDomain: string | undefined\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /** Fallback workspace ext_id when none is actively selected. */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo workspace. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend AND per signed-in user, so a returning\n * user lands back in the workspace they last chose, while the next person on a shared browser\n * never starts from someone else's workspace id. Namespaced by apiUrl so distinct deployments\n * (and the demo workspace) don't clobber each other. Cleared on logout.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst sessionUserKey = (apiUrl: string) => `arbi:sessionUser:${apiUrl}`\nfunction rememberSessionUser(apiUrl: string, email: string | null) {\n try {\n if (email) window.localStorage.setItem(sessionUserKey(apiUrl), normalizeUserKey(email))\n else window.localStorage.removeItem(sessionUserKey(apiUrl))\n } catch {\n /* Storage may be unavailable. */\n }\n}\nconst normalizeUserKey = (email: string) => email.trim().toLowerCase()\n\n/** Exported for tests. */\nexport const workspaceStorageKey = (apiUrl: string, userKey: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}:${normalizeUserKey(userKey)}`\n\n/** The pre-isolation key (apiUrl only). Never read: removed so it cannot leak across users. */\nconst legacyWorkspaceStorageKey = (apiUrl: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string, userKey: string | null): string | null {\n if (!userKey) return null\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl, userKey))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, userKey: string | null, id: string | null): void {\n if (!userKey) return\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl, userKey), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl, userKey))\n window.localStorage.removeItem(legacyWorkspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\n\n/** Shown on the sign-in screen after the session could not be recovered. */\nexport const SESSION_EXPIRED_MESSAGE = 'Your session expired. Sign in again.'\n\n/** The connection user for a profile: its full name, falling back to the email local part. */\nfunction userFromProfile(profile: LoginProfile, externalId?: string): ArbiUser {\n const fullName = [profile.givenName, profile.familyName]\n .map((part) => part?.trim())\n .filter(Boolean)\n .join(' ')\n return {\n name: fullName || profile.email.split('@')[0],\n email: profile.email,\n externalId,\n picture: profile.picture,\n }\n}\n\n/**\n * The connection, over the session state of the host (an `ArbiSessionStateProvider` above), else\n * its own: the selected workspace lives there, so every block reads one value.\n */\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n return (\n <ArbiSessionStateProvider>\n <SessionConnectionProvider config={config}>{children}</SessionConnectionProvider>\n </ArbiSessionStateProvider>\n )\n}\n\nfunction SessionConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-workspace'\n\n const [status, setStatus] = useState<ConnectionStatus>(\n isLiveConfigured ? 'connecting' : 'disconnected'\n )\n const [user, setUser] = useState<ArbiUser | null>(null)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const selectWorkspaceId = session.setWorkspaceId\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n // Who the persisted workspace belongs to; set at sign-in, cleared at logout.\n const storageUserRef = useRef<string | null>(null)\n\n // The SDK could not recover the session (token refused, workspace not re-openable): drop to\n // 'disconnected' with a plain message, so the host's gate sends the user to sign in instead of\n // every call failing with a raw backend error. The remembered workspace is kept for next login.\n useEffect(\n () =>\n arbi.onSessionExpired?.(() => {\n rememberSessionUser(config.apiUrl, null)\n storageUserRef.current = null\n setUser(null)\n selectWorkspaceId(null)\n setStatus('disconnected')\n setError(SESSION_EXPIRED_MESSAGE)\n }),\n [arbi, config.apiUrl, selectWorkspaceId]\n )\n\n // A saved name, picture or email reaches every surface reading `useConnection().user`.\n useEffect(\n () =>\n arbi.user.onProfileChange?.((profile) =>\n setUser((current) => (current ? userFromProfile(profile, current.externalId) : current))\n ),\n [arbi]\n )\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n selectWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId, selectWorkspaceId])\n\n const login = useCallback(\n async (email: string, password: string, restoring = false) => {\n setError(null)\n // No backend configured → run the seeded demo workspace.\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n if (restoring) {\n if (!(await arbi.restoreSession(email))) {\n rememberSessionUser(config.apiUrl, null)\n setStatus('disconnected')\n return\n }\n } else await arbi.login(email, password)\n storageUserRef.current = normalizeUserKey(email)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the workspace the user last affirmatively selected (persisted),\n // then the configured workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl, storageUserRef.current)\n const preferred = persisted ?? config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n await arbi.selectWorkspace(target.external_id)\n selectWorkspaceId(target.external_id)\n persistWorkspace(config.apiUrl, storageUserRef.current, target.external_id)\n }\n // The profile (name + avatar) comes with the login response. A session restored without\n // a login has none, so fall back to finding ourselves in the workspace roster; the email\n // local part is only the last resort, never the answer when a profile name exists.\n let resolved: ArbiUser = { name: email.split('@')[0], email }\n const me = arbi.user.identity()\n const profile = arbi.user.profile?.()\n if (profile) {\n resolved = userFromProfile(profile, me?.externalId)\n } else {\n try {\n const members = await arbi.workspaces.listUsers()\n const self = members.find((m) => m.user.external_id === me?.externalId)?.user\n if (self) {\n const fullName = [self.given_name, self.family_name].filter(Boolean).join(' ').trim()\n resolved = {\n name: fullName || email.split('@')[0],\n email: self.email || email,\n externalId: self.external_id,\n picture: self.picture ?? null,\n }\n } else if (me?.externalId) {\n resolved.externalId = me.externalId\n }\n } catch {\n // Roster not available (e.g. no workspace) — keep the fallback identity.\n }\n }\n setUser(resolved)\n rememberSessionUser(config.apiUrl, email)\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured, config.workspaceId, config.apiUrl, selectWorkspaceId]\n )\n\n // Run once even under StrictMode; passwords and signing keys are never stored here.\n const recoveryStarted = useRef(false)\n useEffect(() => {\n if (recoveryStarted.current || !isLiveConfigured) return\n recoveryStarted.current = true\n let email: string | null = null\n try {\n email = window.localStorage.getItem(sessionUserKey(config.apiUrl))\n } catch {\n /* unavailable */\n }\n if (email) void login(email, '', true)\n else setStatus('disconnected')\n }, [isLiveConfigured, config.apiUrl, login])\n\n const logout = useCallback(() => {\n rememberSessionUser(config.apiUrl, null)\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n selectWorkspaceId(null)\n persistWorkspace(config.apiUrl, storageUserRef.current, null)\n storageUserRef.current = null\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl, selectWorkspaceId])\n\n // Affirmative selection: open the workspace on the server (live), then remember\n // it in state + storage so every surface — and the next login — is in sync.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n await arbi.selectWorkspace(id)\n }\n selectWorkspaceId(id)\n persistWorkspace(config.apiUrl, storageUserRef.current, id)\n },\n [arbi, mode, config.apiUrl, selectWorkspaceId]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped\n // it. Idempotent: re-running `/open` for the already-selected workspace is safe.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n // The selected workspace as of now, not as of the last render: a flow that switches workspace\n // and then re-opens it in the same async chain (a step that creates a matter, then starts its\n // thread) must not re-open the one it just left.\n const id =\n session.getState().workspaceId ??\n readPersistedWorkspace(config.apiUrl, storageUserRef.current) ??\n config.workspaceId\n if (id) await arbi.selectWorkspace(id)\n }, [arbi, session, mode, config.apiUrl, config.workspaceId])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n deploymentDomain: isLiveConfigured ? arbi.getDeploymentDomain() : undefined,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n arbi,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n ]\n )\n\n const account = useConnectionAccount(arbi, user, logout)\n\n return (\n <ConnectionContext.Provider value={value}>\n <AccountClientProvider client={account} enabled={status === 'authenticated'}>\n {children}\n </AccountClientProvider>\n </ConnectionContext.Provider>\n )\n}\n\n/**\n * The account client of the settings blocks below: the SDK's, with sign-out going through this\n * connection (so its state is cleared too) and, for a session restored without a login (no SDK\n * profile), the connection user as the profile.\n */\nfunction useConnectionAccount(\n arbi: ReturnType<typeof useArbi>,\n user: ArbiUser | null,\n logout: () => void\n): AccountClient {\n const userRef = useRef(user)\n const logoutRef = useRef(logout)\n logoutRef.current = logout\n const listeners = useRef(new Set<() => void>())\n useEffect(() => {\n userRef.current = user\n listeners.current.forEach((listener) => listener())\n }, [user])\n return useMemo(() => {\n const base = arbiAccountClient(arbi)\n return {\n ...base,\n profile: (): ProfileView | null => {\n const own = base.profile()\n const fallback = userRef.current\n if (own || !fallback) return own\n return {\n ...toProfileView({\n givenName: '',\n familyName: null,\n picture: fallback.picture ?? null,\n email: fallback.email,\n isSso: false,\n }),\n fullName: fallback.name,\n }\n },\n onProfileChange: (listener) => {\n listeners.current.add(listener)\n const off = base.onProfileChange(listener)\n return () => {\n listeners.current.delete(listener)\n off()\n }\n },\n signOut: async ({ everywhere } = {}) => {\n try {\n if (everywhere) await arbi.sessions.logoutAll()\n } finally {\n logoutRef.current()\n }\n },\n }\n }, [arbi])\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection must be used within ConnectionProvider')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n"]}
@@ -153,6 +153,7 @@ function wallArrayOffset(a, zone) {
153
153
  exports.addDays = addDays;
154
154
  exports.addMonths = addMonths;
155
155
  exports.convertWall = convertWall;
156
+ exports.dayOfWeekSun0 = dayOfWeekSun0;
156
157
  exports.detectTimeZone = detectTimeZone;
157
158
  exports.diffDays = diffDays;
158
159
  exports.epochToWallArray = epochToWallArray;
@@ -173,5 +174,5 @@ exports.wallToUtc = wallToUtc;
173
174
  exports.zoneCity = zoneCity;
174
175
  exports.zoneOffsetLabel = zoneOffsetLabel;
175
176
  exports.zoneOffsetMinutes = zoneOffsetMinutes;
176
- //# sourceMappingURL=chunk-TGWTLNXW.cjs.map
177
- //# sourceMappingURL=chunk-TGWTLNXW.cjs.map
177
+ //# sourceMappingURL=chunk-BIXHB4LV.cjs.map
178
+ //# sourceMappingURL=chunk-BIXHB4LV.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/calendar/zone.ts"],"names":["Temporal"],"mappings":";;;;;AAQA,IAAM,IAAA,GAAO,CAAC,CAAA,KAAc,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrD,IAAM,IAAA,GAAO,CAAC,CAAA,KAAc,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAG9C,SAAS,gBAAgB,IAAA,EAAiD;AAC/E,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI;AACF,IAAAA,yBAAA,CAAS,GAAA,CAAI,OAAA,EAAQ,CAAE,kBAAA,CAAmB,IAAI,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,QAAA,CAAS,IAAA,EAAiC,QAAA,GAAW,KAAA,EAAe;AAClF,EAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,GAAI,QAAA,GAAW,KAAA;AAChD;AAEA,SAAS,gBAAgB,IAAA,EAAsC;AAE7D,EAAA,OAAO,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA,GAClCA,0BAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAE,eAAA,EAAgB,GAC9CA,yBAAA,CAAS,aAAA,CAAc,KAAK,IAAI,CAAA;AACtC;AAGO,SAAS,SAAA,CAAU,MAAc,IAAA,EAAsB;AAC5D,EAAA,MAAM,MAAM,eAAA,CAAgB,IAAI,EAAE,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG;AAAA,IAChE,cAAA,EAAgB;AAAA,GACjB,CAAA;AACD,EAAA,OAAO,GAAA,CAAI,SAAA,EAAU,CAAE,QAAA,EAAS;AAClC;AAGO,SAAS,aAAA,CAAc,MAAc,IAAA,EAAsB;AAChE,EAAA,OAAO,eAAA,CAAgB,IAAI,CAAA,CAAE,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,cAAA,EAAgB,YAAA,EAAc,CAAA,CAC1F,iBAAA;AACL;AAEA,SAAS,UAAU,GAAA,EAA+C;AAChE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,SAAiBA,yBAAA,CAAS,OAAA,CAAQ,sBAAsB,GAAG,CAAA;AAC9E,EAAA,IAAI,GAAA,YAAe,MAAM,OAAOA,yBAAA,CAAS,QAAQ,qBAAA,CAAsB,GAAA,CAAI,SAAS,CAAA;AACpF,EAAA,OAAOA,yBAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAClC;AAGO,SAAS,KAAA,CAAM,KAA6B,IAAA,EAAsC;AACvF,EAAA,OAAO,UAAU,GAAG,CAAA,CAAE,kBAAA,CAAmB,QAAA,CAAS,IAAI,CAAC,CAAA;AACzD;AAGO,SAAS,SAAA,CAAU,KAA6B,IAAA,EAAsB;AAC3E,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACzB,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,GAAG,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA;AAC1F;AAGO,SAAS,SAAA,CAAU,KAA6B,IAAA,EAAsB;AAC3E,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACzB,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA;AACxD;AAGO,SAAS,SAAA,CAAU,KAA6B,IAAA,EAAsB;AAC3E,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACzB,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA;AAC1C;AAGO,SAAS,WAAA,CAAY,IAAA,EAAc,QAAA,EAAkB,MAAA,EAAwB;AAClF,EAAA,OAAO,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,QAAQ,GAAG,MAAM,CAAA;AACpD;AAGO,SAAS,WAAA,CAAY,IAAA,EAAc,GAAA,GAAqB,IAAA,CAAK,KAAI,EAAW;AACjF,EAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAC5B;AAGO,SAAS,OAAA,CAAQ,MAAc,IAAA,EAAsB;AAC1D,EAAA,OAAOA,yBAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAE,IAAI,EAAE,IAAA,EAAM,CAAA,CAAE,QAAA,EAAS;AAC9D;AAEO,SAAS,SAAA,CAAU,MAAc,MAAA,EAAwB;AAC9D,EAAA,OAAOA,yBAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAE,IAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAChE;AAGO,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AACrD,EAAA,OAAOA,yBAAA,CAAS,SAAA,CAAU,IAAA,CAAK,CAAC,EAAE,KAAA,CAAMA,yBAAA,CAAS,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,EAAE,WAAA,EAAa,MAAA,EAAQ,CAAA,CAAE,IAAA;AAC/F;AAGO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAOA,yBAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,EAAE,SAAA,GAAY,CAAA;AACnD;AAGO,SAAS,WAAA,CAAY,MAAc,SAAA,EAA2B;AACnE,EAAA,MAAM,IAAA,GAAA,CAAQ,aAAA,CAAc,IAAI,CAAA,GAAI,YAAY,CAAA,IAAK,CAAA;AACrD,EAAA,OAAO,OAAA,CAAQ,IAAA,EAAM,CAAC,IAAI,CAAA;AAC5B;AAGO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAOA,yBAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,EAAE,UAAA,IAAc,CAAA;AACrD;AAGO,SAAS,iBAAA,CAAkB,IAAA,EAAc,EAAA,GAA6B,IAAA,CAAK,KAAI,EAAW;AAC/F,EAAA,OAAO,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,IAAI,CAAA,CAAE,oBAAoB,IAAc,CAAA;AACtE;AAGO,SAAS,eAAA,CAAgB,IAAA,EAAc,EAAA,GAA6B,IAAA,CAAK,KAAI,EAAW;AAC7F,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,EAAM,EAAE,CAAA;AACxC,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,KAAA;AACxB,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,GAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,EAAE,CAAA;AAC7B,EAAA,MAAM,IAAI,GAAA,GAAM,EAAA;AAChB,EAAA,OAAO,CAAA,GAAA,EAAM,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAChD;AAGO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,IAAA;AACtC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC/B;AAGO,SAAS,aAAA,GAA0B;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,KAAM,IAAA,CACT,iBAAA;AACH,IAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,CAAG,UAAU,IAAI,EAAC;AACrC,IAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAA,EAAO,GAAG,KAAK,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,qBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,cAAA,GAAyB;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,GAAkB,QAAA,IAAY,KAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,YAAA,CACd,GAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAG,CAAA,CAAE,iBAAA;AAC1B,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,IAAI,CAAA,EAAG,CAAA,CAAE,OAAO,EAAE,CAAA;AAC5F;AAGO,SAAS,eAAA,CACd,IAAA,EACA,OAAA,EACA,MAAA,EACQ;AACR,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,MAAA;AAAA,IACtE,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY;AAAA,GAChC;AACF;AAGO,SAAS,gBAAA,CAAiB,IAAY,IAAA,EAAwB;AACnE,EAAA,MAAM,IAAIA,yBAAA,CAAS,OAAA,CAAQ,sBAAsB,EAAE,CAAA,CAAE,mBAAmB,IAAI,CAAA;AAC5E,EAAA,OAAO,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,EAAE,WAAW,CAAA;AAC/E;AAGO,SAAS,eAAA,CAAgB,GAAa,IAAA,EAAsB;AAEjE,EAAA,MAAM,OAAO,IAAI,IAAA;AAAA,IACf,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC;AAAA,GACjF;AACA,EAAA,MAAM,GAAA,GAAM,IAAIA,yBAAA,CAAS,aAAA;AAAA,IACvB,KAAK,cAAA,EAAe;AAAA,IACpB,IAAA,CAAK,aAAY,GAAI,CAAA;AAAA,IACrB,KAAK,UAAA,EAAW;AAAA,IAChB,KAAK,WAAA,EAAY;AAAA,IACjB,KAAK,aAAA,EAAc;AAAA,IACnB,KAAK,aAAA,EAAc;AAAA,IACnB,KAAK,kBAAA;AAAmB,GAC1B;AACA,EAAA,MAAM,MAAM,GAAA,CAAI,eAAA,CAAgB,MAAM,EAAE,cAAA,EAAgB,cAAc,CAAA;AACtE,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,iBAAA,GAAoB,IAAc,CAAA;AAC1D","file":"chunk-TGWTLNXW.cjs","sourcesContent":["/**\n * Zone math for the calendar. Every conversion between a wall time in a named IANA zone and a UTC\n * instant goes through Temporal (the polyfill, imported as a module: nothing global is patched),\n * so DST gaps/overlaps resolve the way RFC 5545 says (`compatible`: a skipped time moves forward,\n * a repeated time takes the earlier instant). Nothing here reads the browser's local zone.\n */\nimport { Temporal } from 'temporal-polyfill'\n\nconst pad2 = (n: number) => String(n).padStart(2, '0')\nconst pad4 = (n: number) => String(n).padStart(4, '0')\n\n/** True when `zone` is a time zone the runtime can resolve. */\nexport function isValidTimeZone(zone: string | null | undefined): zone is string {\n if (!zone) return false\n try {\n Temporal.Now.instant().toZonedDateTimeISO(zone)\n return true\n } catch {\n return false\n }\n}\n\n/** `zone` when valid, else `fallback` (else UTC). */\nexport function safeZone(zone: string | null | undefined, fallback = 'UTC'): string {\n if (isValidTimeZone(zone)) return zone\n return isValidTimeZone(fallback) ? fallback : 'UTC'\n}\n\nfunction toPlainDateTime(wall: string): Temporal.PlainDateTime {\n // Accept `YYYY-MM-DDTHH:MM`, `…:SS` and a bare date (midnight).\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(wall)\n ? Temporal.PlainDate.from(wall).toPlainDateTime()\n : Temporal.PlainDateTime.from(wall)\n}\n\n/** The instant a wall time in `zone` names, as an ISO string ending in `Z` (no milliseconds unless set). */\nexport function wallToUtc(wall: string, zone: string): string {\n const zdt = toPlainDateTime(wall).toZonedDateTime(safeZone(zone), {\n disambiguation: 'compatible',\n })\n return zdt.toInstant().toString()\n}\n\n/** Epoch milliseconds of a wall time in `zone`. */\nexport function wallToEpochMs(wall: string, zone: string): number {\n return toPlainDateTime(wall).toZonedDateTime(safeZone(zone), { disambiguation: 'compatible' })\n .epochMilliseconds\n}\n\nfunction instantOf(utc: string | Date | number): Temporal.Instant {\n if (typeof utc === 'number') return Temporal.Instant.fromEpochMilliseconds(utc)\n if (utc instanceof Date) return Temporal.Instant.fromEpochMilliseconds(utc.getTime())\n return Temporal.Instant.from(utc)\n}\n\n/** The zoned date-time of an instant. */\nexport function zoned(utc: string | Date | number, zone: string): Temporal.ZonedDateTime {\n return instantOf(utc).toZonedDateTimeISO(safeZone(zone))\n}\n\n/** `YYYY-MM-DDTHH:MM` wall time of an instant in `zone`. */\nexport function utcToWall(utc: string | Date | number, zone: string): string {\n const z = zoned(utc, zone)\n return `${pad4(z.year)}-${pad2(z.month)}-${pad2(z.day)}T${pad2(z.hour)}:${pad2(z.minute)}`\n}\n\n/** `YYYY-MM-DD` date of an instant in `zone`. */\nexport function utcToDate(utc: string | Date | number, zone: string): string {\n const z = zoned(utc, zone)\n return `${pad4(z.year)}-${pad2(z.month)}-${pad2(z.day)}`\n}\n\n/** `HH:MM` of an instant in `zone`. */\nexport function utcToTime(utc: string | Date | number, zone: string): string {\n const z = zoned(utc, zone)\n return `${pad2(z.hour)}:${pad2(z.minute)}`\n}\n\n/** Convert a wall time from one zone to the same instant's wall time in another. */\nexport function convertWall(wall: string, fromZone: string, toZone: string): string {\n return utcToWall(wallToUtc(wall, fromZone), toZone)\n}\n\n/** Today's date in `zone`. */\nexport function todayInZone(zone: string, now: Date | number = Date.now()): string {\n return utcToDate(now, zone)\n}\n\n/** Calendar arithmetic on a `YYYY-MM-DD` date. */\nexport function addDays(date: string, days: number): string {\n return Temporal.PlainDate.from(date).add({ days }).toString()\n}\n\nexport function addMonths(date: string, months: number): string {\n return Temporal.PlainDate.from(date).add({ months }).toString()\n}\n\n/** Whole days from `a` to `b` (both `YYYY-MM-DD`). */\nexport function diffDays(a: string, b: string): number {\n return Temporal.PlainDate.from(a).until(Temporal.PlainDate.from(b), { largestUnit: 'days' }).days\n}\n\n/** 0 = Sunday … 6 = Saturday, for a `YYYY-MM-DD` date. */\nexport function dayOfWeekSun0(date: string): number {\n return Temporal.PlainDate.from(date).dayOfWeek % 7\n}\n\n/** The first day of the week containing `date`, for a week starting on `weekStart` (0 = Sunday). */\nexport function startOfWeek(date: string, weekStart: number): string {\n const back = (dayOfWeekSun0(date) - weekStart + 7) % 7\n return addDays(date, -back)\n}\n\n/** ISO-8601 week number of a `YYYY-MM-DD` date. */\nexport function isoWeekNumber(date: string): number {\n return Temporal.PlainDate.from(date).weekOfYear ?? 1\n}\n\n/** Offset of `zone` at an instant, in minutes east of UTC. */\nexport function zoneOffsetMinutes(zone: string, at: string | Date | number = Date.now()): number {\n return Math.round(zoned(at, zone).offsetNanoseconds / 60_000_000_000)\n}\n\n/** `GMT+5:30` / `GMT-4` / `GMT` label for `zone` at an instant. */\nexport function zoneOffsetLabel(zone: string, at: string | Date | number = Date.now()): string {\n const total = zoneOffsetMinutes(zone, at)\n if (total === 0) return 'GMT'\n const sign = total > 0 ? '+' : '-'\n const abs = Math.abs(total)\n const h = Math.floor(abs / 60)\n const m = abs % 60\n return `GMT${sign}${h}${m ? `:${pad2(m)}` : ''}`\n}\n\n/** Short city-ish label for a zone: `America/New_York` → `New York`. */\nexport function zoneCity(zone: string): string {\n const last = zone.split('/').pop() ?? zone\n return last.replace(/_/g, ' ')\n}\n\n/** Every IANA zone the runtime knows (falls back to a short list on old engines). */\nexport function listTimeZones(): string[] {\n try {\n const fn = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n const zones = fn ? fn('timeZone') : []\n if (zones.length) return zones.includes('UTC') ? zones : ['UTC', ...zones]\n } catch {\n // fall through\n }\n return [\n 'UTC',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'Asia/Tokyo',\n 'Asia/Singapore',\n 'Australia/Sydney',\n ]\n}\n\n/** The viewer's zone (only as a default for a new user; rendering always uses an explicit zone). */\nexport function detectTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n } catch {\n return 'UTC'\n }\n}\n\n/** Format an instant in `zone` with Intl (never the browser zone). */\nexport function formatInZone(\n utc: string | Date | number,\n zone: string,\n options: Intl.DateTimeFormatOptions,\n locale?: string\n): string {\n const ms = instantOf(utc).epochMilliseconds\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: safeZone(zone) }).format(ms)\n}\n\n/** Format a `YYYY-MM-DD` date (zone-free: rendered at UTC noon so no zone can shift the day). */\nexport function formatPlainDate(\n date: string,\n options: Intl.DateTimeFormatOptions,\n locale?: string\n): string {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' }).format(\n Date.parse(`${date}T12:00:00Z`)\n )\n}\n\n/** Wall-clock array FullCalendar's NamedTimeZoneImpl speaks: [y, m0, d, h, min, s, ms]. */\nexport function epochToWallArray(ms: number, zone: string): number[] {\n const z = Temporal.Instant.fromEpochMilliseconds(ms).toZonedDateTimeISO(zone)\n return [z.year, z.month - 1, z.day, z.hour, z.minute, z.second, z.millisecond]\n}\n\n/** Offset (minutes east of UTC) for a wall-clock array in `zone`, resolving gaps `compatible`. */\nexport function wallArrayOffset(a: number[], zone: string): number {\n // FullCalendar may pass out-of-range parts (e.g. hour 24): normalise via a UTC Date first.\n const norm = new Date(\n Date.UTC(a[0], a[1] ?? 0, a[2] ?? 1, a[3] ?? 0, a[4] ?? 0, a[5] ?? 0, a[6] ?? 0)\n )\n const pdt = new Temporal.PlainDateTime(\n norm.getUTCFullYear(),\n norm.getUTCMonth() + 1,\n norm.getUTCDate(),\n norm.getUTCHours(),\n norm.getUTCMinutes(),\n norm.getUTCSeconds(),\n norm.getUTCMilliseconds()\n )\n const zdt = pdt.toZonedDateTime(zone, { disambiguation: 'compatible' })\n return Math.round(zdt.offsetNanoseconds / 60_000_000_000)\n}\n"]}
1
+ {"version":3,"sources":["../src/calendar/zone.ts"],"names":["Temporal"],"mappings":"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","file":"chunk-BIXHB4LV.cjs","sourcesContent":["/**\n * Zone math for the calendar. Every conversion between a wall time in a named IANA zone and a UTC\n * instant goes through Temporal (the polyfill, imported as a module: nothing global is patched),\n * so DST gaps/overlaps resolve the way RFC 5545 says (`compatible`: a skipped time moves forward,\n * a repeated time takes the earlier instant). Nothing here reads the browser's local zone.\n */\nimport { Temporal } from 'temporal-polyfill'\n\nconst pad2 = (n: number) => String(n).padStart(2, '0')\nconst pad4 = (n: number) => String(n).padStart(4, '0')\n\n/** True when `zone` is a time zone the runtime can resolve. */\nexport function isValidTimeZone(zone: string | null | undefined): zone is string {\n if (!zone) return false\n try {\n Temporal.Now.instant().toZonedDateTimeISO(zone)\n return true\n } catch {\n return false\n }\n}\n\n/** `zone` when valid, else `fallback` (else UTC). */\nexport function safeZone(zone: string | null | undefined, fallback = 'UTC'): string {\n if (isValidTimeZone(zone)) return zone\n return isValidTimeZone(fallback) ? fallback : 'UTC'\n}\n\nfunction toPlainDateTime(wall: string): Temporal.PlainDateTime {\n // Accept `YYYY-MM-DDTHH:MM`, `…:SS` and a bare date (midnight).\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(wall)\n ? Temporal.PlainDate.from(wall).toPlainDateTime()\n : Temporal.PlainDateTime.from(wall)\n}\n\n/** The instant a wall time in `zone` names, as an ISO string ending in `Z` (no milliseconds unless set). */\nexport function wallToUtc(wall: string, zone: string): string {\n const zdt = toPlainDateTime(wall).toZonedDateTime(safeZone(zone), {\n disambiguation: 'compatible',\n })\n return zdt.toInstant().toString()\n}\n\n/** Epoch milliseconds of a wall time in `zone`. */\nexport function wallToEpochMs(wall: string, zone: string): number {\n return toPlainDateTime(wall).toZonedDateTime(safeZone(zone), { disambiguation: 'compatible' })\n .epochMilliseconds\n}\n\nfunction instantOf(utc: string | Date | number): Temporal.Instant {\n if (typeof utc === 'number') return Temporal.Instant.fromEpochMilliseconds(utc)\n if (utc instanceof Date) return Temporal.Instant.fromEpochMilliseconds(utc.getTime())\n return Temporal.Instant.from(utc)\n}\n\n/** The zoned date-time of an instant. */\nexport function zoned(utc: string | Date | number, zone: string): Temporal.ZonedDateTime {\n return instantOf(utc).toZonedDateTimeISO(safeZone(zone))\n}\n\n/** `YYYY-MM-DDTHH:MM` wall time of an instant in `zone`. */\nexport function utcToWall(utc: string | Date | number, zone: string): string {\n const z = zoned(utc, zone)\n return `${pad4(z.year)}-${pad2(z.month)}-${pad2(z.day)}T${pad2(z.hour)}:${pad2(z.minute)}`\n}\n\n/** `YYYY-MM-DD` date of an instant in `zone`. */\nexport function utcToDate(utc: string | Date | number, zone: string): string {\n const z = zoned(utc, zone)\n return `${pad4(z.year)}-${pad2(z.month)}-${pad2(z.day)}`\n}\n\n/** `HH:MM` of an instant in `zone`. */\nexport function utcToTime(utc: string | Date | number, zone: string): string {\n const z = zoned(utc, zone)\n return `${pad2(z.hour)}:${pad2(z.minute)}`\n}\n\n/** Convert a wall time from one zone to the same instant's wall time in another. */\nexport function convertWall(wall: string, fromZone: string, toZone: string): string {\n return utcToWall(wallToUtc(wall, fromZone), toZone)\n}\n\n/** Today's date in `zone`. */\nexport function todayInZone(zone: string, now: Date | number = Date.now()): string {\n return utcToDate(now, zone)\n}\n\n/** Calendar arithmetic on a `YYYY-MM-DD` date. */\nexport function addDays(date: string, days: number): string {\n return Temporal.PlainDate.from(date).add({ days }).toString()\n}\n\nexport function addMonths(date: string, months: number): string {\n return Temporal.PlainDate.from(date).add({ months }).toString()\n}\n\n/** Whole days from `a` to `b` (both `YYYY-MM-DD`). */\nexport function diffDays(a: string, b: string): number {\n return Temporal.PlainDate.from(a).until(Temporal.PlainDate.from(b), { largestUnit: 'days' }).days\n}\n\n/** 0 = Sunday … 6 = Saturday, for a `YYYY-MM-DD` date. */\nexport function dayOfWeekSun0(date: string): number {\n return Temporal.PlainDate.from(date).dayOfWeek % 7\n}\n\n/** The first day of the week containing `date`, for a week starting on `weekStart` (0 = Sunday). */\nexport function startOfWeek(date: string, weekStart: number): string {\n const back = (dayOfWeekSun0(date) - weekStart + 7) % 7\n return addDays(date, -back)\n}\n\n/** ISO-8601 week number of a `YYYY-MM-DD` date. */\nexport function isoWeekNumber(date: string): number {\n return Temporal.PlainDate.from(date).weekOfYear ?? 1\n}\n\n/** Offset of `zone` at an instant, in minutes east of UTC. */\nexport function zoneOffsetMinutes(zone: string, at: string | Date | number = Date.now()): number {\n return Math.round(zoned(at, zone).offsetNanoseconds / 60_000_000_000)\n}\n\n/** `GMT+5:30` / `GMT-4` / `GMT` label for `zone` at an instant. */\nexport function zoneOffsetLabel(zone: string, at: string | Date | number = Date.now()): string {\n const total = zoneOffsetMinutes(zone, at)\n if (total === 0) return 'GMT'\n const sign = total > 0 ? '+' : '-'\n const abs = Math.abs(total)\n const h = Math.floor(abs / 60)\n const m = abs % 60\n return `GMT${sign}${h}${m ? `:${pad2(m)}` : ''}`\n}\n\n/** Short city-ish label for a zone: `America/New_York` → `New York`. */\nexport function zoneCity(zone: string): string {\n const last = zone.split('/').pop() ?? zone\n return last.replace(/_/g, ' ')\n}\n\n/** Every IANA zone the runtime knows (falls back to a short list on old engines). */\nexport function listTimeZones(): string[] {\n try {\n const fn = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n const zones = fn ? fn('timeZone') : []\n if (zones.length) return zones.includes('UTC') ? zones : ['UTC', ...zones]\n } catch {\n // fall through\n }\n return [\n 'UTC',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'Asia/Tokyo',\n 'Asia/Singapore',\n 'Australia/Sydney',\n ]\n}\n\n/** The viewer's zone (only as a default for a new user; rendering always uses an explicit zone). */\nexport function detectTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n } catch {\n return 'UTC'\n }\n}\n\n/** Format an instant in `zone` with Intl (never the browser zone). */\nexport function formatInZone(\n utc: string | Date | number,\n zone: string,\n options: Intl.DateTimeFormatOptions,\n locale?: string\n): string {\n const ms = instantOf(utc).epochMilliseconds\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: safeZone(zone) }).format(ms)\n}\n\n/** Format a `YYYY-MM-DD` date (zone-free: rendered at UTC noon so no zone can shift the day). */\nexport function formatPlainDate(\n date: string,\n options: Intl.DateTimeFormatOptions,\n locale?: string\n): string {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' }).format(\n Date.parse(`${date}T12:00:00Z`)\n )\n}\n\n/** Wall-clock array FullCalendar's NamedTimeZoneImpl speaks: [y, m0, d, h, min, s, ms]. */\nexport function epochToWallArray(ms: number, zone: string): number[] {\n const z = Temporal.Instant.fromEpochMilliseconds(ms).toZonedDateTimeISO(zone)\n return [z.year, z.month - 1, z.day, z.hour, z.minute, z.second, z.millisecond]\n}\n\n/** Offset (minutes east of UTC) for a wall-clock array in `zone`, resolving gaps `compatible`. */\nexport function wallArrayOffset(a: number[], zone: string): number {\n // FullCalendar may pass out-of-range parts (e.g. hour 24): normalise via a UTC Date first.\n const norm = new Date(\n Date.UTC(a[0], a[1] ?? 0, a[2] ?? 1, a[3] ?? 0, a[4] ?? 0, a[5] ?? 0, a[6] ?? 0)\n )\n const pdt = new Temporal.PlainDateTime(\n norm.getUTCFullYear(),\n norm.getUTCMonth() + 1,\n norm.getUTCDate(),\n norm.getUTCHours(),\n norm.getUTCMinutes(),\n norm.getUTCSeconds(),\n norm.getUTCMilliseconds()\n )\n const zdt = pdt.toZonedDateTime(zone, { disambiguation: 'compatible' })\n return Math.round(zdt.offsetNanoseconds / 60_000_000_000)\n}\n"]}
@@ -0,0 +1,166 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkULWRNGGE_cjs = require('./chunk-ULWRNGGE.cjs');
5
+ var react = require('react');
6
+ var lucideReact = require('lucide-react');
7
+ var ui = require('@arbidocs/react/ui');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+ var shell = require('@arbidocs/react/shell');
10
+
11
+ var UNMOUNT_DELAY_MS = 300;
12
+ function PromptDialog({
13
+ request,
14
+ onSettle
15
+ }) {
16
+ const [open, setOpen] = react.useState(true);
17
+ const { message, title = "Confirm", choices, icon = "alert", testId = "choice-modal" } = request;
18
+ const settle = (value) => {
19
+ setOpen(false);
20
+ onSettle(value);
21
+ };
22
+ return /* @__PURE__ */ jsxRuntime.jsx(
23
+ chunkULWRNGGE_cjs.ModalScaffold,
24
+ {
25
+ open,
26
+ onOpenChange: (next) => {
27
+ if (!next) settle(null);
28
+ },
29
+ title,
30
+ icon: icon === "info" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "h-5 w-5 text-blue-text", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "h-5 w-5", "aria-hidden": "true" }),
31
+ description: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-pre-line", children: message }),
32
+ showDescription: true,
33
+ testId,
34
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Footer, { children: choices.map((choice) => /* @__PURE__ */ jsxRuntime.jsx(
35
+ ui.Button,
36
+ {
37
+ variant: choice.variant ?? "default",
38
+ onClick: () => settle(choice.value),
39
+ "data-testid": `${testId}-${choice.value.toLowerCase()}-button`,
40
+ children: choice.label
41
+ },
42
+ choice.value
43
+ )) })
44
+ }
45
+ );
46
+ }
47
+ function choiceDialog(request) {
48
+ if (typeof document === "undefined") return Promise.resolve(null);
49
+ return new Promise((resolve) => {
50
+ const container = document.createElement("div");
51
+ document.body.appendChild(container);
52
+ let settled = false;
53
+ void import('react-dom/client').then(({ createRoot }) => {
54
+ const root = createRoot(container);
55
+ const onSettle = (value) => {
56
+ if (settled) return;
57
+ settled = true;
58
+ resolve(value);
59
+ setTimeout(() => {
60
+ root.unmount();
61
+ container.remove();
62
+ }, UNMOUNT_DELAY_MS);
63
+ };
64
+ root.render(/* @__PURE__ */ jsxRuntime.jsx(PromptDialog, { request, onSettle }));
65
+ });
66
+ });
67
+ }
68
+ var CONFIRM_CHOICES = {
69
+ confirm: [
70
+ { label: "Cancel", value: "cancel", variant: "outline" },
71
+ { label: "Confirm", value: "confirm", variant: "destructive" }
72
+ ],
73
+ yesno: [
74
+ { label: "No", value: "no", variant: "outline" },
75
+ { label: "Yes", value: "yes" }
76
+ ],
77
+ alert: [{ label: "OK", value: "ok" }]
78
+ };
79
+ var CONFIRM_TEST_ID = {
80
+ confirm: "confirmation-modal",
81
+ yesno: "yes-no-modal",
82
+ alert: "alert-modal"
83
+ };
84
+ async function confirmDialog(request) {
85
+ const kind = request.kind ?? "confirm";
86
+ const choice = await choiceDialog({
87
+ message: request.message,
88
+ title: request.title ?? (kind === "alert" ? "Alert" : "Confirm"),
89
+ choices: CONFIRM_CHOICES[kind],
90
+ icon: kind === "alert" ? "info" : "alert",
91
+ testId: CONFIRM_TEST_ID[kind]
92
+ });
93
+ return choice === "confirm" || choice === "yes" || choice === "ok";
94
+ }
95
+ var noop = () => {
96
+ };
97
+ var defaultEnvironment = {
98
+ navigate: (href) => {
99
+ if (typeof window !== "undefined") window.location.assign(href);
100
+ },
101
+ notify: (message, kind = "info", options) => {
102
+ shell.notify[kind](message, options);
103
+ },
104
+ confirm: confirmDialog,
105
+ choose: choiceDialog,
106
+ runtimeConfig: {
107
+ apiBaseUrl: "",
108
+ deploymentDomain: typeof window !== "undefined" ? window.location.host : ""
109
+ },
110
+ openDocument: noop,
111
+ openConversation: noop,
112
+ openSettings: noop,
113
+ openProject: noop
114
+ };
115
+ var BlocksContext = react.createContext(defaultEnvironment);
116
+ function BlocksProvider({
117
+ children,
118
+ linkComponent,
119
+ navigate,
120
+ notify,
121
+ confirm,
122
+ choose,
123
+ runtimeConfig,
124
+ openDocument,
125
+ openConversation,
126
+ openSettings,
127
+ openProject
128
+ }) {
129
+ const parent = react.useContext(BlocksContext);
130
+ const value = react.useMemo(
131
+ () => ({
132
+ linkComponent: linkComponent ?? parent.linkComponent,
133
+ navigate: navigate ?? parent.navigate,
134
+ notify: notify ?? parent.notify,
135
+ confirm: confirm ?? parent.confirm,
136
+ choose: choose ?? parent.choose,
137
+ runtimeConfig: runtimeConfig ?? parent.runtimeConfig,
138
+ openDocument: openDocument ?? parent.openDocument,
139
+ openConversation: openConversation ?? parent.openConversation,
140
+ openSettings: openSettings ?? parent.openSettings,
141
+ openProject: openProject ?? parent.openProject
142
+ }),
143
+ [
144
+ parent,
145
+ linkComponent,
146
+ navigate,
147
+ notify,
148
+ confirm,
149
+ choose,
150
+ runtimeConfig,
151
+ openDocument,
152
+ openConversation,
153
+ openSettings,
154
+ openProject
155
+ ]
156
+ );
157
+ return /* @__PURE__ */ jsxRuntime.jsx(BlocksContext.Provider, { value, children });
158
+ }
159
+ function useBlocksEnvironment() {
160
+ return react.useContext(BlocksContext);
161
+ }
162
+
163
+ exports.BlocksProvider = BlocksProvider;
164
+ exports.useBlocksEnvironment = useBlocksEnvironment;
165
+ //# sourceMappingURL=chunk-C4WSHRR6.cjs.map
166
+ //# sourceMappingURL=chunk-C4WSHRR6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/dialogs.tsx","../src/provider/BlocksProvider.tsx"],"names":["useState","jsx","ModalScaffold","Info","AlertCircle","Button","notifyStore","createContext","useContext","useMemo"],"mappings":"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","file":"chunk-C4WSHRR6.cjs","sourcesContent":["/**\n * Promise-based prompt dialogs — the blocks replacement for `window.confirm` / `window.alert`.\n * Each call mounts its own short-lived React root, so it works from any event handler with no\n * dialog host in the tree. Hosts reach these through `useBlocksEnvironment().confirm` / `.choose`\n * (the defaults), which lets an app swap in its own dialogs without touching callers.\n *\n * For a confirmation with a loading state, render the declarative {@link ConfirmDialog} instead.\n */\nimport { useState, type ReactElement } from 'react'\nimport { AlertCircle, Info } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\ntype ChoiceVariant = 'default' | 'destructive' | 'outline'\n\nexport interface PromptChoice<T extends string> {\n label: string\n value: T\n variant?: ChoiceVariant\n}\n\n/** A dialog offering arbitrary choices (e.g. Overwrite / Skip / Cancel). */\nexport interface ChoiceRequest<T extends string> {\n message: string\n title?: string\n choices: PromptChoice<T>[]\n icon?: 'alert' | 'info'\n /** Dialog test id; each button is `${testId}-${value}-button`. Default `choice-modal`. */\n testId?: string\n}\n\n/**\n * `confirm` — Cancel / Confirm (destructive); `yesno` — No / Yes; `alert` — a single OK\n * (resolves true once acknowledged).\n */\nexport type ConfirmKind = 'confirm' | 'yesno' | 'alert'\n\nexport interface ConfirmRequest {\n message: string\n /** Default: \"Alert\" for `alert`, else \"Confirm\". */\n title?: string\n kind?: ConfirmKind\n}\n\n/** Close animation length before the root is unmounted. */\nconst UNMOUNT_DELAY_MS = 300\n\nfunction PromptDialog<T extends string>({\n request,\n onSettle,\n}: {\n request: ChoiceRequest<T>\n onSettle: (value: T | null) => void\n}): ReactElement {\n const [open, setOpen] = useState(true)\n const { message, title = 'Confirm', choices, icon = 'alert', testId = 'choice-modal' } = request\n const settle = (value: T | null) => {\n setOpen(false)\n onSettle(value)\n }\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => {\n if (!next) settle(null)\n }}\n title={title}\n icon={\n icon === 'info' ? (\n <Info className=\"h-5 w-5 text-blue-text\" aria-hidden=\"true\" />\n ) : (\n <AlertCircle className=\"h-5 w-5\" aria-hidden=\"true\" />\n )\n }\n description={<span className=\"whitespace-pre-line\">{message}</span>}\n showDescription\n testId={testId}\n >\n <ModalScaffold.Footer>\n {choices.map((choice) => (\n <Button\n key={choice.value}\n variant={choice.variant ?? 'default'}\n onClick={() => settle(choice.value)}\n data-testid={`${testId}-${choice.value.toLowerCase()}-button`}\n >\n {choice.label}\n </Button>\n ))}\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n/** Show a choice dialog; resolves with the chosen `value`, or `null` when dismissed. */\nexport function choiceDialog<T extends string>(request: ChoiceRequest<T>): Promise<T | null> {\n if (typeof document === 'undefined') return Promise.resolve(null)\n return new Promise((resolve) => {\n const container = document.createElement('div')\n document.body.appendChild(container)\n let settled = false\n void import('react-dom/client').then(({ createRoot }) => {\n const root = createRoot(container)\n const onSettle = (value: T | null) => {\n if (settled) return\n settled = true\n resolve(value)\n setTimeout(() => {\n root.unmount()\n container.remove()\n }, UNMOUNT_DELAY_MS)\n }\n root.render(<PromptDialog request={request} onSettle={onSettle} />)\n })\n })\n}\n\nconst CONFIRM_CHOICES: Record<\n ConfirmKind,\n PromptChoice<'confirm' | 'cancel' | 'yes' | 'no' | 'ok'>[]\n> = {\n confirm: [\n { label: 'Cancel', value: 'cancel', variant: 'outline' },\n { label: 'Confirm', value: 'confirm', variant: 'destructive' },\n ],\n yesno: [\n { label: 'No', value: 'no', variant: 'outline' },\n { label: 'Yes', value: 'yes' },\n ],\n alert: [{ label: 'OK', value: 'ok' }],\n}\n\nconst CONFIRM_TEST_ID: Record<ConfirmKind, string> = {\n confirm: 'confirmation-modal',\n yesno: 'yes-no-modal',\n alert: 'alert-modal',\n}\n\n/** Show a confirmation; resolves true on Confirm / Yes / OK, false on cancel or dismissal. */\nexport async function confirmDialog(request: ConfirmRequest): Promise<boolean> {\n const kind = request.kind ?? 'confirm'\n const choice = await choiceDialog({\n message: request.message,\n title: request.title ?? (kind === 'alert' ? 'Alert' : 'Confirm'),\n choices: CONFIRM_CHOICES[kind],\n icon: kind === 'alert' ? 'info' : 'alert',\n testId: CONFIRM_TEST_ID[kind],\n })\n return choice === 'confirm' || choice === 'yes' || choice === 'ok'\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport {\n notify as notifyStore,\n type NotifyOptions,\n type NotifyVariant,\n} from '@arbidocs/react/shell'\nimport type { BlockLinkComponent } from '../components/blockLink'\nimport { choiceDialog, confirmDialog, type ChoiceRequest, type ConfirmRequest } from './dialogs'\n\n/** What blocks need from the host's runtime configuration (the app's `config.json`). */\nexport interface BlocksRuntimeConfig {\n /** Origin of the ARBI API; `''` means the page's own origin. */\n apiBaseUrl: string\n /** The deployment's domain, e.g. `www.arbidocs.com` (deep links, key derivation, labels). */\n deploymentDomain: string\n}\n\nexport interface OpenDocumentOptions {\n /** 1-based page to scroll to. */\n page?: number\n /** Passage (chunk) to highlight. */\n passageId?: string\n}\n\n/**\n * The only way blocks reach the host app's environment. Blocks never import a router, a toast\n * library or an app store; the host injects what it has, and every field has a safe default so a\n * block renders correctly with no provider at all. A nested provider overrides only the fields\n * it is given and inherits the rest.\n */\nexport interface BlocksEnvironment {\n /** Router-aware link (keeps navigation in-SPA). Default: a plain `<a href>`. */\n linkComponent?: BlockLinkComponent\n /** Imperative navigation for buttons and keyboard shortcuts. Default: `window.location.assign`. */\n navigate: (href: string) => void\n /** Surface a transient message (and record it in the notification centre). Default: the shared\n * `@arbidocs/react` notify store, rendered by its `<Toaster/>`. */\n notify: (message: ReactNode, kind?: NotifyVariant, options?: NotifyOptions) => void\n /** Ask the user to confirm. Default: the blocks prompt dialog. */\n confirm: (request: ConfirmRequest) => Promise<boolean>\n /** Ask the user to pick one of several choices; `null` when dismissed. Default: the blocks\n * prompt dialog. */\n choose: <T extends string>(request: ChoiceRequest<T>) => Promise<T | null>\n /** Deployment configuration. Default: same-origin API on the page's own host. */\n runtimeConfig: BlocksRuntimeConfig\n /** Open a document (optionally at a page / passage) wherever the host shows documents.\n * Default: no-op. */\n openDocument: (documentId: string, options?: OpenDocumentOptions) => void\n /** Open a conversation thread, optionally scrolled to a message. Default: no-op. */\n openConversation: (conversationId: string, options?: { messageId?: string }) => void\n /** Open the user's settings, optionally at a section. Default: no-op. */\n openSettings: (section?: string) => void\n /** Open a project. Default: no-op. */\n openProject: (projectId: string) => void\n}\n\nconst noop = () => {}\n\nconst defaultEnvironment: BlocksEnvironment = {\n navigate: (href) => {\n if (typeof window !== 'undefined') window.location.assign(href)\n },\n notify: (message, kind = 'info', options) => {\n notifyStore[kind](message, options)\n },\n confirm: confirmDialog,\n choose: choiceDialog,\n runtimeConfig: {\n apiBaseUrl: '',\n deploymentDomain: typeof window !== 'undefined' ? window.location.host : '',\n },\n openDocument: noop,\n openConversation: noop,\n openSettings: noop,\n openProject: noop,\n}\n\nconst BlocksContext = createContext<BlocksEnvironment>(defaultEnvironment)\n\nexport interface BlocksProviderProps extends Partial<BlocksEnvironment> {\n children: ReactNode\n}\n\nexport function BlocksProvider({\n children,\n linkComponent,\n navigate,\n notify,\n confirm,\n choose,\n runtimeConfig,\n openDocument,\n openConversation,\n openSettings,\n openProject,\n}: BlocksProviderProps) {\n const parent = useContext(BlocksContext)\n const value = useMemo<BlocksEnvironment>(\n () => ({\n linkComponent: linkComponent ?? parent.linkComponent,\n navigate: navigate ?? parent.navigate,\n notify: notify ?? parent.notify,\n confirm: confirm ?? parent.confirm,\n choose: choose ?? parent.choose,\n runtimeConfig: runtimeConfig ?? parent.runtimeConfig,\n openDocument: openDocument ?? parent.openDocument,\n openConversation: openConversation ?? parent.openConversation,\n openSettings: openSettings ?? parent.openSettings,\n openProject: openProject ?? parent.openProject,\n }),\n [\n parent,\n linkComponent,\n navigate,\n notify,\n confirm,\n choose,\n runtimeConfig,\n openDocument,\n openConversation,\n openSettings,\n openProject,\n ]\n )\n return <BlocksContext.Provider value={value}>{children}</BlocksContext.Provider>\n}\n\nexport function useBlocksEnvironment(): BlocksEnvironment {\n return useContext(BlocksContext)\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkULWRNGGE_cjs = require('./chunk-ULWRNGGE.cjs');
5
4
  var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
5
+ var chunkULWRNGGE_cjs = require('./chunk-ULWRNGGE.cjs');
6
6
  var react = require('react');
7
7
  var lucideReact = require('lucide-react');
8
8
  var ui = require('@arbidocs/react/ui');
@@ -76,5 +76,5 @@ function ConfirmDialog({
76
76
 
77
77
  exports.ConfirmDialog = ConfirmDialog;
78
78
  exports.DEFAULT_CONFIRM_DIALOG_LABELS = DEFAULT_CONFIRM_DIALOG_LABELS;
79
- //# sourceMappingURL=chunk-ZAVEMQ37.cjs.map
80
- //# sourceMappingURL=chunk-ZAVEMQ37.cjs.map
79
+ //# sourceMappingURL=chunk-DWZXSPMB.cjs.map
80
+ //# sourceMappingURL=chunk-DWZXSPMB.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":["useMemo","useRef","jsxs","ModalScaffold","jsx","AlertTriangle","testIdOr","Button"],"mappings":";;;;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAyBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAIA,aAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAYC,aAA0B,IAAI,CAAA;AAChD,EAAA,uBACEC,eAAA;AAAA,IAACC,+BAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACVC,cAAA,CAACC,6BAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQC,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAExD,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDJ,eAAA,CAACC,+BAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAACG,SAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,cACvB,QAAA,EAAU,SAAA;AAAA,cACV,eAAaD,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,cAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,WACnB;AAAA,0BACAF,cAAA;AAAA,YAACG,SAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAU,SAAA;AAAA,cACV,eAAaD,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,cAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-ZAVEMQ37.cjs","sourcesContent":["import { useMemo, useRef, type ReactNode } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n /** Extra content between the description and the buttons (e.g. an opt-in checkbox). */\n children?: ReactNode\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n children,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n {children}\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":["useMemo","useRef","jsxs","ModalScaffold","jsx","AlertTriangle","testIdOr","Button"],"mappings":";;;;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAyBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAIA,aAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAYC,aAA0B,IAAI,CAAA;AAChD,EAAA,uBACEC,eAAA;AAAA,IAACC,+BAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACVC,cAAA,CAACC,6BAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQC,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAExD,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDJ,eAAA,CAACC,+BAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAACG,SAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,cACvB,QAAA,EAAU,SAAA;AAAA,cACV,eAAaD,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,cAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,WACnB;AAAA,0BACAF,cAAA;AAAA,YAACG,SAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAU,SAAA;AAAA,cACV,eAAaD,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,cAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-DWZXSPMB.cjs","sourcesContent":["import { useMemo, useRef, type ReactNode } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n /** Extra content between the description and the buttons (e.g. an opt-in checkbox). */\n children?: ReactNode\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n children,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n {children}\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { RoleBadge } from './chunk-NBV56SGU.js';
3
- import { ModalSection, ModalSectionTitle } from './chunk-TX2ZICS7.js';
4
3
  import { testIdOr } from './chunk-7F6CBP3Z.js';
4
+ import { ModalSection, ModalSectionTitle } from './chunk-TX2ZICS7.js';
5
5
  import { Clock, UserMinus, Trash2, Gift, AtSign, Contact, Mail, Phone, MoreHorizontal, Download, UserPlus, MoreVertical, Plus, KeyRound, Loader2, BellOff, Bell, X, ChevronsUpDown, AlertCircle, XCircle, CheckCircle, ChevronDown, ChevronRight } from 'lucide-react';
6
6
  import { cn, Tooltip, TooltipTrigger, Select, SelectTrigger, SelectContent, SelectItem, TooltipContent, SelectValue, Button, Textarea, Avatar, AvatarImage, AvatarFallback, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, ScrollArea, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, Popover, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, Checkbox } from '@arbidocs/react/ui';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -973,5 +973,5 @@ function MailFolderTree({
973
973
  }
974
974
 
975
975
  export { ActionMenu, AddContactsForm, AddContactsResults, ContactCard, DEFAULT_ADD_CONTACTS_LABELS, DEFAULT_CONTACT_CARD_LABELS, DEFAULT_CONTACT_OUTCOME_LABELS, DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS, DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS, DEFAULT_DM_INVITE_CHIP_LABELS, DEFAULT_DM_THREAD_FRAME_LABELS, DEFAULT_MAIL_FOLDER_TREE_LABELS, DEFAULT_RECIPIENT_PICKER_LABELS, DmAccessRequestBanner, DmGrantAccessDialogView, DmInviteAvatar, DmInviteChip, DmNewTabIcon, DmThreadFrame, DmThreadHeader, MAX_INVITE_EMAILS, MailFolderTree, MemberBulkActions, MemberListLoading, MemberMutedText, MemberNameCell, MemberRoleCell, RecipientPicker, RoleSelect, WorkspaceDeleteButton, buildMailFolderTree, contactToVCard, descendantFolderIds, downloadVCard, isInboxFolder, parseEmails, toAddContactsRow, toAddContactsRows, toggleMailFolder, vCardFilename };
976
- //# sourceMappingURL=chunk-5HFPRI3W.js.map
977
- //# sourceMappingURL=chunk-5HFPRI3W.js.map
976
+ //# sourceMappingURL=chunk-FUTMU4FR.js.map
977
+ //# sourceMappingURL=chunk-FUTMU4FR.js.map