@arbidocs/blocks 0.5.8 → 0.5.10

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 (95) hide show
  1. package/dist/{ConnectedNativeDocxComparison-VZLB7WWW.cjs → ConnectedNativeDocxComparison-E2QVYVVI.cjs} +8 -7
  2. package/dist/{ConnectedNativeDocxComparison-VZLB7WWW.cjs.map → ConnectedNativeDocxComparison-E2QVYVVI.cjs.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-4MI22H2R.js → ConnectedNativeDocxComparison-KPAQMOIF.js} +7 -6
  4. package/dist/{ConnectedNativeDocxComparison-4MI22H2R.js.map → ConnectedNativeDocxComparison-KPAQMOIF.js.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-YBHAQQSY.js → ConnectedNativeDocxEditor-5PF7J3CP.js} +6 -5
  6. package/dist/{ConnectedNativeDocxEditor-YBHAQQSY.js.map → ConnectedNativeDocxEditor-5PF7J3CP.js.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-74PFGTMR.cjs → ConnectedNativeDocxEditor-XV3K77ZB.cjs} +8 -7
  8. package/dist/{ConnectedNativeDocxEditor-74PFGTMR.cjs.map → ConnectedNativeDocxEditor-XV3K77ZB.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-63ME4QD5.cjs → ConnectedStreamedWordArtifact-3N5CIXZU.cjs} +8 -7
  10. package/dist/ConnectedStreamedWordArtifact-3N5CIXZU.cjs.map +1 -0
  11. package/dist/{ConnectedStreamedWordArtifact-ELHQ2VYL.js → ConnectedStreamedWordArtifact-L45BLBRH.js} +7 -6
  12. package/dist/{ConnectedStreamedWordArtifact-ELHQ2VYL.js.map → ConnectedStreamedWordArtifact-L45BLBRH.js.map} +1 -1
  13. package/dist/{WorkspaceTableView-3TIMUU2J.js → WorkspaceTableView-EZAFYKAJ.js} +4 -3
  14. package/dist/WorkspaceTableView-EZAFYKAJ.js.map +1 -0
  15. package/dist/{WorkspaceTableView-FROHEPCT.cjs → WorkspaceTableView-MQXVE3JB.cjs} +4 -3
  16. package/dist/WorkspaceTableView-MQXVE3JB.cjs.map +1 -0
  17. package/dist/agents/index.cjs +327 -326
  18. package/dist/agents/index.js +5 -4
  19. package/dist/calendar/EventAttachments.d.ts +17 -0
  20. package/dist/calendar/EventEditor.d.ts +1 -1
  21. package/dist/calendar/conference.d.ts +2 -0
  22. package/dist/calendar/index.cjs +117 -120
  23. package/dist/calendar/index.d.ts +0 -1
  24. package/dist/calendar/index.js +2 -1
  25. package/dist/calendar/types.d.ts +15 -35
  26. package/dist/{chunk-2A2QX3MS.js → chunk-3SKLWW5D.js} +4 -3
  27. package/dist/chunk-3SKLWW5D.js.map +1 -0
  28. package/dist/{chunk-Z7KGBVKI.js → chunk-6NSGSEYS.js} +5 -5
  29. package/dist/{chunk-Z7KGBVKI.js.map → chunk-6NSGSEYS.js.map} +1 -1
  30. package/dist/{chunk-FEYRHZYB.js → chunk-6SPVTPUQ.js} +3 -3
  31. package/dist/{chunk-FEYRHZYB.js.map → chunk-6SPVTPUQ.js.map} +1 -1
  32. package/dist/{chunk-M6Z7HTJ2.cjs → chunk-6TE3QA3Y.cjs} +6 -5
  33. package/dist/chunk-6TE3QA3Y.cjs.map +1 -0
  34. package/dist/{chunk-BJ24VPOA.js → chunk-AFIJCK66.js} +210 -214
  35. package/dist/chunk-AFIJCK66.js.map +1 -0
  36. package/dist/{chunk-2VHYOTWW.cjs → chunk-AQPZ4QMV.cjs} +3 -201
  37. package/dist/chunk-AQPZ4QMV.cjs.map +1 -0
  38. package/dist/{chunk-TUODUKDK.cjs → chunk-DP4GMPI3.cjs} +4 -4
  39. package/dist/{chunk-TUODUKDK.cjs.map → chunk-DP4GMPI3.cjs.map} +1 -1
  40. package/dist/{chunk-IK4AWPDW.js → chunk-ELH375VC.js} +3 -3
  41. package/dist/{chunk-IK4AWPDW.js.map → chunk-ELH375VC.js.map} +1 -1
  42. package/dist/{chunk-X5FS27BM.js → chunk-FJCSJLTM.js} +4 -4
  43. package/dist/{chunk-X5FS27BM.js.map → chunk-FJCSJLTM.js.map} +1 -1
  44. package/dist/{chunk-AQ2XKOQ7.js → chunk-FT22URKT.js} +4 -4
  45. package/dist/{chunk-AQ2XKOQ7.js.map → chunk-FT22URKT.js.map} +1 -1
  46. package/dist/{chunk-NUSBINUM.js → chunk-G4GLDQLY.js} +7 -203
  47. package/dist/chunk-G4GLDQLY.js.map +1 -0
  48. package/dist/{chunk-2CTG4DHL.cjs → chunk-I7GQO43N.cjs} +7 -7
  49. package/dist/{chunk-2CTG4DHL.cjs.map → chunk-I7GQO43N.cjs.map} +1 -1
  50. package/dist/{chunk-PSTA227J.cjs → chunk-NG6AGVZ4.cjs} +10 -10
  51. package/dist/{chunk-PSTA227J.cjs.map → chunk-NG6AGVZ4.cjs.map} +1 -1
  52. package/dist/{chunk-M7LMEVXY.cjs → chunk-PFJIGGNN.cjs} +50 -50
  53. package/dist/{chunk-M7LMEVXY.cjs.map → chunk-PFJIGGNN.cjs.map} +1 -1
  54. package/dist/{chunk-LLYZGH3L.cjs → chunk-PXVSZRCA.cjs} +208 -213
  55. package/dist/chunk-PXVSZRCA.cjs.map +1 -0
  56. package/dist/{chunk-AY66THUZ.cjs → chunk-RPWWMOYP.cjs} +9 -9
  57. package/dist/{chunk-AY66THUZ.cjs.map → chunk-RPWWMOYP.cjs.map} +1 -1
  58. package/dist/{chunk-3IQUMSJI.js → chunk-VMMRK4SR.js} +3 -3
  59. package/dist/{chunk-3IQUMSJI.js.map → chunk-VMMRK4SR.js.map} +1 -1
  60. package/dist/chunk-VZOOGA47.cjs +210 -0
  61. package/dist/chunk-VZOOGA47.cjs.map +1 -0
  62. package/dist/chunk-WNDIVNPT.js +207 -0
  63. package/dist/chunk-WNDIVNPT.js.map +1 -0
  64. package/dist/{chunk-6HPBSKXG.cjs → chunk-XUKQQCOK.cjs} +4 -4
  65. package/dist/{chunk-6HPBSKXG.cjs.map → chunk-XUKQQCOK.cjs.map} +1 -1
  66. package/dist/connect/docx.cjs +10 -9
  67. package/dist/connect/docx.js +6 -5
  68. package/dist/connect/index.cjs +381 -381
  69. package/dist/connect/index.cjs.map +1 -1
  70. package/dist/connect/index.js +90 -90
  71. package/dist/connect/index.js.map +1 -1
  72. package/dist/connect/viewer.cjs +3 -3
  73. package/dist/connect/viewer.js +3 -3
  74. package/dist/index.cjs +382 -381
  75. package/dist/index.cjs.map +1 -1
  76. package/dist/index.js +6 -5
  77. package/dist/index.js.map +1 -1
  78. package/dist/settings/index.cjs +10 -9
  79. package/dist/settings/index.js +2 -1
  80. package/dist/workflow-canvas/index.cjs +18 -17
  81. package/dist/workflow-canvas/index.cjs.map +1 -1
  82. package/dist/workflow-canvas/index.js +5 -4
  83. package/dist/workflow-canvas/index.js.map +1 -1
  84. package/node_modules/@arbidocs/coedit/package.json +1 -1
  85. package/package.json +5 -5
  86. package/dist/ConnectedStreamedWordArtifact-63ME4QD5.cjs.map +0 -1
  87. package/dist/WorkspaceTableView-3TIMUU2J.js.map +0 -1
  88. package/dist/WorkspaceTableView-FROHEPCT.cjs.map +0 -1
  89. package/dist/calendar/RoomFinder.d.ts +0 -2
  90. package/dist/chunk-2A2QX3MS.js.map +0 -1
  91. package/dist/chunk-2VHYOTWW.cjs.map +0 -1
  92. package/dist/chunk-BJ24VPOA.js.map +0 -1
  93. package/dist/chunk-LLYZGH3L.cjs.map +0 -1
  94. package/dist/chunk-M6Z7HTJ2.cjs.map +0 -1
  95. package/dist/chunk-NUSBINUM.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useConnectedNativeDocxAdapter } from './chunk-X5FS27BM.js';
