@bendyline/docblocks-react 1.1.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 (335) hide show
  1. package/README.md +50 -15
  2. package/dist/AppMenu/AppMenu.d.ts +29 -2
  3. package/dist/AppMenu/AppMenu.d.ts.map +1 -1
  4. package/dist/AppMenu/AppMenu.js +41 -2
  5. package/dist/AppMenu/AppMenu.js.map +1 -1
  6. package/dist/AppMenu/index.d.ts +1 -1
  7. package/dist/AppMenu/index.d.ts.map +1 -1
  8. package/dist/DocBlocksShell/DocBlocksShell.d.ts +17 -4
  9. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +1 -1
  10. package/dist/DocBlocksShell/DocBlocksShell.js +1710 -299
  11. package/dist/DocBlocksShell/DocBlocksShell.js.map +1 -1
  12. package/dist/DocBlocksShell/LazyEditorShell.d.ts +3 -0
  13. package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +1 -0
  14. package/dist/DocBlocksShell/LazyEditorShell.js +3 -0
  15. package/dist/DocBlocksShell/LazyEditorShell.js.map +1 -0
  16. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +13 -0
  17. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +1 -0
  18. package/dist/DocBlocksShell/UpdateAvailableNotice.js +16 -0
  19. package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +1 -0
  20. package/dist/DocBlocksShell/document-title.d.ts +3 -0
  21. package/dist/DocBlocksShell/document-title.d.ts.map +1 -0
  22. package/dist/DocBlocksShell/document-title.js +17 -0
  23. package/dist/DocBlocksShell/document-title.js.map +1 -0
  24. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +14 -0
  25. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +1 -0
  26. package/dist/DocBlocksShell/workspace-authority-barrier.js +23 -0
  27. package/dist/DocBlocksShell/workspace-authority-barrier.js.map +1 -0
  28. package/dist/Export/DeferredExportToolbarControls.d.ts +5 -0
  29. package/dist/Export/DeferredExportToolbarControls.d.ts.map +1 -0
  30. package/dist/Export/DeferredExportToolbarControls.js +10 -0
  31. package/dist/Export/DeferredExportToolbarControls.js.map +1 -0
  32. package/dist/Export/ExportDialog.d.ts +10 -1
  33. package/dist/Export/ExportDialog.d.ts.map +1 -1
  34. package/dist/Export/ExportDialog.js +39 -20
  35. package/dist/Export/ExportDialog.js.map +1 -1
  36. package/dist/Export/ExportToolbarControls.d.ts +21 -1
  37. package/dist/Export/ExportToolbarControls.d.ts.map +1 -1
  38. package/dist/Export/ExportToolbarControls.js +161 -26
  39. package/dist/Export/ExportToolbarControls.js.map +1 -1
  40. package/dist/Export/export-destination.d.ts +3 -0
  41. package/dist/Export/export-destination.d.ts.map +1 -0
  42. package/dist/Export/export-destination.js +32 -0
  43. package/dist/Export/export-destination.js.map +1 -0
  44. package/dist/Export/index.d.ts +8 -4
  45. package/dist/Export/index.d.ts.map +1 -1
  46. package/dist/Export/index.js +4 -1
  47. package/dist/Export/index.js.map +1 -1
  48. package/dist/Export/public-api.d.ts +12 -0
  49. package/dist/Export/public-api.d.ts.map +1 -0
  50. package/dist/Export/public-api.js +9 -0
  51. package/dist/Export/public-api.js.map +1 -0
  52. package/dist/Export/run-export.d.ts +3 -1
  53. package/dist/Export/run-export.d.ts.map +1 -1
  54. package/dist/Export/run-export.js +58 -25
  55. package/dist/Export/run-export.js.map +1 -1
  56. package/dist/Export/transform-summaries.d.ts +7 -0
  57. package/dist/Export/transform-summaries.d.ts.map +1 -0
  58. package/dist/Export/transform-summaries.js +6 -0
  59. package/dist/Export/transform-summaries.js.map +1 -0
  60. package/dist/ExportDialog-MEUISWZX.js +9 -0
  61. package/dist/ExportDialog-MEUISWZX.js.map +1 -0
  62. package/dist/ExportToolbarControls-D2YDWOXW.js +373 -0
  63. package/dist/ExportToolbarControls-D2YDWOXW.js.map +1 -0
  64. package/dist/FileExplorer/FileExplorer.d.ts +26 -4
  65. package/dist/FileExplorer/FileExplorer.d.ts.map +1 -1
  66. package/dist/FileExplorer/FileExplorer.js +204 -29
  67. package/dist/FileExplorer/FileExplorer.js.map +1 -1
  68. package/dist/FileExplorer/FileTreeNode.d.ts +24 -3
  69. package/dist/FileExplorer/FileTreeNode.d.ts.map +1 -1
  70. package/dist/FileExplorer/FileTreeNode.js +27 -8
  71. package/dist/FileExplorer/FileTreeNode.js.map +1 -1
  72. package/dist/FileExplorer/index.d.ts +1 -1
  73. package/dist/FileExplorer/index.d.ts.map +1 -1
  74. package/dist/FileExplorer/useFileTree.d.ts +5 -3
  75. package/dist/FileExplorer/useFileTree.d.ts.map +1 -1
  76. package/dist/FileExplorer/useFileTree.js +173 -13
  77. package/dist/FileExplorer/useFileTree.js.map +1 -1
  78. package/dist/Git/GitAuthGuidanceDialog.d.ts +18 -0
  79. package/dist/Git/GitAuthGuidanceDialog.d.ts.map +1 -0
  80. package/dist/Git/GitAuthGuidanceDialog.js +27 -0
  81. package/dist/Git/GitAuthGuidanceDialog.js.map +1 -0
  82. package/dist/Git/GitBranchesDialog.d.ts +13 -0
  83. package/dist/Git/GitBranchesDialog.d.ts.map +1 -0
  84. package/dist/Git/GitBranchesDialog.js +59 -0
  85. package/dist/Git/GitBranchesDialog.js.map +1 -0
  86. package/dist/Git/GitCloneDialog.d.ts +14 -0
  87. package/dist/Git/GitCloneDialog.d.ts.map +1 -0
  88. package/dist/Git/GitCloneDialog.js +79 -0
  89. package/dist/Git/GitCloneDialog.js.map +1 -0
  90. package/dist/Git/GitCommitDialog.d.ts +12 -0
  91. package/dist/Git/GitCommitDialog.d.ts.map +1 -0
  92. package/dist/Git/GitCommitDialog.js +38 -0
  93. package/dist/Git/GitCommitDialog.js.map +1 -0
  94. package/dist/Git/GitConflictsDialog.d.ts +12 -0
  95. package/dist/Git/GitConflictsDialog.d.ts.map +1 -0
  96. package/dist/Git/GitConflictsDialog.js +17 -0
  97. package/dist/Git/GitConflictsDialog.js.map +1 -0
  98. package/dist/Git/GitContext.d.ts +89 -0
  99. package/dist/Git/GitContext.d.ts.map +1 -0
  100. package/dist/Git/GitContext.js +15 -0
  101. package/dist/Git/GitContext.js.map +1 -0
  102. package/dist/Git/GitDiffDialog.d.ts +20 -0
  103. package/dist/Git/GitDiffDialog.d.ts.map +1 -0
  104. package/dist/Git/GitDiffDialog.js +100 -0
  105. package/dist/Git/GitDiffDialog.js.map +1 -0
  106. package/dist/Git/GitDiffView.d.ts +23 -0
  107. package/dist/Git/GitDiffView.d.ts.map +1 -0
  108. package/dist/Git/GitDiffView.js +77 -0
  109. package/dist/Git/GitDiffView.js.map +1 -0
  110. package/dist/Git/GitHistoryDialog.d.ts +15 -0
  111. package/dist/Git/GitHistoryDialog.d.ts.map +1 -0
  112. package/dist/Git/GitHistoryDialog.js +107 -0
  113. package/dist/Git/GitHistoryDialog.js.map +1 -0
  114. package/dist/Git/GitStatusBar.d.ts +8 -0
  115. package/dist/Git/GitStatusBar.d.ts.map +1 -0
  116. package/dist/Git/GitStatusBar.js +49 -0
  117. package/dist/Git/GitStatusBar.js.map +1 -0
  118. package/dist/Git/GitToolbarControl.d.ts +15 -0
  119. package/dist/Git/GitToolbarControl.d.ts.map +1 -0
  120. package/dist/Git/GitToolbarControl.js +51 -0
  121. package/dist/Git/GitToolbarControl.js.map +1 -0
  122. package/dist/Git/GitUI.d.ts +14 -0
  123. package/dist/Git/GitUI.d.ts.map +1 -0
  124. package/dist/Git/GitUI.js +21 -0
  125. package/dist/Git/GitUI.js.map +1 -0
  126. package/dist/Git/commit-selection.d.ts +22 -0
  127. package/dist/Git/commit-selection.d.ts.map +1 -0
  128. package/dist/Git/commit-selection.js +47 -0
  129. package/dist/Git/commit-selection.js.map +1 -0
  130. package/dist/Git/git-clone-utils.d.ts +8 -0
  131. package/dist/Git/git-clone-utils.d.ts.map +1 -0
  132. package/dist/Git/git-clone-utils.js +26 -0
  133. package/dist/Git/git-clone-utils.js.map +1 -0
  134. package/dist/Git/git-status.d.ts +24 -0
  135. package/dist/Git/git-status.d.ts.map +1 -0
  136. package/dist/Git/git-status.js +105 -0
  137. package/dist/Git/git-status.js.map +1 -0
  138. package/dist/Git/useGit.d.ts +15 -0
  139. package/dist/Git/useGit.d.ts.map +1 -0
  140. package/dist/Git/useGit.js +206 -0
  141. package/dist/Git/useGit.js.map +1 -0
  142. package/dist/Git/useGitStatus.d.ts +17 -0
  143. package/dist/Git/useGitStatus.d.ts.map +1 -0
  144. package/dist/Git/useGitStatus.js +63 -0
  145. package/dist/Git/useGitStatus.js.map +1 -0
  146. package/dist/GitToolbarControl-LMIR4R7I.js +117 -0
  147. package/dist/GitToolbarControl-LMIR4R7I.js.map +1 -0
  148. package/dist/GitUI-KGF5MSNV.js +1048 -0
  149. package/dist/GitUI-KGF5MSNV.js.map +1 -0
  150. package/dist/LazyEditorShell-EF2BWRXU.js +6 -0
  151. package/dist/LazyEditorShell-EF2BWRXU.js.map +1 -0
  152. package/dist/Settings/Settings.d.ts +23 -0
  153. package/dist/Settings/Settings.d.ts.map +1 -0
  154. package/dist/Settings/Settings.js +22 -0
  155. package/dist/Settings/Settings.js.map +1 -0
  156. package/dist/Settings/public-api.d.ts +3 -0
  157. package/dist/Settings/public-api.d.ts.map +1 -0
  158. package/dist/Settings/public-api.js +2 -0
  159. package/dist/Settings/public-api.js.map +1 -0
  160. package/dist/WorkspacePicker/WorkspacePicker.d.ts +6 -1
  161. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +1 -1
  162. package/dist/WorkspacePicker/WorkspacePicker.js +16 -5
  163. package/dist/WorkspacePicker/WorkspacePicker.js.map +1 -1
  164. package/dist/chunk-3SAXDU2U.js +157 -0
  165. package/dist/chunk-3SAXDU2U.js.map +1 -0
  166. package/dist/chunk-4XXSWN3T.js +13 -0
  167. package/dist/chunk-4XXSWN3T.js.map +1 -0
  168. package/dist/chunk-5A4KEWKT.js +97 -0
  169. package/dist/chunk-5A4KEWKT.js.map +1 -0
  170. package/dist/chunk-AOVTHZU7.js +321 -0
  171. package/dist/chunk-AOVTHZU7.js.map +1 -0
  172. package/dist/chunk-DD4VFJQI.js +51 -0
  173. package/dist/chunk-DD4VFJQI.js.map +1 -0
  174. package/dist/chunk-GSNZSCIK.js +55 -0
  175. package/dist/chunk-GSNZSCIK.js.map +1 -0
  176. package/dist/chunk-VHDP4IPL.js +70 -0
  177. package/dist/chunk-VHDP4IPL.js.map +1 -0
  178. package/dist/chunk-ZI56BNB7.js +270 -0
  179. package/dist/chunk-ZI56BNB7.js.map +1 -0
  180. package/dist/components/Dialog.d.ts +22 -0
  181. package/dist/components/Dialog.d.ts.map +1 -0
  182. package/dist/components/Dialog.js +33 -0
  183. package/dist/components/Dialog.js.map +1 -0
  184. package/dist/editor.d.ts +10 -0
  185. package/dist/editor.d.ts.map +1 -0
  186. package/dist/editor.js +70 -0
  187. package/dist/editor.js.map +1 -0
  188. package/dist/export/index.d.ts +87 -0
  189. package/dist/export/index.js +26 -0
  190. package/dist/export/index.js.map +1 -0
  191. package/dist/hooks/index.d.ts +2 -1
  192. package/dist/hooks/index.d.ts.map +1 -1
  193. package/dist/hooks/index.js +1 -1
  194. package/dist/hooks/index.js.map +1 -1
  195. package/dist/hooks/useDocumentSession.d.ts +16 -0
  196. package/dist/hooks/useDocumentSession.d.ts.map +1 -0
  197. package/dist/hooks/useDocumentSession.js +18 -0
  198. package/dist/hooks/useDocumentSession.js.map +1 -0
  199. package/dist/icons.d.ts +11 -6
  200. package/dist/icons.d.ts.map +1 -1
  201. package/dist/icons.js +21 -20
  202. package/dist/icons.js.map +1 -1
  203. package/dist/index.d.ts +8 -5
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +4 -2
  206. package/dist/index.js.map +1 -1
  207. package/dist/preferences/theme.d.ts +18 -0
  208. package/dist/preferences/theme.d.ts.map +1 -0
  209. package/dist/preferences/theme.js +63 -0
  210. package/dist/preferences/theme.js.map +1 -0
  211. package/dist/provider-lease.d.ts +10 -0
  212. package/dist/provider-lease.d.ts.map +1 -0
  213. package/dist/provider-lease.js +42 -0
  214. package/dist/provider-lease.js.map +1 -0
  215. package/dist/run-export-ICTZITXC.js +10 -0
  216. package/dist/run-export-ICTZITXC.js.map +1 -0
  217. package/dist/settings/index.d.ts +28 -0
  218. package/dist/settings/index.js +12 -0
  219. package/dist/settings/index.js.map +1 -0
  220. package/package.json +27 -10
  221. package/src/AppMenu/AppMenu.tsx +169 -99
  222. package/src/AppMenu/index.ts +1 -1
  223. package/src/DocBlocksShell/DocBlocksShell.tsx +2183 -516
  224. package/src/DocBlocksShell/LazyEditorShell.ts +2 -0
  225. package/src/DocBlocksShell/UpdateAvailableNotice.tsx +60 -0
  226. package/src/DocBlocksShell/document-title.ts +19 -0
  227. package/src/DocBlocksShell/workspace-authority-barrier.ts +26 -0
  228. package/src/Export/DeferredExportToolbarControls.tsx +23 -0
  229. package/src/Export/ExportDialog.tsx +102 -27
  230. package/src/Export/ExportToolbarControls.tsx +343 -57
  231. package/src/Export/export-destination.ts +30 -0
  232. package/src/Export/index.ts +18 -4
  233. package/src/Export/public-api.ts +17 -0
  234. package/src/Export/run-export.ts +66 -29
  235. package/src/Export/transform-summaries.ts +14 -0
  236. package/src/FileExplorer/FileExplorer.tsx +284 -38
  237. package/src/FileExplorer/FileTreeNode.tsx +100 -8
  238. package/src/FileExplorer/index.ts +1 -1
  239. package/src/FileExplorer/useFileTree.ts +190 -16
  240. package/src/Git/GitAuthGuidanceDialog.tsx +84 -0
  241. package/src/Git/GitBranchesDialog.tsx +144 -0
  242. package/src/Git/GitCloneDialog.tsx +200 -0
  243. package/src/Git/GitCommitDialog.tsx +119 -0
  244. package/src/Git/GitConflictsDialog.tsx +62 -0
  245. package/src/Git/GitContext.tsx +88 -0
  246. package/src/Git/GitDiffDialog.tsx +147 -0
  247. package/src/Git/GitDiffView.tsx +105 -0
  248. package/src/Git/GitHistoryDialog.tsx +195 -0
  249. package/src/Git/GitStatusBar.tsx +157 -0
  250. package/src/Git/GitToolbarControl.tsx +123 -0
  251. package/src/Git/GitUI.tsx +68 -0
  252. package/src/Git/commit-selection.ts +63 -0
  253. package/src/Git/git-clone-utils.ts +23 -0
  254. package/src/Git/git-status.ts +113 -0
  255. package/src/Git/useGit.ts +279 -0
  256. package/src/Git/useGitStatus.ts +78 -0
  257. package/src/Settings/Settings.tsx +118 -0
  258. package/src/Settings/public-api.ts +8 -0
  259. package/src/WorkspacePicker/WorkspacePicker.tsx +62 -8
  260. package/src/components/Dialog.tsx +81 -0
  261. package/src/editor.ts +72 -0
  262. package/src/hooks/index.ts +2 -1
  263. package/src/hooks/useDocumentSession.ts +37 -0
  264. package/src/icons.tsx +33 -55
  265. package/src/index.ts +35 -5
  266. package/src/preferences/theme.ts +67 -0
  267. package/src/provider-lease.ts +52 -0
  268. package/src/styles/docblocks.css +2247 -77
  269. package/src/types/pwa-dom.d.ts +31 -0
  270. package/dist/hooks/useAutoSave.d.ts +0 -15
  271. package/dist/hooks/useAutoSave.d.ts.map +0 -1
  272. package/dist/hooks/useAutoSave.js +0 -83
  273. package/dist/hooks/useAutoSave.js.map +0 -1
  274. package/src/fonts/fonts.css +0 -362
  275. package/src/fonts/licenses/LICENSE-cormorant-garamond.txt +0 -93
  276. package/src/fonts/licenses/LICENSE-crimson-text.txt +0 -93
  277. package/src/fonts/licenses/LICENSE-dm-sans.txt +0 -93
  278. package/src/fonts/licenses/LICENSE-dm-serif-display.txt +0 -93
  279. package/src/fonts/licenses/LICENSE-hanken-grotesk.txt +0 -94
  280. package/src/fonts/licenses/LICENSE-ibm-plex-sans.txt +0 -93
  281. package/src/fonts/licenses/LICENSE-inter.txt +0 -93
  282. package/src/fonts/licenses/LICENSE-jetbrains-mono.txt +0 -93
  283. package/src/fonts/licenses/LICENSE-lora.txt +0 -93
  284. package/src/fonts/licenses/LICENSE-merriweather.txt +0 -93
  285. package/src/fonts/licenses/LICENSE-oswald.txt +0 -93
  286. package/src/fonts/licenses/LICENSE-playfair-display.txt +0 -93
  287. package/src/fonts/licenses/LICENSE-pt-serif.txt +0 -93
  288. package/src/fonts/licenses/LICENSE-roboto.txt +0 -93
  289. package/src/fonts/licenses/LICENSE-source-serif-4.txt +0 -93
  290. package/src/fonts/woff2/cormorant-garamond-400.woff2 +0 -0
  291. package/src/fonts/woff2/cormorant-garamond-700.woff2 +0 -0
  292. package/src/fonts/woff2/crimson-text-400.woff2 +0 -0
  293. package/src/fonts/woff2/crimson-text-400i.woff2 +0 -0
  294. package/src/fonts/woff2/crimson-text-700.woff2 +0 -0
  295. package/src/fonts/woff2/dm-sans-400.woff2 +0 -0
  296. package/src/fonts/woff2/dm-sans-400i.woff2 +0 -0
  297. package/src/fonts/woff2/dm-sans-500.woff2 +0 -0
  298. package/src/fonts/woff2/dm-sans-700.woff2 +0 -0
  299. package/src/fonts/woff2/dm-serif-display-400.woff2 +0 -0
  300. package/src/fonts/woff2/hanken-grotesk-400.woff2 +0 -0
  301. package/src/fonts/woff2/hanken-grotesk-400i.woff2 +0 -0
  302. package/src/fonts/woff2/hanken-grotesk-500.woff2 +0 -0
  303. package/src/fonts/woff2/hanken-grotesk-600.woff2 +0 -0
  304. package/src/fonts/woff2/hanken-grotesk-700.woff2 +0 -0
  305. package/src/fonts/woff2/ibm-plex-sans-400.woff2 +0 -0
  306. package/src/fonts/woff2/ibm-plex-sans-400i.woff2 +0 -0
  307. package/src/fonts/woff2/ibm-plex-sans-500.woff2 +0 -0
  308. package/src/fonts/woff2/ibm-plex-sans-600.woff2 +0 -0
  309. package/src/fonts/woff2/ibm-plex-sans-700.woff2 +0 -0
  310. package/src/fonts/woff2/inter-400.woff2 +0 -0
  311. package/src/fonts/woff2/inter-400i.woff2 +0 -0
  312. package/src/fonts/woff2/inter-500.woff2 +0 -0
  313. package/src/fonts/woff2/inter-600.woff2 +0 -0
  314. package/src/fonts/woff2/inter-700.woff2 +0 -0
  315. package/src/fonts/woff2/jetbrains-mono-400.woff2 +0 -0
  316. package/src/fonts/woff2/jetbrains-mono-400i.woff2 +0 -0
  317. package/src/fonts/woff2/jetbrains-mono-700.woff2 +0 -0
  318. package/src/fonts/woff2/lora-400.woff2 +0 -0
  319. package/src/fonts/woff2/lora-400i.woff2 +0 -0
  320. package/src/fonts/woff2/lora-700.woff2 +0 -0
  321. package/src/fonts/woff2/merriweather-400.woff2 +0 -0
  322. package/src/fonts/woff2/merriweather-700.woff2 +0 -0
  323. package/src/fonts/woff2/oswald-400.woff2 +0 -0
  324. package/src/fonts/woff2/oswald-700.woff2 +0 -0
  325. package/src/fonts/woff2/playfair-display-400.woff2 +0 -0
  326. package/src/fonts/woff2/playfair-display-700.woff2 +0 -0
  327. package/src/fonts/woff2/pt-serif-400.woff2 +0 -0
  328. package/src/fonts/woff2/pt-serif-700.woff2 +0 -0
  329. package/src/fonts/woff2/roboto-400.woff2 +0 -0
  330. package/src/fonts/woff2/roboto-400i.woff2 +0 -0
  331. package/src/fonts/woff2/roboto-700.woff2 +0 -0
  332. package/src/fonts/woff2/source-serif-4-400.woff2 +0 -0
  333. package/src/fonts/woff2/source-serif-4-400i.woff2 +0 -0
  334. package/src/fonts/woff2/source-serif-4-700.woff2 +0 -0
  335. package/src/hooks/useAutoSave.ts +0 -116
