@arbidocs/blocks 0.4.96 → 0.4.97

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 (73) hide show
  1. package/dist/agents/index.cjs +280 -280
  2. package/dist/agents/index.js +4 -4
  3. package/dist/{chunk-3WW32OUU.cjs → chunk-3US5OIDQ.cjs} +3 -3
  4. package/dist/{chunk-3WW32OUU.cjs.map → chunk-3US5OIDQ.cjs.map} +1 -1
  5. package/dist/{chunk-SJVUKXS6.js → chunk-5NQIBJPP.js} +5 -5
  6. package/dist/{chunk-SJVUKXS6.js.map → chunk-5NQIBJPP.js.map} +1 -1
  7. package/dist/chunk-D54JXTPG.cjs +164 -0
  8. package/dist/chunk-D54JXTPG.cjs.map +1 -0
  9. package/dist/{chunk-MROSCSPW.cjs → chunk-DDYXFALG.cjs} +43 -43
  10. package/dist/{chunk-MROSCSPW.cjs.map → chunk-DDYXFALG.cjs.map} +1 -1
  11. package/dist/{chunk-CK6TU76J.cjs → chunk-EHB7J6SR.cjs} +5 -5
  12. package/dist/{chunk-CK6TU76J.cjs.map → chunk-EHB7J6SR.cjs.map} +1 -1
  13. package/dist/{chunk-SC33PQTQ.cjs → chunk-GVOTXXZG.cjs} +5 -5
  14. package/dist/{chunk-SC33PQTQ.cjs.map → chunk-GVOTXXZG.cjs.map} +1 -1
  15. package/dist/{chunk-7RI3G5BO.cjs → chunk-HGJGALLN.cjs} +296 -53
  16. package/dist/chunk-HGJGALLN.cjs.map +1 -0
  17. package/dist/{chunk-PSN4VWI7.cjs → chunk-LENXDIMY.cjs} +5 -5
  18. package/dist/{chunk-PSN4VWI7.cjs.map → chunk-LENXDIMY.cjs.map} +1 -1
  19. package/dist/{chunk-SF4BDUZS.js → chunk-PGDL26TQ.js} +3 -3
  20. package/dist/{chunk-SF4BDUZS.js.map → chunk-PGDL26TQ.js.map} +1 -1
  21. package/dist/{chunk-K27SDLLN.js → chunk-QIEEFBZ5.js} +299 -56
  22. package/dist/chunk-QIEEFBZ5.js.map +1 -0
  23. package/dist/{chunk-Y52CEKVD.js → chunk-RSUOOMPT.js} +3 -3
  24. package/dist/{chunk-Y52CEKVD.js.map → chunk-RSUOOMPT.js.map} +1 -1
  25. package/dist/{chunk-H4SVY5FH.js → chunk-YH6SSJDW.js} +3 -3
  26. package/dist/{chunk-H4SVY5FH.js.map → chunk-YH6SSJDW.js.map} +1 -1
  27. package/dist/{chunk-JID3CZSY.js → chunk-Z3G65XHZ.js} +3 -3
  28. package/dist/{chunk-JID3CZSY.js.map → chunk-Z3G65XHZ.js.map} +1 -1
  29. package/dist/chunk-ZCOVDK2E.js +153 -0
  30. package/dist/chunk-ZCOVDK2E.js.map +1 -0
  31. package/dist/components/DetailPanel.d.ts +106 -0
  32. package/dist/connect/docx.cjs +6 -6
  33. package/dist/connect/docx.js +4 -4
  34. package/dist/connect/index.cjs +25 -25
  35. package/dist/connect/index.js +5 -5
  36. package/dist/databases/DatabaseRowDetail.d.ts +32 -0
  37. package/dist/databases/DatabaseTable.d.ts +3 -1
  38. package/dist/databases/DatabaseToolbar.d.ts +9 -1
  39. package/dist/databases/PickCellEditor.d.ts +8 -1
  40. package/dist/databases/SelectCellEditor.d.ts +6 -1
  41. package/dist/databases/column-types.d.ts +5 -0
  42. package/dist/databases/databaseColumns.d.ts +7 -0
  43. package/dist/databases/index.cjs +381 -11
  44. package/dist/databases/index.cjs.map +1 -1
  45. package/dist/databases/index.d.ts +7 -5
  46. package/dist/databases/index.js +379 -14
  47. package/dist/databases/index.js.map +1 -1
  48. package/dist/databases/linkCells.d.ts +4 -2
  49. package/dist/docx/RibbonMenu.d.ts +15 -0
  50. package/dist/docx/StyleGallery.d.ts +9 -0
  51. package/dist/docx/WordReferences.d.ts +21 -0
  52. package/dist/docx/index.cjs +24 -24
  53. package/dist/docx/index.js +3 -3
  54. package/dist/docx/wordStyles.d.ts +21 -0
  55. package/dist/files/index.cjs +308 -0
  56. package/dist/files/index.cjs.map +1 -1
  57. package/dist/files/index.js +298 -2
  58. package/dist/files/index.js.map +1 -1
  59. package/dist/files/views/gridViews.d.ts +80 -0
  60. package/dist/files/views/index.d.ts +2 -0
  61. package/dist/files/views/useGridViews.d.ts +38 -0
  62. package/dist/index.cjs +428 -428
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.js +87 -126
  66. package/dist/index.js.map +1 -1
  67. package/dist/tags/TagDetail.d.ts +1 -0
  68. package/dist/workflow-canvas/index.cjs +47 -47
  69. package/dist/workflow-canvas/index.js +4 -4
  70. package/package.json +4 -4
  71. package/src/docx/styles.css +91 -0
  72. package/dist/chunk-7RI3G5BO.cjs.map +0 -1
  73. package/dist/chunk-K27SDLLN.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMUMH3Z6K_cjs = require('./chunk-MUMH3Z6K.cjs');
