@bendyline/squisq-editor-react 2.13.22 → 2.13.24

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.
@@ -722,6 +722,12 @@ type CoverImageSaveOutput = (blob: Blob, filename: string) => boolean | void | P
722
722
  * as {@link CoverImageSaveOutput} (`false` keeps the export dialog open).
723
723
  */
724
724
  type DashboardImageSaveOutput = CoverImageSaveOutput;
725
+ /**
726
+ * Host-owned persistence for an edited copy of a clip ("Save edited copy" in
727
+ * the media-edit dialog) — the same contract as {@link CoverImageSaveOutput}
728
+ * (`false` means the user cancelled). Without one the copy is downloaded.
729
+ */
730
+ type MediaEditSaveOutput = CoverImageSaveOutput;
725
731
  /** Identifies the clip the media-edit panel is open on. */
726
732
  interface MediaEditTarget {
727
733
  /** 1-based source line of the clip's annotation or standalone media tag, when known. */
@@ -871,6 +877,8 @@ interface EditorContextValue extends EditorState, EditorActions {
871
877
  saveCoverImageOutput: CoverImageSaveOutput | undefined;
872
878
  /** Optional host save flow for dashboard image exports. */
873
879
  saveDashboardImageOutput: DashboardImageSaveOutput | undefined;
880
+ /** Optional host save flow for an edited copy of a clip. */
881
+ saveMediaEditOutput: MediaEditSaveOutput | undefined;
874
882
  }
875
883
  type ImageDisplayMode = 'inline' | 'thumbnail';
876
884
  /**
@@ -923,6 +931,12 @@ interface EditorProviderProps {
923
931
  onSaveVersion?: (result: SaveVersionResult) => void;
924
932
  /** MediaProvider for resolving image URLs */
925
933
  mediaProvider?: MediaProvider | null;
934
+ /**
935
+ * Base for relative media paths when there is no `mediaProvider` (the
936
+ * player's `basePath`). Used to measure the videos that hold a block open
937
+ * for their length. Default `/`.
938
+ */
939
+ mediaBasePath?: string;
926
940
  /** Processed-audio render manager for media-edit recipes; null disables. */
927
941
  mediaEditRenders?: MediaEditRenderManager | null;
928
942
  /** Display mode for images in the WYSIWYG view. Defaults to `'inline'`. */
@@ -1000,6 +1014,8 @@ interface EditorProviderProps {
1000
1014
  saveCoverImageOutput?: CoverImageSaveOutput;
1001
1015
  /** Optional host save flow for dashboard image exports. */
1002
1016
  saveDashboardImageOutput?: DashboardImageSaveOutput;
1017
+ /** Optional host save flow for an edited copy of a clip; default is a download. */
1018
+ saveMediaEditOutput?: MediaEditSaveOutput;
1003
1019
  /** Explicit Monaco language ID — wins over the fileName-derived one. */
1004
1020
  language?: string;
1005
1021
  /**
@@ -1090,7 +1106,7 @@ interface ViewPreferences {
1090
1106
  /** Document vs. block-at-a-time layout. */
1091
1107
  layoutMode?: LayoutMode;
1092
1108
  }
1093
- declare function EditorProvider({ initialMarkdown, initialView, articleId, colorScheme: initialColorScheme, workspaceContainer, allowVersioning, versionBasename, versioningPrunePolicy, versioningAutoSaveIdleMs, onSaveVersion, mediaProvider, mediaEditRenders, imageDisplayMode, mentionProvider, proofing, proofingDefaultEnabled, proofingSpellingEnabled, proofingGrammarEnabled, proofingIgnoreStore, speechInput, documentLinkProvider, wikiLinks, fenceRenderers, onCopyCode, linkSchemes, allowRecording, allowNarrate, preserveSourceWrapping, fileName, saveCoverImageOutput, saveDashboardImageOutput, language, findMode: controlledFindMode, onFindModeChange, findRequest, inlinePreview, showStatusBar, outline, blockTags, blockTagVisibility: initialBlockTagVisibility, themeInheritance, layoutMode, viewPreferences, onViewPreferencesChange, children, }: EditorProviderProps): react.JSX.Element;
1109
+ declare function EditorProvider({ initialMarkdown, initialView, articleId, colorScheme: initialColorScheme, workspaceContainer, allowVersioning, versionBasename, versioningPrunePolicy, versioningAutoSaveIdleMs, onSaveVersion, mediaProvider, mediaBasePath, mediaEditRenders, imageDisplayMode, mentionProvider, proofing, proofingDefaultEnabled, proofingSpellingEnabled, proofingGrammarEnabled, proofingIgnoreStore, speechInput, documentLinkProvider, wikiLinks, fenceRenderers, onCopyCode, linkSchemes, allowRecording, allowNarrate, preserveSourceWrapping, fileName, saveCoverImageOutput, saveDashboardImageOutput, saveMediaEditOutput, language, findMode: controlledFindMode, onFindModeChange, findRequest, inlinePreview, showStatusBar, outline, blockTags, blockTagVisibility: initialBlockTagVisibility, themeInheritance, layoutMode, viewPreferences, onViewPreferencesChange, children, }: EditorProviderProps): react.JSX.Element;
1094
1110
 
1095
1111
  /** Which list the navigation sheet shows. */
1096
1112
  type NavigationSheetPanel = 'outline' | 'previews';
@@ -1229,6 +1245,11 @@ interface WriteCanvasSettings {
1229
1245
  * authoring controls that do not belong in a message composer.
1230
1246
  */
1231
1247
  type EditorHostMode = 'document' | 'chat';
1248
+ /**
1249
+ * Where the editor shell places its toolbar: above the editing surface (the
1250
+ * document default) or below it (a chat composer's attach and send row).
1251
+ */
1252
+ type EditorToolbarPosition = 'top' | 'bottom';
1232
1253
 
1233
1254
  interface EditorShellProps {
1234
1255
  /** Accessible name for the editing surface, separate from its empty placeholder. */
@@ -1382,6 +1403,14 @@ interface EditorShellProps {
1382
1403
  toolbarSlotAfterActions?: ReactNode;
1383
1404
  /** Content rendered at the rightmost end of the toolbar, after all other elements. */
1384
1405
  toolbarSlotRight?: ReactNode;
1406
+ /**
1407
+ * Where the toolbar sits relative to the editing surface (default: `'top'`).
1408
+ * `'bottom'` renders it after the content, above the status bar, the way a
1409
+ * chat composer carries its attach and send keys under the draft. The
1410
+ * toolbar follows the content in DOM order too, so keyboard focus moves
1411
+ * from the draft to the keys in the order they are seen.
1412
+ */
1413
+ toolbarPosition?: EditorToolbarPosition;
1385
1414
  /** Optional designer opened beside Summarize in the preview toolbar. */
1386
1415
  summarizationDesigner?: (onClose: () => void) => ReactNode;
1387
1416
  /** Host-supplied content rendered at the right edge of the bottom status bar. */
@@ -1416,6 +1445,15 @@ interface EditorShellProps {
1416
1445
  * sense (e.g. editing free-form prompt documents). Defaults to true.
1417
1446
  */
1418
1447
  showPlayTab?: boolean;
1448
+ /**
1449
+ * Whether to show the view tabs (Write, Source, Use) and their mode menus.
1450
+ * Defaults to true. When false the editor stays in `initialView` — the
1451
+ * Ctrl/Cmd+Shift+1/2/3 view shortcuts act through the tabs, so they do
1452
+ * nothing either — while the formatting and Insert controls remain. Use it
1453
+ * for a small field inside a form, where switching views is not a choice
1454
+ * the person should face. `hostMode="chat"` already hides the tabs.
1455
+ */
1456
+ showViewTabs?: boolean;
1419
1457
  /**
1420
1458
  * Whether Use mode may open its audience view in a separate browser window.
1421
1459
  * Defaults to true. Disable this in embedded hosts that block popups.
@@ -1519,6 +1557,11 @@ interface EditorShellProps {
1519
1557
  * editor uses the browser File System Access picker or download fallback.
1520
1558
  */
1521
1559
  saveDashboardImageOutput?: DashboardImageSaveOutput;
1560
+ /**
1561
+ * Host save flow for "Save edited copy" in the media-edit dialog (a clip
1562
+ * with its edits baked into one file). Without one the copy is downloaded.
1563
+ */
1564
+ saveMediaEditOutput?: MediaEditSaveOutput;
1522
1565
  /**
1523
1566
  * Explicit Monaco language ID override (e.g. `'typescript'`,
1524
1567
  * `'python'`, `'json'`). Wins over the language derived from
@@ -1825,7 +1868,7 @@ interface EditorShellProps {
1825
1868
  * Complete markdown editor shell with toolbar, view switcher, and three
1826
1869
  * editing modes: Raw (Monaco), WYSIWYG (Tiptap), and Preview.
1827
1870
  */
1828
- declare function EditorShell({ ariaLabel, initialMarkdown, initialView, hostMode, defaultViewportPreset, articleId, basePath, onChange, onLinkClick, showCodeCopyButton, onCopyCode, colorScheme, className, height, minHeight, maxHeight, mediaProvider, mediaEditRenders, workspaceContainer, allowVersioning, versionBasename, versioningPrunePolicy, versioningAutoSaveIdleMs, onSaveVersion, showFilesToggle, showFilesWhenNotEmpty, showFormattingControls, showInsertControls, allowBinaryDownloads, toolbarSlotLeft, toolbarSlotAfterActions, toolbarSlotRight, summarizationDesigner, statusBarSlotRight, sidePanelSlot, reviewProviders, showPlayTab, allowPresentationWindow, allowPresentationFullscreen, allowPrint, submitOnEnter, calcEngineFactory, codeContext, fullWidth, uxFont, thinMargins, writeCanvasSettings, showStatusBar, imageDisplayMode, fileName, saveCoverImageOutput, saveDashboardImageOutput, language, findMode, onFindModeChange, findRequest, findShortcut, mentionProvider, proofing, proofingDefaultEnabled, proofingSpellingEnabled, proofingGrammarEnabled, proofingIgnoreStore, speechInput, documentLinkProvider, wikiLinks, fenceRenderers, linkSchemes, allowRecording, allowNarrate, preserveSourceWrapping, placeholder, readOnly, imageSrc, imageAlt, imageMode, imageEditorContainer, onImageExport, inlinePreview, inlinePreviewWidth, outline, outlineWidth, navigationSheet, onNavigationSheetChange, blockTags, blockTagVisibility, themeInheritance, viewPreferences, onViewPreferencesChange, themeOverride, defaultThemeId, defaultThemeLabel, pageTemplates, }: EditorShellProps): react.JSX.Element;
1871
+ declare function EditorShell({ ariaLabel, initialMarkdown, initialView, hostMode, defaultViewportPreset, articleId, basePath, onChange, onLinkClick, showCodeCopyButton, onCopyCode, colorScheme, className, height, minHeight, maxHeight, mediaProvider, mediaEditRenders, workspaceContainer, allowVersioning, versionBasename, versioningPrunePolicy, versioningAutoSaveIdleMs, onSaveVersion, showFilesToggle, showFilesWhenNotEmpty, showFormattingControls, showInsertControls, allowBinaryDownloads, toolbarSlotLeft, toolbarSlotAfterActions, toolbarSlotRight, toolbarPosition, summarizationDesigner, statusBarSlotRight, sidePanelSlot, reviewProviders, showPlayTab, showViewTabs, allowPresentationWindow, allowPresentationFullscreen, allowPrint, submitOnEnter, calcEngineFactory, codeContext, fullWidth, uxFont, thinMargins, writeCanvasSettings, showStatusBar, imageDisplayMode, fileName, saveCoverImageOutput, saveDashboardImageOutput, saveMediaEditOutput, language, findMode, onFindModeChange, findRequest, findShortcut, mentionProvider, proofing, proofingDefaultEnabled, proofingSpellingEnabled, proofingGrammarEnabled, proofingIgnoreStore, speechInput, documentLinkProvider, wikiLinks, fenceRenderers, linkSchemes, allowRecording, allowNarrate, preserveSourceWrapping, placeholder, readOnly, imageSrc, imageAlt, imageMode, imageEditorContainer, onImageExport, inlinePreview, inlinePreviewWidth, outline, outlineWidth, navigationSheet, onNavigationSheetChange, blockTags, blockTagVisibility, themeInheritance, viewPreferences, onViewPreferencesChange, themeOverride, defaultThemeId, defaultThemeLabel, pageTemplates, }: EditorShellProps): react.JSX.Element;
1829
1872
 
1830
1873
  /**
1831
1874
  * MediaClipboard — copy, cut and paste of one image, video or audio clip in
@@ -2023,4 +2066,4 @@ interface EditorInsertMenuItem {
2023
2066
  /** Call from a toolbar slot; callbacks retain access to the editor context. */
2024
2067
  declare function useEditorInsertMenuItems(items: readonly EditorInsertMenuItem[]): void;
2025
2068
 
2026
- export { type RawEditorProps as $, type ApplySourceEditsOptions as A, type BlockInsertionBuilder as B, type CodeContext as C, type DashboardImageSaveOutput as D, type EditorHostMode as E, type FormulaEditRecord as F, type EditorShellProps as G, type EditorState as H, type FindOptions as I, type FindRequest as J, type FormulaSessionOptions as K, type ImageDisplayMode as L, type IngestedSidecar as M, type InsertBlockOptions as N, type LayoutMode as O, type PageTemplateSettings as P, type MentionCandidate as Q, type MentionProvider as R, type SceneTextChannel as S, type NavigationSheetPanel as T, type OutlineBlock as U, type OutlineInsertion as V, type PageTemplateChoice as W, type XlsxSourceMeta as X, PreviewPanel as Y, type PreviewPanelProps as Z, RawEditor as _, type CalcEngineFactory as a, type ThemeInheritance as a0, type ViewPreferences as a1, type WriteCanvasSettings as a2, WysiwygEditor as a3, type WysiwygEditorProps as a4, XLSX_LOCKED_REASON as a5, type XlsxFormulaSession as a6, applySourceEditsToText as a7, blockInsertionPoint as a8, createXlsxFormulaSession as a9, getBlockSlices as aa, headingDepthForInsertion as ab, ingestSidecarBytes as ac, joinBlockAt as ad, lineToOffset as ae, minimalReplaceEdit as af, normalizeSourceEdits as ag, offsetToLine as ah, resolveOutlineInsertion as ai, sliceIndexAtOffset as aj, sourceOutline as ak, spliceBlock as al, useEditorContext as am, useEditorContextMenuItems as an, useEditorInsertMenuItems as ao, type EditorView as b, type CsvSourceMeta as c, type BlockInsertionContext as d, type BlockPlacement as e, type BlockRange as f, type BlockSlice as g, type BlockTagVisibility as h, type CodeContextSection as i, type CoverImageSaveOutput as j, type DocumentLinkCandidate as k, type DocumentLinkProvider as l, type EditorActions as m, type EditorColorScheme as n, type EditorContextMenuContext as o, type EditorContextMenuItem as p, type EditorContextMenuItemVisibility as q, EditorContextMenuProvider as r, type EditorContextMenuProviderProps as s, type EditorContextValue as t, type EditorInsertMenuItem as u, type EditorMode as v, EditorProvider as w, type EditorProviderProps as x, type EditorSelectionInfo as y, EditorShell as z };
2069
+ export { type PreviewPanelProps as $, type ApplySourceEditsOptions as A, type BlockInsertionBuilder as B, type CodeContext as C, type DashboardImageSaveOutput as D, type EditorHostMode as E, type FormulaEditRecord as F, type EditorShellProps as G, type EditorState as H, type EditorToolbarPosition as I, type FindOptions as J, type FindRequest as K, type FormulaSessionOptions as L, type ImageDisplayMode as M, type IngestedSidecar as N, type InsertBlockOptions as O, type PageTemplateSettings as P, type LayoutMode as Q, type MediaEditSaveOutput as R, type SceneTextChannel as S, type MentionCandidate as T, type MentionProvider as U, type NavigationSheetPanel as V, type OutlineBlock as W, type XlsxSourceMeta as X, type OutlineInsertion as Y, type PageTemplateChoice as Z, PreviewPanel as _, type CalcEngineFactory as a, RawEditor as a0, type RawEditorProps as a1, type ThemeInheritance as a2, type ViewPreferences as a3, type WriteCanvasSettings as a4, WysiwygEditor as a5, type WysiwygEditorProps as a6, XLSX_LOCKED_REASON as a7, type XlsxFormulaSession as a8, applySourceEditsToText as a9, blockInsertionPoint as aa, createXlsxFormulaSession as ab, getBlockSlices as ac, headingDepthForInsertion as ad, ingestSidecarBytes as ae, joinBlockAt as af, lineToOffset as ag, minimalReplaceEdit as ah, normalizeSourceEdits as ai, offsetToLine as aj, resolveOutlineInsertion as ak, sliceIndexAtOffset as al, sourceOutline as am, spliceBlock as an, useEditorContext as ao, useEditorContextMenuItems as ap, useEditorInsertMenuItems as aq, type EditorView as b, type CsvSourceMeta as c, type BlockInsertionContext as d, type BlockPlacement as e, type BlockRange as f, type BlockSlice as g, type BlockTagVisibility as h, type CodeContextSection as i, type CoverImageSaveOutput as j, type DocumentLinkCandidate as k, type DocumentLinkProvider as l, type EditorActions as m, type EditorColorScheme as n, type EditorContextMenuContext as o, type EditorContextMenuItem as p, type EditorContextMenuItemVisibility as q, EditorContextMenuProvider as r, type EditorContextMenuProviderProps as s, type EditorContextValue as t, type EditorInsertMenuItem as u, type EditorMode as v, EditorProvider as w, type EditorProviderProps as x, type EditorSelectionInfo as y, EditorShell as z };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  encodeMonoPcm16Wav,
3
3
  startDictationSession
4
- } from "../chunk-7ADGH53Y.js";
4
+ } from "../chunk-RVHUTOHG.js";
5
5
  import {
6
6
  SPEECH_INPUT_SAMPLE_RATE,
7
7
  isSpeechInputProviderFactory,
@@ -9129,6 +9129,10 @@
9129
9129
  outline: 2px solid rgba(99, 102, 241, 0.25);
9130
9130
  outline-offset: -1px;
9131
9131
  }
9132
+ .squisq-template-picker-trigger:disabled {
9133
+ opacity: 0.6;
9134
+ pointer-events: none;
9135
+ }
9132
9136
  .squisq-template-picker-trigger-label {
9133
9137
  color: var(--squisq-text-muted);
9134
9138
  }
@@ -9160,6 +9164,10 @@
9160
9164
  overflow: hidden;
9161
9165
  text-overflow: ellipsis;
9162
9166
  }
9167
+ .squisq-slide-block-type .squisq-template-picker-trigger-value {
9168
+ width: 88px;
9169
+ text-align: left;
9170
+ }
9163
9171
  .squisq-template-picker-trigger-caret {
9164
9172
  color: var(--squisq-text-faint);
9165
9173
  flex-shrink: 0;
@@ -9624,6 +9632,10 @@
9624
9632
  background: var(--squisq-surface-subtle);
9625
9633
  flex-shrink: 0;
9626
9634
  }
9635
+ .squisq-editor-shell[data-toolbar-position=bottom] > .squisq-editor-header {
9636
+ border-bottom: 0;
9637
+ border-top: 1px solid var(--squisq-border-subtle);
9638
+ }
9627
9639
  .squisq-editor-header--image {
9628
9640
  display: flex;
9629
9641
  align-items: center;
@@ -15430,6 +15442,35 @@ button.squisq-view-menu-radio-row:focus-visible {
15430
15442
  font-weight: 600;
15431
15443
  }
15432
15444
 
15445
+ /* src/styles/footnotes.css */
15446
+ .squisq-footnote-ref {
15447
+ font-size: 0.72em;
15448
+ vertical-align: super;
15449
+ line-height: 0;
15450
+ padding: 0 0.2em;
15451
+ border-radius: 3px;
15452
+ color: var(--squisq-accent);
15453
+ background: var(--squisq-accent-subtle);
15454
+ white-space: nowrap;
15455
+ }
15456
+ .squisq-footnote-ref--missing {
15457
+ color: var(--squisq-text-muted);
15458
+ background: transparent;
15459
+ }
15460
+ .squisq-footnote-definition {
15461
+ font-size: 0.875em;
15462
+ color: var(--squisq-text-muted);
15463
+ }
15464
+ .squisq-footnote-definition:not(.squisq-footnote-definition + .squisq-footnote-definition) {
15465
+ margin-top: 1.25em;
15466
+ padding-top: 0.5em;
15467
+ border-top: 1px solid var(--squisq-border-subtle);
15468
+ }
15469
+ .squisq-footnote-label {
15470
+ color: var(--squisq-accent);
15471
+ font-weight: 600;
15472
+ }
15473
+
15433
15474
  /* src/styles/document-tray.css */
15434
15475
  .squisq-wysiwyg-editor .squisq-document-tray-source {
15435
15476
  display: none !important;
@@ -17057,13 +17098,26 @@ button.squisq-view-menu-radio-row:focus-visible {
17057
17098
  background: var(--squisq-editor-control-bg-hover);
17058
17099
  }
17059
17100
  .squisq-media-edit-modal__surface--tabbed {
17101
+ width: min(720px, 100%);
17060
17102
  height: min(640px, 100%);
17061
17103
  }
17104
+ .squisq-media-edit-modal__surface--large {
17105
+ width: 100%;
17106
+ height: 100%;
17107
+ }
17062
17108
  .squisq-media-edit-modal__body {
17109
+ display: flex;
17063
17110
  flex: 1;
17111
+ flex-direction: column;
17112
+ min-height: 0;
17064
17113
  overflow: auto;
17065
17114
  padding: 12px 16px 16px;
17066
17115
  }
17116
+ .squisq-media-edit-panel--fill:not([hidden]) {
17117
+ display: flex;
17118
+ flex: 1 0 auto;
17119
+ flex-direction: column;
17120
+ }
17067
17121
  .squisq-media-edit-tabs {
17068
17122
  display: flex;
17069
17123
  gap: 4px;
@@ -17372,6 +17426,10 @@ button.squisq-view-menu-radio-row:focus-visible {
17372
17426
  border-radius: 4px;
17373
17427
  touch-action: none;
17374
17428
  }
17429
+ .squisq-media-edit-modal__surface--large .squisq-media-edit-crop {
17430
+ max-width: min(100%, calc((100vh - 300px) * var(--squisq-media-edit-frame-ratio, 1.7778)));
17431
+ margin-inline: auto;
17432
+ }
17375
17433
  .squisq-media-edit-crop video {
17376
17434
  display: block;
17377
17435
  width: 100%;
@@ -17417,6 +17475,318 @@ button.squisq-view-menu-radio-row:focus-visible {
17417
17475
  right: -7px;
17418
17476
  cursor: nwse-resize;
17419
17477
  }
17478
+ .squisq-media-edit-cuts {
17479
+ display: flex;
17480
+ flex: 1 0 auto;
17481
+ flex-direction: column;
17482
+ }
17483
+ .squisq-media-edit-cuts__monitor {
17484
+ position: relative;
17485
+ flex: 1 1 180px;
17486
+ min-height: 180px;
17487
+ margin-bottom: 8px;
17488
+ overflow: hidden;
17489
+ background: var(--squisq-surface-sunken);
17490
+ border-radius: 4px;
17491
+ }
17492
+ .squisq-media-edit-cuts__monitor video {
17493
+ position: absolute;
17494
+ inset: 0;
17495
+ display: block;
17496
+ width: 100%;
17497
+ height: 100%;
17498
+ object-fit: contain;
17499
+ }
17500
+ .squisq-media-edit-cuts__transport,
17501
+ .squisq-media-edit-cuts__actions {
17502
+ display: flex;
17503
+ flex-wrap: wrap;
17504
+ align-items: center;
17505
+ gap: 6px;
17506
+ }
17507
+ .squisq-media-edit-cuts__transport {
17508
+ margin-bottom: 8px;
17509
+ }
17510
+ .squisq-media-edit-cuts__actions {
17511
+ margin-top: 8px;
17512
+ }
17513
+ .squisq-media-edit-cuts__notes {
17514
+ display: flex;
17515
+ flex-wrap: wrap;
17516
+ justify-content: space-between;
17517
+ column-gap: 16px;
17518
+ }
17519
+ .squisq-media-edit-modal__surface--large .squisq-media-edit-cuts__lower {
17520
+ display: grid;
17521
+ grid-template-columns: minmax(0, 1fr) 380px;
17522
+ column-gap: 20px;
17523
+ align-items: start;
17524
+ }
17525
+ .squisq-media-edit-modal__surface--large .squisq-media-edit-cuts__pauses {
17526
+ margin-top: 6px;
17527
+ padding-top: 0;
17528
+ border-top: 0;
17529
+ }
17530
+ .squisq-media-edit-cuts__transport .squisq-media-edit-chips {
17531
+ margin: 0;
17532
+ }
17533
+ .squisq-media-edit-cuts__play {
17534
+ display: inline-flex;
17535
+ align-items: center;
17536
+ justify-content: center;
17537
+ gap: 6px;
17538
+ min-width: 78px;
17539
+ }
17540
+ .squisq-media-edit-cuts__time {
17541
+ min-width: 9.5em;
17542
+ color: var(--squisq-text-muted);
17543
+ font-variant-numeric: tabular-nums;
17544
+ white-space: nowrap;
17545
+ }
17546
+ .squisq-media-edit-cuts__zoom {
17547
+ display: flex;
17548
+ gap: 4px;
17549
+ margin-left: auto;
17550
+ }
17551
+ .squisq-media-edit-cuts__selection {
17552
+ flex: 1;
17553
+ min-width: 0;
17554
+ overflow: hidden;
17555
+ color: var(--squisq-text-muted);
17556
+ font-size: 12px;
17557
+ font-variant-numeric: tabular-nums;
17558
+ text-overflow: ellipsis;
17559
+ white-space: nowrap;
17560
+ }
17561
+ .squisq-media-edit-cuts__pauses {
17562
+ margin-top: 12px;
17563
+ padding-top: 8px;
17564
+ border-top: 1px solid var(--squisq-border-subtle);
17565
+ }
17566
+ .squisq-media-edit-timeline {
17567
+ position: relative;
17568
+ overflow-x: auto;
17569
+ overflow-y: hidden;
17570
+ scrollbar-width: thin;
17571
+ background: var(--squisq-surface-sunken);
17572
+ border: 1px solid var(--squisq-editor-control-border);
17573
+ border-radius: 4px;
17574
+ }
17575
+ .squisq-media-edit-timeline:focus-visible {
17576
+ outline: 2px solid var(--squisq-focus-ring);
17577
+ outline-offset: 1px;
17578
+ }
17579
+ .squisq-media-edit-timeline--empty {
17580
+ display: flex;
17581
+ align-items: center;
17582
+ justify-content: center;
17583
+ height: 122px;
17584
+ padding: 0 16px;
17585
+ overflow: hidden;
17586
+ color: var(--squisq-text-muted);
17587
+ font-variant-numeric: tabular-nums;
17588
+ }
17589
+ .squisq-media-edit-timeline__track {
17590
+ position: relative;
17591
+ box-sizing: border-box;
17592
+ min-width: 100%;
17593
+ height: 120px;
17594
+ padding-top: 18px;
17595
+ cursor: text;
17596
+ touch-action: none;
17597
+ user-select: none;
17598
+ }
17599
+ .squisq-media-edit-timeline__ruler {
17600
+ position: absolute;
17601
+ inset: 0 0 auto;
17602
+ height: 18px;
17603
+ border-bottom: 1px solid var(--squisq-border-subtle);
17604
+ pointer-events: none;
17605
+ }
17606
+ .squisq-media-edit-timeline__tick {
17607
+ position: absolute;
17608
+ top: 0;
17609
+ height: 18px;
17610
+ padding-left: 4px;
17611
+ border-left: 1px solid var(--squisq-editor-control-border);
17612
+ color: var(--squisq-text-muted);
17613
+ font-size: 10px;
17614
+ font-variant-numeric: tabular-nums;
17615
+ line-height: 18px;
17616
+ white-space: nowrap;
17617
+ }
17618
+ .squisq-media-edit-timeline__wave {
17619
+ position: sticky;
17620
+ left: 0;
17621
+ display: block;
17622
+ height: 102px;
17623
+ color: var(--squisq-accent);
17624
+ pointer-events: none;
17625
+ }
17626
+ .squisq-media-edit-timeline__cut {
17627
+ position: absolute;
17628
+ top: 18px;
17629
+ bottom: 0;
17630
+ box-sizing: border-box;
17631
+ min-width: 2px;
17632
+ border-inline: 1px solid var(--squisq-danger);
17633
+ }
17634
+ .squisq-media-edit-timeline__cut::before,
17635
+ .squisq-media-edit-timeline__cut::after {
17636
+ content: "";
17637
+ position: absolute;
17638
+ inset: 0;
17639
+ pointer-events: none;
17640
+ }
17641
+ .squisq-media-edit-timeline__cut::before {
17642
+ background: var(--squisq-surface-sunken);
17643
+ opacity: 0.84;
17644
+ }
17645
+ .squisq-media-edit-timeline__cut::after {
17646
+ background:
17647
+ repeating-linear-gradient(
17648
+ 135deg,
17649
+ transparent 0 6px,
17650
+ color-mix(in srgb, var(--squisq-danger) 38%, transparent) 6px 7px);
17651
+ }
17652
+ .squisq-media-edit-timeline__handle {
17653
+ position: absolute;
17654
+ top: 0;
17655
+ bottom: 0;
17656
+ z-index: 1;
17657
+ width: 11px;
17658
+ cursor: ew-resize;
17659
+ touch-action: none;
17660
+ }
17661
+ .squisq-media-edit-timeline__handle--start {
17662
+ left: -6px;
17663
+ }
17664
+ .squisq-media-edit-timeline__handle--end {
17665
+ right: -6px;
17666
+ }
17667
+ .squisq-media-edit-timeline__handle::after {
17668
+ content: "";
17669
+ position: absolute;
17670
+ top: 50%;
17671
+ left: 2px;
17672
+ box-sizing: border-box;
17673
+ width: 7px;
17674
+ height: 30px;
17675
+ border: 1px solid var(--squisq-surface-sunken);
17676
+ border-radius: 4px;
17677
+ background: var(--squisq-danger);
17678
+ transform: translateY(-50%);
17679
+ }
17680
+ .squisq-media-edit-timeline__handle:focus-visible {
17681
+ outline: 2px solid var(--squisq-focus-ring);
17682
+ outline-offset: -2px;
17683
+ }
17684
+ .squisq-media-edit-timeline__cut[data-narrow=true] .squisq-media-edit-timeline__handle {
17685
+ opacity: 0;
17686
+ pointer-events: none;
17687
+ }
17688
+ .squisq-media-edit-timeline__cut[data-narrow=true] .squisq-media-edit-timeline__handle:focus-visible {
17689
+ opacity: 1;
17690
+ }
17691
+ .squisq-media-edit-modal button.squisq-media-edit-timeline__restore {
17692
+ position: absolute;
17693
+ top: 4px;
17694
+ left: 50%;
17695
+ z-index: 2;
17696
+ width: 18px;
17697
+ min-height: 0;
17698
+ height: 18px;
17699
+ padding: 0;
17700
+ border-radius: 50%;
17701
+ font-size: 13px;
17702
+ line-height: 1;
17703
+ opacity: 0;
17704
+ transform: translateX(-50%);
17705
+ }
17706
+ .squisq-media-edit-timeline__cut:hover .squisq-media-edit-timeline__restore,
17707
+ .squisq-media-edit-modal button.squisq-media-edit-timeline__restore:focus-visible {
17708
+ opacity: 1;
17709
+ }
17710
+ .squisq-media-edit-timeline__cut[data-narrow=true] .squisq-media-edit-timeline__restore {
17711
+ display: none;
17712
+ }
17713
+ .squisq-media-edit-timeline__selection {
17714
+ position: absolute;
17715
+ top: 18px;
17716
+ bottom: 0;
17717
+ box-sizing: content-box;
17718
+ margin-left: -1px;
17719
+ border-inline: 1px solid var(--squisq-accent);
17720
+ background: color-mix(in srgb, var(--squisq-accent) 26%, transparent);
17721
+ pointer-events: none;
17722
+ }
17723
+ .squisq-media-edit-timeline__playhead {
17724
+ position: absolute;
17725
+ top: 0;
17726
+ bottom: 0;
17727
+ z-index: 3;
17728
+ width: 0;
17729
+ margin-left: -1px;
17730
+ border-left: 2px solid var(--squisq-text);
17731
+ pointer-events: none;
17732
+ }
17733
+ .squisq-media-edit-timeline__playhead::before {
17734
+ content: "";
17735
+ position: absolute;
17736
+ top: 0;
17737
+ left: -6px;
17738
+ border: 5px solid transparent;
17739
+ border-top: 7px solid var(--squisq-text);
17740
+ border-bottom: 0;
17741
+ }
17742
+ .squisq-media-edit-cutlist {
17743
+ flex: none;
17744
+ box-sizing: border-box;
17745
+ height: 100px;
17746
+ margin: 6px 0 0;
17747
+ padding: 0;
17748
+ overflow-y: auto;
17749
+ border: 1px solid var(--squisq-border-subtle);
17750
+ border-radius: 4px;
17751
+ list-style: none;
17752
+ }
17753
+ .squisq-media-edit-cutlist--empty {
17754
+ display: flex;
17755
+ align-items: center;
17756
+ justify-content: center;
17757
+ color: var(--squisq-text-muted);
17758
+ font-size: 12px;
17759
+ }
17760
+ .squisq-media-edit-cutlist li {
17761
+ display: grid;
17762
+ grid-template-columns: 1fr auto auto auto;
17763
+ align-items: center;
17764
+ column-gap: 8px;
17765
+ padding: 3px 6px 3px 10px;
17766
+ font-variant-numeric: tabular-nums;
17767
+ }
17768
+ .squisq-media-edit-cutlist li + li {
17769
+ border-top: 1px solid var(--squisq-border-subtle);
17770
+ }
17771
+ .squisq-media-edit-cutlist__length {
17772
+ min-width: 4.5em;
17773
+ color: var(--squisq-text-muted);
17774
+ text-align: right;
17775
+ }
17776
+ .squisq-media-edit-modal .squisq-media-edit-cutlist button {
17777
+ display: inline-flex;
17778
+ align-items: center;
17779
+ gap: 6px;
17780
+ min-height: 24px;
17781
+ padding: 2px 8px;
17782
+ }
17783
+
17784
+ /* src/styles/fill-available.css */
17785
+ .squisq-block-fill-available[data-fill-height] {
17786
+ display: flex;
17787
+ flex-direction: column;
17788
+ min-height: var(--squisq-fill-height);
17789
+ }
17420
17790
 
17421
17791
  /* src/styles/diagram.css */
17422
17792
  .squisq-diagram-widget-host {
@@ -18591,24 +18961,14 @@ button.squisq-view-menu-radio-row:focus-visible {
18591
18961
  border-radius: 0;
18592
18962
  border-top: 1px solid var(--squisq-border-subtle);
18593
18963
  }
18594
- .squisq-block-card-body .squisq-wysiwyg-editor:has(> .squisq-block-fill-available:last-child) {
18595
- display: flex;
18596
- flex-direction: column;
18597
- box-sizing: border-box;
18598
- }
18599
- .squisq-block-card-body .squisq-wysiwyg-editor > .squisq-block-fill-available:last-child {
18600
- display: flex;
18601
- flex: 1 0 auto;
18602
- flex-direction: column;
18603
- }
18604
- .squisq-block-card-body .squisq-wysiwyg-editor > .squisq-data-card-host:last-child > .squisq-data-card,
18605
- .squisq-block-card-body .squisq-wysiwyg-editor > .squisq-data-card-host:last-child > .squisq-data-card > .squisq-data-card-grid {
18964
+ .squisq-data-card-host[data-fill-height] > .squisq-data-card[data-fills],
18965
+ .squisq-data-card-host[data-fill-height] > .squisq-data-card[data-fills] > .squisq-data-card-grid {
18606
18966
  display: flex;
18607
18967
  flex: 1 1 auto;
18608
18968
  flex-direction: column;
18609
18969
  min-height: 0;
18610
18970
  }
18611
- .squisq-block-card-body .squisq-wysiwyg-editor > .squisq-data-card-host:last-child .squisq-grid-scroller {
18971
+ .squisq-data-card-host[data-fill-height] > .squisq-data-card[data-fills] > .squisq-data-card-grid > .squisq-grid-scroller {
18612
18972
  flex: 1 1 420px;
18613
18973
  min-height: 0;
18614
18974
  }
@@ -19628,6 +19988,28 @@ button.squisq-ascii-timeline-track-name:focus-visible {
19628
19988
  margin: 4px 6px;
19629
19989
  background: var(--squisq-border-subtle);
19630
19990
  }
19991
+ .squisq-editor-context-menu-proof {
19992
+ display: flex;
19993
+ align-items: flex-start;
19994
+ gap: 7px;
19995
+ padding: 6px 10px;
19996
+ margin-bottom: 4px;
19997
+ border-bottom: 1px solid var(--squisq-border-subtle);
19998
+ color: var(--squisq-text-muted);
19999
+ font-size: 12px;
20000
+ }
20001
+ .squisq-editor-context-menu-proof .squisq-proof-dot {
20002
+ flex: 0 0 auto;
20003
+ margin-top: 3px;
20004
+ }
20005
+ .squisq-editor-context-menu-proof-empty {
20006
+ padding: 2px 10px 6px;
20007
+ color: var(--squisq-text-faint);
20008
+ font-style: italic;
20009
+ }
20010
+ .squisq-editor-context-menu-item--suggestion {
20011
+ font-weight: 600;
20012
+ }
19631
20013
  .squisq-editor-context-menu-error {
19632
20014
  max-width: 300px;
19633
20015
  padding: 6px 10px;
@@ -20866,6 +21248,18 @@ button.squisq-ascii-timeline-track-name:focus-visible {
20866
21248
  overflow: hidden;
20867
21249
  background: var(--squisq-surface);
20868
21250
  }
21251
+ .squisq-block-fill-available[data-fill-height] > .squisq-scene-shell {
21252
+ display: flex;
21253
+ flex: 1 1 auto;
21254
+ flex-direction: column;
21255
+ min-height: 0;
21256
+ }
21257
+ .squisq-block-fill-available[data-fill-height] > .squisq-scene-shell > .squisq-scene-inline,
21258
+ .squisq-block-fill-available[data-fill-height] > .squisq-scene-shell > .squisq-diagram-inline:not([data-height-pinned]) {
21259
+ flex: 1 1 420px;
21260
+ height: auto;
21261
+ min-height: 0;
21262
+ }
20869
21263
  .squisq-scene-inline-placeholder {
20870
21264
  height: 420px;
20871
21265
  border: 1px dashed var(--squisq-border);
@@ -2,8 +2,8 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { Doc, Theme, MediaProvider } from '@bendyline/squisq/schemas';
4
4
  import { ContentContainer } from '@bendyline/squisq/storage';
5
- import { o as TeleprompterRecordingDeps, g as NarrationStageHandle, T as TeleprompterController, c as FloatingWindowHandle } from '../useNarrationStage-DlighI1z.js';
6
- export { C as CanvasSink, D as DEFAULT_TELEPROMPTER_PREFS, F as FloatOpenOptions, b as FloatTier, d as FloatingWindowManager, M as MicAnalysisHandle, e as MicAnalysisStatus, N as NarrationRecorderController, f as NarrationRecorderState, h as NarrationTake, P as PrompterTransport, J as TELEPROMPTER_PREF_LIMITS, n as TeleprompterPrefs, q as UseNarrationStageOptions, s as createFloatingWindowManager, t as detectFloatTiers, K as normalizeTeleprompterPrefs, z as useFloatingWindow, B as useMicAnalysis, E as useNarrationRecorder, G as useNarrationStage, H as useTeleprompter, I as vadConfigForSensitivity } from '../useNarrationStage-DlighI1z.js';
5
+ import { o as TeleprompterRecordingDeps, g as NarrationStageHandle, T as TeleprompterController, c as FloatingWindowHandle } from '../useNarrationStage-BsSUp9Zr.js';
6
+ export { C as CanvasSink, D as DEFAULT_TELEPROMPTER_PREFS, F as FloatOpenOptions, b as FloatTier, d as FloatingWindowManager, M as MicAnalysisHandle, e as MicAnalysisStatus, N as NarrationRecorderController, f as NarrationRecorderState, h as NarrationTake, P as PrompterTransport, J as TELEPROMPTER_PREF_LIMITS, n as TeleprompterPrefs, q as UseNarrationStageOptions, s as createFloatingWindowManager, t as detectFloatTiers, K as normalizeTeleprompterPrefs, z as useFloatingWindow, B as useMicAnalysis, E as useNarrationRecorder, G as useNarrationStage, H as useTeleprompter, I as vadConfigForSensitivity } from '../useNarrationStage-BsSUp9Zr.js';
7
7
  import { NarrationTimingJsonV3, NarrationScript, NarrationAlignment, NarrationTimingGenerator } from '@bendyline/squisq/narration';
8
8
  import '../screenRegion-Ci_RsCzG.js';
9
9
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TeleprompterView
3
- } from "../chunk-GI2D2XS5.js";
3
+ } from "../chunk-IOG66XFC.js";
4
4
  import {
5
5
  DEFAULT_TELEPROMPTER_PREFS,
6
6
  EYE_LINE_FRACTION,
@@ -31,8 +31,8 @@ import {
31
31
  useNarrationStage,
32
32
  useTeleprompter,
33
33
  vadConfigForSensitivity
34
- } from "../chunk-JCIK2QU5.js";
35
- import "../chunk-DNJ6HOES.js";
34
+ } from "../chunk-2KTMXJWB.js";
35
+ import "../chunk-QXHX7N4V.js";
36
36
  import "../chunk-GG35EBRB.js";
37
37
  export {
38
38
  DEFAULT_TELEPROMPTER_PREFS,
@@ -13,6 +13,7 @@ import { S as ScreenCaptureRegion } from './screenRegion-Ci_RsCzG.js';
13
13
  * the best supported option, falling back to whatever the browser hands
14
14
  * back when no probe succeeds.
15
15
  */
16
+
16
17
  /** What the recorded stream is intended to capture. */
17
18
  type CaptureKind = 'audio' | 'video';
18
19
  /** A probed format choice — what to pass to `MediaRecorder` and where to write it. */