2
+ import { useConnectedNativeDocxAdapter } from './chunk-FJCSJLTM.js';
3
3
  import { NativeDocxComparison } from './chunk-I3MA7IHR.js';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -12,5 +12,5 @@ function ConnectedNativeDocxComparison({
12
12
  }
13
13
 
14
14
  export { ConnectedNativeDocxComparison };
15
- //# sourceMappingURL=chunk-3IQUMSJI.js.map
16
- //# sourceMappingURL=chunk-3IQUMSJI.js.map
15
+ //# sourceMappingURL=chunk-VMMRK4SR.js.map
16
+ //# sourceMappingURL=chunk-VMMRK4SR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAU,8BAA8B,WAAW,CAAA;AACzD,EAAA,2BAAQ,oBAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-3IQUMSJI.js","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAU,8BAA8B,WAAW,CAAA;AACzD,EAAA,2BAAQ,oBAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-VMMRK4SR.js","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
@@ -0,0 +1,210 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var lucideReact = require('lucide-react');
6
+ var cmdk = require('cmdk');
7
+ var ui = require('@arbidocs/react/ui');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ // src/settings/DocumentPicker.tsx
11
+ var TOKEN_WARNING_THRESHOLD = 15e4;
12
+ var TOKEN_DANGER_THRESHOLD = 19e4;
13
+ var DEFAULT_DOCUMENT_PICKER_LABELS = {
14
+ placeholder: "Select a document",
15
+ searchDocuments: "Search documents...",
16
+ noDocuments: "No documents found.",
17
+ selectedAsSource: "Selected as source",
18
+ selectAsSource: "Select as source",
19
+ largeDocument: "Large document \u2014 may take longer to process",
20
+ tooLong: "Document is too long to be read in its entirety",
21
+ pages: (n) => `${n.toLocaleString()} pages`,
22
+ tokens: (n) => `${n.toLocaleString()} tokens`
23
+ };
24
+ function DocumentPicker({
25
+ groups,
26
+ value,
27
+ onValueChange,
28
+ selected,
29
+ selectedIds,
30
+ onOpenDocument,
31
+ viewingId,
32
+ forceClosed = false,
33
+ listClassName,
34
+ labels
35
+ }) {
36
+ const l = react.useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels]);
37
+ const multi = selectedIds !== void 0;
38
+ const isChosen = (id) => multi ? selectedIds.includes(id) : value === id;
39
+ const [open, setOpen] = react.useState(false);
40
+ react.useEffect(() => {
41
+ if (forceClosed) setOpen(false);
42
+ }, [forceClosed]);
43
+ const anchorRef = react.useRef(null);
44
+ const leadingControl = (id) => onOpenDocument ? (
45
+ // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would
46
+ // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.
47
+ /* @__PURE__ */ jsxRuntime.jsx(
48
+ "span",
49
+ {
50
+ className: "mr-2 flex items-center",
51
+ onClick: (e) => e.stopPropagation(),
52
+ onMouseDown: (e) => e.stopPropagation(),
53
+ onPointerDown: (e) => e.stopPropagation(),
54
+ children: /* @__PURE__ */ jsxRuntime.jsx(
55
+ ui.Checkbox,
56
+ {
57
+ checked: isChosen(id),
58
+ onCheckedChange: () => onValueChange(id),
59
+ "aria-label": isChosen(id) ? l.selectedAsSource : l.selectAsSource,
60
+ "data-testid": `document-combobox-select-${id}`
61
+ }
62
+ )
63
+ }
64
+ )
65
+ ) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: ui.cn("mr-2 size-4", isChosen(id) ? "opacity-100" : "opacity-0") });
66
+ const itemClass = (id) => ui.cn(
67
+ onOpenDocument && "cursor-pointer",
68
+ onOpenDocument && isChosen(id) && "bg-primary/10 aria-selected:bg-primary/15",
69
+ // Inverted so the open one is unmistakable, over cmdk's own hover tint.
70
+ viewingId === id && "bg-foreground text-background data-[selected=true]:bg-foreground data-[selected=true]:text-background"
71
+ );
72
+ const renderGroups = () => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
73
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: l.noDocuments }),
74
+ groups.map((group) => /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { heading: group.heading, children: group.docs.map((doc) => /* @__PURE__ */ jsxRuntime.jsxs(
75
+ ui.CommandItem,
76
+ {
77
+ value: doc.id,
78
+ keywords: [doc.title],
79
+ className: itemClass(doc.id),
80
+ onSelect: () => {
81
+ if (onOpenDocument) {
82
+ onOpenDocument(doc.id);
83
+ return;
84
+ }
85
+ onValueChange(doc.id);
86
+ if (!multi) setOpen(false);
87
+ },
88
+ children: [
89
+ leadingControl(doc.id),
90
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-2 flex shrink-0 items-center", children: ui.getDocIcon(doc.fileName ?? void 0) }),
91
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("truncate", onOpenDocument && "hover:underline"), children: doc.title })
92
+ ]
93
+ },
94
+ doc.id
95
+ )) }, group.id))
96
+ ] });
97
+ const contentClass = "w-[var(--radix-popover-trigger-width)] border-0 bg-muted p-0 shadow-md";
98
+ const tokens = selected?.tokens ?? null;
99
+ const pages = selected?.pages ?? null;
100
+ const isDanger = tokens != null && tokens > TOKEN_DANGER_THRESHOLD;
101
+ const isWarning = tokens != null && tokens > TOKEN_WARNING_THRESHOLD && !isDanger;
102
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "document-picker", children: [
103
+ multi ? (
104
+ // The input IS the anchor: the list opens beneath the row as soon as it is focused or
105
+ // typed into. cmdk's context reaches the portaled list, so arrows/Enter still drive it.
106
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Command, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange: setOpen, children: [
107
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
108
+ "div",
109
+ {
110
+ ref: anchorRef,
111
+ className: "flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 shadow-sm transition-colors focus-within:ring-1 focus-within:ring-ring pointer-coarse:h-11",
112
+ "data-testid": "document-combobox-trigger",
113
+ children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "size-4 shrink-0 opacity-50" }),
115
+ /* @__PURE__ */ jsxRuntime.jsx(
116
+ cmdk.Command.Input,
117
+ {
118
+ placeholder: l.placeholder,
119
+ "aria-expanded": open,
120
+ className: "h-full w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm",
121
+ onFocus: () => setOpen(true),
122
+ onValueChange: () => setOpen(true),
123
+ onKeyDown: (e) => {
124
+ if (e.key === "ArrowDown" || e.key === "ArrowUp") setOpen(true);
125
+ if (e.key === "Escape") setOpen(false);
126
+ },
127
+ "data-testid": "document-combobox-search"
128
+ }
129
+ )
130
+ ]
131
+ }
132
+ ) }),
133
+ /* @__PURE__ */ jsxRuntime.jsx(
134
+ ui.PopoverContent,
135
+ {
136
+ className: contentClass,
137
+ align: "start",
138
+ onOpenAutoFocus: (e) => e.preventDefault(),
139
+ onFocusOutside: (e) => e.preventDefault(),
140
+ onInteractOutside: (e) => {
141
+ const target = e.target;
142
+ if (anchorRef.current?.contains(target) || target?.closest(
143
+ '[data-testid="parsed-viewer"], [role="dialog"], [data-radix-popper-content-wrapper]'
144
+ )) {
145
+ e.preventDefault();
146
+ }
147
+ },
148
+ children: /* @__PURE__ */ jsxRuntime.jsx(ui.CommandList, { className: listClassName, children: renderGroups() })
149
+ }
150
+ )
151
+ ] }) })
152
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange: setOpen, children: [
153
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
154
+ "button",
155
+ {
156
+ type: "button",
157
+ role: "combobox",
158
+ "aria-expanded": open,
159
+ className: ui.cn(
160
+ "flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring md:text-sm pointer-coarse:h-11",
161
+ !value && "text-muted-foreground"
162
+ ),
163
+ "data-testid": "document-combobox-trigger",
164
+ children: [
165
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: selected?.title || l.placeholder }),
166
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50" })
167
+ ]
168
+ }
169
+ ) }),
170
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: contentClass, align: "start", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { children: [
171
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandInput, { placeholder: l.searchDocuments }),
172
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandList, { className: listClassName, children: renderGroups() })
173
+ ] }) })
174
+ ] }),
175
+ selected && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-1", "data-testid": "document-combobox-info", children: [
176
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
177
+ pages != null && /* @__PURE__ */ jsxRuntime.jsx("span", { children: l.pages(pages) }),
178
+ pages != null && tokens != null && /* @__PURE__ */ jsxRuntime.jsx("span", { children: " \xB7 " }),
179
+ tokens != null && /* @__PURE__ */ jsxRuntime.jsx("span", { children: l.tokens(tokens) })
180
+ ] }),
181
+ isWarning && /* @__PURE__ */ jsxRuntime.jsxs(
182
+ "p",
183
+ {
184
+ className: "flex items-center gap-1.5 text-sm text-yellow-text",
185
+ "data-testid": "document-combobox-warning",
186
+ children: [
187
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.TriangleAlert, { className: "size-3.5 shrink-0" }),
188
+ l.largeDocument
189
+ ]
190
+ }
191
+ ),
192
+ isDanger && /* @__PURE__ */ jsxRuntime.jsxs(
193
+ "p",
194
+ {
195
+ className: "flex items-center gap-1.5 text-sm text-red-text",
196
+ "data-testid": "document-combobox-danger",
197
+ children: [
198
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.TriangleAlert, { className: "size-3.5 shrink-0" }),
199
+ l.tooLong
200
+ ]
201
+ }
202
+ )
203
+ ] })
204
+ ] });
205
+ }
206
+
207
+ exports.DEFAULT_DOCUMENT_PICKER_LABELS = DEFAULT_DOCUMENT_PICKER_LABELS;
208
+ exports.DocumentPicker = DocumentPicker;
209
+ //# sourceMappingURL=chunk-VZOOGA47.cjs.map
210
+ //# sourceMappingURL=chunk-VZOOGA47.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/DocumentPicker.tsx"],"names":["useMemo","useState","useEffect","useRef","jsx","Checkbox","Check","cn","jsxs","Fragment","CommandEmpty","CommandGroup","CommandItem","Command","Popover","PopoverAnchor","Search","CommandPrimitive","PopoverContent","CommandList","PopoverTrigger","ChevronsUpDown","CommandInput","TriangleAlert"],"mappings":"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","file":"chunk-VZOOGA47.cjs","sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Search, TriangleAlert } from 'lucide-react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport {\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n cn,\n getDocIcon,\n} from '@arbidocs/react/ui'\n\nconst TOKEN_WARNING_THRESHOLD = 150_000\nconst TOKEN_DANGER_THRESHOLD = 190_000\n\n/** A document the picker can offer. `pages`/`tokens` are null for images and unparsed files. */\nexport interface PickerDocument {\n id: string\n title: string\n fileName?: string | null\n pages?: number | null\n tokens?: number | null\n}\n\n/** A heading with its documents, already sorted. A group without heading is unlabeled. */\nexport interface PickerGroup {\n id: string\n heading?: string\n docs: PickerDocument[]\n}\n\n/** Every fixed string of the document picker. */\nexport interface DocumentPickerLabels {\n placeholder: string\n searchDocuments: string\n noDocuments: string\n selectedAsSource: string\n selectAsSource: string\n largeDocument: string\n tooLong: string\n pages: (n: number) => string\n tokens: (n: number) => string\n}\n\nexport const DEFAULT_DOCUMENT_PICKER_LABELS: DocumentPickerLabels = {\n placeholder: 'Select a document',\n searchDocuments: 'Search documents...',\n noDocuments: 'No documents found.',\n selectedAsSource: 'Selected as source',\n selectAsSource: 'Select as source',\n largeDocument: 'Large document — may take longer to process',\n tooLong: 'Document is too long to be read in its entirety',\n pages: (n) => `${n.toLocaleString()} pages`,\n tokens: (n) => `${n.toLocaleString()} tokens`,\n}\n\nexport interface DocumentPickerProps {\n groups: PickerGroup[]\n /** The picked document (single mode). */\n value: string\n onValueChange: (id: string) => void\n /** The picked document's details, shown under the picker (pages, tokens, size warnings). */\n selected?: PickerDocument\n /**\n * Ids already chosen. Supplying this switches to MULTI mode: the search box is inline, the\n * list stays open on select and ticks what is in.\n */\n selectedIds?: string[]\n /**\n * Splits each row in two: a click OPENS the document (this callback) and a leading checkbox\n * selects it as a source via `onValueChange`. Requires `selectedIds`.\n */\n onOpenDocument?: (id: string) => void\n /** The document open in the viewer: its row is inverted (multi mode). */\n viewingId?: string | null\n /** While true the list is shut (a neighbouring popup must not overlay it). */\n forceClosed?: boolean\n /** Extra classes of the results list, e.g. a taller `max-h-*` when the picker is the surface. */\n listClassName?: string\n labels?: Partial<DocumentPickerLabels>\n}\n\n/**\n * Searchable document picker. Single mode is a button that opens a searchable list; multi mode\n * puts the search inline. After a pick it shows page/token counts with size warnings.\n */\nexport function DocumentPicker({\n groups,\n value,\n onValueChange,\n selected,\n selectedIds,\n onOpenDocument,\n viewingId,\n forceClosed = false,\n listClassName,\n labels,\n}: DocumentPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels])\n const multi = selectedIds !== undefined\n const isChosen = (id: string) => (multi ? selectedIds.includes(id) : value === id)\n const [open, setOpen] = useState(false)\n useEffect(() => {\n if (forceClosed) setOpen(false)\n }, [forceClosed])\n const anchorRef = useRef<HTMLDivElement>(null)\n\n // A real checkbox when rows open on click; otherwise the tick that mirrors the pick.\n const leadingControl = (id: string): ReactNode =>\n onOpenDocument ? (\n // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would\n // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.\n <span\n className=\"mr-2 flex items-center\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isChosen(id)}\n onCheckedChange={() => onValueChange(id)}\n aria-label={isChosen(id) ? l.selectedAsSource : l.selectAsSource}\n data-testid={`document-combobox-select-${id}`}\n />\n </span>\n ) : (\n <Check className={cn('mr-2 size-4', isChosen(id) ? 'opacity-100' : 'opacity-0')} />\n )\n\n const itemClass = (id: string) =>\n cn(\n onOpenDocument && 'cursor-pointer',\n onOpenDocument && isChosen(id) && 'bg-primary/10 aria-selected:bg-primary/15',\n // Inverted so the open one is unmistakable, over cmdk's own hover tint.\n viewingId === id &&\n 'bg-foreground text-background data-[selected=true]:bg-foreground data-[selected=true]:text-background'\n )\n\n const renderGroups = () => (\n <>\n <CommandEmpty>{l.noDocuments}</CommandEmpty>\n {groups.map((group) => (\n <CommandGroup key={group.id} heading={group.heading}>\n {group.docs.map((doc) => (\n <CommandItem\n key={doc.id}\n // Identity is the id: two documents can share a name, and a title-valued item would\n // make cmdk treat them as one. The title stays searchable via keywords.\n value={doc.id}\n keywords={[doc.title]}\n className={itemClass(doc.id)}\n onSelect={() => {\n if (onOpenDocument) {\n onOpenDocument(doc.id)\n return\n }\n onValueChange(doc.id)\n if (!multi) setOpen(false)\n }}\n >\n {leadingControl(doc.id)}\n <span className=\"mr-2 flex shrink-0 items-center\">\n {getDocIcon(doc.fileName ?? undefined)}\n </span>\n <span className={cn('truncate', onOpenDocument && 'hover:underline')}>\n {doc.title}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </>\n )\n\n const contentClass = 'w-[var(--radix-popover-trigger-width)] border-0 bg-muted p-0 shadow-md'\n const tokens = selected?.tokens ?? null\n const pages = selected?.pages ?? null\n const isDanger = tokens != null && tokens > TOKEN_DANGER_THRESHOLD\n const isWarning = tokens != null && tokens > TOKEN_WARNING_THRESHOLD && !isDanger\n\n return (\n <div data-slot=\"document-picker\">\n {multi ? (\n // The input IS the anchor: the list opens beneath the row as soon as it is focused or\n // typed into. cmdk's context reaches the portaled list, so arrows/Enter still drive it.\n <Command>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n ref={anchorRef}\n className=\"flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 shadow-sm transition-colors focus-within:ring-1 focus-within:ring-ring pointer-coarse:h-11\"\n data-testid=\"document-combobox-trigger\"\n >\n <Search className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={l.placeholder}\n aria-expanded={open}\n className=\"h-full w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n onFocus={() => setOpen(true)}\n onValueChange={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') setOpen(true)\n if (e.key === 'Escape') setOpen(false)\n }}\n data-testid=\"document-combobox-search\"\n />\n </div>\n </PopoverAnchor>\n <PopoverContent\n className={contentClass}\n align=\"start\"\n // Focus stays in the inline input, and opening a document hands focus to the viewer:\n // neither may count as an outside click. Pointer-downs in the viewer, dialogs and\n // poppers are ignored; Escape and any other outside click still close the list.\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => {\n const target = e.target as Element | null\n if (\n anchorRef.current?.contains(target) ||\n target?.closest(\n '[data-testid=\"parsed-viewer\"], [role=\"dialog\"], [data-radix-popper-content-wrapper]'\n )\n ) {\n e.preventDefault()\n }\n }}\n >\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </PopoverContent>\n </Popover>\n </Command>\n ) : (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n 'flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring md:text-sm pointer-coarse:h-11',\n !value && 'text-muted-foreground'\n )}\n data-testid=\"document-combobox-trigger\"\n >\n <span className=\"truncate\">{selected?.title || l.placeholder}</span>\n <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className={contentClass} align=\"start\">\n <Command>\n <CommandInput placeholder={l.searchDocuments} />\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n\n {selected && (\n <div className=\"mt-2 space-y-1\" data-testid=\"document-combobox-info\">\n <p className=\"text-sm text-muted-foreground\">\n {pages != null && <span>{l.pages(pages)}</span>}\n {pages != null && tokens != null && <span> · </span>}\n {tokens != null && <span>{l.tokens(tokens)}</span>}\n </p>\n {isWarning && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-yellow-text\"\n data-testid=\"document-combobox-warning\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.largeDocument}\n </p>\n )}\n {isDanger && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-red-text\"\n data-testid=\"document-combobox-danger\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.tooLong}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n"]}
@@ -0,0 +1,207 @@
1
+ "use client";
2
+ import { useMemo, useState, useEffect, useRef } from 'react';
3
+ import { Search, ChevronsUpDown, TriangleAlert, Check } from 'lucide-react';
4
+ import { Command as Command$1 } from 'cmdk';
5
+ import { Command, Popover, PopoverAnchor, PopoverContent, CommandList, PopoverTrigger, cn, CommandInput, CommandEmpty, CommandGroup, CommandItem, getDocIcon, Checkbox } from '@arbidocs/react/ui';
6
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
+
8
+ // src/settings/DocumentPicker.tsx
9
+ var TOKEN_WARNING_THRESHOLD = 15e4;
10
+ var TOKEN_DANGER_THRESHOLD = 19e4;
11
+ var DEFAULT_DOCUMENT_PICKER_LABELS = {
12
+ placeholder: "Select a document",
13
+ searchDocuments: "Search documents...",
14
+ noDocuments: "No documents found.",
15
+ selectedAsSource: "Selected as source",
16
+ selectAsSource: "Select as source",
17
+ largeDocument: "Large document \u2014 may take longer to process",
18
+ tooLong: "Document is too long to be read in its entirety",
19
+ pages: (n) => `${n.toLocaleString()} pages`,
20
+ tokens: (n) => `${n.toLocaleString()} tokens`
21
+ };
22
+ function DocumentPicker({
23
+ groups,
24
+ value,
25
+ onValueChange,
26
+ selected,
27
+ selectedIds,
28
+ onOpenDocument,
29
+ viewingId,
30
+ forceClosed = false,
31
+ listClassName,
32
+ labels
33
+ }) {
34
+ const l = useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels]);
35
+ const multi = selectedIds !== void 0;
36
+ const isChosen = (id) => multi ? selectedIds.includes(id) : value === id;
37
+ const [open, setOpen] = useState(false);
38
+ useEffect(() => {
39
+ if (forceClosed) setOpen(false);
40
+ }, [forceClosed]);
41
+ const anchorRef = useRef(null);
42
+ const leadingControl = (id) => onOpenDocument ? (
43
+ // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would
44
+ // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.
45
+ /* @__PURE__ */ jsx(
46
+ "span",
47
+ {
48
+ className: "mr-2 flex items-center",
49
+ onClick: (e) => e.stopPropagation(),
50
+ onMouseDown: (e) => e.stopPropagation(),
51
+ onPointerDown: (e) => e.stopPropagation(),
52
+ children: /* @__PURE__ */ jsx(
53
+ Checkbox,
54
+ {
55
+ checked: isChosen(id),
56
+ onCheckedChange: () => onValueChange(id),
57
+ "aria-label": isChosen(id) ? l.selectedAsSource : l.selectAsSource,
58
+ "data-testid": `document-combobox-select-${id}`
59
+ }
60
+ )
61
+ }
62
+ )
63
+ ) : /* @__PURE__ */ jsx(Check, { className: cn("mr-2 size-4", isChosen(id) ? "opacity-100" : "opacity-0") });
64
+ const itemClass = (id) => cn(
65
+ onOpenDocument && "cursor-pointer",
66
+ onOpenDocument && isChosen(id) && "bg-primary/10 aria-selected:bg-primary/15",
67
+ // Inverted so the open one is unmistakable, over cmdk's own hover tint.
68
+ viewingId === id && "bg-foreground text-background data-[selected=true]:bg-foreground data-[selected=true]:text-background"
69
+ );
70
+ const renderGroups = () => /* @__PURE__ */ jsxs(Fragment, { children: [
71
+ /* @__PURE__ */ jsx(CommandEmpty, { children: l.noDocuments }),
72
+ groups.map((group) => /* @__PURE__ */ jsx(CommandGroup, { heading: group.heading, children: group.docs.map((doc) => /* @__PURE__ */ jsxs(
73
+ CommandItem,
74
+ {
75
+ value: doc.id,
76
+ keywords: [doc.title],
77
+ className: itemClass(doc.id),
78
+ onSelect: () => {
79
+ if (onOpenDocument) {
80
+ onOpenDocument(doc.id);
81
+ return;
82
+ }
83
+ onValueChange(doc.id);
84
+ if (!multi) setOpen(false);
85
+ },
86
+ children: [
87
+ leadingControl(doc.id),
88
+ /* @__PURE__ */ jsx("span", { className: "mr-2 flex shrink-0 items-center", children: getDocIcon(doc.fileName ?? void 0) }),
89
+ /* @__PURE__ */ jsx("span", { className: cn("truncate", onOpenDocument && "hover:underline"), children: doc.title })
90
+ ]
91
+ },
92
+ doc.id
93
+ )) }, group.id))
94
+ ] });
95
+ const contentClass = "w-[var(--radix-popover-trigger-width)] border-0 bg-muted p-0 shadow-md";
96
+ const tokens = selected?.tokens ?? null;
97
+ const pages = selected?.pages ?? null;
98
+ const isDanger = tokens != null && tokens > TOKEN_DANGER_THRESHOLD;
99
+ const isWarning = tokens != null && tokens > TOKEN_WARNING_THRESHOLD && !isDanger;
100
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "document-picker", children: [
101
+ multi ? (
102
+ // The input IS the anchor: the list opens beneath the row as soon as it is focused or
103
+ // typed into. cmdk's context reaches the portaled list, so arrows/Enter still drive it.
104
+ /* @__PURE__ */ jsx(Command, { children: /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
105
+ /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
106
+ "div",
107
+ {
108
+ ref: anchorRef,
109
+ className: "flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 shadow-sm transition-colors focus-within:ring-1 focus-within:ring-ring pointer-coarse:h-11",
110
+ "data-testid": "document-combobox-trigger",
111
+ children: [
112
+ /* @__PURE__ */ jsx(Search, { className: "size-4 shrink-0 opacity-50" }),
113
+ /* @__PURE__ */ jsx(
114
+ Command$1.Input,
115
+ {
116
+ placeholder: l.placeholder,
117
+ "aria-expanded": open,
118
+ className: "h-full w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm",
119
+ onFocus: () => setOpen(true),
120
+ onValueChange: () => setOpen(true),
121
+ onKeyDown: (e) => {
122
+ if (e.key === "ArrowDown" || e.key === "ArrowUp") setOpen(true);
123
+ if (e.key === "Escape") setOpen(false);
124
+ },
125
+ "data-testid": "document-combobox-search"
126
+ }
127
+ )
128
+ ]
129
+ }
130
+ ) }),
131
+ /* @__PURE__ */ jsx(
132
+ PopoverContent,
133
+ {
134
+ className: contentClass,
135
+ align: "start",
136
+ onOpenAutoFocus: (e) => e.preventDefault(),
137
+ onFocusOutside: (e) => e.preventDefault(),
138
+ onInteractOutside: (e) => {
139
+ const target = e.target;
140
+ if (anchorRef.current?.contains(target) || target?.closest(
141
+ '[data-testid="parsed-viewer"], [role="dialog"], [data-radix-popper-content-wrapper]'
142
+ )) {
143
+ e.preventDefault();
144
+ }
145
+ },
146
+ children: /* @__PURE__ */ jsx(CommandList, { className: listClassName, children: renderGroups() })
147
+ }
148
+ )
149
+ ] }) })
150
+ ) : /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
151
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
152
+ "button",
153
+ {
154
+ type: "button",
155
+ role: "combobox",
156
+ "aria-expanded": open,
157
+ className: cn(
158
+ "flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring md:text-sm pointer-coarse:h-11",
159
+ !value && "text-muted-foreground"
160
+ ),
161
+ "data-testid": "document-combobox-trigger",
162
+ children: [
163
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: selected?.title || l.placeholder }),
164
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50" })
165
+ ]
166
+ }
167
+ ) }),
168
+ /* @__PURE__ */ jsx(PopoverContent, { className: contentClass, align: "start", children: /* @__PURE__ */ jsxs(Command, { children: [
169
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: l.searchDocuments }),
170
+ /* @__PURE__ */ jsx(CommandList, { className: listClassName, children: renderGroups() })
171
+ ] }) })
172
+ ] }),
173
+ selected && /* @__PURE__ */ jsxs("div", { className: "mt-2 space-y-1", "data-testid": "document-combobox-info", children: [
174
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
175
+ pages != null && /* @__PURE__ */ jsx("span", { children: l.pages(pages) }),
176
+ pages != null && tokens != null && /* @__PURE__ */ jsx("span", { children: " \xB7 " }),
177
+ tokens != null && /* @__PURE__ */ jsx("span", { children: l.tokens(tokens) })
178
+ ] }),
179
+ isWarning && /* @__PURE__ */ jsxs(
180
+ "p",
181
+ {
182
+ className: "flex items-center gap-1.5 text-sm text-yellow-text",
183
+ "data-testid": "document-combobox-warning",
184
+ children: [
185
+ /* @__PURE__ */ jsx(TriangleAlert, { className: "size-3.5 shrink-0" }),
186
+ l.largeDocument
187
+ ]
188
+ }
189
+ ),
190
+ isDanger && /* @__PURE__ */ jsxs(
191
+ "p",
192
+ {
193
+ className: "flex items-center gap-1.5 text-sm text-red-text",
194
+ "data-testid": "document-combobox-danger",
195
+ children: [
196
+ /* @__PURE__ */ jsx(TriangleAlert, { className: "size-3.5 shrink-0" }),
197
+ l.tooLong
198
+ ]
199
+ }
200
+ )
201
+ ] })
202
+ ] });
203
+ }
204
+
205
+ export { DEFAULT_DOCUMENT_PICKER_LABELS, DocumentPicker };
206
+ //# sourceMappingURL=chunk-WNDIVNPT.js.map
207
+ //# sourceMappingURL=chunk-WNDIVNPT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/DocumentPicker.tsx"],"names":["CommandPrimitive"],"mappings":";;;;;;;AAmBA,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,sBAAA,GAAyB,IAAA;AA+BxB,IAAM,8BAAA,GAAuD;AAAA,EAClE,WAAA,EAAa,mBAAA;AAAA,EACb,eAAA,EAAiB,qBAAA;AAAA,EACjB,WAAA,EAAa,qBAAA;AAAA,EACb,gBAAA,EAAkB,oBAAA;AAAA,EAClB,cAAA,EAAgB,kBAAA;AAAA,EAChB,aAAA,EAAe,kDAAA;AAAA,EACf,OAAA,EAAS,iDAAA;AAAA,EACT,OAAO,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,gBAAgB,CAAA,MAAA,CAAA;AAAA,EACnC,QAAQ,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,gBAAgB,CAAA,OAAA;AACtC;AAgCO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,aAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAO,EAAE,GAAG,8BAAA,EAAgC,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACpF,EAAA,MAAM,QAAQ,WAAA,KAAgB,MAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAAgB,KAAA,GAAQ,YAAY,QAAA,CAAS,EAAE,IAAI,KAAA,KAAU,EAAA;AAC/E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAA,UAAqB,KAAK,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAChB,EAAA,MAAM,SAAA,GAAY,OAAuB,IAAI,CAAA;AAG7C,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KACtB,cAAA;AAAA;AAAA;AAAA,oBAGE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wBAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAClC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QACtC,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAExC,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAS,EAAE,CAAA;AAAA,YACpB,eAAA,EAAiB,MAAM,aAAA,CAAc,EAAE,CAAA;AAAA,YACvC,cAAY,QAAA,CAAS,EAAE,CAAA,GAAI,CAAA,CAAE,mBAAmB,CAAA,CAAE,cAAA;AAAA,YAClD,aAAA,EAAa,4BAA4B,EAAE,CAAA;AAAA;AAAA;AAC7C;AAAA;AACF,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,EAAE,CAAA,GAAI,aAAA,GAAgB,WAAW,CAAA,EAAG,CAAA;AAGrF,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KACjB,EAAA;AAAA,IACE,cAAA,IAAkB,gBAAA;AAAA,IAClB,cAAA,IAAkB,QAAA,CAAS,EAAE,CAAA,IAAK,2CAAA;AAAA;AAAA,IAElC,cAAc,EAAA,IACZ;AAAA,GACJ;AAEF,EAAA,MAAM,YAAA,GAAe,sBACnB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EAAc,YAAE,WAAA,EAAY,CAAA;AAAA,IAC5B,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACX,GAAA,CAAC,YAAA,EAAA,EAA4B,OAAA,EAAS,KAAA,CAAM,OAAA,EACzC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACf,IAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAIC,OAAO,GAAA,CAAI,EAAA;AAAA,QACX,QAAA,EAAU,CAAC,GAAA,CAAI,KAAK,CAAA;AAAA,QACpB,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAAA,QAC3B,UAAU,MAAM;AACd,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,cAAA,CAAe,IAAI,EAAE,CAAA;AACrB,YAAA;AAAA,UACF;AACA,UAAA,aAAA,CAAc,IAAI,EAAE,CAAA;AACpB,UAAA,IAAI,CAAC,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC3B,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,cAAA,CAAe,IAAI,EAAE,CAAA;AAAA,0BACtB,GAAA,CAAC,UAAK,SAAA,EAAU,iCAAA,EACb,qBAAW,GAAA,CAAI,QAAA,IAAY,MAAS,CAAA,EACvC,CAAA;AAAA,0BACA,GAAA,CAAC,UAAK,SAAA,EAAW,EAAA,CAAG,YAAY,cAAA,IAAkB,iBAAiB,CAAA,EAChE,QAAA,EAAA,GAAA,CAAI,KAAA,EACP;AAAA;AAAA,OAAA;AAAA,MArBK,GAAA,CAAI;AAAA,KAuBZ,CAAA,EAAA,EA1BgB,KAAA,CAAM,EA2BzB,CACD;AAAA,GAAA,EACH,CAAA;AAGF,EAAA,MAAM,YAAA,GAAe,wEAAA;AACrB,EAAA,MAAM,MAAA,GAAS,UAAU,MAAA,IAAU,IAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,IAAS,IAAA;AACjC,EAAA,MAAM,QAAA,GAAW,MAAA,IAAU,IAAA,IAAQ,MAAA,GAAS,sBAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,MAAA,IAAU,IAAA,IAAQ,MAAA,GAAS,2BAA2B,CAAC,QAAA;AAEzE,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA;AAAA;AAAA,0BAGE,OAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAO,IAAA,EACpB,QAAA,kBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,SAAA,EAAU,kLAAA;AAAA,YACV,aAAA,EAAY,2BAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,4BAAA,EAA6B,CAAA;AAAA,8BAC/C,GAAA;AAAA,gBAACA,SAAA,CAAiB,KAAA;AAAA,gBAAjB;AAAA,kBACC,aAAa,CAAA,CAAE,WAAA;AAAA,kBACf,eAAA,EAAe,IAAA;AAAA,kBACf,SAAA,EAAU,kGAAA;AAAA,kBACV,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,kBAC3B,aAAA,EAAe,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,kBACjC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,oBAAA,IAAI,EAAE,GAAA,KAAQ,WAAA,IAAe,EAAE,GAAA,KAAQ,SAAA,UAAmB,IAAI,CAAA;AAC9D,oBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,kBACvC,CAAA;AAAA,kBACA,aAAA,EAAY;AAAA;AAAA;AACd;AAAA;AAAA,SACF,EACF,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAA;AAAA,YACX,KAAA,EAAM,OAAA;AAAA,YAIN,eAAA,EAAiB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,YACzC,cAAA,EAAgB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,YACxC,iBAAA,EAAmB,CAAC,CAAA,KAAM;AACxB,cAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,cAAA,IACE,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,MAAM,KAClC,MAAA,EAAQ,OAAA;AAAA,gBACN;AAAA,eACF,EACA;AACA,gBAAA,CAAA,CAAE,cAAA,EAAe;AAAA,cACnB;AAAA,YACF,CAAA;AAAA,YAEA,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,aAAA,EAAgB,wBAAa,EAAE;AAAA;AAAA;AACzD,OAAA,EACF,CAAA,EACF;AAAA,wBAEA,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,OAAA,EACjC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,UAAA;AAAA,UACL,eAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAW,EAAA;AAAA,YACT,mPAAA;AAAA,YACA,CAAC,KAAA,IAAS;AAAA,WACZ;AAAA,UACA,aAAA,EAAY,2BAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,QAAA,EAAU,KAAA,IAAS,EAAE,WAAA,EAAY,CAAA;AAAA,4BAC7D,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,iCAAA,EAAkC;AAAA;AAAA;AAAA,OAC9D,EACF,CAAA;AAAA,0BACC,cAAA,EAAA,EAAe,SAAA,EAAW,cAAc,KAAA,EAAM,OAAA,EAC7C,+BAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAA,EAAa,CAAA,CAAE,eAAA,EAAiB,CAAA;AAAA,wBAC9C,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,aAAA,EAAgB,wBAAa,EAAE;AAAA,OAAA,EACzD,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGD,4BACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,eAAY,wBAAA,EAC1C,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EACV,QAAA,EAAA;AAAA,QAAA,KAAA,IAAS,wBAAQ,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,EAAE,CAAA;AAAA,QACvC,SAAS,IAAA,IAAQ,MAAA,IAAU,IAAA,oBAAQ,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAG,CAAA;AAAA,QAC5C,UAAU,IAAA,oBAAQ,GAAA,CAAC,UAAM,QAAA,EAAA,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAE;AAAA,OAAA,EAC7C,CAAA;AAAA,MACC,SAAA,oBACC,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oDAAA;AAAA,UACV,aAAA,EAAY,2BAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,mBAAA,EAAoB,CAAA;AAAA,YAC5C,CAAA,CAAE;AAAA;AAAA;AAAA,OACL;AAAA,MAED,QAAA,oBACC,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,iDAAA;AAAA,UACV,aAAA,EAAY,0BAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,mBAAA,EAAoB,CAAA;AAAA,YAC5C,CAAA,CAAE;AAAA;AAAA;AAAA;AACL,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-WNDIVNPT.js","sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Search, TriangleAlert } from 'lucide-react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport {\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n cn,\n getDocIcon,\n} from '@arbidocs/react/ui'\n\nconst TOKEN_WARNING_THRESHOLD = 150_000\nconst TOKEN_DANGER_THRESHOLD = 190_000\n\n/** A document the picker can offer. `pages`/`tokens` are null for images and unparsed files. */\nexport interface PickerDocument {\n id: string\n title: string\n fileName?: string | null\n pages?: number | null\n tokens?: number | null\n}\n\n/** A heading with its documents, already sorted. A group without heading is unlabeled. */\nexport interface PickerGroup {\n id: string\n heading?: string\n docs: PickerDocument[]\n}\n\n/** Every fixed string of the document picker. */\nexport interface DocumentPickerLabels {\n placeholder: string\n searchDocuments: string\n noDocuments: string\n selectedAsSource: string\n selectAsSource: string\n largeDocument: string\n tooLong: string\n pages: (n: number) => string\n tokens: (n: number) => string\n}\n\nexport const DEFAULT_DOCUMENT_PICKER_LABELS: DocumentPickerLabels = {\n placeholder: 'Select a document',\n searchDocuments: 'Search documents...',\n noDocuments: 'No documents found.',\n selectedAsSource: 'Selected as source',\n selectAsSource: 'Select as source',\n largeDocument: 'Large document — may take longer to process',\n tooLong: 'Document is too long to be read in its entirety',\n pages: (n) => `${n.toLocaleString()} pages`,\n tokens: (n) => `${n.toLocaleString()} tokens`,\n}\n\nexport interface DocumentPickerProps {\n groups: PickerGroup[]\n /** The picked document (single mode). */\n value: string\n onValueChange: (id: string) => void\n /** The picked document's details, shown under the picker (pages, tokens, size warnings). */\n selected?: PickerDocument\n /**\n * Ids already chosen. Supplying this switches to MULTI mode: the search box is inline, the\n * list stays open on select and ticks what is in.\n */\n selectedIds?: string[]\n /**\n * Splits each row in two: a click OPENS the document (this callback) and a leading checkbox\n * selects it as a source via `onValueChange`. Requires `selectedIds`.\n */\n onOpenDocument?: (id: string) => void\n /** The document open in the viewer: its row is inverted (multi mode). */\n viewingId?: string | null\n /** While true the list is shut (a neighbouring popup must not overlay it). */\n forceClosed?: boolean\n /** Extra classes of the results list, e.g. a taller `max-h-*` when the picker is the surface. */\n listClassName?: string\n labels?: Partial<DocumentPickerLabels>\n}\n\n/**\n * Searchable document picker. Single mode is a button that opens a searchable list; multi mode\n * puts the search inline. After a pick it shows page/token counts with size warnings.\n */\nexport function DocumentPicker({\n groups,\n value,\n onValueChange,\n selected,\n selectedIds,\n onOpenDocument,\n viewingId,\n forceClosed = false,\n listClassName,\n labels,\n}: DocumentPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels])\n const multi = selectedIds !== undefined\n const isChosen = (id: string) => (multi ? selectedIds.includes(id) : value === id)\n const [open, setOpen] = useState(false)\n useEffect(() => {\n if (forceClosed) setOpen(false)\n }, [forceClosed])\n const anchorRef = useRef<HTMLDivElement>(null)\n\n // A real checkbox when rows open on click; otherwise the tick that mirrors the pick.\n const leadingControl = (id: string): ReactNode =>\n onOpenDocument ? (\n // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would\n // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.\n <span\n className=\"mr-2 flex items-center\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isChosen(id)}\n onCheckedChange={() => onValueChange(id)}\n aria-label={isChosen(id) ? l.selectedAsSource : l.selectAsSource}\n data-testid={`document-combobox-select-${id}`}\n />\n </span>\n ) : (\n <Check className={cn('mr-2 size-4', isChosen(id) ? 'opacity-100' : 'opacity-0')} />\n )\n\n const itemClass = (id: string) =>\n cn(\n onOpenDocument && 'cursor-pointer',\n onOpenDocument && isChosen(id) && 'bg-primary/10 aria-selected:bg-primary/15',\n // Inverted so the open one is unmistakable, over cmdk's own hover tint.\n viewingId === id &&\n 'bg-foreground text-background data-[selected=true]:bg-foreground data-[selected=true]:text-background'\n )\n\n const renderGroups = () => (\n <>\n <CommandEmpty>{l.noDocuments}</CommandEmpty>\n {groups.map((group) => (\n <CommandGroup key={group.id} heading={group.heading}>\n {group.docs.map((doc) => (\n <CommandItem\n key={doc.id}\n // Identity is the id: two documents can share a name, and a title-valued item would\n // make cmdk treat them as one. The title stays searchable via keywords.\n value={doc.id}\n keywords={[doc.title]}\n className={itemClass(doc.id)}\n onSelect={() => {\n if (onOpenDocument) {\n onOpenDocument(doc.id)\n return\n }\n onValueChange(doc.id)\n if (!multi) setOpen(false)\n }}\n >\n {leadingControl(doc.id)}\n <span className=\"mr-2 flex shrink-0 items-center\">\n {getDocIcon(doc.fileName ?? undefined)}\n </span>\n <span className={cn('truncate', onOpenDocument && 'hover:underline')}>\n {doc.title}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </>\n )\n\n const contentClass = 'w-[var(--radix-popover-trigger-width)] border-0 bg-muted p-0 shadow-md'\n const tokens = selected?.tokens ?? null\n const pages = selected?.pages ?? null\n const isDanger = tokens != null && tokens > TOKEN_DANGER_THRESHOLD\n const isWarning = tokens != null && tokens > TOKEN_WARNING_THRESHOLD && !isDanger\n\n return (\n <div data-slot=\"document-picker\">\n {multi ? (\n // The input IS the anchor: the list opens beneath the row as soon as it is focused or\n // typed into. cmdk's context reaches the portaled list, so arrows/Enter still drive it.\n <Command>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n ref={anchorRef}\n className=\"flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 shadow-sm transition-colors focus-within:ring-1 focus-within:ring-ring pointer-coarse:h-11\"\n data-testid=\"document-combobox-trigger\"\n >\n <Search className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={l.placeholder}\n aria-expanded={open}\n className=\"h-full w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n onFocus={() => setOpen(true)}\n onValueChange={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') setOpen(true)\n if (e.key === 'Escape') setOpen(false)\n }}\n data-testid=\"document-combobox-search\"\n />\n </div>\n </PopoverAnchor>\n <PopoverContent\n className={contentClass}\n align=\"start\"\n // Focus stays in the inline input, and opening a document hands focus to the viewer:\n // neither may count as an outside click. Pointer-downs in the viewer, dialogs and\n // poppers are ignored; Escape and any other outside click still close the list.\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => {\n const target = e.target as Element | null\n if (\n anchorRef.current?.contains(target) ||\n target?.closest(\n '[data-testid=\"parsed-viewer\"], [role=\"dialog\"], [data-radix-popper-content-wrapper]'\n )\n ) {\n e.preventDefault()\n }\n }}\n >\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </PopoverContent>\n </Popover>\n </Command>\n ) : (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n 'flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring md:text-sm pointer-coarse:h-11',\n !value && 'text-muted-foreground'\n )}\n data-testid=\"document-combobox-trigger\"\n >\n <span className=\"truncate\">{selected?.title || l.placeholder}</span>\n <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className={contentClass} align=\"start\">\n <Command>\n <CommandInput placeholder={l.searchDocuments} />\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n\n {selected && (\n <div className=\"mt-2 space-y-1\" data-testid=\"document-combobox-info\">\n <p className=\"text-sm text-muted-foreground\">\n {pages != null && <span>{l.pages(pages)}</span>}\n {pages != null && tokens != null && <span> · </span>}\n {tokens != null && <span>{l.tokens(tokens)}</span>}\n </p>\n {isWarning && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-yellow-text\"\n data-testid=\"document-combobox-warning\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.largeDocument}\n </p>\n )}\n {isDanger && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-red-text\"\n data-testid=\"document-combobox-danger\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.tooLong}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkPSTA227J_cjs = require('./chunk-PSTA227J.cjs');
4
+ var chunkNG6AGVZ4_cjs = require('./chunk-NG6AGVZ4.cjs');
5
5
  var chunkZVJA66P7_cjs = require('./chunk-ZVJA66P7.cjs');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -9,10 +9,10 @@ function ConnectedNativeDocxComparison({
9
9
  fontBaseUrl,
10
10
  ...props
11
11
  }) {
12
- const adapter = chunkPSTA227J_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
12
+ const adapter = chunkNG6AGVZ4_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
13
13
  return /* @__PURE__ */ jsxRuntime.jsx(chunkZVJA66P7_cjs.NativeDocxComparison, { ...props, adapter, onCompared: adapter.onVersionSaved });
14
14
  }