5
- var chunk7RI3G5BO_cjs = require('./chunk-7RI3G5BO.cjs');
5
+ var chunkHGJGALLN_cjs = require('./chunk-HGJGALLN.cjs');
6
6
  var react$1 = require('react');
7
7
  var reactQuery = require('@tanstack/react-query');
8
8
  var react = require('@arbidocs/react');
@@ -13,7 +13,7 @@ function ConnectedNativeDocxEditor({
13
13
  ...props
14
14
  }) {
15
15
  const adapter = useConnectedNativeDocxAdapter(fontBaseUrl);
16
- return /* @__PURE__ */ jsxRuntime.jsx(chunk7RI3G5BO_cjs.NativeDocxEditor, { ...props, adapter });
16
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkHGJGALLN_cjs.NativeDocxEditor, { ...props, adapter });
17
17
  }
18
18
  function useConnectedNativeDocxAdapter(fontBaseUrl = "/native-docx/fonts") {
19
19
  const arbi = react.useArbi();
@@ -42,7 +42,7 @@ function useConnectedNativeDocxAdapter(fontBaseUrl = "/native-docx/fonts") {
42
42
  headers: { "Content-Type": "application/json" },
43
43
  body: JSON.stringify({ state })
44
44
  })).json(),
45
- loadFonts: () => chunk7RI3G5BO_cjs.loadDocxFonts(fontBaseUrl),
45
+ loadFonts: () => chunkHGJGALLN_cjs.loadDocxFonts(fontBaseUrl),
46
46
  baseUrl: apiUrl,
47
47
  author: user?.name || "You",
