@bendyline/squisq-editor-react 2.11.27 → 2.12.1

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.
@@ -61,6 +61,103 @@ function escapeLinkLabel(text) {
61
61
  return text.replace(/([\\[\]])/g, "\\$1");
62
62
  }
63
63
 
64
+ // src/markdownQuote.ts
65
+ function isQuoteLine(line) {
66
+ return line.startsWith("> ") || line.trimEnd() === ">";
67
+ }
68
+ function quoteLineContent(line) {
69
+ return line.trimEnd() === ">" ? "" : line.slice(2);
70
+ }
71
+ var RE_QUOTE_BLOCK_START = /^ {0,3}(?:#{1,6}(?:\s|$)|>|[-*+]\s|\d+[.)]\s|```|~~~|\||(?:-{3,}|\*{3,}|_{3,})\s*$)/;
72
+ var RE_LIST_ITEM_LINE = /^\s*(?:[-*+]|\d+[.)])\s/;
73
+ function quoteBlockRunEnd(body, start) {
74
+ const first = body[start].trimStart();
75
+ const fence = /^(`{3,}|~{3,})/.exec(first)?.[1];
76
+ if (fence) {
77
+ for (let k2 = start + 1; k2 < body.length; k2++) {
78
+ if (body[k2].trimStart().startsWith(fence)) return k2 + 1;
79
+ }
80
+ return body.length;
81
+ }
82
+ const repeats = (marker) => {
83
+ let k2 = start + 1;
84
+ while (k2 < body.length && body[k2].trimStart().startsWith(marker)) k2++;
85
+ return k2;
86
+ };
87
+ if (first.startsWith("|")) return repeats("|");
88
+ if (first.startsWith(">")) return repeats(">");
89
+ if (!RE_LIST_ITEM_LINE.test(body[start])) return start + 1;
90
+ const continuesList = (line) => line !== void 0 && (RE_LIST_ITEM_LINE.test(line) || /^\s+\S/.test(line));
91
+ let k = start + 1;
92
+ while (k < body.length) {
93
+ if (continuesList(body[k])) {
94
+ k++;
95
+ } else if (body[k] === "" && continuesList(body[k + 1])) {
96
+ k += 2;
97
+ } else {
98
+ break;
99
+ }
100
+ }
101
+ return k;
102
+ }
103
+ function quoteBodyToHtml(body, convert) {
104
+ const parts = [];
105
+ let afterBlock = false;
106
+ for (let k = 0; k < body.length; ) {
107
+ const content = body[k];
108
+ if (RE_QUOTE_BLOCK_START.test(content)) {
109
+ const end = quoteBlockRunEnd(body, k);
110
+ parts.push(convert.markdownToHtml(body.slice(k, end).join("\n")));
111
+ afterBlock = true;
112
+ k = end;
113
+ continue;
114
+ }
115
+ if (content === "" && afterBlock) {
116
+ afterBlock = false;
117
+ k++;
118
+ continue;
119
+ }
120
+ parts.push(content ? `<p>${convert.inlineToHtml(content)}</p>` : "<p></p>");
121
+ afterBlock = false;
122
+ k++;
123
+ }
124
+ return parts.join("");
125
+ }
126
+ function quoteBodyToMarkdown(inner, convert) {
127
+ const out = [];
128
+ let rest = inner.trim();
129
+ let afterBlock = false;
130
+ while (rest.length > 0) {
131
+ const paragraph = /^<p\b[^>]*>(.*?)<\/p>/s.exec(rest);
132
+ if (paragraph) {
133
+ if (afterBlock) out.push(">");
134
+ afterBlock = false;
135
+ const inline = convert.htmlToInline(paragraph[1]);
136
+ if (!inline.trim()) {
137
+ out.push(">");
138
+ } else {
139
+ for (const quoteLine of inline.split("\n")) out.push("> " + quoteLine);
140
+ }
141
+ rest = rest.slice(paragraph[0].length).trimStart();
142
+ continue;
143
+ }
144
+ const tag = /^<([a-z][a-z0-9]*)\b/i.exec(rest)?.[1];
145
+ const element = tag ? convert.matchBalancedTag(rest, 0, tag) : null;
146
+ if (!element) {
147
+ if (afterBlock) out.push(">");
148
+ const inline = convert.htmlToInline(rest);
149
+ for (const quoteLine of inline.split("\n")) out.push(inline.trim() ? "> " + quoteLine : ">");
150
+ break;
151
+ }
152
+ if (afterBlock) out.push(">");
153
+ const blockLines = convert.htmlToMarkdown(rest.slice(0, element.end)).replace(/\n+$/, "").split("\n");
154
+ for (const blockLine of blockLines) out.push(blockLine ? "> " + blockLine : ">");
155
+ afterBlock = true;
156
+ rest = rest.slice(element.end).trimStart();
157
+ }
158
+ return out;
159
+ }
160
+
64
161
  // src/tiptapBridge.ts
65
162
  var MARKDOWN_ESCAPE_ATTR = "data-md-escape";
66
163
  var RE_BOLD_STAR = /\*\*(?![\s*])(.+?)(?<![\s*])\*\*/g;
@@ -162,6 +259,13 @@ function joinWrappedCodeSpans(lines) {
162
259
  function leavesCodeSpanOpen(text) {
163
260
  return text.replace(RE_INLINE_CODE, "").includes(BACKTICK);
164
261
  }
262
+ var QUOTE_CONVERTERS = {
263
+ markdownToHtml: (markdown) => markdownToTiptap(markdown),
264
+ inlineToHtml: (text) => inlineToHtml(text),
265
+ htmlToMarkdown: (html) => tiptapToMarkdown(html),
266
+ htmlToInline: (html) => htmlToInline(html),
267
+ matchBalancedTag: (html, start, tag) => matchBalancedTag(html, start, tag)
268
+ };
165
269
  function markdownToTiptap(markdown) {
166
270
  if (!markdown.trim()) return "<p></p>";
167
271
  const html = markdown.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
@@ -377,9 +481,7 @@ function markdownToTiptap(markdown) {
377
481
  i++;
378
482
  quoteLines.push(quoteLineContent(lines[i]));
379
483
  }
380
- pushBlock(
381
- `<blockquote>${quoteLines.map((quoteLine) => quoteLine ? `<p>${inlineToHtml(quoteLine)}</p>` : "<p></p>").join("")}</blockquote>`
382
- );
484
+ pushBlock(`<blockquote>${quoteBodyToHtml(quoteLines, QUOTE_CONVERTERS)}</blockquote>`);
383
485
  continue;
384
486
  }
385
487
  const taskMatch = line.match(/^([ \t]*)[-*+]\s+\[([xX ])\]\s*(.*)$/);
@@ -513,20 +615,10 @@ function tiptapToMarkdown(html) {
513
615
  remaining = remaining.slice(codeMatch[0].length);
514
616
  continue;
515
617
  }
516
- const bqMatch = remaining.match(/^<blockquote>(.*?)<\/blockquote>/s);
618
+ const bqMatch = /^<blockquote\b/.test(remaining) ? matchBalancedTag(remaining, 0, "blockquote") : null;
517
619
  if (bqMatch) {
518
- const paragraphs = bqMatch[1].split(/<\/p>\s*<p[^>]*>/i).map((paragraph) => paragraph.replace(/^<p[^>]*>/i, "").replace(/<\/p>\s*$/i, ""));
519
- for (const paragraph of paragraphs) {
520
- const inline = htmlToInline(paragraph);
521
- if (!inline.trim()) {
522
- lines.push(">");
523
- continue;
524
- }
525
- for (const quoteLine of inline.split("\n")) {
526
- lines.push("> " + quoteLine);
527
- }
528
- }
529
- const next = remaining.slice(bqMatch[0].length);
620
+ lines.push(...quoteBodyToMarkdown(bqMatch.inner, QUOTE_CONVERTERS));
621
+ const next = remaining.slice(bqMatch.end);
530
622
  if (!/^\s*<blockquote>/.test(next)) lines.push("");
531
623
  remaining = next;
532
624
  continue;
@@ -803,12 +895,6 @@ function isIndentedCodeLine(line) {
803
895
  function stripCodeIndent(line) {
804
896
  return line.startsWith(" ") ? line.slice(1) : line.slice(4);
805
897
  }
806
- function isQuoteLine(line) {
807
- return line.startsWith("> ") || line.trimEnd() === ">";
808
- }
809
- function quoteLineContent(line) {
810
- return line.trimEnd() === ">" ? "" : line.slice(2);
811
- }
812
898
  function stripHardBreak(line) {
813
899
  if (/\S {2,}$/.test(line)) return line.replace(/ {2,}$/, "");
814
900
  if (line.endsWith("\\") && isEscapedMarkdownCharacter(`${line}x`, line.length)) {
@@ -1242,6 +1328,8 @@ function restoreLeadingSpaces(text) {
1242
1328
  }
1243
1329
 
1244
1330
  export {
1331
+ mediaEditNodeAttributeName,
1332
+ mediaEditKeysFor,
1245
1333
  mediaEditNodeAttributes,
1246
1334
  formatLinkDestination,
1247
1335
  escapeLinkLabel,
@@ -4,8 +4,8 @@ import {
4
4
  imageEditorReducer,
5
5
  initialImageEditorState,
6
6
  useImageEditor
7
- } from "../chunk-K4Z2GIX4.js";
8
- import "../chunk-GS7QWYFT.js";
7
+ } from "../chunk-HLU6ZBS7.js";
8
+ import "../chunk-UYB5CPRE.js";
9
9
  export {
10
10
  ImageEditor,
11
11
  ImageViewer,
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as CodeContext, E as EditorHostMode, S as SceneTextChannel, a as CalcEngineFactory, b as EditorView$1, c as CsvSourceMeta, X as XlsxSourceMeta, F as FormulaEditRecord } from './shell-xuF3vK5Z.js';
2
- export { A as ApplySourceEditsOptions, B as BlockInsertionBuilder, d as BlockInsertionContext, e as BlockPlacement, f as BlockRange, g as BlockSlice, h as BlockTagVisibility, i as CodeContextSection, j as CoverImageSaveOutput, D as DashboardImageSaveOutput, k as DocumentLinkCandidate, l as DocumentLinkProvider, m as EditorActions, n as EditorColorScheme, o as EditorContextMenuContext, p as EditorContextMenuItem, q as EditorContextMenuItemVisibility, r as EditorContextMenuProvider, s as EditorContextMenuProviderProps, t as EditorContextValue, u as EditorInsertMenuItem, v as EditorMode, w as EditorProvider, x as EditorProviderProps, y as EditorSelectionInfo, z as EditorShell, G as EditorShellProps, H as EditorState, I as FindOptions, J as FindRequest, K as FormulaSessionOptions, L as ImageDisplayMode, M as IngestedSidecar, N as InsertBlockOptions, O as LayoutMode, P as MentionCandidate, Q as MentionProvider, R as OutlineBlock, T as OutlineInsertion, U as PreviewPanel, V as PreviewPanelProps, W as RawEditor, Y as RawEditorProps, Z as ThemeInheritance, _ as ViewPreferences, $ as WriteCanvasSettings, a0 as WysiwygEditor, a1 as WysiwygEditorProps, a2 as XLSX_LOCKED_REASON, a3 as XlsxFormulaSession, a4 as applySourceEditsToText, a5 as blockInsertionPoint, a6 as createXlsxFormulaSession, a7 as getBlockSlices, a8 as headingDepthForInsertion, a9 as ingestSidecarBytes, aa as joinBlockAt, ab as lineToOffset, ac as minimalReplaceEdit, ad as normalizeSourceEdits, ae as offsetToLine, af as resolveOutlineInsertion, ag as sliceIndexAtOffset, ah as sourceOutline, ai as spliceBlock, aj as useEditorContext, ak as useEditorContextMenuItems, al as useEditorInsertMenuItems } from './shell-xuF3vK5Z.js';
1
+ import { C as CodeContext, E as EditorHostMode, S as SceneTextChannel, a as CalcEngineFactory, b as EditorView$1, c as CsvSourceMeta, X as XlsxSourceMeta, F as FormulaEditRecord } from './shell-D9E73nri.js';
2
+ export { A as ApplySourceEditsOptions, B as BlockInsertionBuilder, d as BlockInsertionContext, e as BlockPlacement, f as BlockRange, g as BlockSlice, h as BlockTagVisibility, i as CodeContextSection, j as CoverImageSaveOutput, D as DashboardImageSaveOutput, k as DocumentLinkCandidate, l as DocumentLinkProvider, m as EditorActions, n as EditorColorScheme, o as EditorContextMenuContext, p as EditorContextMenuItem, q as EditorContextMenuItemVisibility, r as EditorContextMenuProvider, s as EditorContextMenuProviderProps, t as EditorContextValue, u as EditorInsertMenuItem, v as EditorMode, w as EditorProvider, x as EditorProviderProps, y as EditorSelectionInfo, z as EditorShell, G as EditorShellProps, H as EditorState, I as FindOptions, J as FindRequest, K as FormulaSessionOptions, L as ImageDisplayMode, M as IngestedSidecar, N as InsertBlockOptions, O as LayoutMode, P as MentionCandidate, Q as MentionProvider, R as OutlineBlock, T as OutlineInsertion, U as PreviewPanel, V as PreviewPanelProps, W as RawEditor, Y as RawEditorProps, Z as ThemeInheritance, _ as ViewPreferences, $ as WriteCanvasSettings, a0 as WysiwygEditor, a1 as WysiwygEditorProps, a2 as XLSX_LOCKED_REASON, a3 as XlsxFormulaSession, a4 as applySourceEditsToText, a5 as blockInsertionPoint, a6 as createXlsxFormulaSession, a7 as getBlockSlices, a8 as headingDepthForInsertion, a9 as ingestSidecarBytes, aa as joinBlockAt, ab as lineToOffset, ac as minimalReplaceEdit, ad as normalizeSourceEdits, ae as offsetToLine, af as resolveOutlineInsertion, ag as sliceIndexAtOffset, ah as sourceOutline, ai as spliceBlock, aj as useEditorContext, ak as useEditorContextMenuItems, al as useEditorInsertMenuItems } from './shell-D9E73nri.js';
3
3
  import * as react from 'react';
4
4
  import { ReactNode, CSSProperties, ReactElement } from 'react';
5
5
  import { Doc, ScheduledClip, VideoPlacement, VideoPipSize, VideoPipShape, VideoPipPosition, MediaEdits, MediaProvider, Theme, CustomTemplateDefinition, ThemeSeedColors, ViewportPreset, ViewportConfig, Block, MediaEntry, DiagramEdgeAnchor } from '@bendyline/squisq/schemas';
@@ -988,11 +988,11 @@ declare function ViewSwitcher({ className }: ViewSwitcherProps): react.JSX.Eleme
988
988
  interface ToolbarProps {
989
989
  /** Additional class name */
990
990
  className?: string;
991
- /** Whether the Files panel is currently shown */
991
+ /** Whether the Attachments panel is currently shown */
992
992
  showFiles?: boolean;
993
993
  /** Number of files currently available through the MediaProvider. */
994
994
  fileCount?: number;
995
- /** Toggle the Files panel. When provided, a "Files" button appears in the toolbar. */
995
+ /** Toggle the Attachments panel. When provided, an "Attachments" button appears in the toolbar. */
996
996
  onToggleFiles?: () => void;
997
997
  /** Content rendered at the left edge of the toolbar, before the view tabs. */
998
998
  slotLeft?: ReactNode;
@@ -1256,19 +1256,6 @@ declare function findTransitionEntry(value: string): TransitionCatalogEntry | un
1256
1256
  */
1257
1257
  declare function transitionLabel(value: string): string;
1258
1258
 
1259
- /**
1260
- * blockProperties
1261
- *
1262
- * Generic read/write of a single block-meta key on a heading's Pandoc `{…}`
1263
- * attribute block (stored as the `dataBlockAttrs` inner string in the WYSIWYG
1264
- * heading node — no braces, matching `tiptapBridge`).
1265
- *
1266
- * The transition family (which spans three coupled keys) has its own helpers
1267
- * in `headingTransition.ts`; this module covers the standalone scalar keys the
1268
- * block-properties palette edits — `duration`, `startTime`, `x`, `y`, … — all
1269
- * of which are plain `key=value` params. Parse/serialize is delegated to the
1270
- * shared core helpers so quoting and ordering match the parser exactly.
1271
- */
1272
1259
  /** Parse a `dataBlockAttrs` inner string into its flat `key → value` map. */
1273
1260
  declare function readBlockAttrsParams(inner: string | null | undefined): Record<string, string>;
1274
1261
  /** Read a single block-meta param, or '' when unset. */
@@ -1288,23 +1275,6 @@ declare function setBlockAttrsValue(inner: string | null | undefined, key: strin
1288
1275
  */
1289
1276
  declare function summarizeBlockProps(blockAttrs: string | null | undefined, templateParams: string | null | undefined): string;
1290
1277
 
1291
- /**
1292
- * BlockPropertiesPopover
1293
- *
1294
- * The on-canvas "block properties" palette — the sibling of the block-template
1295
- * badge. Anchored at the `.squisq-props-badge` chip on a heading, it edits the
1296
- * block's playback/animation metadata:
1297
- *
1298
- * - Transition (type / direction / duration) — stored in `{[…]}` params
1299
- * - Duration (`duration`) — stored in Pandoc `dataBlockAttrs`
1300
- * - Start time (`startTime`) — stored in Pandoc `dataBlockAttrs`
1301
- *
1302
- * The popover holds the `dataBlockAttrs` inner string as working state and
1303
- * re-derives each control from it, so successive edits compose. Every change
1304
- * serializes a new inner and bubbles up through `onChange`; the host applies it
1305
- * to the heading node. Positioning/portal/outside-click mirror
1306
- * `TemplateBadgePopover`.
1307
- */
1308
1278
  interface BlockPropertiesPopoverProps {
1309
1279
  /** DOMRect of the badge that triggered the popover (viewport coords). */
1310
1280
  anchorRect: DOMRect;
@@ -1378,7 +1348,7 @@ interface MediaBinProps {
1378
1348
  /** Fired whenever the panel scans media and knows the current entry count. */
1379
1349
  onCountChange?: (count: number) => void;
1380
1350
  /**
1381
- * Opens the host's media recorder. When provided, the Files header shows a
1351
+ * Opens the host's media recorder. When provided, the Attachments header shows a
1382
1352
  * compact Record button beside Upload.
1383
1353
  */
1384
1354
  onRecord?: () => void;
@@ -1392,7 +1362,7 @@ interface MediaBinProps {
1392
1362
  allowBinaryDownloads?: boolean;
1393
1363
  /**
1394
1364
  * Relative path of an entry to highlight and scroll into view — how the
1395
- * data card's "Show in Files" lands on the file it names.
1365
+ * data card's "Show in Attachments" lands on the file it names.
1396
1366
  */
1397
1367
  highlightPath?: string | null;
1398
1368
  }
@@ -3495,6 +3465,7 @@ interface RecorderSlide {
3495
3465
  declare function buildRecorderSlideDeck(doc: Doc, theme: Theme, viewport: ViewportConfig): RecorderSlide[];
3496
3466
 
3497
3467
  interface RecorderSlidesPanelProps {
3468
+ onBuildShown?: (blockId: string, step: number, sourceText: string) => void;
3498
3469
  slides: RecorderSlide[];
3499
3470
  /** Active slide index — controlled by the host. */
3500
3471
  index: number;
@@ -3507,7 +3478,7 @@ interface RecorderSlidesPanelProps {
3507
3478
  /** Block ids already first-shown this take; drives the progress dots. */
3508
3479
  shownBlockIds?: ReadonlySet<string>;
3509
3480
  }
3510
- declare function RecorderSlidesPanel({ slides, index, onIndexChange, viewport, basePath, mediaProvider, recording, shownBlockIds, }: RecorderSlidesPanelProps): react.JSX.Element;
3481
+ declare function RecorderSlidesPanel({ slides, index, onIndexChange, viewport, basePath, mediaProvider, recording, shownBlockIds, onBuildShown, }: RecorderSlidesPanelProps): react.JSX.Element;
3511
3482
 
3512
3483
  /**
3513
3484
  * Pure decision helpers for the Record media dialog's slides mode — the peer
package/dist/index.js CHANGED
@@ -233,7 +233,7 @@ import {
233
233
  videoEmbedParagraphJson,
234
234
  viewStateFromBinding,
235
235
  writeHeadingViewState
236
- } from "./chunk-IRFFIMKM.js";
236
+ } from "./chunk-MJPL4QUR.js";
237
237
  import {
238
238
  EditorProvider,
239
239
  applySourceEditsToText,
@@ -254,7 +254,7 @@ import {
254
254
  useBlockNavigator,
255
255
  useEditorContext,
256
256
  useEditorInsertMenuItems
257
- } from "./chunk-TRBNNRLK.js";
257
+ } from "./chunk-4SZ3UWSL.js";
258
258
  import {
259
259
  SPEECH_INPUT_SAMPLE_RATE,
260
260
  isSpeechInputProviderFactory,
@@ -263,24 +263,24 @@ import {
263
263
  import "./chunk-V4NBQF5C.js";
264
264
  import {
265
265
  JsonEditor
266
- } from "./chunk-V2OLZOYJ.js";
266
+ } from "./chunk-PXO3D42N.js";
267
267
  import {
268
268
  MarkdownEscape
269
- } from "./chunk-OCQEWWHI.js";
269
+ } from "./chunk-KI5XQWRU.js";
270
270
  import {
271
271
  markdownToTiptap,
272
272
  tiptapToMarkdown
273
- } from "./chunk-HSWWEWT4.js";
273
+ } from "./chunk-WMNL2WEI.js";
274
274
  import {
275
275
  ImageEditor,
276
276
  ImageViewer,
277
277
  imageEditorReducer,
278
278
  initialImageEditorState,
279
279
  useImageEditor
280
- } from "./chunk-K4Z2GIX4.js";
280
+ } from "./chunk-HLU6ZBS7.js";
281
281
  import {
282
282
  RecorderButton
283
- } from "./chunk-LR6Q2MK4.js";
283
+ } from "./chunk-H3XGOKPT.js";
284
284
  import {
285
285
  RecorderDeviceQuickPicks,
286
286
  RecorderDeviceSettingsPanel,
@@ -305,7 +305,7 @@ import {
305
305
  unshownSlidesWarning,
306
306
  useMediaDevices,
307
307
  useMediaRecorder
308
- } from "./chunk-UFK47ZAI.js";
308
+ } from "./chunk-TCGWKYME.js";
309
309
  import {
310
310
  DEFAULT_RECORDER_DEVICE_SETTINGS,
311
311
  buildRecorderAudioConstraints,
@@ -314,7 +314,9 @@ import {
314
314
  buildRecorderScreenConstraints,
315
315
  recorderBitsPerSecond
316
316
  } from "./chunk-LRZJD5YD.js";
317
- import "./chunk-GS7QWYFT.js";
317
+ import {
318
+ Icon
319
+ } from "./chunk-UYB5CPRE.js";
318
320
  import {
319
321
  TeleprompterView
320
322
  } from "./chunk-DJS5I5NO.js";
@@ -380,13 +382,7 @@ function FolderView({
380
382
  });
381
383
  return /* @__PURE__ */ jsxs("div", { className: "squisq-folder-view", "data-theme": theme, style: { height }, children: [
382
384
  /* @__PURE__ */ jsxs("div", { className: "squisq-folder-view-header", children: [
383
- /* @__PURE__ */ jsx(
384
- "i",
385
- {
386
- className: "fa-regular fa-folder-open squisq-folder-view-header-icon",
387
- "aria-hidden": "true"
388
- }
389
- ),
385
+ /* @__PURE__ */ jsx(Icon, { icon: "fa-regular fa-folder-open", className: "squisq-folder-view-header-icon" }),
390
386
  /* @__PURE__ */ jsx("span", { className: "squisq-folder-view-title", children: name }),
391
387
  /* @__PURE__ */ jsxs("span", { className: "squisq-folder-view-count", children: [
392
388
  entries.length,
@@ -404,10 +400,10 @@ function FolderView({
404
400
  /* @__PURE__ */ jsx("span", { className: "squisq-folder-view-item-icon", children: iconFor(entry) }),
405
401
  /* @__PURE__ */ jsx("span", { className: "squisq-folder-view-item-name", children: entry.name }),
406
402
  entry.isDirectory && /* @__PURE__ */ jsx(
407
- "i",
403
+ Icon,
408
404
  {
409
- className: "fa-solid fa-chevron-right squisq-folder-view-item-chevron",
410
- "aria-hidden": "true"
405
+ icon: "fa-solid fa-chevron-right",
406
+ className: "squisq-folder-view-item-chevron"
411
407
  }
412
408
  )
413
409
  ]
@@ -415,11 +411,11 @@ function FolderView({
415
411
  ) }, entry.path)) }) }),
416
412
  /* @__PURE__ */ jsxs("div", { className: "squisq-folder-view-actions", children: [
417
413
  /* @__PURE__ */ jsxs("button", { type: "button", className: "squisq-folder-view-new", onClick: onNewDocument, children: [
418
- /* @__PURE__ */ jsx("i", { className: "fa-solid fa-plus", "aria-hidden": "true" }),
414
+ /* @__PURE__ */ jsx(Icon, { icon: "fa-solid fa-plus" }),
419
415
  " New document"
420
416
  ] }),
421
417
  onNewFolder && /* @__PURE__ */ jsxs("button", { type: "button", className: "squisq-folder-view-new-folder", onClick: onNewFolder, children: [
422
- /* @__PURE__ */ jsx("i", { className: "fa-regular fa-folder", "aria-hidden": "true" }),
418
+ /* @__PURE__ */ jsx(Icon, { icon: "fa-regular fa-folder" }),
423
419
  " New folder"
424
420
  ] })
425
421
  ] })
@@ -428,12 +424,12 @@ function FolderView({
428
424
  var IMAGE_RE = /\.(png|jpe?g|gif|svg|webp|bmp|avif)$/i;
429
425
  function defaultIconFor(entry) {
430
426
  if (entry.isDirectory) {
431
- return /* @__PURE__ */ jsx("i", { className: "fa-regular fa-folder fa-fw", "aria-hidden": "true" });
427
+ return /* @__PURE__ */ jsx(Icon, { icon: "fa-regular fa-folder fa-fw" });
432
428
  }
433
429
  if (IMAGE_RE.test(entry.name)) {
434
- return /* @__PURE__ */ jsx("i", { className: "fa-regular fa-file-image fa-fw", "aria-hidden": "true" });
430
+ return /* @__PURE__ */ jsx(Icon, { icon: "fa-regular fa-file-image fa-fw" });
435
431
  }
436
- return /* @__PURE__ */ jsx("i", { className: "fa-regular fa-file-lines fa-fw", "aria-hidden": "true" });
432
+ return /* @__PURE__ */ jsx(Icon, { icon: "fa-regular fa-file-lines fa-fw" });
437
433
  }
438
434
 
439
435
  // src/ViewSwitcher.tsx
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  JsonEditor
3
- } from "../chunk-V2OLZOYJ.js";
4
- import "../chunk-OCQEWWHI.js";
5
- import "../chunk-HSWWEWT4.js";
3
+ } from "../chunk-PXO3D42N.js";
4
+ import "../chunk-KI5XQWRU.js";
5
+ import "../chunk-WMNL2WEI.js";
6
6
  export {
7
7
  JsonEditor
8
8
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RecorderButton
3
- } from "../chunk-LR6Q2MK4.js";
3
+ } from "../chunk-H3XGOKPT.js";
4
4
  import {
5
5
  RecorderDeviceQuickPicks,
6
6
  RecorderDeviceSettingsPanel,
@@ -14,7 +14,7 @@ import {
14
14
  requestScreenStream,
15
15
  useMediaDevices,
16
16
  useMediaRecorder
17
- } from "../chunk-UFK47ZAI.js";
17
+ } from "../chunk-TCGWKYME.js";
18
18
  import {
19
19
  DEFAULT_RECORDER_DEVICE_SETTINGS,
20
20
  buildRecorderAudioConstraints,
@@ -23,7 +23,7 @@ import {
23
23
  buildRecorderScreenConstraints,
24
24
  recorderBitsPerSecond
25
25
  } from "../chunk-LRZJD5YD.js";
26
- import "../chunk-GS7QWYFT.js";
26
+ import "../chunk-UYB5CPRE.js";
27
27
  import {
28
28
  buildTimingJson,
29
29
  encodeTimingJson,
@@ -19,9 +19,9 @@ import {
19
19
  updateReviewDecorations,
20
20
  useReview,
21
21
  useReviewState
22
- } from "../chunk-TRBNNRLK.js";
22
+ } from "../chunk-4SZ3UWSL.js";
23
23
  import "../chunk-DNEVUOBZ.js";
24
- import "../chunk-HSWWEWT4.js";
24
+ import "../chunk-WMNL2WEI.js";
25
25
 
26
26
  // src/review/proofingAdapter.ts
27
27
  import {
@@ -1,4 +1,4 @@
1
- export { h as BlockTagVisibility, k as DocumentLinkCandidate, l as DocumentLinkProvider, m as EditorActions, n as EditorColorScheme, o as EditorContextMenuContext, p as EditorContextMenuItem, q as EditorContextMenuItemVisibility, r as EditorContextMenuProvider, s as EditorContextMenuProviderProps, t as EditorContextValue, E as EditorHostMode, u as EditorInsertMenuItem, v as EditorMode, w as EditorProvider, x as EditorProviderProps, z as EditorShell, G as EditorShellProps, H as EditorState, b as EditorView, L as ImageDisplayMode, O as LayoutMode, P as MentionCandidate, Q as MentionProvider, U as PreviewPanel, V as PreviewPanelProps, W as RawEditor, Y as RawEditorProps, Z as ThemeInheritance, _ as ViewPreferences, a0 as WysiwygEditor, a1 as WysiwygEditorProps, aj as useEditorContext, ak as useEditorContextMenuItems, al as useEditorInsertMenuItems } from '../shell-xuF3vK5Z.js';
1
+ export { h as BlockTagVisibility, k as DocumentLinkCandidate, l as DocumentLinkProvider, m as EditorActions, n as EditorColorScheme, o as EditorContextMenuContext, p as EditorContextMenuItem, q as EditorContextMenuItemVisibility, r as EditorContextMenuProvider, s as EditorContextMenuProviderProps, t as EditorContextValue, E as EditorHostMode, u as EditorInsertMenuItem, v as EditorMode, w as EditorProvider, x as EditorProviderProps, z as EditorShell, G as EditorShellProps, H as EditorState, b as EditorView, L as ImageDisplayMode, O as LayoutMode, P as MentionCandidate, Q as MentionProvider, U as PreviewPanel, V as PreviewPanelProps, W as RawEditor, Y as RawEditorProps, Z as ThemeInheritance, _ as ViewPreferences, a0 as WysiwygEditor, a1 as WysiwygEditorProps, aj as useEditorContext, ak as useEditorContextMenuItems, al as useEditorInsertMenuItems } from '../shell-D9E73nri.js';
2
2
  import 'react';
3
3
  import '@bendyline/squisq/table';
4
4
  import '@bendyline/squisq-calc';
@@ -5,20 +5,20 @@ import {
5
5
  RawEditor,
6
6
  WysiwygEditor,
7
7
  useEditorContextMenuItems
8
- } from "../chunk-IRFFIMKM.js";
8
+ } from "../chunk-MJPL4QUR.js";
9
9
  import {
10
10
  EditorProvider,
11
11
  useEditorContext,
12
12
  useEditorInsertMenuItems
13
- } from "../chunk-TRBNNRLK.js";
13
+ } from "../chunk-4SZ3UWSL.js";
14
14
  import "../chunk-DNEVUOBZ.js";
15
15
  import "../chunk-V4NBQF5C.js";
16
- import "../chunk-OCQEWWHI.js";
17
- import "../chunk-HSWWEWT4.js";
18
- import "../chunk-K4Z2GIX4.js";
19
- import "../chunk-UFK47ZAI.js";
16
+ import "../chunk-KI5XQWRU.js";
17
+ import "../chunk-WMNL2WEI.js";
18
+ import "../chunk-HLU6ZBS7.js";
19
+ import "../chunk-TCGWKYME.js";
20
20
  import "../chunk-LRZJD5YD.js";
21
- import "../chunk-GS7QWYFT.js";
21
+ import "../chunk-UYB5CPRE.js";
22
22
  import "../chunk-DJS5I5NO.js";
23
23
  import "../chunk-ZS6G2P57.js";
24
24
  import "../chunk-DNJ6HOES.js";
@@ -1252,7 +1252,7 @@ interface EditorShellProps {
1252
1252
  minHeight?: string;
1253
1253
  /** See `minHeight`. Upper bound of the auto-grow range. */
1254
1254
  maxHeight?: string;
1255
- /** Optional MediaProvider for the Files panel. When set (even to null), a Files toggle appears in the toolbar. */
1255
+ /** Optional MediaProvider for the Attachments panel. When set (even to null), an Attachments toggle appears in the toolbar. */
1256
1256
  mediaProvider?: MediaProvider | null;
1257
1257
  /**
1258
1258
  * Processed-audio render manager for media-edit recipes (denoise,
@@ -1313,7 +1313,7 @@ interface EditorShellProps {
1313
1313
  /** Show the Files toggle in the toolbar. Defaults to true when mediaProvider is passed. */
1314
1314
  showFilesToggle?: boolean;
1315
1315
  /**
1316
- * Open the Files panel when its accessory bin becomes non-empty. The user
1316
+ * Open the Attachments panel when its accessory bin becomes non-empty. The user
1317
1317
  * can still close it normally; it opens again only when the visible count
1318
1318
  * changes. Defaults to false.
1319
1319
  */
@@ -1331,7 +1331,7 @@ interface EditorShellProps {
1331
1331
  */
1332
1332
  showInsertControls?: boolean;
1333
1333
  /**
1334
- * Whether the Files panel offers browser downloads for its binary entries.
1334
+ * Whether the Attachments panel offers browser downloads for its binary entries.
1335
1335
  * Defaults to true. Pass false to remove the built-in download affordance.
1336
1336
  */
1337
1337
  allowBinaryDownloads?: boolean;