@bendyline/squisq-editor-react 1.6.1 → 2.0.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 +12 -3
- package/dist/index.d.ts +1304 -208
- package/dist/index.js +22838 -14494
- package/dist/index.js.map +1 -1
- package/dist/monaco.d.ts +1 -0
- package/dist/monaco.js +4 -0
- package/dist/monaco.js.map +1 -0
- package/dist/styles/index.css +2384 -408
- package/package.json +9 -5
- package/src/BlockPropertiesPopover.tsx +48 -17
- package/src/DocumentSettingsDialog.tsx +13 -21
- package/src/EditorContext.tsx +199 -42
- package/src/EditorShell.tsx +403 -270
- package/src/ImageEditor.tsx +22 -1
- package/src/InlinePreviewGutter.tsx +16 -8
- package/src/MediaBin.tsx +276 -40
- package/src/OutlinePanel.tsx +202 -7
- package/src/PlainHtmlPreview.tsx +40 -1
- package/src/PreviewControls.tsx +466 -93
- package/src/PreviewPanel.tsx +313 -77
- package/src/RawEditor.tsx +13 -2
- package/src/StatusBar.tsx +5 -2
- package/src/TemplateAnnotation.ts +34 -10
- package/src/TemplateContentPreview.tsx +56 -0
- package/src/TemplatePicker.tsx +355 -134
- package/src/ThemeCustomizerPanel.tsx +30 -15
- package/src/ThemePicker.tsx +10 -5
- package/src/TimelineBlockPreview.tsx +1 -1
- package/src/Toolbar.tsx +719 -238
- package/src/TransitionPicker.tsx +44 -5
- package/src/ViewMenuPanel.tsx +12 -14
- package/src/ViewSwitcher.tsx +4 -4
- package/src/WysiwygEditor.tsx +167 -92
- package/src/__tests__/blockPropertiesPopoverTheme.test.tsx +33 -0
- package/src/__tests__/blockTagActivity.test.ts +183 -0
- package/src/__tests__/buildDocumentPreviewMarkdown.test.ts +75 -0
- package/src/__tests__/buildPreviewDocContent.test.ts +48 -0
- package/src/__tests__/buildPreviewDocTransition.test.ts +22 -3
- package/src/__tests__/canvasSurfaceTextEditing.test.tsx +60 -0
- package/src/__tests__/customLayoutManagerTheme.test.tsx +34 -0
- package/src/__tests__/documentSettingsDialog.test.tsx +29 -1
- package/src/__tests__/editorScrollHandoff.test.tsx +102 -0
- package/src/__tests__/editorScrollSync.test.ts +65 -0
- package/src/__tests__/editorShellProps.test.tsx +390 -1
- package/src/__tests__/emojiPicker.test.tsx +2 -42
- package/src/__tests__/headingTransition.test.ts +53 -15
- package/src/__tests__/imageEditAffordance.test.tsx +5 -1
- package/src/__tests__/imageEditModalContract.test.tsx +119 -0
- package/src/__tests__/imageEditorShell.test.tsx +38 -1
- package/src/__tests__/jsonEditor.test.tsx +56 -1
- package/src/__tests__/layersPanel.test.tsx +75 -5
- package/src/__tests__/majorApiTypes.test.ts +26 -0
- package/src/__tests__/mediaBinDrop.test.tsx +90 -0
- package/src/__tests__/mediaReferences.test.ts +82 -0
- package/src/__tests__/narrationSave.test.ts +148 -0
- package/src/__tests__/outlinePanel.test.tsx +93 -3
- package/src/__tests__/outlineSource.test.ts +217 -0
- package/src/__tests__/plainHtmlPreview.test.tsx +17 -1
- package/src/__tests__/presentationMode.test.tsx +290 -0
- package/src/__tests__/previewControls.test.tsx +312 -6
- package/src/__tests__/previewPanelAudioFailure.test.tsx +46 -0
- package/src/__tests__/previewPanelPresentation.test.tsx +126 -0
- package/src/__tests__/previewPanelTransforms.test.tsx +117 -0
- package/src/__tests__/rawEditorModelIsolation.test.ts +19 -0
- package/src/__tests__/resolveBlockVisual.test.ts +43 -0
- package/src/__tests__/statusBar.test.tsx +27 -0
- package/src/__tests__/teleprompter.test.tsx +190 -0
- package/src/__tests__/templateAnnotationRoundTrip.test.ts +49 -2
- package/src/__tests__/templateContentPreview.test.ts +101 -0
- package/src/__tests__/templatePickerPortal.test.tsx +62 -0
- package/src/__tests__/tiptapBridge.test.ts +70 -0
- package/src/__tests__/tiptapCodeBlockRoundTrip.test.ts +109 -0
- package/src/__tests__/transformStyleId.test.ts +13 -0
- package/src/__tests__/useImageEditor.test.tsx +67 -0
- package/src/__tests__/useMediaRecorder.test.ts +75 -0
- package/src/__tests__/viewMenuPanel.test.tsx +130 -0
- package/src/__tests__/wysiwygImageUpload.test.ts +69 -0
- package/src/__tests__/wysiwygTemplateBadgeFocus.test.tsx +56 -0
- package/src/asciiDiagram/AsciiDiagramExtension.ts +343 -0
- package/src/asciiDiagram/AsciiDiagramWidget.tsx +224 -0
- package/src/asciiDiagram/RepairableDiagramExtension.ts +200 -0
- package/src/asciiDiagram/__tests__/AsciiDiagramExtension.test.ts +145 -0
- package/src/asciiDiagram/__tests__/RepairableDiagramExtension.test.ts +159 -0
- package/src/asciiDiagram/__tests__/asciiDiagramCommands.test.ts +227 -0
- package/src/asciiDiagram/__tests__/asciiDiagramOps.test.ts +114 -0
- package/src/asciiDiagram/__tests__/asciiPaste.test.ts +43 -0
- package/src/asciiDiagram/asciiDiagramCommands.ts +148 -0
- package/src/asciiDiagram/asciiDiagramData.ts +116 -0
- package/src/asciiDiagram/asciiDiagramOps.ts +219 -0
- package/src/asciiDiagram/asciiPaste.ts +19 -0
- package/src/blockTagActivity.ts +233 -0
- package/src/buildDocumentPreviewMarkdown.ts +168 -0
- package/src/buildPreviewDoc.ts +19 -12
- package/src/customTemplates/CustomLayoutManager.tsx +3 -2
- package/src/customTemplates/CustomTemplateContext.tsx +6 -0
- package/src/customTemplates/TemplateDesigner.tsx +7 -4
- package/src/customTemplates/__tests__/library.test.ts +8 -0
- package/src/customTemplates/designer.css +158 -99
- package/src/customTemplates/library.ts +16 -3
- package/src/customThemes/CustomThemeContext.tsx +6 -0
- package/src/customThemes/CustomThemeDialog.tsx +35 -5
- package/src/customThemes/ImportThemeSection.tsx +178 -0
- package/src/customThemes/__tests__/customThemeLibrary.test.ts +9 -0
- package/src/customThemes/__tests__/importThemeSection.test.tsx +192 -0
- package/src/customThemes/customThemeLibrary.ts +7 -4
- package/src/customThemes/index.ts +7 -1
- package/src/customThemes/themeDraft.ts +23 -7
- package/src/diagram/DiagramCanvas.tsx +9 -4
- package/src/diagram/types.ts +35 -0
- package/src/editorScrollSync.ts +73 -0
- package/src/emojiData.ts +3 -23
- package/src/headingTransition.ts +85 -25
- package/src/imageEditor/CanvasSurface.tsx +29 -23
- package/src/imageEditor/LayersPanel.tsx +78 -3
- package/src/imageEditor/Toolbar.tsx +5 -1
- package/src/imageEditor/icons.tsx +4 -0
- package/src/imageEditor/image-editor.css +75 -0
- package/src/imageEditor/layers/SelectionHandles.tsx +1 -1
- package/src/imageEditor/useImageEditor.ts +71 -14
- package/src/index.ts +193 -20
- package/src/jsonEditor/JsonEditorContext.tsx +12 -6
- package/src/jsonEditor/RenderNode.tsx +24 -3
- package/src/jsonEditor/editors.tsx +86 -19
- package/src/mediaEntries.ts +12 -0
- package/src/mediaReferences.ts +299 -0
- package/src/monaco.ts +35 -0
- package/src/monacoWorkers.ts +89 -0
- package/src/outlineSource.ts +171 -0
- package/src/presentation/PresentationMode.tsx +596 -0
- package/src/rawEditorIsolation.ts +18 -0
- package/src/recorder/hooks/useMediaRecorder.ts +97 -53
- package/src/resolveBlockVisual.ts +10 -4
- package/src/scene/Scene.tsx +101 -25
- package/src/scene/SceneBlockExtension.ts +17 -10
- package/src/scene/SceneBlockWidget.tsx +11 -4
- package/src/scene/SceneSelection.tsx +19 -15
- package/src/scene/SceneSideToolbar.tsx +89 -0
- package/src/scene/SceneViewport.tsx +7 -3
- package/src/scene/ShapePalette.tsx +17 -2
- package/src/scene/__tests__/DiagramAdapter.test.ts +86 -0
- package/src/scene/__tests__/SceneBlockExtension.test.ts +33 -0
- package/src/scene/__tests__/sceneIsolation.test.tsx +93 -0
- package/src/scene/adapters/DiagramAdapter.ts +12 -101
- package/src/scene/commands/SceneCommand.ts +4 -1
- package/src/scene/index.ts +1 -6
- package/src/scene/layers/DiagramEdges.tsx +24 -9
- package/src/scene/layers/edgeGeometry.ts +31 -4
- package/src/scene/layers/nodeCard.tsx +27 -8
- package/src/scene/scene.css +145 -2
- package/src/scene/text/SceneTextOverlay.tsx +5 -5
- package/src/scene/text/sceneTextChannel.ts +26 -20
- package/src/scene/text/sceneTextConfig.ts +4 -0
- package/src/scene/tools/ConnectTool.ts +126 -28
- package/src/scene/tools/DrawingConnectTool.ts +86 -16
- package/src/scene/tools/SceneTool.ts +10 -0
- package/src/scene/tools/SelectTool.ts +34 -18
- package/src/scene/tools/ShapeTool.ts +2 -3
- package/src/styles/ascii-diagram.css +79 -0
- package/src/styles/ascii-timeline.css +499 -0
- package/src/styles/editor.css +1566 -219
- package/src/styles/index.css +3 -0
- package/src/styles/tree-view.css +139 -0
- package/src/teleprompter/TeleprompterControls.tsx +218 -0
- package/src/teleprompter/TeleprompterSelfView.tsx +22 -0
- package/src/teleprompter/TeleprompterSurface.tsx +267 -0
- package/src/teleprompter/TeleprompterView.tsx +338 -0
- package/src/teleprompter/canvasRenderer.ts +161 -0
- package/src/teleprompter/floatingWindow.ts +352 -0
- package/src/teleprompter/index.ts +61 -0
- package/src/teleprompter/pcmWorklet.ts +62 -0
- package/src/teleprompter/recording/insertPreamble.ts +80 -0
- package/src/teleprompter/recording/narrationSave.ts +134 -0
- package/src/teleprompter/recording/useNarrationRecorder.ts +367 -0
- package/src/teleprompter/scrollModel.ts +85 -0
- package/src/teleprompter/teleprompterTheme.ts +303 -0
- package/src/teleprompter/types.ts +38 -0
- package/src/teleprompter/useFloatingWindow.ts +74 -0
- package/src/teleprompter/useMicAnalysis.ts +211 -0
- package/src/teleprompter/useTeleprompter.ts +421 -0
- package/src/templateContentPreviewResolver.ts +360 -0
- package/src/timeline/TimelineEditorWidget.tsx +702 -0
- package/src/timeline/TimelineViewExtension.ts +252 -0
- package/src/timeline/__tests__/TimelineEditorWidget.test.tsx +355 -0
- package/src/timeline/__tests__/TimelineViewExtension.test.ts +163 -0
- package/src/timeline/__tests__/timelineCommands.test.ts +327 -0
- package/src/timeline/__tests__/timelineOps.test.ts +222 -0
- package/src/timeline/__tests__/timelinePaste.test.ts +34 -0
- package/src/timeline/timelineCommands.ts +367 -0
- package/src/timeline/timelineData.ts +54 -0
- package/src/timeline/timelineOps.ts +277 -0
- package/src/timeline/timelinePaste.ts +8 -0
- package/src/tiptapBridge.ts +84 -49
- package/src/transformStyleId.ts +17 -0
- package/src/treeview/TreeOutlineWidget.tsx +240 -0
- package/src/treeview/TreeViewExtension.ts +250 -0
- package/src/treeview/__tests__/TreeViewExtension.test.ts +122 -0
- package/src/treeview/__tests__/treeOps.test.ts +125 -0
- package/src/treeview/__tests__/treePaste.test.ts +40 -0
- package/src/treeview/__tests__/treeViewCommands.test.ts +163 -0
- package/src/treeview/treeOps.ts +172 -0
- package/src/treeview/treePaste.ts +13 -0
- package/src/treeview/treeViewCommands.ts +94 -0
- package/src/treeview/treeViewData.ts +41 -0
- package/src/useMonacoLoader.ts +11 -34
- package/src/wysiwygImageUpload.ts +113 -0
- package/src/diagram/DiagramExtension.ts +0 -209
- package/src/diagram/DiagramWidget.tsx +0 -270
- package/src/diagram/useDiagramData.ts +0 -126
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
type ImageTreatmentPreset,
|
|
41
41
|
} from './customThemes/themeDraft';
|
|
42
42
|
import { Section, SeedColorRow, FontPicker, PresetRow } from './customThemes/themeControls';
|
|
43
|
+
import { ImportThemeSection } from './customThemes/ImportThemeSection';
|
|
43
44
|
|
|
44
45
|
// ── Component ───────────────────────────────────────────────────────
|
|
45
46
|
|
|
@@ -52,6 +53,8 @@ export interface ThemeCustomizerPanelProps {
|
|
|
52
53
|
onSave?: (theme: Theme, json: string) => void;
|
|
53
54
|
/** Fired when the user clicks Reset. Host typically clears its persistent storage. */
|
|
54
55
|
onReset?: () => void;
|
|
56
|
+
/** Optional text trigger. Omit to use the compact icon trigger. */
|
|
57
|
+
triggerLabel?: string;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
export function ThemeCustomizerPanel({
|
|
@@ -59,6 +62,7 @@ export function ThemeCustomizerPanel({
|
|
|
59
62
|
onChange,
|
|
60
63
|
onSave,
|
|
61
64
|
onReset,
|
|
65
|
+
triggerLabel,
|
|
62
66
|
}: ThemeCustomizerPanelProps) {
|
|
63
67
|
const [open, setOpen] = useState(false);
|
|
64
68
|
const [draft, setDraft] = useState<Draft>(() => themeToDraft(value));
|
|
@@ -143,26 +147,30 @@ export function ThemeCustomizerPanel({
|
|
|
143
147
|
<button
|
|
144
148
|
type="button"
|
|
145
149
|
className={`squisq-toolbar-button squisq-theme-customizer-trigger${
|
|
146
|
-
|
|
147
|
-
}`}
|
|
150
|
+
triggerLabel ? ' squisq-theme-customizer-trigger--label' : ''
|
|
151
|
+
}${open ? ' squisq-toolbar-button--active' : ''}`}
|
|
148
152
|
data-tooltip="Customize theme"
|
|
149
153
|
aria-label="Customize theme"
|
|
150
154
|
aria-expanded={open}
|
|
151
155
|
onClick={() => setOpen((v) => !v)}
|
|
152
156
|
>
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
157
|
+
{triggerLabel ? (
|
|
158
|
+
<span className="squisq-theme-customizer-trigger-label">{triggerLabel}</span>
|
|
159
|
+
) : (
|
|
160
|
+
<svg
|
|
161
|
+
width="16"
|
|
162
|
+
height="16"
|
|
163
|
+
viewBox="0 0 16 16"
|
|
164
|
+
fill="none"
|
|
165
|
+
stroke="currentColor"
|
|
166
|
+
strokeWidth="1.5"
|
|
167
|
+
strokeLinecap="round"
|
|
168
|
+
strokeLinejoin="round"
|
|
169
|
+
>
|
|
170
|
+
<circle cx="8" cy="8" r="6" />
|
|
171
|
+
<path d="M8 2 A6 6 0 0 1 8 14 Z" fill="currentColor" stroke="none" />
|
|
172
|
+
</svg>
|
|
173
|
+
)}
|
|
166
174
|
</button>
|
|
167
175
|
{open && (
|
|
168
176
|
<div className="squisq-theme-customizer-popover" role="dialog" aria-label="Customize theme">
|
|
@@ -181,6 +189,13 @@ export function ThemeCustomizerPanel({
|
|
|
181
189
|
/>
|
|
182
190
|
</Section>
|
|
183
191
|
|
|
192
|
+
<Section
|
|
193
|
+
title="Import from file"
|
|
194
|
+
hint="Pull colors and fonts from a Word, PowerPoint, or Excel file."
|
|
195
|
+
>
|
|
196
|
+
<ImportThemeSection onImported={(patch) => updateDraft(patch)} />
|
|
197
|
+
</Section>
|
|
198
|
+
|
|
184
199
|
<Section title="Colors" hint="Pick seed colors. The rest is derived.">
|
|
185
200
|
<SeedColorRow
|
|
186
201
|
label="Primary"
|
package/src/ThemePicker.tsx
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* preview-on-hover style listing rather than a wall of names.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
12
|
+
import { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
13
13
|
import { createPortal } from 'react-dom';
|
|
14
14
|
import {
|
|
15
15
|
getThemeSummaries,
|
|
@@ -95,6 +95,7 @@ function ThemeNameChip({
|
|
|
95
95
|
return (
|
|
96
96
|
<span
|
|
97
97
|
className={`squisq-theme-picker-name-chip${className ? ` ${className}` : ''}`}
|
|
98
|
+
data-theme-id={theme.id}
|
|
98
99
|
style={{
|
|
99
100
|
background: theme.colors.background,
|
|
100
101
|
color: theme.colors.text,
|
|
@@ -102,7 +103,7 @@ function ThemeNameChip({
|
|
|
102
103
|
borderColor: theme.colors.backgroundLight,
|
|
103
104
|
}}
|
|
104
105
|
>
|
|
105
|
-
{label}
|
|
106
|
+
<span className="squisq-theme-picker-name-chip-label">{label}</span>
|
|
106
107
|
</span>
|
|
107
108
|
);
|
|
108
109
|
}
|
|
@@ -133,6 +134,8 @@ export function ThemePicker({
|
|
|
133
134
|
const [open, setOpen] = useState(false);
|
|
134
135
|
const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({});
|
|
135
136
|
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
137
|
+
const popoverRef = useRef<HTMLDivElement>(null);
|
|
138
|
+
const popoverId = `squisq-theme-picker-popover-${useId().replace(/:/g, '')}`;
|
|
136
139
|
|
|
137
140
|
// Custom entries are computed per-render (built-ins stay static at module
|
|
138
141
|
// load). A custom theme is already a full Theme, so it becomes an entry
|
|
@@ -189,7 +192,7 @@ export function ThemePicker({
|
|
|
189
192
|
// trigger as-is. On the first open it doesn't exist yet — we'll
|
|
190
193
|
// re-run after mount via the requestAnimationFrame in the open
|
|
191
194
|
// effect, so estimate generously for paint #1.
|
|
192
|
-
const popoverEl =
|
|
195
|
+
const popoverEl = popoverRef.current;
|
|
193
196
|
const measured = popoverEl?.scrollHeight ?? 520;
|
|
194
197
|
const spaceBelow = vh - rect.bottom - margin - gap;
|
|
195
198
|
const spaceAbove = rect.top - margin - gap;
|
|
@@ -229,7 +232,7 @@ export function ThemePicker({
|
|
|
229
232
|
const onDown = (e: MouseEvent) => {
|
|
230
233
|
const target = e.target as Node;
|
|
231
234
|
if (triggerRef.current?.contains(target)) return;
|
|
232
|
-
const popoverEl =
|
|
235
|
+
const popoverEl = popoverRef.current;
|
|
233
236
|
if (popoverEl?.contains(target)) return;
|
|
234
237
|
setOpen(false);
|
|
235
238
|
};
|
|
@@ -258,7 +261,8 @@ export function ThemePicker({
|
|
|
258
261
|
const popover = open
|
|
259
262
|
? createPortal(
|
|
260
263
|
<div
|
|
261
|
-
|
|
264
|
+
ref={popoverRef}
|
|
265
|
+
id={popoverId}
|
|
262
266
|
className="squisq-theme-picker-popover"
|
|
263
267
|
role="listbox"
|
|
264
268
|
aria-label={ariaLabel}
|
|
@@ -392,6 +396,7 @@ export function ThemePicker({
|
|
|
392
396
|
onClick={handleToggle}
|
|
393
397
|
aria-haspopup="listbox"
|
|
394
398
|
aria-expanded={open}
|
|
399
|
+
aria-controls={open ? popoverId : undefined}
|
|
395
400
|
aria-label={ariaLabel}
|
|
396
401
|
>
|
|
397
402
|
{previewEntry && (
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Renders a tiny slideshow-style thumbnail of a single block, used to fill each
|
|
5
5
|
* bar on the timeline. Reuses the same rendering path as the inline preview
|
|
6
|
-
* gutter and the slideshow: `buildPreviewDoc` → `
|
|
6
|
+
* gutter and the slideshow: `buildPreviewDoc` → `materializeBlockLayers` → `BlockRenderer`.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { memo } from 'react';
|