48
48
  onVersionSaved: async (id) => {
@@ -91,5 +91,5 @@ function useConnectedNativeDocxAdapter(fontBaseUrl = "/native-docx/fonts") {
91
91
 
92
92
  exports.ConnectedNativeDocxEditor = ConnectedNativeDocxEditor;
93
93
  exports.useConnectedNativeDocxAdapter = useConnectedNativeDocxAdapter;
94
- //# sourceMappingURL=chunk-CK6TU76J.cjs.map
95
- //# sourceMappingURL=chunk-CK6TU76J.cjs.map
94
+ //# sourceMappingURL=chunk-EHB7J6SR.cjs.map
95
+ //# sourceMappingURL=chunk-EHB7J6SR.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/ConnectedNativeDocxEditor.tsx"],"names":["jsx","NativeDocxEditor","useArbi","useConnection","useQueryClient","useQuery","useMemo","loadDocxFonts","arbiQueryKeys","notify"],"mappings":"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","file":"chunk-CK6TU76J.cjs","sourcesContent":["import { useMemo } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, notify, arbiQueryKeys } from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport {\n NativeDocxEditor,\n type NativeDocxAdapter,\n type NativeDocxEditorProps,\n} from '../docx/NativeDocxEditor'\nimport { loadDocxFonts } from '../docx/fonts'\n\n/** Native Word widget bound to the standard blocks connection and SDK session. */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: Omit<NativeDocxEditorProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxEditor {...props} adapter={adapter} />\n}\n\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, apiUrl, user, ensureWorkspaceOpen } = useConnection()\n const queries = useQueryClient()\n const { data: members } = useQuery({\n queryKey: ['native-docx-members', apiUrl, user?.externalId, workspaceId],\n enabled: arbi.isLoggedIn && !!workspaceId,\n queryFn: async () => {\n await ensureWorkspaceOpen()\n return arbi.workspaces.listUsers()\n },\n })\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => loadDocxFonts(fontBaseUrl),\n baseUrl: apiUrl,\n author: user?.name || 'You',\n onVersionSaved: async (id) => {\n if (!workspaceId) return\n const key = arbiQueryKeys.documents(workspaceId)\n try {\n const documents = await arbi.documents.get([id])\n if (!documents.length) throw new Error('The saved version is not available yet.')\n queries.setQueryData<Awaited<ReturnType<typeof arbi.documents.list>>>(key, (previous) => [\n ...documents,\n ...(previous || []).filter(\n (doc) => !documents.some((saved) => saved.external_id === doc.external_id)\n ),\n ])\n } catch {\n await queries.invalidateQueries({ queryKey: key })\n }\n },\n notify: (message, kind) => notify[kind](message),\n mentions: members?.map(({ user: member }) => ({\n id: member.external_id,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n kind: member.external_id.startsWith('agt-') ? 'agent' : 'human',\n })),\n requestAgent: async (id, request) => {\n const response = await arbi.editor.request(`/${encodeURIComponent(id)}/mentions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n comment_id: request.commentId,\n instruction: request.instruction,\n request_id: request.requestId,\n recipient_ids: request.recipientIds,\n }),\n })\n const delivery = (await response.json()) as { response_ids: string[] }\n notify.success('Mention delivered.')\n return { responseIds: delivery.response_ids || [] }\n },\n getAgentStatus: async (responseId) => (await arbi.assistant.getResponse(responseId)).status,\n }),\n [arbi, apiUrl, user?.name, members, ensureWorkspaceOpen, fontBaseUrl, queries, workspaceId]\n )\n return adapter\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/ConnectedNativeDocxEditor.tsx"],"names":["jsx","NativeDocxEditor","useArbi","useConnection","useQueryClient","useQuery","useMemo","loadDocxFonts","arbiQueryKeys","notify"],"mappings":"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","file":"chunk-EHB7J6SR.cjs","sourcesContent":["import { useMemo } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, notify, arbiQueryKeys } from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport {\n NativeDocxEditor,\n type NativeDocxAdapter,\n type NativeDocxEditorProps,\n} from '../docx/NativeDocxEditor'\nimport { loadDocxFonts } from '../docx/fonts'\n\n/** Native Word widget bound to the standard blocks connection and SDK session. */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: Omit<NativeDocxEditorProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxEditor {...props} adapter={adapter} />\n}\n\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, apiUrl, user, ensureWorkspaceOpen } = useConnection()\n const queries = useQueryClient()\n const { data: members } = useQuery({\n queryKey: ['native-docx-members', apiUrl, user?.externalId, workspaceId],\n enabled: arbi.isLoggedIn && !!workspaceId,\n queryFn: async () => {\n await ensureWorkspaceOpen()\n return arbi.workspaces.listUsers()\n },\n })\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => loadDocxFonts(fontBaseUrl),\n baseUrl: apiUrl,\n author: user?.name || 'You',\n onVersionSaved: async (id) => {\n if (!workspaceId) return\n const key = arbiQueryKeys.documents(workspaceId)\n try {\n const documents = await arbi.documents.get([id])\n if (!documents.length) throw new Error('The saved version is not available yet.')\n queries.setQueryData<Awaited<ReturnType<typeof arbi.documents.list>>>(key, (previous) => [\n ...documents,\n ...(previous || []).filter(\n (doc) => !documents.some((saved) => saved.external_id === doc.external_id)\n ),\n ])\n } catch {\n await queries.invalidateQueries({ queryKey: key })\n }\n },\n notify: (message, kind) => notify[kind](message),\n mentions: members?.map(({ user: member }) => ({\n id: member.external_id,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n kind: member.external_id.startsWith('agt-') ? 'agent' : 'human',\n })),\n requestAgent: async (id, request) => {\n const response = await arbi.editor.request(`/${encodeURIComponent(id)}/mentions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n comment_id: request.commentId,\n instruction: request.instruction,\n request_id: request.requestId,\n recipient_ids: request.recipientIds,\n }),\n })\n const delivery = (await response.json()) as { response_ids: string[] }\n notify.success('Mention delivered.')\n return { responseIds: delivery.response_ids || [] }\n },\n getAgentStatus: async (responseId) => (await arbi.assistant.getResponse(responseId)).status,\n }),\n [arbi, apiUrl, user?.name, members, ensureWorkspaceOpen, fontBaseUrl, queries, workspaceId]\n )\n return adapter\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk7RI3G5BO_cjs = require('./chunk-7RI3G5BO.cjs');
4
+ var chunkHGJGALLN_cjs = require('./chunk-HGJGALLN.cjs');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
7
7
  function StreamedWordArtifact({
@@ -15,7 +15,7 @@ function StreamedWordArtifact({
15
15
  }) {
16
16
  if (!busy && documentId) {
17
17
  return /* @__PURE__ */ jsxRuntime.jsx(
18
- chunk7RI3G5BO_cjs.NativeDocxEditor,
18
+ chunkHGJGALLN_cjs.NativeDocxEditor,
19
19
  {
20
20
  adapter,
21
21
  documentId,
@@ -26,7 +26,7 @@ function StreamedWordArtifact({
26
26
  );
27
27
  }
28
28
  return /* @__PURE__ */ jsxRuntime.jsx(
29
- chunk7RI3G5BO_cjs.NativeDocxEditor,
29
+ chunkHGJGALLN_cjs.NativeDocxEditor,
30
30
  {
31
31
  adapter,
32
32
  documentId: "stream-preview",
@@ -39,5 +39,5 @@ function StreamedWordArtifact({
39
39
  }
40
40
 
41
41
  exports.StreamedWordArtifact = StreamedWordArtifact;
42
- //# sourceMappingURL=chunk-SC33PQTQ.cjs.map
43
- //# sourceMappingURL=chunk-SC33PQTQ.cjs.map
42
+ //# sourceMappingURL=chunk-GVOTXXZG.cjs.map
43
+ //# sourceMappingURL=chunk-GVOTXXZG.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/docx/StreamedWordArtifact.tsx"],"names":["jsx","NativeDocxEditor"],"mappings":";;;;;AAmBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,uBACEA,cAAA;AAAA,MAACC,kCAAA;AAAA,MAAA;AAAA,QAEC,OAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK;AAAA,KAKP;AAAA,EAEJ;AACA,EAAA,uBACED,cAAA;AAAA,IAACC,kCAAA;AAAA,IAAA;AAAA,MAEC,OAAA;AAAA,MACA,UAAA,EAAW,gBAAA;AAAA,MACX,KAAA;AAAA,MACA,YAAA,EAAa,EAAA;AAAA,MACb,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA;AAAM,KAAA;AAAA,IAL3B;AAAA,GAMN;AAEJ","file":"chunk-SC33PQTQ.cjs","sourcesContent":["import { NativeDocxEditor, type NativeDocxAdapter } from './NativeDocxEditor'\n\nexport interface StreamedWordArtifactProps {\n adapter: NativeDocxAdapter\n /** Streamed Markdown, shown as a read-only preview while the draft is generated. */\n content: string\n title: string\n busy: boolean\n error?: string | null\n /** The DOCX draft the server stored for this generation (`doc-…`), once known. */\n documentId?: string\n onSaved?: (documentId: string) => void\n}\n\n/**\n * One drafting surface for an AI document draft. The server stores every draft as DOCX, so\n * this component never creates a document: it previews the streamed Markdown until generation\n * ends and the stored DOCX is known, then opens that DOCX in the live collaborative editor.\n */\nexport function StreamedWordArtifact({\n adapter,\n content,\n title,\n busy,\n error,\n documentId,\n onSaved,\n}: StreamedWordArtifactProps) {\n if (!busy && documentId) {\n return (\n <NativeDocxEditor\n key={documentId}\n adapter={adapter}\n documentId={documentId}\n title={title}\n onSaved={onSaved}\n />\n )\n }\n return (\n <NativeDocxEditor\n key=\"stream-preview\"\n adapter={adapter}\n documentId=\"stream-preview\"\n title={title}\n draftContent=\"\"\n stream={{ content, busy, error }}\n />\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/docx/StreamedWordArtifact.tsx"],"names":["jsx","NativeDocxEditor"],"mappings":";;;;;AAmBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,uBACEA,cAAA;AAAA,MAACC,kCAAA;AAAA,MAAA;AAAA,QAEC,OAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK;AAAA,KAKP;AAAA,EAEJ;AACA,EAAA,uBACED,cAAA;AAAA,IAACC,kCAAA;AAAA,IAAA;AAAA,MAEC,OAAA;AAAA,MACA,UAAA,EAAW,gBAAA;AAAA,MACX,KAAA;AAAA,MACA,YAAA,EAAa,EAAA;AAAA,MACb,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA;AAAM,KAAA;AAAA,IAL3B;AAAA,GAMN;AAEJ","file":"chunk-GVOTXXZG.cjs","sourcesContent":["import { NativeDocxEditor, type NativeDocxAdapter } from './NativeDocxEditor'\n\nexport interface StreamedWordArtifactProps {\n adapter: NativeDocxAdapter\n /** Streamed Markdown, shown as a read-only preview while the draft is generated. */\n content: string\n title: string\n busy: boolean\n error?: string | null\n /** The DOCX draft the server stored for this generation (`doc-…`), once known. */\n documentId?: string\n onSaved?: (documentId: string) => void\n}\n\n/**\n * One drafting surface for an AI document draft. The server stores every draft as DOCX, so\n * this component never creates a document: it previews the streamed Markdown until generation\n * ends and the stored DOCX is known, then opens that DOCX in the live collaborative editor.\n */\nexport function StreamedWordArtifact({\n adapter,\n content,\n title,\n busy,\n error,\n documentId,\n onSaved,\n}: StreamedWordArtifactProps) {\n if (!busy && documentId) {\n return (\n <NativeDocxEditor\n key={documentId}\n adapter={adapter}\n documentId={documentId}\n title={title}\n onSaved={onSaved}\n />\n )\n }\n return (\n <NativeDocxEditor\n key=\"stream-preview\"\n adapter={adapter}\n documentId=\"stream-preview\"\n title={title}\n draftContent=\"\"\n stream={{ content, busy, error }}\n />\n )\n}\n"]}
@@ -2234,57 +2234,12 @@ var WordDraftStream = class {
2234
2234
  }
2235
2235
  }
2236
2236
  };
2237
- function contentPath(documentId) {
2238
- const match = /^(doc-[A-Za-z0-9]+)@v([1-9][0-9]*)$/.exec(documentId);
2239
- return match ? `/${encodeURIComponent(match[1])}/content?version=${match[2]}` : `/${encodeURIComponent(documentId)}/content`;
2240
- }
2241
- var drafts = /* @__PURE__ */ new Map();
2242
- var stateBytes = (room) => Y__namespace.encodeStateAsUpdate(room.ydoc);
2243
- var encodeState = (room) => {
2244
- let binary = "";
2245
- for (const byte of stateBytes(room)) binary += String.fromCharCode(byte);
2246
- return btoa(binary);
2247
- };
2248
- function covered(room, vector, receipt) {
2249
- const decode = (value) => Uint8Array.from(atob(value), (c) => c.charCodeAt(0));
2250
- const server = Y__namespace.decodeStateVector(decode(vector)), local = Y__namespace.decodeStateVector(Y__namespace.encodeStateVector(room.ydoc));
2251
- for (const [client, clock] of local) if ((server.get(client) || 0) < clock) return false;
2252
- const deleted = Y__namespace.decodeUpdate(stateBytes(room)).ds.clients;
2253
- const saved = Y__namespace.decodeUpdate(decode(receipt)).ds.clients;
2254
- for (const [client, ranges] of deleted)
2255
- for (const range of ranges) {
2256
- if (!(saved.get(client) || []).some(
2257
- (s) => s.clock <= range.clock && s.clock + s.len >= range.clock + range.len
2258
- ))
2259
- return false;
2260
- }
2261
- return true;
2262
- }
2263
- var EditorBoundary = class extends React3__default.default.Component {
2264
- state = {};
2265
- static getDerivedStateFromError(error) {
2266
- return { error };
2267
- }
2268
- render() {
2269
- return this.state.error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "alert", className: "native-docx-error", children: [
2270
- "Could not render this Word document: ",
2271
- this.state.error.message
2272
- ] }) : this.props.children;
2273
- }
2274
- };
2275
- function DocxParticipants({ session }) {
2276
- const [people, setPeople] = React3.useState([]);
2277
- React3.useEffect(() => {
2278
- if (!session) return;
2279
- setPeople(session.participants());
2280
- return session.subscribeParticipants(setPeople);
2281
- }, [session]);
2282
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "native-docx-presence", "aria-label": "People viewing this document", children: people.map((p) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "native-docx-avatar", title: p.name, children: p.name.split(" ").map((s) => s[0]).slice(0, 2).join("") }, p.actorId)) });
2283
- }
2284
2237
  function RibbonMenu({
2285
2238
  label,
2286
2239
  icon,
2287
- children
2240
+ children,
2241
+ className,
2242
+ testId
2288
2243
  }) {
2289
2244
  const [open, setOpen] = React3.useState(false);
2290
2245
  const element = React3.useRef(null);
@@ -2308,10 +2263,11 @@ function RibbonMenu({
2308
2263
  "button",
2309
2264
  {
2310
2265
  type: "button",
2311
- className: "native-docx-ribbon-trigger",
2266
+ className: ["native-docx-ribbon-trigger", className].filter(Boolean).join(" "),
2312
2267
  "aria-label": label,
2313
2268
  title: label,
2314
2269
  "aria-expanded": open,
2270
+ "data-testid": testId,
2315
2271
  onMouseDown: (event) => event.preventDefault(),
2316
2272
  onClick: () => setOpen((value) => !value),
2317
2273
  children: icon
@@ -2327,11 +2283,295 @@ function RibbonMenu({
2327
2283
  if (!(event.target instanceof HTMLInputElement || event.target instanceof HTMLSelectElement))
2328
2284
  event.preventDefault();
2329
2285
  },
2330
- children
2286
+ children: typeof children === "function" ? children(() => setOpen(false)) : children
2287
+ }
2288
+ )
2289
+ ] });
2290
+ }
2291
+
2292
+ // src/docx/wordStyles.ts
2293
+ var QUICK_STYLES = ["Normal", "Title", "heading 1", "heading 2", "heading 3"];
2294
+ function findStyle(options, name) {
2295
+ const wanted = name.toLowerCase();
2296
+ const id = name.replace(/(^|\s)(\w)/g, (_, _s, c) => c.toUpperCase());
2297
+ return options.find((o) => o.name.toLowerCase() === wanted) ?? options.find((o) => o.styleId.toLowerCase() === id.toLowerCase());
2298
+ }
2299
+ function styleLabel(name) {
2300
+ return name === name.toLowerCase() ? name.replace(/(^|\s)(\w)/g, (m) => m.toUpperCase()) : name;
2301
+ }
2302
+ function wordShortcut(event) {
2303
+ const mod = event.ctrlKey || event.metaKey;
2304
+ if (!mod) return null;
2305
+ if (event.altKey && !event.shiftKey) {
2306
+ switch (event.code) {
2307
+ case "KeyF":
2308
+ return "footnote";
2309
+ case "KeyD":
2310
+ return "endnote";
2311
+ case "Digit1":
2312
+ case "Numpad1":
2313
+ return "heading 1";
2314
+ case "Digit2":
2315
+ case "Numpad2":
2316
+ return "heading 2";
2317
+ case "Digit3":
2318
+ case "Numpad3":
2319
+ return "heading 3";
2320
+ }
2321
+ }
2322
+ if (event.shiftKey && !event.altKey && event.code === "KeyN") return "Normal";
2323
+ return null;
2324
+ }
2325
+ var FILTER_FROM = 8;
2326
+ function previewStyle(option) {
2327
+ const { fontFamily, fontSizePt, bold, italic, color } = option.preview;
2328
+ return {
2329
+ fontFamily: fontFamily ? `"${fontFamily}", serif` : void 0,
2330
+ // In the face of the style, but within a row: 9-18pt.
2331
+ fontSize: fontSizePt ? `${Math.min(18, Math.max(9, fontSizePt))}pt` : void 0,
2332
+ fontWeight: bold ? 700 : void 0,
2333
+ fontStyle: italic ? "italic" : void 0,
2334
+ color: color ? `#${color}` : void 0
2335
+ };
2336
+ }
2337
+ function Gallery({ close }) {
2338
+ const { value, setValue, options, isEnabled } = react.useParagraphStyle();
2339
+ const editor = react.useDocxEditor();
2340
+ const [query, setQuery] = React3.useState("");
2341
+ const quick = React3.useMemo(
2342
+ () => QUICK_STYLES.map((name) => findStyle(options, name)).filter(
2343
+ (o) => !!o
2344
+ ),
2345
+ [options]
2346
+ );
2347
+ const shown = React3.useMemo(() => {
2348
+ const q = query.trim().toLowerCase();
2349
+ return q ? options.filter(
2350
+ (o) => o.name.toLowerCase().includes(q) || o.styleId.toLowerCase().includes(q)
2351
+ ) : options;
2352
+ }, [options, query]);
2353
+ const apply = (option) => {
2354
+ setValue(option.styleId);
2355
+ close();
2356
+ editor?.surface?.focus();
2357
+ };
2358
+ const nav = chunk7UTB4PHM_cjs.useListKeyNav({
2359
+ open: true,
2360
+ items: shown,
2361
+ onPick: apply,
2362
+ onDismiss: close,
2363
+ resetKey: query
2364
+ });
2365
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "native-docx-style-gallery", "data-testid": "docx-style-gallery", children: [
2366
+ quick.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "native-docx-style-quick", role: "group", "aria-label": "Quick styles", children: quick.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
2367
+ "button",
2368
+ {
2369
+ type: "button",
2370
+ "aria-pressed": value === option.styleId,
2371
+ disabled: !isEnabled,
2372
+ "data-style-id": option.styleId,
2373
+ title: styleLabel(option.name),
2374
+ onClick: () => apply(option),
2375
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: previewStyle(option), children: styleLabel(option.name) })
2376
+ },
2377
+ option.styleId
2378
+ )) }),
2379
+ options.length > FILTER_FROM && /* @__PURE__ */ jsxRuntime.jsx(
2380
+ "input",
2381
+ {
2382
+ className: "native-docx-style-filter",
2383
+ placeholder: "Find a style",
2384
+ "aria-label": "Find a style",
2385
+ value: query,
2386
+ autoFocus: true,
2387
+ onChange: (event) => setQuery(event.target.value),
2388
+ onKeyDown: (event) => {
2389
+ nav.handleKeyDown(event);
2390
+ },
2391
+ ...nav.comboboxProps
2392
+ }
2393
+ ),
2394
+ /* @__PURE__ */ jsxRuntime.jsxs(
2395
+ "ul",
2396
+ {
2397
+ className: "native-docx-style-list",
2398
+ role: "listbox",
2399
+ id: nav.listboxId,
2400
+ "aria-label": "Document styles",
2401
+ children: [
2402
+ shown.map((option, index) => /* @__PURE__ */ jsxRuntime.jsx(
2403
+ "li",
2404
+ {
2405
+ id: chunk7UTB4PHM_cjs.listOptionId(nav.listboxId, index),
2406
+ role: "option",
2407
+ "aria-selected": value === option.styleId,
2408
+ "aria-disabled": !isEnabled,
2409
+ "data-active": index === nav.selectedIndex || void 0,
2410
+ "data-style-id": option.styleId,
2411
+ onMouseEnter: () => nav.setSelectedIndex(index),
2412
+ onClick: () => isEnabled && apply(option),
2413
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: previewStyle(option), children: styleLabel(option.name) })
2414
+ },
2415
+ option.styleId
2416
+ )),
2417
+ shown.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("li", { className: "native-docx-style-empty", children: "No matching style" })
2418
+ ]
2419
+ }
2420
+ )
2421
+ ] });
2422
+ }
2423
+ function StyleGallery() {
2424
+ const { value, options } = react.useParagraphStyle();
2425
+ const current = options.find((o) => o.styleId === value);
2426
+ const name = current ? styleLabel(current.name) : "Styles";
2427
+ return /* @__PURE__ */ jsxRuntime.jsx(
2428
+ RibbonMenu,
2429
+ {
2430
+ label: "Styles",
2431
+ className: "native-docx-style-trigger",
2432
+ testId: "docx-style-trigger",
2433
+ icon: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2434
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "native-docx-style-current", "data-testid": "docx-current-style", children: name }),
2435
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { size: 12, "aria-hidden": true })
2436
+ ] }),
2437
+ children: (close) => /* @__PURE__ */ jsxRuntime.jsx(Gallery, { close })
2438
+ }
2439
+ );
2440
+ }
2441
+ function useInsertNote(kind) {
2442
+ const command = react.useEditorCommand(kind === "footnote" ? "insert.footnote" : "insert.endnote");
2443
+ const { options } = react.useParagraphStyle();
2444
+ const editor = react.useDocxEditor();
2445
+ const insert = () => {
2446
+ if (!command.execute()) return false;
2447
+ const text = findStyle(options, `${kind} text`);
2448
+ if (text && editor)
2449
+ withDirectEditing(
2450
+ editor,
2451
+ () => editor.exec({ type: "setParagraphStyle", styleId: text.styleId })
2452
+ );
2453
+ return true;
2454
+ };
2455
+ return { insert, isEnabled: command.isEnabled, disabledReason: command.disabledReason };
2456
+ }
2457
+ function NoteAction({
2458
+ kind,
2459
+ label,
2460
+ shortcut,
2461
+ icon
2462
+ }) {
2463
+ const note = useInsertNote(kind);
2464
+ return /* @__PURE__ */ jsxRuntime.jsx(
2465
+ react.DocxEditor.Toolbar.Action,
2466
+ {
2467
+ label: `${label} (${shortcut})`,
2468
+ icon,
2469
+ disabled: !note.isEnabled,
2470
+ disabledReason: note.disabledReason ?? void 0,
2471
+ onSelect: () => void note.insert(),
2472
+ className: `native-docx-insert-${kind}`
2473
+ }
2474
+ );
2475
+ }
2476
+ function NoteButtons() {
2477
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2478
+ /* @__PURE__ */ jsxRuntime.jsx(
2479
+ NoteAction,
2480
+ {
2481
+ kind: "footnote",
2482
+ label: "Insert footnote",
2483
+ shortcut: "Ctrl+Alt+F",
2484
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Superscript, { size: 16 })
2485
+ }
2486
+ ),
2487
+ /* @__PURE__ */ jsxRuntime.jsx(
2488
+ NoteAction,
2489
+ {
2490
+ kind: "endnote",
2491
+ label: "Insert endnote",
2492
+ shortcut: "Ctrl+Alt+D",
2493
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.NotebookText, { size: 16 })
2331
2494
  }