15
15
 
16
16
  exports.ConnectedNativeDocxComparison = ConnectedNativeDocxComparison;
17
- //# sourceMappingURL=chunk-6HPBSKXG.cjs.map
18
- //# sourceMappingURL=chunk-6HPBSKXG.cjs.map
17
+ //# sourceMappingURL=chunk-XUKQQCOK.cjs.map
18
+ //# sourceMappingURL=chunk-XUKQQCOK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":["useConnectedNativeDocxAdapter","NativeDocxComparison"],"mappings":";;;;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,sCAAQC,sCAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-6HPBSKXG.cjs","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":["useConnectedNativeDocxAdapter","NativeDocxComparison"],"mappings":";;;;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,sCAAQC,sCAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-XUKQQCOK.cjs","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk6HPBSKXG_cjs = require('../chunk-6HPBSKXG.cjs');
5
- var chunkTUODUKDK_cjs = require('../chunk-TUODUKDK.cjs');
6
- var chunkPSTA227J_cjs = require('../chunk-PSTA227J.cjs');
4
+ var chunkXUKQQCOK_cjs = require('../chunk-XUKQQCOK.cjs');
5
+ var chunkDP4GMPI3_cjs = require('../chunk-DP4GMPI3.cjs');
6
+ var chunkNG6AGVZ4_cjs = require('../chunk-NG6AGVZ4.cjs');
7
7
  require('../chunk-ZVJA66P7.cjs');