@@ -0,0 +1,2 @@
1
+ /** Deferred boundary for the large Squisq editor implementation. */
2
+ export { EditorShell as default } from '@bendyline/squisq-editor-react';
@@ -0,0 +1,60 @@
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
+ }
@@ -0,0 +1,19 @@
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
+ }
@@ -0,0 +1,26 @@
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
+ }
@@ -0,0 +1,23 @@
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 };
@@ -2,23 +2,33 @@
2
2
  * ExportDialog — modal for choosing export format and options.
3
3
  */
4
4
 
5
- import { useState, useCallback, useEffect, useRef } from 'react';
5
+ import { useState, useCallback, useEffect, useMemo, useRef } from 'react';
6
6
  import { getThemeSummaries } from '@bendyline/squisq/schemas';
7
- import { getTransformStyleSummaries } from '@bendyline/squisq/transform';
8
7
  import type { ExportFormat, ExportOptions, HtmlBundle, HtmlStyle } from './export-options.js';
9
8
  import { FORMAT_LABELS, saveExportOptions } from './export-options.js';
9
+ import { loadTransformStyleSummaries, type ExportSummaryOption } from './transform-summaries.js';
10
10
 
11
11
  export interface ExportDialogProps {
12
12
  /** Initial options (pre-populated from last export). */
13
13
  initial: ExportOptions;
14
14
  /** Whether the export is currently running. */
15
15
  exporting: boolean;
16
+ /** Optional host-provided destination path control. */
17
+ destination?: ExportDestinationControl;
16
18
  /** Called when the user confirms the export. */
17
19
  onExport: (options: ExportOptions) => void;
20
+ /** Called whenever the currently selected options change. */
21
+ onOptionsChange?: (options: ExportOptions) => void;
18
22
  /** Called when the dialog is dismissed. */
19
23
  onClose: () => void;
20
24
  }
