@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.
Files changed (208) hide show
  1. package/README.md +12 -3
  2. package/dist/index.d.ts +1304 -208
  3. package/dist/index.js +22838 -14494
  4. package/dist/index.js.map +1 -1
  5. package/dist/monaco.d.ts +1 -0
  6. package/dist/monaco.js +4 -0
  7. package/dist/monaco.js.map +1 -0
  8. package/dist/styles/index.css +2384 -408
  9. package/package.json +9 -5
  10. package/src/BlockPropertiesPopover.tsx +48 -17
  11. package/src/DocumentSettingsDialog.tsx +13 -21
  12. package/src/EditorContext.tsx +199 -42
  13. package/src/EditorShell.tsx +403 -270
  14. package/src/ImageEditor.tsx +22 -1
  15. package/src/InlinePreviewGutter.tsx +16 -8
  16. package/src/MediaBin.tsx +276 -40
  17. package/src/OutlinePanel.tsx +202 -7
  18. package/src/PlainHtmlPreview.tsx +40 -1
  19. package/src/PreviewControls.tsx +466 -93
  20. package/src/PreviewPanel.tsx +313 -77
  21. package/src/RawEditor.tsx +13 -2
  22. package/src/StatusBar.tsx +5 -2
  23. package/src/TemplateAnnotation.ts +34 -10
  24. package/src/TemplateContentPreview.tsx +56 -0
  25. package/src/TemplatePicker.tsx +355 -134
  26. package/src/ThemeCustomizerPanel.tsx +30 -15
  27. package/src/ThemePicker.tsx +10 -5
  28. package/src/TimelineBlockPreview.tsx +1 -1
  29. package/src/Toolbar.tsx +719 -238
  30. package/src/TransitionPicker.tsx +44 -5
  31. package/src/ViewMenuPanel.tsx +12 -14
  32. package/src/ViewSwitcher.tsx +4 -4
  33. package/src/WysiwygEditor.tsx +167 -92
  34. package/src/__tests__/blockPropertiesPopoverTheme.test.tsx +33 -0
  35. package/src/__tests__/blockTagActivity.test.ts +183 -0
  36. package/src/__tests__/buildDocumentPreviewMarkdown.test.ts +75 -0
  37. package/src/__tests__/buildPreviewDocContent.test.ts +48 -0
  38. package/src/__tests__/buildPreviewDocTransition.test.ts +22 -3
  39. package/src/__tests__/canvasSurfaceTextEditing.test.tsx +60 -0
  40. package/src/__tests__/customLayoutManagerTheme.test.tsx +34 -0
  41. package/src/__tests__/documentSettingsDialog.test.tsx +29 -1
  42. package/src/__tests__/editorScrollHandoff.test.tsx +102 -0
  43. package/src/__tests__/editorScrollSync.test.ts +65 -0
  44. package/src/__tests__/editorShellProps.test.tsx +390 -1
  45. package/src/__tests__/emojiPicker.test.tsx +2 -42
  46. package/src/__tests__/headingTransition.test.ts +53 -15
  47. package/src/__tests__/imageEditAffordance.test.tsx +5 -1
  48. package/src/__tests__/imageEditModalContract.test.tsx +119 -0
  49. package/src/__tests__/imageEditorShell.test.tsx +38 -1
  50. package/src/__tests__/jsonEditor.test.tsx +56 -1
  51. package/src/__tests__/layersPanel.test.tsx +75 -5
  52. package/src/__tests__/majorApiTypes.test.ts +26 -0
  53. package/src/__tests__/mediaBinDrop.test.tsx +90 -0
  54. package/src/__tests__/mediaReferences.test.ts +82 -0
  55. package/src/__tests__/narrationSave.test.ts +148 -0
  56. package/src/__tests__/outlinePanel.test.tsx +93 -3
  57. package/src/__tests__/outlineSource.test.ts +217 -0
  58. package/src/__tests__/plainHtmlPreview.test.tsx +17 -1
  59. package/src/__tests__/presentationMode.test.tsx +290 -0
  60. package/src/__tests__/previewControls.test.tsx +312 -6
  61. package/src/__tests__/previewPanelAudioFailure.test.tsx +46 -0
  62. package/src/__tests__/previewPanelPresentation.test.tsx +126 -0
  63. package/src/__tests__/previewPanelTransforms.test.tsx +117 -0
  64. package/src/__tests__/rawEditorModelIsolation.test.ts +19 -0
  65. package/src/__tests__/resolveBlockVisual.test.ts +43 -0
  66. package/src/__tests__/statusBar.test.tsx +27 -0
  67. package/src/__tests__/teleprompter.test.tsx +190 -0
  68. package/src/__tests__/templateAnnotationRoundTrip.test.ts +49 -2
  69. package/src/__tests__/templateContentPreview.test.ts +101 -0
  70. package/src/__tests__/templatePickerPortal.test.tsx +62 -0
  71. package/src/__tests__/tiptapBridge.test.ts +70 -0
  72. package/src/__tests__/tiptapCodeBlockRoundTrip.test.ts +109 -0
  73. package/src/__tests__/transformStyleId.test.ts +13 -0
  74. package/src/__tests__/useImageEditor.test.tsx +67 -0
  75. package/src/__tests__/useMediaRecorder.test.ts +75 -0
  76. package/src/__tests__/viewMenuPanel.test.tsx +130 -0
  77. package/src/__tests__/wysiwygImageUpload.test.ts +69 -0
  78. package/src/__tests__/wysiwygTemplateBadgeFocus.test.tsx +56 -0
  79. package/src/asciiDiagram/AsciiDiagramExtension.ts +343 -0
  80. package/src/asciiDiagram/AsciiDiagramWidget.tsx +224 -0
  81. package/src/asciiDiagram/RepairableDiagramExtension.ts +200 -0
  82. package/src/asciiDiagram/__tests__/AsciiDiagramExtension.test.ts +145 -0
  83. package/src/asciiDiagram/__tests__/RepairableDiagramExtension.test.ts +159 -0
  84. package/src/asciiDiagram/__tests__/asciiDiagramCommands.test.ts +227 -0
  85. package/src/asciiDiagram/__tests__/asciiDiagramOps.test.ts +114 -0
  86. package/src/asciiDiagram/__tests__/asciiPaste.test.ts +43 -0
  87. package/src/asciiDiagram/asciiDiagramCommands.ts +148 -0
  88. package/src/asciiDiagram/asciiDiagramData.ts +116 -0
  89. package/src/asciiDiagram/asciiDiagramOps.ts +219 -0
  90. package/src/asciiDiagram/asciiPaste.ts +19 -0
  91. package/src/blockTagActivity.ts +233 -0
  92. package/src/buildDocumentPreviewMarkdown.ts +168 -0
  93. package/src/buildPreviewDoc.ts +19 -12
  94. package/src/customTemplates/CustomLayoutManager.tsx +3 -2
  95. package/src/customTemplates/CustomTemplateContext.tsx +6 -0
  96. package/src/customTemplates/TemplateDesigner.tsx +7 -4
  97. package/src/customTemplates/__tests__/library.test.ts +8 -0
  98. package/src/customTemplates/designer.css +158 -99
  99. package/src/customTemplates/library.ts +16 -3
  100. package/src/customThemes/CustomThemeContext.tsx +6 -0
  101. package/src/customThemes/CustomThemeDialog.tsx +35 -5
  102. package/src/customThemes/ImportThemeSection.tsx +178 -0
  103. package/src/customThemes/__tests__/customThemeLibrary.test.ts +9 -0
  104. package/src/customThemes/__tests__/importThemeSection.test.tsx +192 -0
  105. package/src/customThemes/customThemeLibrary.ts +7 -4
  106. package/src/customThemes/index.ts +7 -1
  107. package/src/customThemes/themeDraft.ts +23 -7
  108. package/src/diagram/DiagramCanvas.tsx +9 -4
  109. package/src/diagram/types.ts +35 -0
  110. package/src/editorScrollSync.ts +73 -0
  111. package/src/emojiData.ts +3 -23
  112. package/src/headingTransition.ts +85 -25
  113. package/src/imageEditor/CanvasSurface.tsx +29 -23
  114. package/src/imageEditor/LayersPanel.tsx +78 -3
  115. package/src/imageEditor/Toolbar.tsx +5 -1
  116. package/src/imageEditor/icons.tsx +4 -0
  117. package/src/imageEditor/image-editor.css +75 -0
  118. package/src/imageEditor/layers/SelectionHandles.tsx +1 -1
  119. package/src/imageEditor/useImageEditor.ts +71 -14
  120. package/src/index.ts +193 -20
  121. package/src/jsonEditor/JsonEditorContext.tsx +12 -6
  122. package/src/jsonEditor/RenderNode.tsx +24 -3
  123. package/src/jsonEditor/editors.tsx +86 -19
  124. package/src/mediaEntries.ts +12 -0
  125. package/src/mediaReferences.ts +299 -0
  126. package/src/monaco.ts +35 -0
  127. package/src/monacoWorkers.ts +89 -0
  128. package/src/outlineSource.ts +171 -0
  129. package/src/presentation/PresentationMode.tsx +596 -0
  130. package/src/rawEditorIsolation.ts +18 -0
  131. package/src/recorder/hooks/useMediaRecorder.ts +97 -53
  132. package/src/resolveBlockVisual.ts +10 -4
  133. package/src/scene/Scene.tsx +101 -25
  134. package/src/scene/SceneBlockExtension.ts +17 -10
  135. package/src/scene/SceneBlockWidget.tsx +11 -4
  136. package/src/scene/SceneSelection.tsx +19 -15
  137. package/src/scene/SceneSideToolbar.tsx +89 -0
  138. package/src/scene/SceneViewport.tsx +7 -3
  139. package/src/scene/ShapePalette.tsx +17 -2
  140. package/src/scene/__tests__/DiagramAdapter.test.ts +86 -0
  141. package/src/scene/__tests__/SceneBlockExtension.test.ts +33 -0
  142. package/src/scene/__tests__/sceneIsolation.test.tsx +93 -0
  143. package/src/scene/adapters/DiagramAdapter.ts +12 -101
  144. package/src/scene/commands/SceneCommand.ts +4 -1
  145. package/src/scene/index.ts +1 -6
  146. package/src/scene/layers/DiagramEdges.tsx +24 -9
  147. package/src/scene/layers/edgeGeometry.ts +31 -4
  148. package/src/scene/layers/nodeCard.tsx +27 -8
  149. package/src/scene/scene.css +145 -2
  150. package/src/scene/text/SceneTextOverlay.tsx +5 -5
  151. package/src/scene/text/sceneTextChannel.ts +26 -20
  152. package/src/scene/text/sceneTextConfig.ts +4 -0
  153. package/src/scene/tools/ConnectTool.ts +126 -28
  154. package/src/scene/tools/DrawingConnectTool.ts +86 -16
  155. package/src/scene/tools/SceneTool.ts +10 -0
  156. package/src/scene/tools/SelectTool.ts +34 -18
  157. package/src/scene/tools/ShapeTool.ts +2 -3
  158. package/src/styles/ascii-diagram.css +79 -0
  159. package/src/styles/ascii-timeline.css +499 -0
  160. package/src/styles/editor.css +1566 -219
  161. package/src/styles/index.css +3 -0
  162. package/src/styles/tree-view.css +139 -0
  163. package/src/teleprompter/TeleprompterControls.tsx +218 -0
  164. package/src/teleprompter/TeleprompterSelfView.tsx +22 -0
  165. package/src/teleprompter/TeleprompterSurface.tsx +267 -0
  166. package/src/teleprompter/TeleprompterView.tsx +338 -0
  167. package/src/teleprompter/canvasRenderer.ts +161 -0
  168. package/src/teleprompter/floatingWindow.ts +352 -0
  169. package/src/teleprompter/index.ts +61 -0
  170. package/src/teleprompter/pcmWorklet.ts +62 -0
  171. package/src/teleprompter/recording/insertPreamble.ts +80 -0
  172. package/src/teleprompter/recording/narrationSave.ts +134 -0
  173. package/src/teleprompter/recording/useNarrationRecorder.ts +367 -0
  174. package/src/teleprompter/scrollModel.ts +85 -0
  175. package/src/teleprompter/teleprompterTheme.ts +303 -0
  176. package/src/teleprompter/types.ts +38 -0
  177. package/src/teleprompter/useFloatingWindow.ts +74 -0
  178. package/src/teleprompter/useMicAnalysis.ts +211 -0
  179. package/src/teleprompter/useTeleprompter.ts +421 -0
  180. package/src/templateContentPreviewResolver.ts +360 -0
  181. package/src/timeline/TimelineEditorWidget.tsx +702 -0
  182. package/src/timeline/TimelineViewExtension.ts +252 -0
  183. package/src/timeline/__tests__/TimelineEditorWidget.test.tsx +355 -0
  184. package/src/timeline/__tests__/TimelineViewExtension.test.ts +163 -0
  185. package/src/timeline/__tests__/timelineCommands.test.ts +327 -0
  186. package/src/timeline/__tests__/timelineOps.test.ts +222 -0
  187. package/src/timeline/__tests__/timelinePaste.test.ts +34 -0
  188. package/src/timeline/timelineCommands.ts +367 -0
  189. package/src/timeline/timelineData.ts +54 -0
  190. package/src/timeline/timelineOps.ts +277 -0
  191. package/src/timeline/timelinePaste.ts +8 -0
  192. package/src/tiptapBridge.ts +84 -49
  193. package/src/transformStyleId.ts +17 -0
  194. package/src/treeview/TreeOutlineWidget.tsx +240 -0
  195. package/src/treeview/TreeViewExtension.ts +250 -0
  196. package/src/treeview/__tests__/TreeViewExtension.test.ts +122 -0
  197. package/src/treeview/__tests__/treeOps.test.ts +125 -0
  198. package/src/treeview/__tests__/treePaste.test.ts +40 -0
  199. package/src/treeview/__tests__/treeViewCommands.test.ts +163 -0
  200. package/src/treeview/treeOps.ts +172 -0
  201. package/src/treeview/treePaste.ts +13 -0
  202. package/src/treeview/treeViewCommands.ts +94 -0
  203. package/src/treeview/treeViewData.ts +41 -0
  204. package/src/useMonacoLoader.ts +11 -34
  205. package/src/wysiwygImageUpload.ts +113 -0
  206. package/src/diagram/DiagramExtension.ts +0 -209
  207. package/src/diagram/DiagramWidget.tsx +0 -270
  208. package/src/diagram/useDiagramData.ts +0 -126
