@bendyline/docblocks-react 2.0.0 → 2.1.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.
Files changed (310) hide show
  1. package/README.md +18 -3
  2. package/dist/ExportDialog-VYATD5UC.js +9 -0
  3. package/dist/{ExportToolbarControls-D2YDWOXW.js → ExportToolbarControls-5HUE3LSX.js} +206 -42
  4. package/dist/{GitToolbarControl-LMIR4R7I.js → GitToolbarControl-FW3BZFXV.js} +62 -44
  5. package/dist/{GitUI-KGF5MSNV.js → GitUI-GMH3PAYL.js} +225 -141
  6. package/dist/{LazyEditorShell-EF2BWRXU.js → LazyEditorShell-RF54B5UD.js} +0 -1
  7. package/dist/ShareDialog-PAMOQQFB.js +212 -0
  8. package/dist/chunk-3CZ27FOA.js +359 -0
  9. package/dist/chunk-3QSZY74C.js +255 -0
  10. package/{src/Export/export-destination.ts → dist/chunk-BI7NVU6T.js} +16 -15
  11. package/dist/{chunk-VHDP4IPL.js → chunk-BPGEBGAN.js} +0 -1
  12. package/dist/{chunk-DD4VFJQI.js → chunk-EBWYGTN7.js} +2 -1
  13. package/dist/{chunk-ZI56BNB7.js → chunk-GHQ4X7KM.js} +27 -7
  14. package/dist/{chunk-5A4KEWKT.js → chunk-HFYPTTCH.js} +0 -1
  15. package/dist/chunk-LG6HAWCK.js +109 -0
  16. package/dist/chunk-TFMO7EVO.js +88 -0
  17. package/dist/{chunk-4XXSWN3T.js → chunk-YBEYTVU2.js} +0 -1
  18. package/dist/editor.d.ts +5 -4
  19. package/dist/editor.js +8 -70
  20. package/dist/export/index.d.ts +24 -8
  21. package/dist/export/index.js +10 -6
  22. package/dist/index.d.ts +355 -21
  23. package/dist/index.js +6419 -21
  24. package/dist/run-export-Z5BVFLIR.js +9 -0
  25. package/dist/settings/index.d.ts +9 -1
  26. package/dist/settings/index.js +6 -5
  27. package/package.json +18 -13
  28. package/src/styles/docblocks.css +985 -35
  29. package/dist/AppMenu/AppMenu.d.ts +0 -53
  30. package/dist/AppMenu/AppMenu.d.ts.map +0 -1
  31. package/dist/AppMenu/AppMenu.js +0 -67
  32. package/dist/AppMenu/AppMenu.js.map +0 -1
  33. package/dist/AppMenu/index.d.ts +0 -3
  34. package/dist/AppMenu/index.d.ts.map +0 -1
  35. package/dist/AppMenu/index.js +0 -2
  36. package/dist/AppMenu/index.js.map +0 -1
  37. package/dist/DocBlocksShell/DocBlocksShell.d.ts +0 -49
  38. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +0 -1
  39. package/dist/DocBlocksShell/DocBlocksShell.js +0 -2730
  40. package/dist/DocBlocksShell/DocBlocksShell.js.map +0 -1
  41. package/dist/DocBlocksShell/LazyEditorShell.d.ts +0 -3
  42. package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +0 -1
  43. package/dist/DocBlocksShell/LazyEditorShell.js +0 -3
  44. package/dist/DocBlocksShell/LazyEditorShell.js.map +0 -1
  45. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +0 -13
  46. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +0 -1
  47. package/dist/DocBlocksShell/UpdateAvailableNotice.js +0 -16
  48. package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +0 -1
  49. package/dist/DocBlocksShell/document-title.d.ts +0 -3
  50. package/dist/DocBlocksShell/document-title.d.ts.map +0 -1
  51. package/dist/DocBlocksShell/document-title.js +0 -17
  52. package/dist/DocBlocksShell/document-title.js.map +0 -1
  53. package/dist/DocBlocksShell/index.d.ts +0 -3
  54. package/dist/DocBlocksShell/index.d.ts.map +0 -1
  55. package/dist/DocBlocksShell/index.js +0 -2
  56. package/dist/DocBlocksShell/index.js.map +0 -1
  57. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +0 -14
  58. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +0 -1
  59. package/dist/DocBlocksShell/workspace-authority-barrier.js +0 -23
  60. package/dist/DocBlocksShell/workspace-authority-barrier.js.map +0 -1
  61. package/dist/Export/DeferredExportToolbarControls.d.ts +0 -5
  62. package/dist/Export/DeferredExportToolbarControls.d.ts.map +0 -1
  63. package/dist/Export/DeferredExportToolbarControls.js +0 -10
  64. package/dist/Export/DeferredExportToolbarControls.js.map +0 -1
  65. package/dist/Export/ExportDialog.d.ts +0 -25
  66. package/dist/Export/ExportDialog.d.ts.map +0 -1
  67. package/dist/Export/ExportDialog.js +0 -160
  68. package/dist/Export/ExportDialog.js.map +0 -1
  69. package/dist/Export/ExportToolbarControls.d.ts +0 -37
  70. package/dist/Export/ExportToolbarControls.d.ts.map +0 -1
  71. package/dist/Export/ExportToolbarControls.js +0 -285
  72. package/dist/Export/ExportToolbarControls.js.map +0 -1
  73. package/dist/Export/export-destination.d.ts +0 -3
  74. package/dist/Export/export-destination.d.ts.map +0 -1
  75. package/dist/Export/export-destination.js +0 -32
  76. package/dist/Export/export-destination.js.map +0 -1
  77. package/dist/Export/export-options.d.ts +0 -53
  78. package/dist/Export/export-options.d.ts.map +0 -1
  79. package/dist/Export/export-options.js +0 -49
  80. package/dist/Export/export-options.js.map +0 -1
  81. package/dist/Export/index.d.ts +0 -10
  82. package/dist/Export/index.d.ts.map +0 -1
  83. package/dist/Export/index.js +0 -6
  84. package/dist/Export/index.js.map +0 -1
  85. package/dist/Export/public-api.d.ts +0 -12
  86. package/dist/Export/public-api.d.ts.map +0 -1
  87. package/dist/Export/public-api.js +0 -9
  88. package/dist/Export/public-api.js.map +0 -1
  89. package/dist/Export/run-export.d.ts +0 -10
  90. package/dist/Export/run-export.d.ts.map +0 -1
  91. package/dist/Export/run-export.js +0 -313
  92. package/dist/Export/run-export.js.map +0 -1
  93. package/dist/Export/transform-summaries.d.ts +0 -7
  94. package/dist/Export/transform-summaries.d.ts.map +0 -1
  95. package/dist/Export/transform-summaries.js +0 -6
  96. package/dist/Export/transform-summaries.js.map +0 -1
  97. package/dist/ExportDialog-MEUISWZX.js +0 -9
  98. package/dist/ExportDialog-MEUISWZX.js.map +0 -1
  99. package/dist/ExportToolbarControls-D2YDWOXW.js.map +0 -1
  100. package/dist/FileExplorer/FileExplorer.d.ts +0 -43
  101. package/dist/FileExplorer/FileExplorer.d.ts.map +0 -1
  102. package/dist/FileExplorer/FileExplorer.js +0 -315
  103. package/dist/FileExplorer/FileExplorer.js.map +0 -1
  104. package/dist/FileExplorer/FileTreeNode.d.ts +0 -39
  105. package/dist/FileExplorer/FileTreeNode.d.ts.map +0 -1
  106. package/dist/FileExplorer/FileTreeNode.js +0 -131
  107. package/dist/FileExplorer/FileTreeNode.js.map +0 -1
  108. package/dist/FileExplorer/index.d.ts +0 -6
  109. package/dist/FileExplorer/index.d.ts.map +0 -1
  110. package/dist/FileExplorer/index.js +0 -4
  111. package/dist/FileExplorer/index.js.map +0 -1
  112. package/dist/FileExplorer/useFileTree.d.ts +0 -37
  113. package/dist/FileExplorer/useFileTree.d.ts.map +0 -1
  114. package/dist/FileExplorer/useFileTree.js +0 -284
  115. package/dist/FileExplorer/useFileTree.js.map +0 -1
  116. package/dist/Git/GitAuthGuidanceDialog.d.ts +0 -18
  117. package/dist/Git/GitAuthGuidanceDialog.d.ts.map +0 -1
  118. package/dist/Git/GitAuthGuidanceDialog.js +0 -27
  119. package/dist/Git/GitAuthGuidanceDialog.js.map +0 -1
  120. package/dist/Git/GitBranchesDialog.d.ts +0 -13
  121. package/dist/Git/GitBranchesDialog.d.ts.map +0 -1
  122. package/dist/Git/GitBranchesDialog.js +0 -59
  123. package/dist/Git/GitBranchesDialog.js.map +0 -1
  124. package/dist/Git/GitCloneDialog.d.ts +0 -14
  125. package/dist/Git/GitCloneDialog.d.ts.map +0 -1
  126. package/dist/Git/GitCloneDialog.js +0 -79
  127. package/dist/Git/GitCloneDialog.js.map +0 -1
  128. package/dist/Git/GitCommitDialog.d.ts +0 -12
  129. package/dist/Git/GitCommitDialog.d.ts.map +0 -1
  130. package/dist/Git/GitCommitDialog.js +0 -38
  131. package/dist/Git/GitCommitDialog.js.map +0 -1
  132. package/dist/Git/GitConflictsDialog.d.ts +0 -12
  133. package/dist/Git/GitConflictsDialog.d.ts.map +0 -1
  134. package/dist/Git/GitConflictsDialog.js +0 -17
  135. package/dist/Git/GitConflictsDialog.js.map +0 -1
  136. package/dist/Git/GitContext.d.ts +0 -89
  137. package/dist/Git/GitContext.d.ts.map +0 -1
  138. package/dist/Git/GitContext.js +0 -15
  139. package/dist/Git/GitContext.js.map +0 -1
  140. package/dist/Git/GitDiffDialog.d.ts +0 -20
  141. package/dist/Git/GitDiffDialog.d.ts.map +0 -1
  142. package/dist/Git/GitDiffDialog.js +0 -100
  143. package/dist/Git/GitDiffDialog.js.map +0 -1
  144. package/dist/Git/GitDiffView.d.ts +0 -23
  145. package/dist/Git/GitDiffView.d.ts.map +0 -1
  146. package/dist/Git/GitDiffView.js +0 -77
  147. package/dist/Git/GitDiffView.js.map +0 -1
  148. package/dist/Git/GitHistoryDialog.d.ts +0 -15
  149. package/dist/Git/GitHistoryDialog.d.ts.map +0 -1
  150. package/dist/Git/GitHistoryDialog.js +0 -107
  151. package/dist/Git/GitHistoryDialog.js.map +0 -1
  152. package/dist/Git/GitStatusBar.d.ts +0 -8
  153. package/dist/Git/GitStatusBar.d.ts.map +0 -1
  154. package/dist/Git/GitStatusBar.js +0 -49
  155. package/dist/Git/GitStatusBar.js.map +0 -1
  156. package/dist/Git/GitToolbarControl.d.ts +0 -15
  157. package/dist/Git/GitToolbarControl.d.ts.map +0 -1
  158. package/dist/Git/GitToolbarControl.js +0 -51
  159. package/dist/Git/GitToolbarControl.js.map +0 -1
  160. package/dist/Git/GitUI.d.ts +0 -14
  161. package/dist/Git/GitUI.d.ts.map +0 -1
  162. package/dist/Git/GitUI.js +0 -21
  163. package/dist/Git/GitUI.js.map +0 -1
  164. package/dist/Git/commit-selection.d.ts +0 -22
  165. package/dist/Git/commit-selection.d.ts.map +0 -1
  166. package/dist/Git/commit-selection.js +0 -47
  167. package/dist/Git/commit-selection.js.map +0 -1
  168. package/dist/Git/git-clone-utils.d.ts +0 -8
  169. package/dist/Git/git-clone-utils.d.ts.map +0 -1
  170. package/dist/Git/git-clone-utils.js +0 -26
  171. package/dist/Git/git-clone-utils.js.map +0 -1
  172. package/dist/Git/git-status.d.ts +0 -24
  173. package/dist/Git/git-status.d.ts.map +0 -1
  174. package/dist/Git/git-status.js +0 -105
  175. package/dist/Git/git-status.js.map +0 -1
  176. package/dist/Git/useGit.d.ts +0 -15
  177. package/dist/Git/useGit.d.ts.map +0 -1
  178. package/dist/Git/useGit.js +0 -206
  179. package/dist/Git/useGit.js.map +0 -1
  180. package/dist/Git/useGitStatus.d.ts +0 -17
  181. package/dist/Git/useGitStatus.d.ts.map +0 -1
  182. package/dist/Git/useGitStatus.js +0 -63
  183. package/dist/Git/useGitStatus.js.map +0 -1
  184. package/dist/GitToolbarControl-LMIR4R7I.js.map +0 -1
  185. package/dist/GitUI-KGF5MSNV.js.map +0 -1
  186. package/dist/LazyEditorShell-EF2BWRXU.js.map +0 -1
  187. package/dist/Settings/Settings.d.ts +0 -23
  188. package/dist/Settings/Settings.d.ts.map +0 -1
  189. package/dist/Settings/Settings.js +0 -22
  190. package/dist/Settings/Settings.js.map +0 -1
  191. package/dist/Settings/public-api.d.ts +0 -3
  192. package/dist/Settings/public-api.d.ts.map +0 -1
  193. package/dist/Settings/public-api.js +0 -2
  194. package/dist/Settings/public-api.js.map +0 -1
  195. package/dist/WorkspacePicker/WorkspacePicker.d.ts +0 -22
  196. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +0 -1
  197. package/dist/WorkspacePicker/WorkspacePicker.js +0 -74
  198. package/dist/WorkspacePicker/WorkspacePicker.js.map +0 -1
  199. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +0 -11
  200. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +0 -1
  201. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +0 -27
  202. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +0 -1
  203. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +0 -20
  204. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +0 -1
  205. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +0 -36
  206. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +0 -1
  207. package/dist/WorkspacePicker/index.d.ts +0 -3
  208. package/dist/WorkspacePicker/index.d.ts.map +0 -1
  209. package/dist/WorkspacePicker/index.js +0 -2
  210. package/dist/WorkspacePicker/index.js.map +0 -1
  211. package/dist/chunk-3SAXDU2U.js +0 -157
  212. package/dist/chunk-3SAXDU2U.js.map +0 -1
  213. package/dist/chunk-4XXSWN3T.js.map +0 -1
  214. package/dist/chunk-5A4KEWKT.js.map +0 -1
  215. package/dist/chunk-AOVTHZU7.js +0 -321
  216. package/dist/chunk-AOVTHZU7.js.map +0 -1
  217. package/dist/chunk-DD4VFJQI.js.map +0 -1
  218. package/dist/chunk-GSNZSCIK.js +0 -55
  219. package/dist/chunk-GSNZSCIK.js.map +0 -1
  220. package/dist/chunk-VHDP4IPL.js.map +0 -1
  221. package/dist/chunk-ZI56BNB7.js.map +0 -1
  222. package/dist/components/Dialog.d.ts +0 -22
  223. package/dist/components/Dialog.d.ts.map +0 -1
  224. package/dist/components/Dialog.js +0 -33
  225. package/dist/components/Dialog.js.map +0 -1
  226. package/dist/editor.d.ts.map +0 -1
  227. package/dist/editor.js.map +0 -1
  228. package/dist/export/index.js.map +0 -1
  229. package/dist/hooks/index.d.ts +0 -3
  230. package/dist/hooks/index.d.ts.map +0 -1
  231. package/dist/hooks/index.js +0 -2
  232. package/dist/hooks/index.js.map +0 -1
  233. package/dist/hooks/useDocumentSession.d.ts +0 -16
  234. package/dist/hooks/useDocumentSession.d.ts.map +0 -1
  235. package/dist/hooks/useDocumentSession.js +0 -18
  236. package/dist/hooks/useDocumentSession.js.map +0 -1
  237. package/dist/icons.d.ts +0 -12
  238. package/dist/icons.d.ts.map +0 -1
  239. package/dist/icons.js +0 -28
  240. package/dist/icons.js.map +0 -1
  241. package/dist/index.d.ts.map +0 -1
  242. package/dist/index.js.map +0 -1
  243. package/dist/preferences/theme.d.ts +0 -18
  244. package/dist/preferences/theme.d.ts.map +0 -1
  245. package/dist/preferences/theme.js +0 -63
  246. package/dist/preferences/theme.js.map +0 -1
  247. package/dist/preferences/versioning.d.ts +0 -27
  248. package/dist/preferences/versioning.d.ts.map +0 -1
  249. package/dist/preferences/versioning.js +0 -62
  250. package/dist/preferences/versioning.js.map +0 -1
  251. package/dist/provider-lease.d.ts +0 -10
  252. package/dist/provider-lease.d.ts.map +0 -1
  253. package/dist/provider-lease.js +0 -42
  254. package/dist/provider-lease.js.map +0 -1
  255. package/dist/run-export-ICTZITXC.js +0 -10
  256. package/dist/run-export-ICTZITXC.js.map +0 -1
  257. package/dist/settings/index.js.map +0 -1
  258. package/src/AppMenu/AppMenu.tsx +0 -334
  259. package/src/AppMenu/index.ts +0 -2
  260. package/src/DocBlocksShell/DocBlocksShell.tsx +0 -3398
  261. package/src/DocBlocksShell/LazyEditorShell.ts +0 -2
  262. package/src/DocBlocksShell/UpdateAvailableNotice.tsx +0 -60
  263. package/src/DocBlocksShell/document-title.ts +0 -19
  264. package/src/DocBlocksShell/index.ts +0 -2
  265. package/src/DocBlocksShell/workspace-authority-barrier.ts +0 -26
  266. package/src/Export/DeferredExportToolbarControls.tsx +0 -23
  267. package/src/Export/ExportDialog.tsx +0 -437
  268. package/src/Export/ExportToolbarControls.tsx +0 -511
  269. package/src/Export/export-options.ts +0 -99
  270. package/src/Export/index.ts +0 -19
  271. package/src/Export/public-api.ts +0 -17
  272. package/src/Export/run-export.ts +0 -374
  273. package/src/Export/transform-summaries.ts +0 -14
  274. package/src/FileExplorer/FileExplorer.tsx +0 -528
  275. package/src/FileExplorer/FileTreeNode.tsx +0 -306
  276. package/src/FileExplorer/index.ts +0 -5
  277. package/src/FileExplorer/useFileTree.ts +0 -352
  278. package/src/Git/GitAuthGuidanceDialog.tsx +0 -84
  279. package/src/Git/GitBranchesDialog.tsx +0 -144
  280. package/src/Git/GitCloneDialog.tsx +0 -200
  281. package/src/Git/GitCommitDialog.tsx +0 -119
  282. package/src/Git/GitConflictsDialog.tsx +0 -62
  283. package/src/Git/GitContext.tsx +0 -88
  284. package/src/Git/GitDiffDialog.tsx +0 -147
  285. package/src/Git/GitDiffView.tsx +0 -105
  286. package/src/Git/GitHistoryDialog.tsx +0 -195
  287. package/src/Git/GitStatusBar.tsx +0 -157
  288. package/src/Git/GitToolbarControl.tsx +0 -123
  289. package/src/Git/GitUI.tsx +0 -68
  290. package/src/Git/commit-selection.ts +0 -63
  291. package/src/Git/git-clone-utils.ts +0 -23
  292. package/src/Git/git-status.ts +0 -113
  293. package/src/Git/useGit.ts +0 -279
  294. package/src/Git/useGitStatus.ts +0 -78
  295. package/src/Settings/Settings.tsx +0 -118
  296. package/src/Settings/public-api.ts +0 -8
  297. package/src/WorkspacePicker/WorkspacePicker.tsx +0 -191
  298. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +0 -88
  299. package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +0 -121
  300. package/src/WorkspacePicker/index.ts +0 -2
  301. package/src/components/Dialog.tsx +0 -81
  302. package/src/editor.ts +0 -72
  303. package/src/hooks/index.ts +0 -2
  304. package/src/hooks/useDocumentSession.ts +0 -37
  305. package/src/icons.tsx +0 -48
  306. package/src/index.ts +0 -61
  307. package/src/preferences/theme.ts +0 -67
  308. package/src/preferences/versioning.ts +0 -69
  309. package/src/provider-lease.ts +0 -52
  310. package/src/types/pwa-dom.d.ts +0 -31
