@bendyline/squisq-editor-react 2.3.3 → 2.4.0

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/README.md CHANGED
@@ -71,7 +71,7 @@ and block-at-a-time / timeline editing primitives (`useBlockNavigator`,
71
71
  - **Recording** — with a `mediaProvider` wired, a record button appears in the
72
72
  toolbar (`allowRecording`, default `true`).
73
73
  - **Presentation mode** — every Use view can fill the Squisq control, open a
74
- synchronized audience window, or enter browser full screen. Slideshow/video
74
+ synchronized audience window, or take over the entire screen. Slideshow/video
75
75
  playback, Page/Document scrolling, and the Narrate surface remain linked to
76
76
  the main view.
77
77
  - **Panels** — `outline` (heading outline pane) and `inlinePreview` (per-block
@@ -88,7 +88,9 @@ and block-at-a-time / timeline editing primitives (`useBlockNavigator`,
88
88
  - **Embedding** — `readOnly`, `placeholder`, `submitOnEnter`, `fullWidth`,
89
89
  `thinMargins`, `minHeight`/`maxHeight` auto-grow for chat-composer use, plus
90
90
  host-controlled Write typography through `writeCanvasSettings` (`textSize`
91
- and `lineSpacing`).
91
+ and `lineSpacing`). Set `hostMode="chat"` to keep the shell in Write view,
92
+ remove its view tabs, and hide Custom layouts, Transform, View options, and
93
+ Document settings.
92
94
  - **Color scheme** — pass `colorScheme="light" | "dark"` for the editor chrome
93
95
  (**v1.5:** renamed from the old `theme` prop; `RawEditor`'s own `theme` prop is
94
96
  now `monacoTheme`).
@@ -473,6 +473,29 @@ var btnDanger = {
473
473
  background: "var(--squisq-recorder-danger)",
474
474
  borderColor: "var(--squisq-recorder-danger-border)"
475
475
  };
476
+ var btnRecord = {
477
+ ...btnPrimary,
478
+ display: "inline-flex",
479
+ alignItems: "center",
480
+ gap: 8
481
+ };
482
+ var recordDotFrameStyle = {
483
+ display: "inline-flex",
484
+ alignItems: "center",
485
+ justifyContent: "center",
486
+ flex: "0 0 auto",
487
+ padding: 2,
488
+ border: "1px solid #9ca3af",
489
+ borderRadius: "50%",
490
+ background: "#000"
491
+ };
492
+ var recordDotStyle = {
493
+ display: "block",
494
+ width: 9,
495
+ height: 9,
496
+ borderRadius: "50%",
497
+ background: "var(--squisq-recorder-danger)"
498
+ };
476
499
  var toggleRowStyle = {
477
500
  display: "flex",
478
501
  gap: 8,
@@ -867,7 +890,18 @@ function RecorderModal({
867
890
  children: recorder.state === "requesting" ? "Requesting\u2026" : "Start preview"
868
891
  }
869
892
  ),
870
- canRecord && /* @__PURE__ */ jsx("button", { type: "button", style: btnPrimary, onClick: handleStart, disabled: isBusy, children: "Record" }),
893
+ canRecord && /* @__PURE__ */ jsxs("button", { type: "button", style: btnRecord, onClick: handleStart, disabled: isBusy, children: [
894
+ /* @__PURE__ */ jsx(
895
+ "span",
896
+ {
897
+ className: "squisq-recorder-record-dot",
898
+ style: recordDotFrameStyle,
899
+ "aria-hidden": "true",
900
+ children: /* @__PURE__ */ jsx("span", { className: "squisq-recorder-record-dot-center", style: recordDotStyle })
901
+ }
902
+ ),
903
+ "Record"
904
+ ] }),
871
905
  canStop && /* @__PURE__ */ jsx("button", { type: "button", style: btnDanger, onClick: handleStop, disabled: isBusy, children: "Stop" }),
872
906
  canSave && /* @__PURE__ */ jsxs(Fragment, { children: [
873
907
  /* @__PURE__ */ jsx("button", { type: "button", style: btnSecondary, onClick: handleDiscard, disabled: isBusy, children: "Discard & re-record" }),
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  markdownToTiptap,
3
3
  tiptapToMarkdown
4
- } from "./chunk-NITZVAXL.js";
4
+ } from "./chunk-MM3M2KUV.js";
5
5
 
6
6
  // src/jsonEditor/JsonEditorContext.tsx
7
7
  import { createContext, useContext, useEffect, useMemo } from "react";
@@ -723,11 +723,23 @@ function serializeMediaTag(tag, attrs) {
723
723
  const width = /\bwidth="([^"]*)"/i.exec(attrs)?.[1];
724
724
  const height = /\bheight="([^"]*)"/i.exec(attrs)?.[1];
725
725
  const poster = tag === "video" ? /\bposter="([^"]*)"/i.exec(attrs)?.[1] : void 0;
726
+ const placement = tag === "video" ? /\bdata-squisq-video-placement="([^"]*)"/i.exec(attrs)?.[1] : void 0;
727
+ const lockToBlock = tag === "video" ? /\bdata-squisq-video-lock-to-block="([^"]*)"/i.exec(attrs)?.[1] : void 0;
728
+ const startAt = tag === "video" ? /\bdata-squisq-video-start-at="([^"]*)"/i.exec(attrs)?.[1] : void 0;
729
+ const clipStart = tag === "video" ? /\bdata-squisq-video-clip-start="([^"]*)"/i.exec(attrs)?.[1] : void 0;
730
+ const clipEnd = tag === "video" ? /\bdata-squisq-video-clip-end="([^"]*)"/i.exec(attrs)?.[1] : void 0;
726
731
  const parts = [`<${tag} src="${src}"`];
727
732
  if (controls) parts.push(" controls");
728
733
  if (width) parts.push(` width="${width}"`);
729
734
  if (height) parts.push(` height="${height}"`);
730
735
  if (poster) parts.push(` poster="${poster}"`);
736
+ if (placement === "picture-in-picture" || placement === "overlay") {
737
+ parts.push(` data-squisq-video-placement="${placement}"`);
738
+ }
739
+ if (lockToBlock === "false") parts.push(' data-squisq-video-lock-to-block="false"');
740
+ if (startAt != null) parts.push(` data-squisq-video-start-at="${startAt}"`);
741
+ if (clipStart != null) parts.push(` data-squisq-video-clip-start="${clipStart}"`);
742
+ if (clipEnd != null) parts.push(` data-squisq-video-clip-end="${clipEnd}"`);
731
743
  parts.push(`></${tag}>`);
732
744
  return parts.join("");
733
745
  }