8
8
  require('../chunk-Z2CVGUWR.cjs');
9
9
  require('../chunk-464YPRAE.cjs');
@@ -12,14 +12,15 @@ require('../chunk-5FYU7ZIU.cjs');
12
12
  require('../chunk-JPWPR6QU.cjs');
13
13
  require('../chunk-QT3A4PFC.cjs');
14
14
  require('../chunk-RC25WMVB.cjs');
15
- require('../chunk-M6Z7HTJ2.cjs');
15
+ require('../chunk-6TE3QA3Y.cjs');
16
16
  require('../chunk-BYCGAAV5.cjs');
17
- require('../chunk-2VHYOTWW.cjs');
17
+ require('../chunk-AQPZ4QMV.cjs');
18
18
  require('../chunk-V4ISCZJ7.cjs');
19
19
  require('../chunk-AHDJXIUB.cjs');
20
20
  require('../chunk-2EI7NCUA.cjs');
21
21
  require('../chunk-HSAEIBRA.cjs');
22
22
  require('../chunk-C2CWWEHO.cjs');
23
+ require('../chunk-VZOOGA47.cjs');
23
24
  require('../chunk-QGSVHWXR.cjs');
24
25
  require('../chunk-3LDVSHRD.cjs');
25
26
  require('../chunk-MB3S2ETI.cjs');