2332
2495
  )
2333
2496
  ] });
2334
2497
  }
2498
+ function WordShortcuts({ scope }) {
2499
+ const footnote = useInsertNote("footnote");
2500
+ const endnote = useInsertNote("endnote");
2501
+ const styles = react.useParagraphStyle();
2502
+ const editor = react.useDocxEditor();
2503
+ const latest = React3.useRef({ footnote, endnote, styles, editor });
2504
+ latest.current = { footnote, endnote, styles, editor };
2505
+ React3.useEffect(() => {
2506
+ const element = scope.current;
2507
+ if (!element) return;
2508
+ const onKeyDown = (event) => {
2509
+ const action = wordShortcut(event);
2510
+ if (!action) return;
2511
+ const { footnote: footnote2, endnote: endnote2, styles: styles2, editor: editor2 } = latest.current;
2512
+ if (action === "footnote" || action === "endnote") {
2513
+ if (!(action === "footnote" ? footnote2 : endnote2).insert()) return;
2514
+ } else {
2515
+ const style = findStyle(styles2.options, action);
2516
+ if (!style) return;
2517
+ styles2.setValue(style.styleId);
2518
+ }
2519
+ event.preventDefault();
2520
+ event.stopPropagation();
2521
+ editor2?.surface?.focus();
2522
+ };
2523
+ element.addEventListener("keydown", onKeyDown, true);
2524
+ return () => element.removeEventListener("keydown", onKeyDown, true);
2525
+ }, [scope]);
2526
+ return null;
2527
+ }
2528
+ function contentPath(documentId) {
2529
+ const match = /^(doc-[A-Za-z0-9]+)@v([1-9][0-9]*)$/.exec(documentId);
2530
+ return match ? `/${encodeURIComponent(match[1])}/content?version=${match[2]}` : `/${encodeURIComponent(documentId)}/content`;
2531
+ }
2532
+ var drafts = /* @__PURE__ */ new Map();
2533
+ var stateBytes = (room) => Y__namespace.encodeStateAsUpdate(room.ydoc);
2534
+ var encodeState = (room) => {
2535
+ let binary = "";
2536
+ for (const byte of stateBytes(room)) binary += String.fromCharCode(byte);
2537
+ return btoa(binary);
2538
+ };
2539
+ function covered(room, vector, receipt) {
2540
+ const decode = (value) => Uint8Array.from(atob(value), (c) => c.charCodeAt(0));
2541
+ const server = Y__namespace.decodeStateVector(decode(vector)), local = Y__namespace.decodeStateVector(Y__namespace.encodeStateVector(room.ydoc));
2542
+ for (const [client, clock] of local) if ((server.get(client) || 0) < clock) return false;
2543
+ const deleted = Y__namespace.decodeUpdate(stateBytes(room)).ds.clients;
2544
+ const saved = Y__namespace.decodeUpdate(decode(receipt)).ds.clients;
2545
+ for (const [client, ranges] of deleted)
2546
+ for (const range of ranges) {
2547
+ if (!(saved.get(client) || []).some(
2548
+ (s) => s.clock <= range.clock && s.clock + s.len >= range.clock + range.len
2549
+ ))
2550
+ return false;
2551
+ }
2552
+ return true;
2553
+ }
2554
+ var EditorBoundary = class extends React3__default.default.Component {
2555
+ state = {};
2556
+ static getDerivedStateFromError(error) {
2557
+ return { error };
2558
+ }
2559
+ render() {
2560
+ return this.state.error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "alert", className: "native-docx-error", children: [
2561
+ "Could not render this Word document: ",
2562
+ this.state.error.message
2563
+ ] }) : this.props.children;
2564
+ }
2565
+ };
2566
+ function DocxParticipants({ session }) {
2567
+ const [people, setPeople] = React3.useState([]);
2568
+ React3.useEffect(() => {
2569
+ if (!session) return;
2570
+ setPeople(session.participants());
2571
+ return session.subscribeParticipants(setPeople);
2572
+ }, [session]);
2573
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "native-docx-presence", "aria-label": "People viewing this document", children: people.map((p) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "native-docx-avatar", title: p.name, children: p.name.split(" ").map((s) => s[0]).slice(0, 2).join("") }, p.actorId)) });
2574
+ }
2335
2575
  function DefinedTermButtons() {
2336
2576
  const terms = useDefinedTerms();
2337
2577
  if (!terms) return null;
@@ -2374,6 +2614,7 @@ function DocxRibbon({
2374
2614
  /* @__PURE__ */ jsxRuntime.jsxs("select", { "aria-label": "Ribbon tab", value: tab, onChange: (event) => setTab(event.target.value), children: [
2375
2615
  /* @__PURE__ */ jsxRuntime.jsx("option", { children: "Home" }),
2376
2616
  /* @__PURE__ */ jsxRuntime.jsx("option", { children: "Insert" }),
2617
+ /* @__PURE__ */ jsxRuntime.jsx("option", { children: "References" }),
2377
2618
  /* @__PURE__ */ jsxRuntime.jsx("option", { children: "Review" })
2378
2619
  ] }),
2379
2620
  /* @__PURE__ */ jsxRuntime.jsxs(react.DocxEditor.Toolbar, { t, preset: false, onSave, children: [
@@ -2381,6 +2622,7 @@ function DocxRibbon({
2381
2622
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Redo, {}),
2382
2623
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Save, {}),
2383
2624
  tab === "Home" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2625
+ /* @__PURE__ */ jsxRuntime.jsx(StyleGallery, {}),
2384
2626
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Bold, {}),
2385
2627
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Italic, {}),
2386
2628
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Underline, {}),
@@ -2391,7 +2633,6 @@ function DocxRibbon({
2391
2633
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Highlight, {})
2392
2634
  ] }),
2393
2635
  /* @__PURE__ */ jsxRuntime.jsxs(RibbonMenu, { label: "More formatting", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Ellipsis, { size: 16 }), children: [
2394
- /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.StylePicker, {}),
2395
2636
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Alignment, {}),
2396
2637
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.BulletList, {}),
2397
2638
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.NumberedList, {}),
@@ -2408,6 +2649,7 @@ function DocxRibbon({
2408
2649
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Link, {}),
2409
2650
  /* @__PURE__ */ jsxRuntime.jsx(DefinedTermButtons, {})
2410
2651
  ] }),