@@ -1,2 +0,0 @@
1
- /** Deferred boundary for the large Squisq editor implementation. */
2
- export { EditorShell as default } from '@bendyline/squisq-editor-react';
@@ -1,60 +0,0 @@
1
- import { useState } from 'react';
2
-
3
- const UPDATE_PROMPT_ID = 'db-update-available-prompt';
4
-
5
- export interface UpdateAvailableNoticeProps {
6
- available: boolean;
7
- onApplyUpdate?: () => void;
8
- blocked?: boolean;
9
- statusBarVisible: boolean;
10
- }
11
-
12
- /**
13
- * Keeps PWA updates unobtrusive until the user asks to review one. The
14
- * notice is positioned over the editor status bar by DocBlocksShell CSS;
15
- * the existing Reload/Later prompt remains a fixed shell-level card.
16
- */
17
- export function UpdateAvailableNotice({
18
- available,
19
- onApplyUpdate,
20
- blocked = false,
21
- statusBarVisible,
22
- }: UpdateAvailableNoticeProps) {
23
- const [promptOpen, setPromptOpen] = useState(false);
24
-
25
- if (!available || !onApplyUpdate) return null;
26
-
27
- const promptVisible = promptOpen && !blocked;
28
-
29
- return (
30
- <>
31
- <button
32
- type="button"
33
- className={`db-update-status-notice${
34
- statusBarVisible ? '' : ' db-update-status-notice--floating'
35
- }`}
36
- onClick={() => setPromptOpen(true)}
37
- disabled={blocked}
38
- aria-controls={UPDATE_PROMPT_ID}
39
- aria-expanded={promptVisible}
40
- aria-label="A new version of DocBlocks is available. Show update options."
41
- title="A new version of DocBlocks is available"
42
- >
43
- Update available
44
- </button>
45
- {promptVisible && (
46
- <div id={UPDATE_PROMPT_ID} className="db-update-banner" role="alert">
47
- <span>A new version of DocBlocks is available.</span>
48
- <div className="db-update-banner-actions">
49
- <button type="button" onClick={onApplyUpdate}>
50
- Reload
51
- </button>
52
- <button type="button" onClick={() => setPromptOpen(false)}>
53
- Later
54
- </button>
55
- </div>
56
- </div>
57
- )}
58
- </>
59
- );
60
- }
@@ -1,19 +0,0 @@
1
- import { useEffect } from 'react';
2
-
3
- const APP_TITLE = 'DocBlocks';
4
-
5
- export function titleForSelectedFile(selectedFile: string | null): string {
6
- if (!selectedFile) return APP_TITLE;
7
-
8
- const filename = selectedFile.replace(/^\/+/, '').split('/').pop();
9
- const name = filename?.replace(/\.[^.]+$/, '');
10
- return name ? `${name} - ${APP_TITLE}` : APP_TITLE;
11
- }
12
-
13
- export function useDocumentTitle(selectedFile: string | null): void {
14
- useEffect(() => {
15
- if (typeof document !== 'undefined') {
16
- document.title = titleForSelectedFile(selectedFile);
17
- }
18
- }, [selectedFile]);
19
- }
@@ -1,2 +0,0 @@
1
- export { DocBlocksShell } from './DocBlocksShell.js';
2
- export type { DocBlocksShellProps } from './DocBlocksShell.js';
@@ -1,26 +0,0 @@
1
- /**
2
- * Renderer-side barrier for main-authoritative Electron workspace identity.
3
- * OS requests may arrive before IndexedDB descriptors have been reconciled;
4
- * they must retain navigation priority while waiting for that reconciliation.
5
- */
6
- export class WorkspaceAuthorityBarrier {
7
- private ready = false;
8
- private readonly readyPromise: Promise<void>;
9
- private resolveReady!: () => void;
10
-
11
- public constructor() {
12
- this.readyPromise = new Promise<void>((resolve) => {
13
- this.resolveReady = resolve;
14
- });
15
- }
16
-
17
- public markReady(): void {
18
- if (this.ready) return;
19
- this.ready = true;
20
- this.resolveReady();
21
- }
22
-
23
- public wait(): Promise<void> {
24
- return this.readyPromise;
25
- }
26
- }
@@ -1,23 +0,0 @@
1
- import { lazy, Suspense } from 'react';
2
- import type {
3
- ExportDestinationAdapter,
4
- ExportDestinationTarget,
5
- ExportToolbarControlsProps,
6
- } from './ExportToolbarControls.js';
7
-
8
- const ExportToolbarControlsImplementation = lazy(() =>
9
- import('./ExportToolbarControls.js').then((module) => ({
10
- default: module.ExportToolbarControls,
11
- })),
12
- );
13
-
14
- /** Public toolbar control with its editor-coupled implementation deferred. */
15
- export function ExportToolbarControls(props: ExportToolbarControlsProps) {
16
- return (
17
- <Suspense fallback={null}>
18
- <ExportToolbarControlsImplementation {...props} />
19
- </Suspense>
20
- );
21
- }
22
-
23
- export type { ExportDestinationAdapter, ExportDestinationTarget, ExportToolbarControlsProps };
@@ -1,437 +0,0 @@
1
- /**
2
- * ExportDialog — modal for choosing export format and options.
3
- */
4
-
5
- import { useState, useCallback, useEffect, useMemo, useRef } from 'react';
6
- import { getThemeSummaries } from '@bendyline/squisq/schemas';
7
- import type { ExportFormat, ExportOptions, HtmlBundle, HtmlStyle } from './export-options.js';
8
- import { FORMAT_LABELS, saveExportOptions } from './export-options.js';
9
- import { loadTransformStyleSummaries, type ExportSummaryOption } from './transform-summaries.js';
10
-
11
- export interface ExportDialogProps {
12
- /** Initial options (pre-populated from last export). */
13
- initial: ExportOptions;
14
- /** Whether the export is currently running. */
15
- exporting: boolean;
16
- /** Optional host-provided destination path control. */
17
- destination?: ExportDestinationControl;
18
- /** Called when the user confirms the export. */
19
- onExport: (options: ExportOptions) => void;
20
- /** Called whenever the currently selected options change. */
21
- onOptionsChange?: (options: ExportOptions) => void;
22
- /** Called when the dialog is dismissed. */
23
- onClose: () => void;
24
- }
25
-
26
- export interface ExportDestinationControl {
27
- value: string;
28
- onPick: (options: ExportOptions) => void | Promise<void>;
29
- hint?: string;
30
- }
31
-
32
- const FORMATS: ExportFormat[] = ['pdf', 'docx', 'pptx', 'html', 'md'];
33
-
34
- /** Short labels for the Format chip row. The fuller `FORMAT_LABELS` list
35
- * is still used as a tooltip so users can confirm the file extension. */
36
- const FORMAT_CHIP_LABELS: Record<ExportFormat, string> = {
37
- pdf: 'PDF',
38
- docx: 'Word',
39
- pptx: 'PowerPoint',
40
- html: 'HTML',
41
- md: 'Markdown',
42
- };
43
-
44
- const HTML_STYLE_CHIPS: { key: HtmlStyle; label: string; hint: string }[] = [
45
- {
46
- key: 'plain',
47
- label: 'Plain',
48
- hint: 'A lightweight static HTML document.',
49
- },
50
- {
51
- key: 'rendered',
52
- label: 'Rendered',
53
- hint: 'Renders via SquisqPlayer with themes and playback support.',
54
- },
55
- ];
56
-
57
- const HTML_BUNDLE_CHIPS: { key: HtmlBundle; label: string; hint: string }[] = [
58
- {
59
- key: 'single',
60
- label: 'Single file',
61
- hint: 'One .html file with images embedded as base64 data URIs.',
62
- },
63
- {
64
- key: 'zip',
65
- label: 'ZIP archive',
66
- hint: 'A .zip with index.html plus separate image (and JS) files.',
67
- },
68
- ];
69
-
70
- interface ChipOption<T extends string> {
71
- key: T;
72
- label: string;
73
- title?: string;
74
- }
75
-
76
- function ChipRadioGroup<T extends string>({
77
- name,
78
- value,
79
- options,
80
- onChange,
81
- }: {
82
- name: string;
83
- value: T;
84
- options: ChipOption<T>[];
85
- onChange: (next: T) => void;
86
- }) {
87
- return (
88
- <div className="db-export-chips" role="radiogroup" aria-label={name}>
89
- {options.map((opt) => {
90
- const active = opt.key === value;
91
- return (
92
- <button
93
- key={opt.key}
94
- type="button"
95
- role="radio"
96
- aria-checked={active}
97
- className={`db-export-chip${active ? ' db-export-chip--active' : ''}`}
98
- onClick={() => onChange(opt.key)}
99
- title={opt.title}
100
- >
101
- {opt.label}
102
- </button>
103
- );
104
- })}
105
- </div>
106
- );
107
- }
108
-
109
- export function ExportDialog({
110
- initial,
111
- exporting,
112
- destination,
113
- onExport,
114
- onOptionsChange,
115
- onClose,
116
- }: ExportDialogProps) {
117
- const [format, setFormat] = useState<ExportFormat>(initial.format);
118
- const [themeId, setThemeId] = useState(initial.themeId);
119
- const [transformStyle, setTransformStyle] = useState(initial.transformStyle);
120
- const [pageSize, setPageSize] = useState(initial.pageSize);
121
- const [htmlStyle, setHtmlStyle] = useState<HtmlStyle>(initial.htmlStyle);
122
- const [htmlBundle, setHtmlBundle] = useState<HtmlBundle>(initial.htmlBundle);
123
- const [includeLinkedDocs, setIncludeLinkedDocs] = useState<boolean>(initial.includeLinkedDocs);
124
- const [entryAsIndex, setEntryAsIndex] = useState<boolean>(initial.entryAsIndex);
125
- const [transforms, setTransforms] = useState<ExportSummaryOption[]>([]);
126
- const dialogRef = useRef<HTMLDivElement>(null);
127
-
128
- const themes = getThemeSummaries();
129
-
130
- // Both HTML styles honor themes now: rendered HTML through the
131
- // SquisqPlayer's theme system, plain HTML through squisq's
132
- // `markdownDocToPlainHtml` which emits theme-driven CSS variables
133
- // and Google Fonts links. Show the dropdown for any export format
134
- // whose pipeline actually applies the picked theme.
135
- const showTheme = format === 'docx' || format === 'pdf' || format === 'pptx' || format === 'html';
136
- const showTransform = format === 'pptx';
137
- const showPageSize = format === 'pdf';
138
- const showHtmlOptions = format === 'html';
139
- // Both HTML styles now have a recursive bundle: plain via
140
- // `markdownDocsToPlainHtmlBundle`, rendered via
141
- // `markdownDocsToHtmlBundle` (which rewrites Doc-tree links to
142
- // `.html` before SquisqPlayer serialization). So the option applies
143
- // to any HTML export.
144
- const showIncludeLinked = format === 'html';
145
- // Multi-doc output is inherently a directory tree, so when recursion
146
- // is on the Bundle row would only confuse — ZIP is the only valid
147
- // packaging. Hide the chip row and surface the implication in a hint.
148
- const showHtmlBundle = showHtmlOptions && !includeLinkedDocs;
149
- // `entryAsIndex` is only honored in pipelines where we control the
150
- // output filename ourselves:
151
- // • single-file HTML downloads → renames `<doc>.html` → `index.html`
152
- // • recursive bundles → passed through to squisq's bundle helpers
153
- // In the single-doc ZIP path, squisq's `docToHtmlZip` and our plain-
154
- // HTML zip writer always emit `index.html` inside the archive, so the
155
- // checkbox has no observable effect — hide it to avoid surfacing an
156
- // inert control.
157
- const showEntryAsIndex = showHtmlOptions && (htmlBundle === 'single' || includeLinkedDocs);
158
-
159
- useEffect(() => {
160
- if (!showTransform) return;
161
- let cancelled = false;
162
-
163
- loadTransformStyleSummaries()
164
- .then((nextTransforms) => {
165
- if (!cancelled) setTransforms(nextTransforms);
166
- })
167
- .catch(() => {
168
- if (!cancelled) setTransforms([]);
169
- });
170
-
171
- return () => {
172
- cancelled = true;
173
- };
174
- }, [showTransform]);
175
-
176
- const currentOptions = useMemo<ExportOptions>(
177
- () => ({
178
- format,
179
- themeId,
180
- transformStyle,
181
- pageSize,
182
- htmlStyle,
183
- htmlBundle,
184
- includeLinkedDocs: showIncludeLinked && includeLinkedDocs,
185
- entryAsIndex: showEntryAsIndex && entryAsIndex,
186
- }),
187
- [
188
- format,
189
- themeId,
190
- transformStyle,
191
- pageSize,
192
- htmlStyle,
193
- htmlBundle,
194
- includeLinkedDocs,
195
- entryAsIndex,
196
- showIncludeLinked,
197
- showEntryAsIndex,
198
- ],
199
- );
200
-
201
- useEffect(() => {
202
- onOptionsChange?.(currentOptions);
203
- }, [currentOptions, onOptionsChange]);
204
-
205
- const handleExport = useCallback(() => {
206
- saveExportOptions(currentOptions);
207
- onExport(currentOptions);
208
- }, [currentOptions, onExport]);
209
-
210
- // Close on Escape
211
- useEffect(() => {
212
- const onKey = (e: KeyboardEvent) => {
213
- if (e.key === 'Escape') onClose();
214
- };
215
- window.addEventListener('keydown', onKey);
216
- return () => window.removeEventListener('keydown', onKey);
217
- }, [onClose]);
218
-
219
- // Close on backdrop click
220
- const handleBackdropClick = useCallback(
221
- (e: React.MouseEvent) => {
222
- if (e.target === e.currentTarget) onClose();
223
- },
224
- [onClose],
225
- );
226
-
227
- return (
228
- <div className="db-dialog-overlay" onClick={handleBackdropClick}>
229
- <div className="db-dialog db-export-dialog" ref={dialogRef}>
230
- <div className="db-dialog-header">
231
- <h2 className="db-dialog-title">Export Document</h2>
232
- <button className="db-dialog-close" onClick={onClose} aria-label="Close">
233
- &times;
234
- </button>
235
- </div>
236
-
237
- <div className="db-dialog-body">
238
- {/* Format — chip radio row for fast switching */}
239
- <div className="db-export-field">
240
- <span className="db-export-label">Format</span>
241
- <ChipRadioGroup
242
- name="Format"
243
- value={format}
244
- options={FORMATS.map((f) => ({
245
- key: f,
246
- label: FORMAT_CHIP_LABELS[f],
247
- title: FORMAT_LABELS[f],
248
- }))}
249
- onChange={setFormat}
250
- />
251
- </div>
252
-
253
- {destination && (
254
- <div className="db-export-field">
255
- <label className="db-export-label" htmlFor="db-export-path">
256
- Export to
257
- </label>
258
- <div className="db-export-path-row">
259
- <input
260
- id="db-export-path"
261
- className="db-export-path-input"
262
- value={destination.value}
263
- readOnly
264
- disabled={exporting}
265
- spellCheck={false}
266
- autoComplete="off"
267
- />
268
- <button
269
- type="button"
270
- className="db-export-path-pick"
271
- onClick={() => void destination.onPick(currentOptions)}
272
- disabled={exporting}
273
- aria-label="Choose export location"
274
- title="Choose export location"
275
- >
276
- ...
277
- </button>
278
- </div>
279
- {destination.hint && <span className="db-export-hint">{destination.hint}</span>}
280
- </div>
281
- )}
282
-
283
- {/* HTML style + bundle (HTML only) — also chip rows */}
284
- {showHtmlOptions && (
285
- <>
286
- <div className="db-export-field">
287
- <span className="db-export-label">Style</span>
288
- <ChipRadioGroup
289
- name="Style"
290
- value={htmlStyle}
291
- options={HTML_STYLE_CHIPS}
292
- onChange={setHtmlStyle}
293
- />
294
- <span className="db-export-hint">
295
- {HTML_STYLE_CHIPS.find((c) => c.key === htmlStyle)?.hint}
296
- </span>
297
- </div>
298
- {showHtmlBundle && (
299
- <div className="db-export-field">
300
- <span className="db-export-label">Bundle</span>
301
- <ChipRadioGroup
302
- name="Bundle"
303
- value={htmlBundle}
304
- options={HTML_BUNDLE_CHIPS}
305
- onChange={setHtmlBundle}
306
- />
307
- <span className="db-export-hint">
308
- {HTML_BUNDLE_CHIPS.find((c) => c.key === htmlBundle)?.hint}
309
- </span>
310
- </div>
311
- )}
312
- {showIncludeLinked && (
313
- <div className="db-export-field">
314
- <label className="db-export-checkbox">
315
- <input
316
- type="checkbox"
317
- checked={includeLinkedDocs}
318
- onChange={(e) => setIncludeLinkedDocs(e.target.checked)}
319
- />
320
- <span>Include linked-to documents</span>
321
- </label>
322
- <span className="db-export-hint">
323
- {includeLinkedDocs
324
- ? 'Follows relative .md links from this page and bundles every reachable document as its own .html in a ZIP. Cross-doc links rewrite from .md to .html.'
325
- : 'Only this document is exported.'}
326
- </span>
327
- </div>
328
- )}
329
- {showEntryAsIndex && (
330
- <div className="db-export-field">
331
- <label className="db-export-checkbox">
332
- <input
333
- type="checkbox"
334
- checked={entryAsIndex}
335
- onChange={(e) => setEntryAsIndex(e.target.checked)}
336
- />
337
- <span>Name entry page index.html</span>
338
- </label>
339
- <span className="db-export-hint">
340
- {entryAsIndex
341
- ? includeLinkedDocs
342
- ? 'Renames this page to index.html in the ZIP and rewrites any cross-doc links pointing back at it. Drops straight into a static-site host.'
343
- : 'Downloads as index.html instead of the document name. Drops straight into a static-site host.'
344
- : 'Exports under the document name.'}
345
- </span>
346
- </div>
347
- )}
348
- </>
349
- )}
350
-
351
- {/* Theme */}
352
- {showTheme && (
353
- <div className="db-export-field">
354
- <label className="db-export-label" htmlFor="db-export-theme">
355
- Theme
356
- </label>
357
- <select
358
- id="db-export-theme"
359
- className="db-export-select"
360
- value={themeId}
361
- onChange={(e) => setThemeId(e.target.value)}
362
- >
363
- {themes.map((t) => (
364
- <option key={t.id} value={t.id}>
365
- {t.name}
366
- </option>
367
- ))}
368
- </select>
369
- <span className="db-export-hint">
370
- {themes.find((t) => t.id === themeId)?.description}
371
- </span>
372
- </div>
373
- )}
374
-
375
- {/* Transform (PPTX only) */}
376
- {showTransform && (
377
- <div className="db-export-field">
378
- <label className="db-export-label" htmlFor="db-export-transform">
379
- Transform
380
- </label>
381
- <select
382
- id="db-export-transform"
383
- className="db-export-select"
384
- value={transformStyle}
385
- onChange={(e) => setTransformStyle(e.target.value)}
386
- >
387
- {transforms.length === 0 ? (
388
- <option value={transformStyle}>Loading...</option>
389
- ) : (
390
- transforms.map((t) => (
391
- <option key={t.id} value={t.id}>
392
- {t.name}
393
- </option>
394
- ))
395
- )}
396
- </select>
397
- <span className="db-export-hint">
398
- {transforms.find((t) => t.id === transformStyle)?.description}
399
- </span>
400
- </div>
401
- )}
402
-
403
- {/* Page size (PDF only) */}
404
- {showPageSize && (
405
- <div className="db-export-field">
406
- <label className="db-export-label" htmlFor="db-export-pagesize">
407
- Page Size
408
- </label>
409
- <select
410
- id="db-export-pagesize"
411
- className="db-export-select"
412
- value={pageSize}
413
- onChange={(e) => setPageSize(e.target.value as 'letter' | 'a4')}
414
- >
415
- <option value="letter">US Letter</option>
416
- <option value="a4">A4</option>
417
- </select>
418
- </div>
419
- )}
420
- </div>
421
-
422
- <div className="db-export-footer">
423
- <button className="db-export-btn db-export-btn--secondary" onClick={onClose}>
424
- Cancel
425
- </button>
426
- <button
427
- className="db-export-btn db-export-btn--primary"
428
- onClick={handleExport}
429
- disabled={exporting}
430
- >
431
- {exporting ? 'Exporting...' : 'Export'}
432
- </button>
433
- </div>
434
- </div>
435
- </div>
436
- );
437
- }