21
25
 
26
+ export interface ExportDestinationControl {
27
+ value: string;
28
+ onPick: (options: ExportOptions) => void | Promise<void>;
29
+ hint?: string;
30
+ }
31
+
22
32
  const FORMATS: ExportFormat[] = ['pdf', 'docx', 'pptx', 'html', 'md'];
23
33
 
24
34
  /** Short labels for the Format chip row. The fuller `FORMAT_LABELS` list
@@ -96,7 +106,14 @@ function ChipRadioGroup<T extends string>({
96
106
  );
97
107
  }
98
108
 
99
- export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDialogProps) {
109
+ export function ExportDialog({
110
+ initial,
111
+ exporting,
112
+ destination,
113
+ onExport,
114
+ onOptionsChange,
115
+ onClose,
116
+ }: ExportDialogProps) {
100
117
  const [format, setFormat] = useState<ExportFormat>(initial.format);
101
118
  const [themeId, setThemeId] = useState(initial.themeId);
102
119
  const [transformStyle, setTransformStyle] = useState(initial.transformStyle);
@@ -105,10 +122,10 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
105
122
  const [htmlBundle, setHtmlBundle] = useState<HtmlBundle>(initial.htmlBundle);
106
123
  const [includeLinkedDocs, setIncludeLinkedDocs] = useState<boolean>(initial.includeLinkedDocs);
107
124
  const [entryAsIndex, setEntryAsIndex] = useState<boolean>(initial.entryAsIndex);
125
+ const [transforms, setTransforms] = useState<ExportSummaryOption[]>([]);
108
126
  const dialogRef = useRef<HTMLDivElement>(null);
109
127
 
110
128
  const themes = getThemeSummaries();
111
- const transforms = getTransformStyleSummaries();
112
129
 
113
130
  // Both HTML styles honor themes now: rendered HTML through the
114
131
  // SquisqPlayer's theme system, plain HTML through squisq's
@@ -139,8 +156,25 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
139
156
  // inert control.
140
157
  const showEntryAsIndex = showHtmlOptions && (htmlBundle === 'single' || includeLinkedDocs);
141
158
 
142
- const handleExport = useCallback(() => {
143
- const opts: ExportOptions = {
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
+ () => ({
144
178
  format,
145
179
  themeId,
146
180
  transformStyle,
@@ -149,22 +183,29 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
149
183
  htmlBundle,
150
184
  includeLinkedDocs: showIncludeLinked && includeLinkedDocs,
151
185
  entryAsIndex: showEntryAsIndex && entryAsIndex,
152
- };
153
- saveExportOptions(opts);
154
- onExport(opts);
155
- }, [
156
- format,
157
- themeId,
158
- transformStyle,
159
- pageSize,
160
- htmlStyle,
161
- htmlBundle,
162
- includeLinkedDocs,
163
- entryAsIndex,
164
- showIncludeLinked,
165
- showEntryAsIndex,
166
- onExport,
167
- ]);
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]);
168
209
 
169
210
  // Close on Escape
170
211
  useEffect(() => {
@@ -209,6 +250,36 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
209
250
  />
210
251
  </div>
211
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
+
212
283
  {/* HTML style + bundle (HTML only) — also chip rows */}
213
284
  {showHtmlOptions && (
214
285
  <>
@@ -313,11 +384,15 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
313
384
  value={transformStyle}
314
385
  onChange={(e) => setTransformStyle(e.target.value)}
315
386
  >
316
- {transforms.map((t) => (
317
- <option key={t.id} value={t.id}>
318
- {t.name}
319
- </option>
320
- ))}
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
+ )}
321
396
  </select>
322
397
  <span className="db-export-hint">
323
398
  {transforms.find((t) => t.id === transformStyle)?.description}