@arbidocs/blocks 0.5.123 → 0.5.124

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 (117) hide show
  1. package/dist/{ClippingMediaViewer-IEIBT74X.cjs → ClippingMediaViewer-ZFEX5A3U.cjs} +11 -10
  2. package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +1 -0
  3. package/dist/{ClippingPdfViewer-OGYLMVCE.cjs → ClippingPdfViewer-3LRTEPHV.cjs} +45 -11
  4. package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +1 -0
  5. package/dist/ConnectedNativeDocxComparison-QKHCYD6W.cjs +1 -1
  6. package/dist/{ConnectedPresentation-5DOJ35XL.cjs → ConnectedPresentation-OV2KBOLK.cjs} +27 -153
  7. package/dist/ConnectedPresentation-OV2KBOLK.cjs.map +1 -0
  8. package/dist/{ConnectedSlidesTab-7YMEDGUU.cjs → ConnectedSlidesTab-LUAGZ6FD.cjs} +29 -27
  9. package/dist/ConnectedSlidesTab-LUAGZ6FD.cjs.map +1 -0
  10. package/dist/ConnectedStreamedWordArtifact-AG62232A.cjs +1 -1
  11. package/dist/{FilesViewerDialog-2QCCRWF2.cjs → FilesViewerDialog-JWKNJLWG.cjs} +12 -9
  12. package/dist/FilesViewerDialog-JWKNJLWG.cjs.map +1 -0
  13. package/dist/SpotlightStrip-ED22UYTM.cjs +398 -0
  14. package/dist/SpotlightStrip-ED22UYTM.cjs.map +1 -0
  15. package/dist/agents/index.cjs +176 -176
  16. package/dist/{chunk-46P7IDBX.cjs → chunk-3IH55CDE.cjs} +3 -3
  17. package/dist/chunk-3IH55CDE.cjs.map +1 -0
  18. package/dist/chunk-3ZZZO4F7.cjs +145 -0
  19. package/dist/chunk-3ZZZO4F7.cjs.map +1 -0
  20. package/dist/{chunk-WFMWKPGY.cjs → chunk-ADPRIBSH.cjs} +9 -33
  21. package/dist/chunk-ADPRIBSH.cjs.map +1 -0
  22. package/dist/{chunk-JD2HX2BR.cjs → chunk-BX6G2ZCI.cjs} +58 -86
  23. package/dist/chunk-BX6G2ZCI.cjs.map +1 -0
  24. package/dist/{chunk-NQML7IUC.cjs → chunk-CQQQIZU4.cjs} +3 -3
  25. package/dist/{chunk-NQML7IUC.cjs.map → chunk-CQQQIZU4.cjs.map} +1 -1
  26. package/dist/{chunk-SNPK3R3O.cjs → chunk-EMRY62HS.cjs} +5 -5
  27. package/dist/{chunk-SNPK3R3O.cjs.map → chunk-EMRY62HS.cjs.map} +1 -1
  28. package/dist/{chunk-DWMWEALB.cjs → chunk-H236SNEV.cjs} +143 -1634
  29. package/dist/chunk-H236SNEV.cjs.map +1 -0
  30. package/dist/chunk-JITYC4OS.cjs +66 -0
  31. package/dist/chunk-JITYC4OS.cjs.map +1 -0
  32. package/dist/chunk-JY7UUZQG.cjs +1513 -0
  33. package/dist/chunk-JY7UUZQG.cjs.map +1 -0
  34. package/dist/chunk-MVXHTAJ4.cjs +111 -0
  35. package/dist/chunk-MVXHTAJ4.cjs.map +1 -0
  36. package/dist/{chunk-4TTX6ZNS.cjs → chunk-ORNLCBNE.cjs} +24 -2
  37. package/dist/chunk-ORNLCBNE.cjs.map +1 -0
  38. package/dist/{chunk-L4CIFLCU.cjs → chunk-QG2U2JGX.cjs} +4 -4
  39. package/dist/{chunk-L4CIFLCU.cjs.map → chunk-QG2U2JGX.cjs.map} +1 -1
  40. package/dist/chunk-WVZLAAIZ.cjs +31 -0
  41. package/dist/chunk-WVZLAAIZ.cjs.map +1 -0
  42. package/dist/{chunk-WV7BCGCK.cjs → chunk-XGM4VVNV.cjs} +19 -19
  43. package/dist/{chunk-WV7BCGCK.cjs.map → chunk-XGM4VVNV.cjs.map} +1 -1
  44. package/dist/chunk-ZZZITHGK.cjs +119 -0
  45. package/dist/chunk-ZZZITHGK.cjs.map +1 -0
  46. package/dist/connect/docx.cjs +1 -1
  47. package/dist/connect/index.cjs +175 -175
  48. package/dist/connect/viewer.cjs +10 -7
  49. package/dist/connection/presentation/ClippingMediaViewer.js +3 -3
  50. package/dist/connection/presentation/ClippingMediaViewer.js.map +2 -2
  51. package/dist/connection/presentation/ClippingPdfViewer.d.ts +4 -3
  52. package/dist/connection/presentation/ClippingPdfViewer.js +48 -9
  53. package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
  54. package/dist/connection/presentation/SpotlightLayer.d.ts +5 -0
  55. package/dist/connection/presentation/SpotlightLayer.js +19 -0
  56. package/dist/connection/presentation/SpotlightLayer.js.map +7 -0
  57. package/dist/connection/presentation/SpotlightStrip.d.ts +10 -0
  58. package/dist/connection/presentation/SpotlightStrip.js +237 -0
  59. package/dist/connection/presentation/SpotlightStrip.js.map +7 -0
  60. package/dist/connection/presentation/useViewerClipping.d.ts +4 -3
  61. package/dist/connection/presentation/useViewerClipping.js +8 -4
  62. package/dist/connection/presentation/useViewerClipping.js.map +2 -2
  63. package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
  64. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  65. package/dist/connection/viewer/pdf/passageHighlights.d.ts +5 -0
  66. package/dist/connection/viewer/pdf/passageHighlights.js +14 -1
  67. package/dist/connection/viewer/pdf/passageHighlights.js.map +2 -2
  68. package/dist/connection/viewer/useCleanView.d.ts +3 -1
  69. package/dist/connection/viewer/useCleanView.js +6 -3
  70. package/dist/connection/viewer/useCleanView.js.map +2 -2
  71. package/dist/document-tools/DocumentToolButtons.js +1 -1
  72. package/dist/document-tools/DocumentToolButtons.js.map +1 -1
  73. package/dist/document-tools/index.cjs +13 -13
  74. package/dist/embed/index.cjs +2 -2
  75. package/dist/index.cjs +239 -239
  76. package/dist/presentation/ClipCaptureOverlay.d.ts +7 -3
  77. package/dist/presentation/ClipCaptureOverlay.js +43 -14
  78. package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
  79. package/dist/presentation/PresentControls.d.ts +8 -0
  80. package/dist/presentation/PresentControls.js +1 -0
  81. package/dist/presentation/PresentControls.js.map +2 -2
  82. package/dist/presentation/PresentationStage.d.ts +10 -2
  83. package/dist/presentation/PresentationStage.js +6 -3
  84. package/dist/presentation/PresentationStage.js.map +2 -2
  85. package/dist/presentation/PresenterView.js +1 -22
  86. package/dist/presentation/PresenterView.js.map +2 -2
  87. package/dist/presentation/SpotlightView.d.ts +19 -0
  88. package/dist/presentation/SpotlightView.js +180 -0
  89. package/dist/presentation/SpotlightView.js.map +7 -0
  90. package/dist/presentation/passage-clip.d.ts +17 -0
  91. package/dist/presentation/passage-clip.js +25 -0
  92. package/dist/presentation/passage-clip.js.map +7 -0
  93. package/dist/presentation/spotlight.d.ts +58 -0
  94. package/dist/presentation/spotlight.js +110 -0
  95. package/dist/presentation/spotlight.js.map +7 -0
  96. package/dist/presentation/store.d.ts +5 -0
  97. package/dist/presentation/store.js +19 -0
  98. package/dist/presentation/store.js.map +2 -2
  99. package/dist/presentation/usePointerActive.d.ts +2 -0
  100. package/dist/presentation/usePointerActive.js +28 -0
  101. package/dist/presentation/usePointerActive.js.map +7 -0
  102. package/dist/styles.css +1 -1
  103. package/dist/workflow-canvas/index.cjs +12 -12
  104. package/node_modules/@arbidocs/coedit/package.json +1 -1
  105. package/package.json +5 -5
  106. package/dist/ClippingMediaViewer-IEIBT74X.cjs.map +0 -1
  107. package/dist/ClippingPdfViewer-OGYLMVCE.cjs.map +0 -1
  108. package/dist/ConnectedPresentation-5DOJ35XL.cjs.map +0 -1
  109. package/dist/ConnectedSlidesTab-7YMEDGUU.cjs.map +0 -1
  110. package/dist/FilesViewerDialog-2QCCRWF2.cjs.map +0 -1
  111. package/dist/chunk-46P7IDBX.cjs.map +0 -1
  112. package/dist/chunk-4TTX6ZNS.cjs.map +0 -1
  113. package/dist/chunk-DWMWEALB.cjs.map +0 -1
  114. package/dist/chunk-JD2HX2BR.cjs.map +0 -1
  115. package/dist/chunk-WFMWKPGY.cjs.map +0 -1
  116. package/dist/chunk-XK4TVJKD.cjs +0 -73
  117. package/dist/chunk-XK4TVJKD.cjs.map +0 -1
