@arbidocs/blocks 0.5.122 → 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.
- package/dist/{ClippingMediaViewer-IEIBT74X.cjs → ClippingMediaViewer-ZFEX5A3U.cjs} +11 -10
- package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +1 -0
- package/dist/{ClippingPdfViewer-OGYLMVCE.cjs → ClippingPdfViewer-3LRTEPHV.cjs} +45 -11
- package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +1 -0
- package/dist/{ConnectedPresentation-AU25OW25.cjs → ConnectedPresentation-OV2KBOLK.cjs} +27 -153
- package/dist/ConnectedPresentation-OV2KBOLK.cjs.map +1 -0
- package/dist/{ConnectedSlidesTab-I75LKKN7.cjs → ConnectedSlidesTab-LUAGZ6FD.cjs} +60 -36
- package/dist/ConnectedSlidesTab-LUAGZ6FD.cjs.map +1 -0
- package/dist/{FilesViewerDialog-4352KIOG.cjs → FilesViewerDialog-JWKNJLWG.cjs} +10 -7
- package/dist/FilesViewerDialog-JWKNJLWG.cjs.map +1 -0
- package/dist/SpotlightStrip-ED22UYTM.cjs +398 -0
- package/dist/SpotlightStrip-ED22UYTM.cjs.map +1 -0
- package/dist/{chunk-LHWOKOMP.cjs → chunk-3IH55CDE.cjs} +4 -4
- package/dist/chunk-3IH55CDE.cjs.map +1 -0
- package/dist/chunk-3ZZZO4F7.cjs +145 -0
- package/dist/chunk-3ZZZO4F7.cjs.map +1 -0
- package/dist/{chunk-WFMWKPGY.cjs → chunk-ADPRIBSH.cjs} +9 -33
- package/dist/chunk-ADPRIBSH.cjs.map +1 -0
- package/dist/{chunk-UTJ223TI.cjs → chunk-BX6G2ZCI.cjs} +138 -146
- package/dist/chunk-BX6G2ZCI.cjs.map +1 -0
- package/dist/{chunk-WRLGLZIA.cjs → chunk-EMRY62HS.cjs} +2 -2
- package/dist/{chunk-WRLGLZIA.cjs.map → chunk-EMRY62HS.cjs.map} +1 -1
- package/dist/{chunk-USNTRL22.cjs → chunk-H236SNEV.cjs} +199 -1616
- package/dist/chunk-H236SNEV.cjs.map +1 -0
- package/dist/chunk-JITYC4OS.cjs +66 -0
- package/dist/chunk-JITYC4OS.cjs.map +1 -0
- package/dist/chunk-JY7UUZQG.cjs +1513 -0
- package/dist/chunk-JY7UUZQG.cjs.map +1 -0
- package/dist/chunk-MVXHTAJ4.cjs +111 -0
- package/dist/chunk-MVXHTAJ4.cjs.map +1 -0
- package/dist/{chunk-4TTX6ZNS.cjs → chunk-ORNLCBNE.cjs} +24 -2
- package/dist/chunk-ORNLCBNE.cjs.map +1 -0
- package/dist/chunk-WVZLAAIZ.cjs +31 -0
- package/dist/chunk-WVZLAAIZ.cjs.map +1 -0
- package/dist/chunk-ZZZITHGK.cjs +119 -0
- package/dist/chunk-ZZZITHGK.cjs.map +1 -0
- package/dist/connect/index.cjs +52 -52
- package/dist/connect/viewer.cjs +8 -5
- package/dist/connection/presentation/ClippingMediaViewer.js +3 -3
- package/dist/connection/presentation/ClippingMediaViewer.js.map +2 -2
- package/dist/connection/presentation/ClippingPdfViewer.d.ts +4 -3
- package/dist/connection/presentation/ClippingPdfViewer.js +48 -9
- package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
- package/dist/connection/presentation/ConnectedSlidesTab.js +35 -13
- package/dist/connection/presentation/ConnectedSlidesTab.js.map +2 -2
- package/dist/connection/presentation/SpotlightLayer.d.ts +5 -0
- package/dist/connection/presentation/SpotlightLayer.js +19 -0
- package/dist/connection/presentation/SpotlightLayer.js.map +7 -0
- package/dist/connection/presentation/SpotlightStrip.d.ts +10 -0
- package/dist/connection/presentation/SpotlightStrip.js +237 -0
- package/dist/connection/presentation/SpotlightStrip.js.map +7 -0
- package/dist/connection/presentation/useViewerClipping.d.ts +4 -3
- package/dist/connection/presentation/useViewerClipping.js +8 -4
- package/dist/connection/presentation/useViewerClipping.js.map +2 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js +52 -61
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/ViewerMoreMenu.d.ts +18 -0
- package/dist/connection/viewer/ViewerMoreMenu.js +45 -0
- package/dist/connection/viewer/ViewerMoreMenu.js.map +7 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js +3 -2
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +2 -2
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +5 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +14 -1
- package/dist/connection/viewer/pdf/passageHighlights.js.map +2 -2
- package/dist/connection/viewer/useCleanView.d.ts +3 -1
- package/dist/connection/viewer/useCleanView.js +6 -3
- package/dist/connection/viewer/useCleanView.js.map +2 -2
- package/dist/document-tools/DocumentToolButtons.js +3 -3
- package/dist/document-tools/DocumentToolButtons.js.map +2 -2
- package/dist/document-tools/index.cjs +13 -13
- package/dist/index.cjs +53 -53
- package/dist/presentation/BoxActionBar.d.ts +2 -2
- package/dist/presentation/BoxActionBar.js +62 -30
- package/dist/presentation/BoxActionBar.js.map +2 -2
- package/dist/presentation/ClipActionBar.js +60 -7
- package/dist/presentation/ClipActionBar.js.map +2 -2
- package/dist/presentation/ClipCaptureOverlay.d.ts +7 -3
- package/dist/presentation/ClipCaptureOverlay.js +43 -14
- package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
- package/dist/presentation/ClipViewControls.d.ts +3 -3
- package/dist/presentation/ClipViewControls.js +59 -64
- package/dist/presentation/ClipViewControls.js.map +2 -2
- package/dist/presentation/PresentControls.d.ts +8 -0
- package/dist/presentation/PresentControls.js +1 -0
- package/dist/presentation/PresentControls.js.map +2 -2
- package/dist/presentation/PresentationStage.d.ts +10 -2
- package/dist/presentation/PresentationStage.js +6 -3
- package/dist/presentation/PresentationStage.js.map +2 -2
- package/dist/presentation/PresenterView.js +1 -22
- package/dist/presentation/PresenterView.js.map +2 -2
- package/dist/presentation/SlidesEditor.js +56 -42
- package/dist/presentation/SlidesEditor.js.map +2 -2
- package/dist/presentation/SpotlightView.d.ts +19 -0
- package/dist/presentation/SpotlightView.js +180 -0
- package/dist/presentation/SpotlightView.js.map +7 -0
- package/dist/presentation/StageItem.js +0 -5
- package/dist/presentation/StageItem.js.map +2 -2
- package/dist/presentation/passage-clip.d.ts +17 -0
- package/dist/presentation/passage-clip.js +25 -0
- package/dist/presentation/passage-clip.js.map +7 -0
- package/dist/presentation/spotlight.d.ts +58 -0
- package/dist/presentation/spotlight.js +110 -0
- package/dist/presentation/spotlight.js.map +7 -0
- package/dist/presentation/store.d.ts +5 -0
- package/dist/presentation/store.js +19 -0
- package/dist/presentation/store.js.map +2 -2
- package/dist/presentation/usePointerActive.d.ts +2 -0
- package/dist/presentation/usePointerActive.js +28 -0
- package/dist/presentation/usePointerActive.js.map +7 -0
- package/dist/styles.css +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ClippingMediaViewer-IEIBT74X.cjs.map +0 -1
- package/dist/ClippingPdfViewer-OGYLMVCE.cjs.map +0 -1
- package/dist/ConnectedPresentation-AU25OW25.cjs.map +0 -1
- package/dist/ConnectedSlidesTab-I75LKKN7.cjs.map +0 -1
- package/dist/FilesViewerDialog-4352KIOG.cjs.map +0 -1
- package/dist/chunk-4TTX6ZNS.cjs.map +0 -1
- package/dist/chunk-LHWOKOMP.cjs.map +0 -1
- package/dist/chunk-USNTRL22.cjs.map +0 -1
- package/dist/chunk-UTJ223TI.cjs.map +0 -1
- package/dist/chunk-WFMWKPGY.cjs.map +0 -1
- package/dist/chunk-XK4TVJKD.cjs +0 -73
- package/dist/chunk-XK4TVJKD.cjs.map +0 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkADPRIBSH_cjs = require('./chunk-ADPRIBSH.cjs');
|
|
5
|
+
var chunkORNLCBNE_cjs = require('./chunk-ORNLCBNE.cjs');
|
|
6
|
+
var lucideReact = require('lucide-react');
|
|
7
|
+
var ui = require('@arbidocs/react/ui');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
var react = require('react');
|
|
10
|
+
|
|
11
|
+
var CONTROL = "inline-flex size-8 items-center justify-center rounded-full text-white/85 hover:bg-white/15 hover:text-white disabled:opacity-30 disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 pointer-coarse:size-11";
|
|
12
|
+
function Control({
|
|
13
|
+
label,
|
|
14
|
+
onClick,
|
|
15
|
+
disabled,
|
|
16
|
+
children,
|
|
17
|
+
testId
|
|
18
|
+
}) {
|
|
19
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
20
|
+
"button",
|
|
21
|
+
{
|
|
22
|
+
type: "button",
|
|
23
|
+
className: CONTROL,
|
|
24
|
+
title: label,
|
|
25
|
+
"aria-label": label,
|
|
26
|
+
disabled,
|
|
27
|
+
onClick: (event) => {
|
|
28
|
+
event.stopPropagation();
|
|
29
|
+
onClick();
|
|
30
|
+
},
|
|
31
|
+
"data-testid": testId,
|
|
32
|
+
children
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function PresentControls({ view, shown }) {
|
|
37
|
+
const current = chunkORNLCBNE_cjs.usePresentation((s) => s.current);
|
|
38
|
+
const count = chunkORNLCBNE_cjs.usePresentation((s) => s.slides.length);
|
|
39
|
+
const blank = chunkORNLCBNE_cjs.usePresentation((s) => s.blank);
|
|
40
|
+
const actions = chunkORNLCBNE_cjs.usePresentation.getState();
|
|
41
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
className: ui.cn(
|
|
45
|
+
"absolute bottom-4 left-4 z-30 flex items-center gap-0.5 rounded-full bg-black/60 p-1 text-white shadow-lg backdrop-blur transition-opacity duration-300",
|
|
46
|
+
shown ? "opacity-100" : "pointer-events-none opacity-0"
|
|
47
|
+
),
|
|
48
|
+
onPointerDown: (event) => event.stopPropagation(),
|
|
49
|
+
onDoubleClick: (event) => event.stopPropagation(),
|
|
50
|
+
role: "toolbar",
|
|
51
|
+
"aria-label": "Slideshow",
|
|
52
|
+
"data-testid": "present-controls",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
55
|
+
Control,
|
|
56
|
+
{
|
|
57
|
+
label: "Previous slide (\u2190)",
|
|
58
|
+
onClick: () => actions.goTo(current - 1),
|
|
59
|
+
disabled: current === 0,
|
|
60
|
+
testId: "present-previous",
|
|
61
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" })
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
65
|
+
"span",
|
|
66
|
+
{
|
|
67
|
+
className: "min-w-12 text-center text-xs tabular-nums text-white/85",
|
|
68
|
+
"data-testid": "present-position",
|
|
69
|
+
children: [
|
|
70
|
+
current + 1,
|
|
71
|
+
" / ",
|
|
72
|
+
count
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
77
|
+
Control,
|
|
78
|
+
{
|
|
79
|
+
label: "Next slide (\u2192, or click the slide)",
|
|
80
|
+
onClick: () => actions.goTo(current + 1),
|
|
81
|
+
disabled: current >= count - 1,
|
|
82
|
+
testId: "present-next",
|
|
83
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" })
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-1 h-4 w-px bg-white/25" }),
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
Control,
|
|
89
|
+
{
|
|
90
|
+
label: blank ? "Show the slide (B)" : "Blank the screen (B)",
|
|
91
|
+
onClick: () => actions.setBlank(!blank),
|
|
92
|
+
testId: "present-blank",
|
|
93
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.EyeOff, { className: ui.cn("size-4", blank && "text-amber-300") })
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
97
|
+
Control,
|
|
98
|
+
{
|
|
99
|
+
label: "Full screen (F)",
|
|
100
|
+
onClick: () => view && chunkADPRIBSH_cjs.toggleFullscreen(view),
|
|
101
|
+
testId: "present-fullscreen",
|
|
102
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize, { className: "size-4" })
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
+
Control,
|
|
107
|
+
{
|
|
108
|
+
label: "Stop presenting (Esc)",
|
|
109
|
+
onClick: () => actions.setPresenting(false),
|
|
110
|
+
testId: "present-stop",
|
|
111
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Square, { className: "size-3.5 fill-current" })
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
var IDLE_MS = 2200;
|
|
119
|
+
function usePointerActive(view) {
|
|
120
|
+
const [active, setActive] = react.useState(true);
|
|
121
|
+
react.useEffect(() => {
|
|
122
|
+
if (!view) return;
|
|
123
|
+
setActive(true);
|
|
124
|
+
let timer = view.setTimeout(() => setActive(false), IDLE_MS);
|
|
125
|
+
const wake = () => {
|
|
126
|
+
setActive(true);
|
|
127
|
+
view.clearTimeout(timer);
|
|
128
|
+
timer = view.setTimeout(() => setActive(false), IDLE_MS);
|
|
129
|
+
};
|
|
130
|
+
view.addEventListener("pointermove", wake);
|
|
131
|
+
view.addEventListener("keydown", wake);
|
|
132
|
+
return () => {
|
|
133
|
+
view.clearTimeout(timer);
|
|
134
|
+
view.removeEventListener("pointermove", wake);
|
|
135
|
+
view.removeEventListener("keydown", wake);
|
|
136
|
+
};
|
|
137
|
+
}, [view]);
|
|
138
|
+
return active;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
exports.Control = Control;
|
|
142
|
+
exports.PresentControls = PresentControls;
|
|
143
|
+
exports.usePointerActive = usePointerActive;
|
|
144
|
+
//# sourceMappingURL=chunk-3ZZZO4F7.cjs.map
|
|
145
|
+
//# sourceMappingURL=chunk-3ZZZO4F7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/presentation/PresentControls.tsx","../src/presentation/usePointerActive.ts"],"names":["jsx","usePresentation","jsxs","cn","ChevronLeft","ChevronRight","EyeOff","toggleFullscreen","Maximize","Square","useState","useEffect"],"mappings":"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","file":"chunk-3ZZZO4F7.cjs","sourcesContent":["/**\n * The presented slides' controls, bottom left: previous and next slide (with where you are),\n * blank, full screen and stop. Like a slideshow's, they show while the pointer moves (or a key is\n * pressed) and fade after a moment, with the pointer, so a shared screen rarely shows them.\n */\n\nimport type { ReactNode } from 'react'\nimport { ChevronLeft, ChevronRight, EyeOff, Maximize, Square } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { usePresentation } from './store'\nimport { toggleFullscreen } from './usePresenterKeys'\n\nconst CONTROL =\n 'inline-flex size-8 items-center justify-center rounded-full text-white/85 hover:bg-white/15 hover:text-white disabled:opacity-30 disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 pointer-coarse:size-11'\n\nexport function Control({\n label,\n onClick,\n disabled,\n children,\n testId,\n}: {\n label: string\n onClick: () => void\n disabled?: boolean\n children: ReactNode\n testId: string\n}) {\n return (\n <button\n type=\"button\"\n className={CONTROL}\n title={label}\n aria-label={label}\n disabled={disabled}\n onClick={(event) => {\n // A click on the controls is not a click on the slide (which goes to the next one).\n event.stopPropagation()\n onClick()\n }}\n data-testid={testId}\n >\n {children}\n </button>\n )\n}\n\nexport interface PresentControlsProps {\n /** The window presented in (full screen is that window's). */\n view: Window | null\n shown: boolean\n}\n\nexport function PresentControls({ view, shown }: PresentControlsProps) {\n const current = usePresentation((s) => s.current)\n const count = usePresentation((s) => s.slides.length)\n const blank = usePresentation((s) => s.blank)\n const actions = usePresentation.getState()\n return (\n <div\n className={cn(\n 'absolute bottom-4 left-4 z-30 flex items-center gap-0.5 rounded-full bg-black/60 p-1 text-white shadow-lg backdrop-blur transition-opacity duration-300',\n shown ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n onPointerDown={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n role=\"toolbar\"\n aria-label=\"Slideshow\"\n data-testid=\"present-controls\"\n >\n <Control\n label=\"Previous slide (←)\"\n onClick={() => actions.goTo(current - 1)}\n disabled={current === 0}\n testId=\"present-previous\"\n >\n <ChevronLeft className=\"size-4\" />\n </Control>\n <span\n className=\"min-w-12 text-center text-xs tabular-nums text-white/85\"\n data-testid=\"present-position\"\n >\n {current + 1} / {count}\n </span>\n <Control\n label=\"Next slide (→, or click the slide)\"\n onClick={() => actions.goTo(current + 1)}\n disabled={current >= count - 1}\n testId=\"present-next\"\n >\n <ChevronRight className=\"size-4\" />\n </Control>\n <div className=\"mx-1 h-4 w-px bg-white/25\" />\n <Control\n label={blank ? 'Show the slide (B)' : 'Blank the screen (B)'}\n onClick={() => actions.setBlank(!blank)}\n testId=\"present-blank\"\n >\n <EyeOff className={cn('size-4', blank && 'text-amber-300')} />\n </Control>\n <Control\n label=\"Full screen (F)\"\n onClick={() => view && toggleFullscreen(view)}\n testId=\"present-fullscreen\"\n >\n <Maximize className=\"size-4\" />\n </Control>\n <Control\n label=\"Stop presenting (Esc)\"\n onClick={() => actions.setPresenting(false)}\n testId=\"present-stop\"\n >\n <Square className=\"size-3.5 fill-current\" />\n </Control>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\n\n/** How long the pointer (or a key) has to rest before the controls fade. */\nconst IDLE_MS = 2200\n\n/** The pointer has moved (or a key was pressed) in `view` within the last moment. */\nexport function usePointerActive(view: Window | null): boolean {\n const [active, setActive] = useState(true)\n useEffect(() => {\n if (!view) return\n setActive(true)\n let timer = view.setTimeout(() => setActive(false), IDLE_MS)\n const wake = () => {\n setActive(true)\n view.clearTimeout(timer)\n timer = view.setTimeout(() => setActive(false), IDLE_MS)\n }\n view.addEventListener('pointermove', wake)\n view.addEventListener('keydown', wake)\n return () => {\n view.clearTimeout(timer)\n view.removeEventListener('pointermove', wake)\n view.removeEventListener('keydown', wake)\n }\n }, [view])\n return active\n}\n"]}
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var react = require('
|
|
6
|
-
var artifacts = require('@arbidocs/react/artifacts');
|
|
7
|
-
var react$1 = require('react');
|
|
8
|
-
|
|
9
|
-
function showPresentation(session, boundTo) {
|
|
10
|
-
if (boundTo === null) return editPresentation(session, { kind: "new" });
|
|
11
|
-
session.setViewingDocument({ id: boundTo, page: null });
|
|
12
|
-
session.setDocumentViewer({ tab: "slides" });
|
|
13
|
-
session.openPanel(react.DOCUMENT_VIEWER_PANEL, "docked");
|
|
14
|
-
}
|
|
15
|
-
function editPresentation(session, request) {
|
|
16
|
-
if (request.kind === "new") {
|
|
17
|
-
session.startDraftDocument("presentation");
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const { documentId, version } = request;
|
|
21
|
-
session.setViewingDocument({
|
|
22
|
-
id: version ? artifacts.versionRef(documentId, version) : documentId,
|
|
23
|
-
page: null
|
|
24
|
-
});
|
|
25
|
-
session.setDocumentViewer({ tab: "slides" });
|
|
26
|
-
session.openPanel(react.DOCUMENT_VIEWER_PANEL, "docked");
|
|
27
|
-
}
|
|
4
|
+
var chunkORNLCBNE_cjs = require('./chunk-ORNLCBNE.cjs');
|
|
5
|
+
var react = require('react');
|
|
28
6
|
|
|
29
7
|
// src/presentation/stage-videos.ts
|
|
30
8
|
var STAGE_VIDEO_ATTRIBUTE = "data-presentation-video";
|
|
@@ -52,28 +30,28 @@ function toggleFullscreen(view) {
|
|
|
52
30
|
function usePresenterKeys(view, presenting, selection) {
|
|
53
31
|
const selected = presenting ? null : selection?.clipId ?? null;
|
|
54
32
|
const clear = selection?.clear;
|
|
55
|
-
react
|
|
33
|
+
react.useEffect(() => {
|
|
56
34
|
if (!view) return;
|
|
57
35
|
const onKeyDown = (event) => {
|
|
58
36
|
if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey) return;
|
|
59
37
|
const target = event.target;
|
|
60
38
|
if (target?.closest?.('input, textarea, select, [contenteditable="true"]')) return;
|
|
61
|
-
const state =
|
|
39
|
+
const state = chunkORNLCBNE_cjs.usePresentation.getState();
|
|
62
40
|
const key = event.key;
|
|
63
41
|
const onSlide = selected && state.slides[state.current]?.items.some((i) => i.clipId === selected);
|
|
64
42
|
const box = selected?.startsWith("box-") ? state.slides.flatMap((slide) => slide.boxes).find((entry) => entry.id === selected) : void 0;
|
|
65
43
|
if (box && key.startsWith("Arrow")) {
|
|
66
44
|
const step = event.shiftKey ? BIG_NUDGE : NUDGE;
|
|
67
45
|
const dx = key === "ArrowLeft" ? -step : key === "ArrowRight" ? step : 0;
|
|
68
|
-
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) *
|
|
69
|
-
state.updateBox(box.id, (entry) => ({ ...entry, frame:
|
|
46
|
+
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) * chunkORNLCBNE_cjs.STAGE_ASPECT;
|
|
47
|
+
state.updateBox(box.id, (entry) => ({ ...entry, frame: chunkORNLCBNE_cjs.moveBox(entry.frame, dx, dy) }));
|
|
70
48
|
} else if (box && (key === "Delete" || key === "Backspace")) {
|
|
71
49
|
state.removeBox(box.id);
|
|
72
50
|
clear?.();
|
|
73
51
|
} else if (onSlide && key.startsWith("Arrow")) {
|
|
74
52
|
const step = event.shiftKey ? BIG_NUDGE : NUDGE;
|
|
75
53
|
const dx = key === "ArrowLeft" ? -step : key === "ArrowRight" ? step : 0;
|
|
76
|
-
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) *
|
|
54
|
+
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) * chunkORNLCBNE_cjs.STAGE_ASPECT;
|
|
77
55
|
state.nudge(selected, dx, dy);
|
|
78
56
|
} else if (onSlide && (key === "Delete" || key === "Backspace")) {
|
|
79
57
|
state.unplace(selected);
|
|
@@ -94,9 +72,7 @@ function usePresenterKeys(view, presenting, selection) {
|
|
|
94
72
|
}
|
|
95
73
|
|
|
96
74
|
exports.STAGE_VIDEO_ATTRIBUTE = STAGE_VIDEO_ATTRIBUTE;
|
|
97
|
-
exports.editPresentation = editPresentation;
|
|
98
|
-
exports.showPresentation = showPresentation;
|
|
99
75
|
exports.toggleFullscreen = toggleFullscreen;
|
|
100
76
|
exports.usePresenterKeys = usePresenterKeys;
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
77
|
+
//# sourceMappingURL=chunk-ADPRIBSH.cjs.map
|
|
78
|
+
//# sourceMappingURL=chunk-ADPRIBSH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/presentation/stage-videos.ts","../src/presentation/usePresenterKeys.ts"],"names":["useEffect","usePresentation","STAGE_ASPECT","moveBox"],"mappings":"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","file":"chunk-ADPRIBSH.cjs","sourcesContent":["/** The presented stage's videos, which the presenter plays and pauses with Space. */\n\n/** Marks the stage's videos, for the presenter's Space key. */\nexport const STAGE_VIDEO_ATTRIBUTE = 'data-presentation-video'\n\n/** Play the presented stage's videos, or pause them if any is playing. */\nexport function toggleStageVideos(doc: Document): boolean {\n const videos = Array.from(\n doc.querySelectorAll<HTMLVideoElement>(`video[${STAGE_VIDEO_ATTRIBUTE}]`)\n )\n if (!videos.length) return false\n const playing = videos.some((video) => !video.paused)\n for (const video of videos) {\n if (playing) video.pause()\n else void video.play().catch(() => undefined)\n }\n return true\n}\n","/**\n * The keys of the presentation window. A presenter (or a presentation clicker, which sends Page Up /\n * Page Down and \".\" or \"b\"): previous / next slide and blank the stage; while presenting, F for\n * full screen and Escape back to editing. While editing with a clip selected: the arrows nudge it\n * (Shift: further), Delete takes it off the slide and Escape deselects it.\n */\n\nimport { useEffect } from 'react'\nimport { toggleStageVideos } from './stage-videos'\nimport { STAGE_ASPECT } from './model'\nimport { usePresentation } from './store'\nimport { moveBox } from './boxes'\n\n/** A nudge, as a fraction of the stage width (vertical nudges move as far on screen). */\nconst NUDGE = 0.005\nconst BIG_NUDGE = 0.04\n\n/** Full screen on or off for a window's page (from a key or click in that window). */\nexport function toggleFullscreen(view: Window): void {\n const doc = view.document\n if (doc.fullscreenElement) void doc.exitFullscreen()\n else void doc.documentElement.requestFullscreen?.()\n}\n\nexport interface PresenterSelection {\n clipId: string | null\n clear: () => void\n}\n\nexport function usePresenterKeys(\n view: Window | null | undefined,\n presenting: boolean,\n selection?: PresenterSelection\n): void {\n const selected = presenting ? null : (selection?.clipId ?? null)\n const clear = selection?.clear\n useEffect(() => {\n if (!view) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey) return\n const target = event.target as HTMLElement | null\n if (target?.closest?.('input, textarea, select, [contenteditable=\"true\"]')) return\n const state = usePresentation.getState()\n const key = event.key\n const onSlide =\n selected && state.slides[state.current]?.items.some((i) => i.clipId === selected)\n const box = selected?.startsWith('box-')\n ? state.slides.flatMap((slide) => slide.boxes).find((entry) => entry.id === selected)\n : undefined\n if (box && key.startsWith('Arrow')) {\n const step = event.shiftKey ? BIG_NUDGE : NUDGE\n const dx = key === 'ArrowLeft' ? -step : key === 'ArrowRight' ? step : 0\n const dy = (key === 'ArrowUp' ? -step : key === 'ArrowDown' ? step : 0) * STAGE_ASPECT\n state.updateBox(box.id, (entry) => ({ ...entry, frame: moveBox(entry.frame, dx, dy) }))\n } else if (box && (key === 'Delete' || key === 'Backspace')) {\n state.removeBox(box.id)\n clear?.()\n } else if (onSlide && key.startsWith('Arrow')) {\n const step = event.shiftKey ? BIG_NUDGE : NUDGE\n const dx = key === 'ArrowLeft' ? -step : key === 'ArrowRight' ? step : 0\n const dy = (key === 'ArrowUp' ? -step : key === 'ArrowDown' ? step : 0) * STAGE_ASPECT\n state.nudge(selected, dx, dy)\n } else if (onSlide && (key === 'Delete' || key === 'Backspace')) {\n state.unplace(selected)\n clear?.()\n } else if (selected && key === 'Escape') clear?.()\n // Editing (in the app's own window too): only a selected clip takes keys.\n else if (!presenting) return\n else if (key === 'ArrowRight' || key === 'PageDown') state.goTo(state.current + 1)\n else if (key === 'ArrowLeft' || key === 'PageUp') state.goTo(state.current - 1)\n else if (key === 'b' || key === 'B' || key === '.') state.setBlank(!state.blank)\n else if (presenting && (key === 'f' || key === 'F')) toggleFullscreen(view)\n // Space plays or pauses the slide's videos.\n else if (presenting && key === ' ' && toggleStageVideos(view.document)) {\n // handled\n }\n // Out of full screen the browser takes the first Escape; the next one stops presenting.\n else if (presenting && key === 'Escape') state.setPresenting(false)\n else return\n event.preventDefault()\n }\n view.addEventListener('keydown', onKeyDown)\n return () => view.removeEventListener('keydown', onKeyDown)\n }, [view, presenting, selected, clear])\n}\n"]}
|