2652
+ tab === "References" && /* @__PURE__ */ jsxRuntime.jsx(NoteButtons, {}),
2411
2653
  tab === "Review" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2412
2654
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.EditingMode, {}),
2413
2655
  /* @__PURE__ */ jsxRuntime.jsx(react.DocxEditor.Toolbar.Comments, {}),
@@ -2774,6 +3016,7 @@ function NativeDocxEditor({
2774
3016
  )
2775
3017
  }
2776
3018
  ),
3019
+ !stream && /* @__PURE__ */ jsxRuntime.jsx(WordShortcuts, { scope: stageRef }),
2777
3020
  /* @__PURE__ */ jsxRuntime.jsxs(
2778
3021
  "div",
2779
3022
  {
@@ -2924,5 +3167,5 @@ exports.useDefinedTerms = useDefinedTerms;
2924
3167
  exports.useReview = useReview;
2925
3168
  exports.useReviewItem = useReviewItem;
2926
3169
  exports.withDirectEditing = withDirectEditing;
2927
- //# sourceMappingURL=chunk-7RI3G5BO.cjs.map
2928
- //# sourceMappingURL=chunk-7RI3G5BO.cjs.map
3170
+ //# sourceMappingURL=chunk-HGJGALLN.cjs.map
3171
+ //# sourceMappingURL=chunk-HGJGALLN.cjs.map