@@ -0,0 +1,499 @@
1
+ /* WYSIWYG surface for authored ASCII timeline fences.
2
+ *
3
+ * Keep this namespace distinct from `.squisq-timeline-*`, which belongs to
4
+ * the editor's document playback/timing track. */
5
+
6
+ .squisq-wysiwyg-editor pre.squisq-ascii-timeline-fence-hidden {
7
+ display: none;
8
+ }
9
+
10
+ .squisq-ascii-timeline-widget-host {
11
+ margin: 0.75rem 0 1.25rem;
12
+ }
13
+
14
+ .squisq-ascii-timeline-editor {
15
+ --squisq-ascii-timeline-accent: var(--squisq-theme-primary, #6366f1);
16
+ --squisq-ascii-timeline-label-width: 120px;
17
+ border: 1px solid var(--squisq-border, #e2e8f0);
18
+ border-radius: 10px;
19
+ background: var(--squisq-input-bg, #fff);
20
+ color: var(--squisq-text, #1e293b);
21
+ overflow: hidden;
22
+ font-size: 14px;
23
+ }
24
+
25
+ .squisq-ascii-timeline-header {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: space-between;
29
+ gap: 12px;
30
+ min-height: 36px;
31
+ padding: 6px 10px;
32
+ border-bottom: 1px solid var(--squisq-border, #e2e8f0);
33
+ background: var(--squisq-bg, #f8fafc);
34
+ }
35
+
36
+ .squisq-ascii-timeline-header > span {
37
+ display: inline-flex;
38
+ align-items: center;
39
+ gap: 6px;
40
+ font-weight: 650;
41
+ }
42
+
43
+ .squisq-ascii-timeline-header small {
44
+ color: var(--squisq-text-muted, #64748b);
45
+ }
46
+
47
+ .squisq-ascii-timeline-canvas {
48
+ position: relative;
49
+ min-width: 600px;
50
+ padding: 8px 18px 8px 10px;
51
+ overflow-x: auto;
52
+ }
53
+
54
+ .squisq-ascii-timeline-track {
55
+ display: grid;
56
+ grid-template-columns: var(--squisq-ascii-timeline-label-width) minmax(420px, 1fr);
57
+ gap: 12px;
58
+ height: 96px;
59
+ align-items: center;
60
+ }
61
+
62
+ .squisq-ascii-timeline-track-label {
63
+ display: flex;
64
+ min-width: 0;
65
+ align-items: center;
66
+ justify-content: flex-end;
67
+ gap: 5px;
68
+ color: var(--squisq-text-muted, #64748b);
69
+ font-size: 12px;
70
+ font-weight: 650;
71
+ text-align: right;
72
+ white-space: nowrap;
73
+ }
74
+
75
+ .squisq-ascii-timeline-track-label > span {
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ }
79
+
80
+ .squisq-ascii-timeline-track-add {
81
+ display: grid;
82
+ width: 22px;
83
+ height: 22px;
84
+ flex: 0 0 22px;
85
+ place-items: center;
86
+ padding: 0;
87
+ border: 1px solid var(--squisq-border, #cbd5e1);
88
+ border-radius: 50%;
89
+ background: var(--squisq-input-bg, #fff);
90
+ color: var(--squisq-ascii-timeline-accent);
91
+ font:
92
+ 700 15px/1 system-ui,
93
+ sans-serif;
94
+ cursor: pointer;
95
+ }
96
+
97
+ .squisq-ascii-timeline-track-add:hover,
98
+ .squisq-ascii-timeline-track-add:focus-visible {
99
+ border-color: var(--squisq-ascii-timeline-accent);
100
+ outline: 2px solid color-mix(in srgb, var(--squisq-ascii-timeline-accent) 22%, transparent);
101
+ }
102
+
103
+ .squisq-ascii-timeline-rail {
104
+ position: relative;
105
+ height: 96px;
106
+ min-width: 420px;
107
+ outline: none;
108
+ cursor: crosshair;
109
+ }
110
+
111
+ .squisq-ascii-timeline-rail--readonly {
112
+ cursor: default;
113
+ }
114
+
115
+ .squisq-ascii-timeline-rail-line {
116
+ position: absolute;
117
+ z-index: 1;
118
+ top: 50%;
119
+ right: 0;
120
+ left: 0;
121
+ height: 2px;
122
+ border-radius: 999px;
123
+ background: var(--squisq-text-muted, #94a3b8);
124
+ pointer-events: none;
125
+ }
126
+
127
+ .squisq-ascii-timeline-rail-line::after {
128
+ position: absolute;
129
+ top: 50%;
130
+ right: -1px;
131
+ width: 8px;
132
+ height: 8px;
133
+ border-top: 2px solid currentColor;
134
+ border-right: 2px solid currentColor;
135
+ color: var(--squisq-text-muted, #94a3b8);
136
+ content: '';
137
+ transform: translateY(-50%) rotate(45deg);
138
+ }
139
+
140
+ .squisq-ascii-timeline-add-ghost,
141
+ .squisq-ascii-timeline-gap-add {
142
+ position: absolute;
143
+ z-index: 4;
144
+ top: 50%;
145
+ display: grid;
146
+ width: 22px;
147
+ height: 22px;
148
+ place-items: center;
149
+ border: 1px solid var(--squisq-ascii-timeline-accent);
150
+ border-radius: 50%;
151
+ background: var(--squisq-input-bg, #fff);
152
+ color: var(--squisq-ascii-timeline-accent);
153
+ font:
154
+ 700 15px/1 system-ui,
155
+ sans-serif;
156
+ transform: translate(-50%, -50%);
157
+ }
158
+
159
+ .squisq-ascii-timeline-add-ghost {
160
+ opacity: 0.72;
161
+ pointer-events: none;
162
+ }
163
+
164
+ .squisq-ascii-timeline-gap-add {
165
+ padding: 0;
166
+ opacity: 0.12;
167
+ cursor: pointer;
168
+ transition:
169
+ opacity 120ms ease,
170
+ transform 120ms ease;
171
+ }
172
+
173
+ .squisq-ascii-timeline-rail:hover .squisq-ascii-timeline-gap-add,
174
+ .squisq-ascii-timeline-gap-add:focus-visible {
175
+ opacity: 0.9;
176
+ }
177
+
178
+ .squisq-ascii-timeline-gap-add:hover,
179
+ .squisq-ascii-timeline-gap-add:focus-visible {
180
+ outline: none;
181
+ transform: translate(-50%, -50%) scale(1.12);
182
+ }
183
+
184
+ .squisq-ascii-timeline-point {
185
+ position: absolute;
186
+ z-index: 6;
187
+ top: 50%;
188
+ width: 0;
189
+ height: 0;
190
+ }
191
+
192
+ .squisq-ascii-timeline-marker {
193
+ position: absolute;
194
+ top: 0;
195
+ left: 0;
196
+ z-index: 2;
197
+ width: 36px;
198
+ height: 36px;
199
+ padding: 0;
200
+ border: 0;
201
+ border-radius: 50%;
202
+ background: transparent;
203
+ cursor: grab;
204
+ touch-action: none;
205
+ user-select: none;
206
+ transform: translate(-50%, -50%);
207
+ }
208
+
209
+ .squisq-ascii-timeline-point--dragging {
210
+ z-index: 8;
211
+ }
212
+
213
+ .squisq-ascii-timeline-point--dragging .squisq-ascii-timeline-marker {
214
+ cursor: grabbing;
215
+ }
216
+
217
+ .squisq-ascii-timeline-point--dragging .squisq-ascii-timeline-marker::before {
218
+ box-shadow:
219
+ 0 0 0 3px var(--squisq-input-bg, #fff),
220
+ 0 0 0 7px color-mix(in srgb, var(--squisq-ascii-timeline-accent) 72%, transparent);
221
+ }
222
+
223
+ .squisq-ascii-timeline-rail--readonly .squisq-ascii-timeline-marker {
224
+ cursor: pointer;
225
+ }
226
+
227
+ .squisq-ascii-timeline-marker::before {
228
+ display: block;
229
+ width: 12px;
230
+ height: 12px;
231
+ margin: 12px;
232
+ border: 2px solid var(--squisq-ascii-timeline-accent);
233
+ border-radius: 50%;
234
+ background: var(--squisq-ascii-timeline-accent);
235
+ box-sizing: border-box;
236
+ content: '';
237
+ }
238
+
239
+ .squisq-ascii-timeline-marker--hollow::before {
240
+ background: var(--squisq-input-bg, #fff);
241
+ }
242
+
243
+ .squisq-ascii-timeline-marker--diamond::before {
244
+ border-radius: 2px;
245
+ transform: rotate(45deg);
246
+ }
247
+
248
+ .squisq-ascii-timeline-marker:hover::before {
249
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--squisq-ascii-timeline-accent) 18%, transparent);
250
+ }
251
+
252
+ .squisq-ascii-timeline-marker:focus-visible {
253
+ outline: 2px solid var(--squisq-ascii-timeline-accent);
254
+ outline-offset: 1px;
255
+ }
256
+
257
+ .squisq-ascii-timeline-marker--selected::before {
258
+ box-shadow:
259
+ 0 0 0 3px var(--squisq-input-bg, #fff),
260
+ 0 0 0 6px var(--squisq-ascii-timeline-accent);
261
+ }
262
+
263
+ .squisq-ascii-timeline-callout,
264
+ .squisq-ascii-timeline-description {
265
+ position: absolute;
266
+ left: 0;
267
+ width: 128px;
268
+ overflow: hidden;
269
+ color: var(--squisq-text, #1e293b);
270
+ line-height: 1.2;
271
+ text-align: center;
272
+ text-overflow: ellipsis;
273
+ white-space: nowrap;
274
+ pointer-events: none;
275
+ transform: translateX(-50%);
276
+ }
277
+
278
+ .squisq-ascii-timeline-callout {
279
+ font-size: 12px;
280
+ font-weight: 650;
281
+ }
282
+
283
+ .squisq-ascii-timeline-description {
284
+ color: var(--squisq-text-muted, #64748b);
285
+ font-size: 10px;
286
+ }
287
+
288
+ .squisq-ascii-timeline-callout--above {
289
+ bottom: 14px;
290
+ }
291
+
292
+ .squisq-ascii-timeline-callout--below {
293
+ top: 14px;
294
+ }
295
+
296
+ .squisq-ascii-timeline-description--above {
297
+ bottom: 30px;
298
+ }
299
+
300
+ .squisq-ascii-timeline-description--below {
301
+ top: 30px;
302
+ }
303
+
304
+ .squisq-ascii-timeline-end-label {
305
+ position: absolute;
306
+ top: calc(50% + 8px);
307
+ right: 0;
308
+ max-width: 100px;
309
+ overflow: hidden;
310
+ color: var(--squisq-text-muted, #64748b);
311
+ font-size: 10px;
312
+ text-overflow: ellipsis;
313
+ white-space: nowrap;
314
+ pointer-events: none;
315
+ }
316
+
317
+ .squisq-ascii-timeline-branches {
318
+ position: absolute;
319
+ z-index: 2;
320
+ top: 8px;
321
+ right: 18px;
322
+ bottom: 8px;
323
+ left: calc(10px + var(--squisq-ascii-timeline-label-width) + 12px);
324
+ width: calc(100% - var(--squisq-ascii-timeline-label-width) - 40px);
325
+ height: calc(var(--squisq-ascii-timeline-track-count) * 96px);
326
+ overflow: visible;
327
+ pointer-events: none;
328
+ }
329
+
330
+ .squisq-ascii-timeline-branches path {
331
+ fill: none;
332
+ stroke: color-mix(in srgb, var(--squisq-ascii-timeline-accent) 72%, transparent);
333
+ stroke-width: 2;
334
+ stroke-dasharray: 4 3;
335
+ }
336
+
337
+ .squisq-ascii-timeline-link-list {
338
+ display: flex;
339
+ flex-wrap: wrap;
340
+ gap: 4px;
341
+ margin: 0;
342
+ padding: 0 10px 8px;
343
+ list-style: none;
344
+ }
345
+
346
+ .squisq-ascii-timeline-link-list li {
347
+ padding: 2px 7px;
348
+ border-radius: 999px;
349
+ background: var(--squisq-bg, #f1f5f9);
350
+ color: var(--squisq-text-muted, #64748b);
351
+ font-size: 11px;
352
+ list-style: none;
353
+ }
354
+
355
+ .squisq-ascii-timeline-inspector {
356
+ display: grid;
357
+ grid-template-columns: minmax(150px, 1fr) minmax(190px, 1.5fr) 120px 120px;
358
+ gap: 8px;
359
+ margin: 0;
360
+ padding: 10px;
361
+ border: 0;
362
+ border-top: 1px solid var(--squisq-border, #e2e8f0);
363
+ background: var(--squisq-bg, #f8fafc);
364
+ }
365
+
366
+ .squisq-ascii-timeline-inspector legend {
367
+ grid-column: 1 / -1;
368
+ padding: 0 4px;
369
+ color: var(--squisq-text, #1e293b);
370
+ font-size: 12px;
371
+ font-weight: 700;
372
+ }
373
+
374
+ .squisq-ascii-timeline-inspector legend span {
375
+ color: var(--squisq-text-muted, #64748b);
376
+ font-weight: 500;
377
+ }
378
+
379
+ .squisq-ascii-timeline-inspector label {
380
+ display: flex;
381
+ min-width: 0;
382
+ flex-direction: column;
383
+ gap: 3px;
384
+ color: var(--squisq-text-muted, #64748b);
385
+ font-size: 11px;
386
+ }
387
+
388
+ .squisq-ascii-timeline-inspector input,
389
+ .squisq-ascii-timeline-inspector textarea,
390
+ .squisq-ascii-timeline-inspector select {
391
+ min-width: 0;
392
+ border: 1px solid var(--squisq-border, #cbd5e1);
393
+ border-radius: 5px;
394
+ background: var(--squisq-input-bg, #fff);
395
+ color: var(--squisq-text, #1e293b);
396
+ font: inherit;
397
+ padding: 5px 7px;
398
+ }
399
+
400
+ .squisq-ascii-timeline-inspector input:focus,
401
+ .squisq-ascii-timeline-inspector textarea:focus,
402
+ .squisq-ascii-timeline-inspector select:focus {
403
+ border-color: var(--squisq-ascii-timeline-accent);
404
+ outline: 2px solid color-mix(in srgb, var(--squisq-ascii-timeline-accent) 22%, transparent);
405
+ }
406
+
407
+ .squisq-ascii-timeline-inspector-description textarea {
408
+ resize: vertical;
409
+ }
410
+
411
+ .squisq-ascii-timeline-inspector .squisq-ascii-timeline-checkbox {
412
+ grid-column: 1 / 2;
413
+ flex-direction: row;
414
+ align-items: center;
415
+ align-self: center;
416
+ color: var(--squisq-text, #1e293b);
417
+ }
418
+
419
+ .squisq-ascii-timeline-checkbox input {
420
+ width: auto;
421
+ }
422
+
423
+ .squisq-ascii-timeline-delete {
424
+ grid-column: 4 / 5;
425
+ display: inline-flex;
426
+ align-items: center;
427
+ justify-content: center;
428
+ gap: 5px;
429
+ align-self: end;
430
+ padding: 5px 8px;
431
+ border: 1px solid color-mix(in srgb, #ef4444 45%, var(--squisq-border, #e2e8f0));
432
+ border-radius: 5px;
433
+ background: transparent;
434
+ color: #dc2626;
435
+ cursor: pointer;
436
+ }
437
+
438
+ .squisq-ascii-timeline-delete:disabled {
439
+ opacity: 0.45;
440
+ cursor: not-allowed;
441
+ }
442
+
443
+ .squisq-ascii-timeline-warnings {
444
+ padding: 0 10px 8px;
445
+ color: var(--squisq-text-muted, #64748b);
446
+ font-size: 11px;
447
+ }
448
+
449
+ .squisq-sr-only {
450
+ position: absolute;
451
+ width: 1px;
452
+ height: 1px;
453
+ padding: 0;
454
+ margin: -1px;
455
+ overflow: hidden;
456
+ clip: rect(0, 0, 0, 0);
457
+ white-space: nowrap;
458
+ border: 0;
459
+ }
460
+
461
+ @media (max-width: 760px) {
462
+ .squisq-ascii-timeline-editor {
463
+ --squisq-ascii-timeline-label-width: 88px;
464
+ }
465
+
466
+ .squisq-ascii-timeline-inspector {
467
+ grid-template-columns: 1fr 1fr;
468
+ }
469
+
470
+ .squisq-ascii-timeline-inspector-description,
471
+ .squisq-ascii-timeline-inspector legend {
472
+ grid-column: 1 / -1;
473
+ }
474
+
475
+ .squisq-ascii-timeline-delete {
476
+ grid-column: 2 / 3;
477
+ }
478
+ }
479
+
480
+ @media (prefers-reduced-motion: reduce) {
481
+ .squisq-ascii-timeline-gap-add {
482
+ transition: none;
483
+ }
484
+ }
485
+
486
+ @media (forced-colors: active) {
487
+ .squisq-ascii-timeline-marker::before,
488
+ .squisq-ascii-timeline-gap-add,
489
+ .squisq-ascii-timeline-add-ghost {
490
+ border-color: ButtonText;
491
+ forced-color-adjust: none;
492
+ }
493
+
494
+ .squisq-ascii-timeline-rail-line,
495
+ .squisq-ascii-timeline-branches path {
496
+ background: CanvasText;
497
+ stroke: CanvasText;
498
+ }
499
+ }