@@ -0,0 +1,119 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var annotations = require('@arbidocs/react/annotations');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/presentation/passage-clip.ts
9
+ var PASSAGE_MARGIN_X = 0.015;
10
+ var PASSAGE_MARGIN_Y = 8e-3;
11
+ function passageClipRect([x0, y0, x1, y1]) {
12
+ const left = Math.max(0, x0 - PASSAGE_MARGIN_X);
13
+ const top = Math.max(0, y0 - PASSAGE_MARGIN_Y);
14
+ const right = Math.min(1, x1 + PASSAGE_MARGIN_X);
15
+ const bottom = Math.min(1, y1 + PASSAGE_MARGIN_Y);
16
+ return { x: left, y: top, w: right - left, h: bottom - top };
17
+ }
18
+ function passageAt(passages, x, y) {
19
+ let best = null;
20
+ for (const passage of passages) {
21
+ const inside = x >= passage.x && x <= passage.x + passage.w && y >= passage.y && y <= passage.y + passage.h;
22
+ if (inside && (!best || passage.w * passage.h < best.w * best.h)) best = passage;
23
+ }
24
+ return best;
25
+ }
26
+ var MIN_CLIP_FRACTION = 0.02;
27
+ var percent = (rect) => ({
28
+ left: `${rect.x * 100}%`,
29
+ top: `${rect.y * 100}%`,
30
+ width: `${rect.w * 100}%`,
31
+ height: `${rect.h * 100}%`
32
+ });
33
+ function ClipCaptureOverlay({ page, passages = [], onCapture }) {
34
+ const start = react.useRef(null);
35
+ const [draft, setDraft] = react.useState(null);
36
+ const [hovered, setHovered] = react.useState(null);
37
+ const point = (event, box) => ({
38
+ x: event.clientX - box.left,
39
+ y: event.clientY - box.top
40
+ });
41
+ const passageUnder = (event, box) => {
42
+ if (!passages.length || !box.width || !box.height) return null;
43
+ const p = point(event, box);
44
+ return passageAt(passages, p.x / box.width, p.y / box.height);
45
+ };
46
+ const onPointerDown = (event) => {
47
+ if (event.button !== 0) return;
48
+ event.preventDefault();
49
+ event.currentTarget.setPointerCapture?.(event.pointerId);
50
+ const box = event.currentTarget.getBoundingClientRect();
51
+ start.current = { ...point(event, box), box };
52
+ setDraft(null);
53
+ };
54
+ const onPointerMove = (event) => {
55
+ const s = start.current;
56
+ if (!s) {
57
+ const next = passageUnder(event, event.currentTarget.getBoundingClientRect());
58
+ if (next !== hovered) setHovered(next);
59
+ return;
60
+ }
61
+ const p = point(event, s.box);
62
+ setDraft({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y });
63
+ };
64
+ const onPointerUp = (event) => {
65
+ const s = start.current;
66
+ start.current = null;
67
+ setDraft(null);
68
+ if (!s) return;
69
+ const p = point(event, s.box);
70
+ const size = { width: s.box.width, height: s.box.height };
71
+ const dragged = annotations.toNorm({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y }, size);
72
+ const rect = dragged.w < MIN_CLIP_FRACTION || dragged.h < MIN_CLIP_FRACTION ? passageUnder(event, s.box) : dragged;
73
+ if (!rect) return;
74
+ onCapture({ page, rect, aspect: rect.w * size.width / (rect.h * size.height) });
75
+ };
76
+ const shown = draft && {
77
+ left: Math.min(draft.x, draft.x + draft.width),
78
+ top: Math.min(draft.y, draft.y + draft.height),
79
+ width: Math.abs(draft.width),
80
+ height: Math.abs(draft.height)
81
+ };
82
+ return /* @__PURE__ */ jsxRuntime.jsxs(
83
+ "div",
84
+ {
85
+ className: "absolute inset-0 z-20 cursor-crosshair touch-none select-none",
86
+ onPointerDown,
87
+ onPointerMove,
88
+ onPointerUp,
89
+ onPointerLeave: () => setHovered(null),
90
+ onPointerCancel: () => {
91
+ start.current = null;
92
+ setDraft(null);
93
+ },
94
+ "data-testid": `clip-capture-${page}`,
95
+ children: [
96
+ hovered && !draft && /* @__PURE__ */ jsxRuntime.jsx(
97
+ "div",
98
+ {
99
+ className: "pointer-events-none absolute rounded-sm bg-ai-soft/40 ring-2 ring-ai-accent",
100
+ style: percent(hovered),
101
+ "data-testid": "clip-passage-outline"
102
+ }
103
+ ),
104
+ shown && /* @__PURE__ */ jsxRuntime.jsx(
105
+ "div",
106
+ {
107
+ className: "pointer-events-none absolute border-2 border-dashed border-primary bg-primary/10",
108
+ style: shown
109
+ }
110
+ )
111
+ ]
112
+ }
113
+ );
114
+ }
115
+
116
+ exports.ClipCaptureOverlay = ClipCaptureOverlay;
117
+ exports.passageClipRect = passageClipRect;
118
+ //# sourceMappingURL=chunk-ZZZITHGK.cjs.map
119
+ //# sourceMappingURL=chunk-ZZZITHGK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presentation/passage-clip.ts","../src/presentation/ClipCaptureOverlay.tsx"],"names":["useRef","useState","toNorm","jsxs","jsx"],"mappings":"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","file":"chunk-ZZZITHGK.cjs","sourcesContent":["/**\n * Clipping a passage with one click: the parser places each passage on its page (`page_bbox`,\n * fractions of the page), so in clip mode the passage under the pointer is outlined and a click\n * clips exactly its box, with a little room around it — the same room the server leaves when it\n * clips a passage for a slide (`PASSAGE_MARGIN_X` / `_Y` in its presentation tool).\n */\n\nimport type { Rect } from './model'\n\n/** Room kept around a clipped passage, as fractions of the page's width and height. */\nexport const PASSAGE_MARGIN_X = 0.015\nexport const PASSAGE_MARGIN_Y = 0.008\n\n/** A passage's box `[x0, y0, x1, y1]` as the area to clip: with its margin, kept on the page. */\nexport function passageClipRect([x0, y0, x1, y1]: readonly [number, number, number, number]): Rect {\n const left = Math.max(0, x0 - PASSAGE_MARGIN_X)\n const top = Math.max(0, y0 - PASSAGE_MARGIN_Y)\n const right = Math.min(1, x1 + PASSAGE_MARGIN_X)\n const bottom = Math.min(1, y1 + PASSAGE_MARGIN_Y)\n return { x: left, y: top, w: right - left, h: bottom - top }\n}\n\n/**\n * The passage at a point of the page (fractions), if any: the smallest one holding it, so a\n * caption inside a figure's box wins over the figure.\n */\nexport function passageAt(passages: readonly Rect[], x: number, y: number): Rect | null {\n let best: Rect | null = null\n for (const passage of passages) {\n const inside =\n x >= passage.x && x <= passage.x + passage.w && y >= passage.y && y <= passage.y + passage.h\n if (inside && (!best || passage.w * passage.h < best.w * best.h)) best = passage\n }\n return best\n}\n","/**\n * Over a page while clipping. A click on a passage clips exactly that passage (the parser placed it\n * on the page; it is outlined under the pointer); a drag clips any rectangle (a figure, a scan, a\n * page with no passages). Either way the area is kept as fractions of the page (`toNorm`), so it\n * does not depend on the zoom it was taken at.\n */\n\nimport { useRef, useState, type PointerEvent as ReactPointerEvent } from 'react'\nimport { toNorm, type PixelRect } from '@arbidocs/react/annotations'\nimport type { Rect } from './model'\nimport { passageAt } from './passage-clip'\n\n/** Smaller than this (a fraction of the page, either side) is a click, not a dragged clip. */\nconst MIN_CLIP_FRACTION = 0.02\n\nexport interface ClipCaptureOverlayProps {\n page: number\n /** The page's passages, as the areas a click clips (page fractions, margin included). */\n passages?: readonly Rect[]\n onCapture: (capture: { page: number; rect: Rect; aspect: number }) => void\n}\n\nconst percent = (rect: Rect) => ({\n left: `${rect.x * 100}%`,\n top: `${rect.y * 100}%`,\n width: `${rect.w * 100}%`,\n height: `${rect.h * 100}%`,\n})\n\nexport function ClipCaptureOverlay({ page, passages = [], onCapture }: ClipCaptureOverlayProps) {\n const start = useRef<{ x: number; y: number; box: DOMRect } | null>(null)\n const [draft, setDraft] = useState<PixelRect | null>(null)\n const [hovered, setHovered] = useState<Rect | null>(null)\n\n const point = (event: ReactPointerEvent, box: DOMRect) => ({\n x: event.clientX - box.left,\n y: event.clientY - box.top,\n })\n /** The passage under the pointer, if any. */\n const passageUnder = (event: ReactPointerEvent, box: DOMRect) => {\n if (!passages.length || !box.width || !box.height) return null\n const p = point(event, box)\n return passageAt(passages, p.x / box.width, p.y / box.height)\n }\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return\n event.preventDefault()\n event.currentTarget.setPointerCapture?.(event.pointerId)\n const box = event.currentTarget.getBoundingClientRect()\n start.current = { ...point(event, box), box }\n setDraft(null)\n }\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const s = start.current\n if (!s) {\n const next = passageUnder(event, event.currentTarget.getBoundingClientRect())\n if (next !== hovered) setHovered(next)\n return\n }\n const p = point(event, s.box)\n setDraft({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y })\n }\n\n const onPointerUp = (event: ReactPointerEvent) => {\n const s = start.current\n start.current = null\n setDraft(null)\n if (!s) return\n const p = point(event, s.box)\n const size = { width: s.box.width, height: s.box.height }\n const dragged = toNorm({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y }, size)\n // A click: the passage under it, if there is one.\n const rect =\n dragged.w < MIN_CLIP_FRACTION || dragged.h < MIN_CLIP_FRACTION\n ? passageUnder(event, s.box)\n : dragged\n if (!rect) return\n onCapture({ page, rect, aspect: (rect.w * size.width) / (rect.h * size.height) })\n }\n\n const shown = draft && {\n left: Math.min(draft.x, draft.x + draft.width),\n top: Math.min(draft.y, draft.y + draft.height),\n width: Math.abs(draft.width),\n height: Math.abs(draft.height),\n }\n\n return (\n <div\n className=\"absolute inset-0 z-20 cursor-crosshair touch-none select-none\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={() => setHovered(null)}\n onPointerCancel={() => {\n start.current = null\n setDraft(null)\n }}\n data-testid={`clip-capture-${page}`}\n >\n {/* The passage a click would clip, exactly as it would be clipped. */}\n {hovered && !draft && (\n <div\n className=\"pointer-events-none absolute rounded-sm bg-ai-soft/40 ring-2 ring-ai-accent\"\n style={percent(hovered)}\n data-testid=\"clip-passage-outline\"\n />\n )}\n {shown && (\n <div\n className=\"pointer-events-none absolute border-2 border-dashed border-primary bg-primary/10\"\n style={shown}\n />\n )}\n </div>\n )\n}\n"]}
@@ -23,9 +23,9 @@ require('../chunk-3YEXZX4H.cjs');
23
23
  require('../chunk-4PA6VCCR.cjs');
24
24
  require('../chunk-WXUU3COI.cjs');
25
25
  require('../chunk-AHDJXIUB.cjs');
26
- require('../chunk-YVCOQHCE.cjs');
27
26
  require('../chunk-RL2HI6NP.cjs');
28
27
  require('../chunk-6UZC4XVV.cjs');
28
+ require('../chunk-YVCOQHCE.cjs');
29
29
  require('../chunk-JV5TVUOU.cjs');
30
30
  require('../chunk-ZVEW3JBT.cjs');
31
31
  require('../chunk-VZOOGA47.cjs');