@@ -41,19 +42,19 @@ require('../chunk-DES3K4SD.cjs');
41
42
 
42
43
  Object.defineProperty(exports, "ConnectedNativeDocxComparison", {
43
44
  enumerable: true,
44
- get: function () { return chunk6HPBSKXG_cjs.ConnectedNativeDocxComparison; }
45
+ get: function () { return chunkXUKQQCOK_cjs.ConnectedNativeDocxComparison; }
45
46
  });
46
47
  Object.defineProperty(exports, "ConnectedStreamedWordArtifact", {
47
48
  enumerable: true,
48
- get: function () { return chunkTUODUKDK_cjs.ConnectedStreamedWordArtifact; }
49
+ get: function () { return chunkDP4GMPI3_cjs.ConnectedStreamedWordArtifact; }
49
50
  });
50
51
  Object.defineProperty(exports, "ConnectedNativeDocxEditor", {
51
52
  enumerable: true,
52
- get: function () { return chunkPSTA227J_cjs.ConnectedNativeDocxEditor; }
53
+ get: function () { return chunkNG6AGVZ4_cjs.ConnectedNativeDocxEditor; }
53
54
  });
54
55
  Object.defineProperty(exports, "useConnectedNativeDocxAdapter", {
55
56
  enumerable: true,
56
- get: function () { return chunkPSTA227J_cjs.useConnectedNativeDocxAdapter; }
57
+ get: function () { return chunkNG6AGVZ4_cjs.useConnectedNativeDocxAdapter; }
57
58
  });
58
59
  //# sourceMappingURL=docx.cjs.map
59
60
  //# sourceMappingURL=docx.cjs.map