@bendyline/docblocks-react 1.0.0 → 1.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 (133) hide show
  1. package/dist/AppMenu/AppMenu.d.ts +16 -1
  2. package/dist/AppMenu/AppMenu.d.ts.map +1 -1
  3. package/dist/AppMenu/AppMenu.js +3 -2
  4. package/dist/AppMenu/AppMenu.js.map +1 -1
  5. package/dist/AppMenu/index.d.ts +1 -1
  6. package/dist/AppMenu/index.d.ts.map +1 -1
  7. package/dist/DocBlocksShell/DocBlocksShell.d.ts +21 -1
  8. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +1 -1
  9. package/dist/DocBlocksShell/DocBlocksShell.js +930 -98
  10. package/dist/DocBlocksShell/DocBlocksShell.js.map +1 -1
  11. package/dist/Export/ExportDialog.d.ts.map +1 -1
  12. package/dist/Export/ExportDialog.js +104 -5
  13. package/dist/Export/ExportDialog.js.map +1 -1
  14. package/dist/Export/ExportToolbarControls.d.ts.map +1 -1
  15. package/dist/Export/ExportToolbarControls.js +44 -3
  16. package/dist/Export/ExportToolbarControls.js.map +1 -1
  17. package/dist/Export/export-options.d.ts +35 -0
  18. package/dist/Export/export-options.d.ts.map +1 -1
  19. package/dist/Export/export-options.js +6 -1
  20. package/dist/Export/export-options.js.map +1 -1
  21. package/dist/Export/run-export.d.ts.map +1 -1
  22. package/dist/Export/run-export.js +163 -91
  23. package/dist/Export/run-export.js.map +1 -1
  24. package/dist/FileExplorer/FileExplorer.d.ts.map +1 -1
  25. package/dist/FileExplorer/FileExplorer.js +17 -2
  26. package/dist/FileExplorer/FileExplorer.js.map +1 -1
  27. package/dist/FileExplorer/FileTreeNode.d.ts.map +1 -1
  28. package/dist/FileExplorer/FileTreeNode.js +34 -8
  29. package/dist/FileExplorer/FileTreeNode.js.map +1 -1
  30. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +1 -1
  31. package/dist/WorkspacePicker/WorkspacePicker.js +9 -3
  32. package/dist/WorkspacePicker/WorkspacePicker.js.map +1 -1
  33. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +2 -1
  34. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +1 -1
  35. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +2 -2
  36. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +1 -1
  37. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +20 -0
  38. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +1 -0
  39. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +36 -0
  40. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +1 -0
  41. package/dist/hooks/useAutoSave.d.ts +8 -2
  42. package/dist/hooks/useAutoSave.d.ts.map +1 -1
  43. package/dist/hooks/useAutoSave.js +65 -30
  44. package/dist/hooks/useAutoSave.js.map +1 -1
  45. package/dist/icons.d.ts +1 -0
  46. package/dist/icons.d.ts.map +1 -1
  47. package/dist/icons.js +3 -0
  48. package/dist/icons.js.map +1 -1
  49. package/dist/index.d.ts +1 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/preferences/versioning.d.ts +27 -0
  52. package/dist/preferences/versioning.d.ts.map +1 -0
  53. package/dist/preferences/versioning.js +62 -0
  54. package/dist/preferences/versioning.js.map +1 -0
  55. package/package.json +10 -8
  56. package/src/AppMenu/AppMenu.tsx +142 -2
  57. package/src/AppMenu/index.ts +1 -1
  58. package/src/DocBlocksShell/DocBlocksShell.tsx +1194 -125
  59. package/src/Export/ExportDialog.tsx +208 -19
  60. package/src/Export/ExportToolbarControls.tsx +45 -3
  61. package/src/Export/export-options.ts +43 -1
  62. package/src/Export/run-export.ts +190 -91
  63. package/src/FileExplorer/FileExplorer.tsx +31 -9
  64. package/src/FileExplorer/FileTreeNode.tsx +68 -26
  65. package/src/WorkspacePicker/WorkspacePicker.tsx +18 -7
  66. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +9 -0
  67. package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +121 -0
  68. package/src/fonts/fonts.css +362 -0
  69. package/src/fonts/licenses/LICENSE-cormorant-garamond.txt +93 -0
  70. package/src/fonts/licenses/LICENSE-crimson-text.txt +93 -0
  71. package/src/fonts/licenses/LICENSE-dm-sans.txt +93 -0
  72. package/src/fonts/licenses/LICENSE-dm-serif-display.txt +93 -0
  73. package/src/fonts/licenses/LICENSE-hanken-grotesk.txt +94 -0
  74. package/src/fonts/licenses/LICENSE-ibm-plex-sans.txt +93 -0
  75. package/src/fonts/licenses/LICENSE-inter.txt +93 -0
  76. package/src/fonts/licenses/LICENSE-jetbrains-mono.txt +93 -0
  77. package/src/fonts/licenses/LICENSE-lora.txt +93 -0
  78. package/src/fonts/licenses/LICENSE-merriweather.txt +93 -0
  79. package/src/fonts/licenses/LICENSE-oswald.txt +93 -0
  80. package/src/fonts/licenses/LICENSE-playfair-display.txt +93 -0
  81. package/src/fonts/licenses/LICENSE-pt-serif.txt +93 -0
  82. package/src/fonts/licenses/LICENSE-roboto.txt +93 -0
  83. package/src/fonts/licenses/LICENSE-source-serif-4.txt +93 -0
  84. package/src/fonts/woff2/cormorant-garamond-400.woff2 +0 -0
  85. package/src/fonts/woff2/cormorant-garamond-700.woff2 +0 -0
  86. package/src/fonts/woff2/crimson-text-400.woff2 +0 -0
  87. package/src/fonts/woff2/crimson-text-400i.woff2 +0 -0
  88. package/src/fonts/woff2/crimson-text-700.woff2 +0 -0
  89. package/src/fonts/woff2/dm-sans-400.woff2 +0 -0
  90. package/src/fonts/woff2/dm-sans-400i.woff2 +0 -0
  91. package/src/fonts/woff2/dm-sans-500.woff2 +0 -0
  92. package/src/fonts/woff2/dm-sans-700.woff2 +0 -0
  93. package/src/fonts/woff2/dm-serif-display-400.woff2 +0 -0
  94. package/src/fonts/woff2/hanken-grotesk-400.woff2 +0 -0
  95. package/src/fonts/woff2/hanken-grotesk-400i.woff2 +0 -0
  96. package/src/fonts/woff2/hanken-grotesk-500.woff2 +0 -0
  97. package/src/fonts/woff2/hanken-grotesk-600.woff2 +0 -0
  98. package/src/fonts/woff2/hanken-grotesk-700.woff2 +0 -0
  99. package/src/fonts/woff2/ibm-plex-sans-400.woff2 +0 -0
  100. package/src/fonts/woff2/ibm-plex-sans-400i.woff2 +0 -0
  101. package/src/fonts/woff2/ibm-plex-sans-500.woff2 +0 -0
  102. package/src/fonts/woff2/ibm-plex-sans-600.woff2 +0 -0
  103. package/src/fonts/woff2/ibm-plex-sans-700.woff2 +0 -0
  104. package/src/fonts/woff2/inter-400.woff2 +0 -0
  105. package/src/fonts/woff2/inter-400i.woff2 +0 -0
  106. package/src/fonts/woff2/inter-500.woff2 +0 -0
  107. package/src/fonts/woff2/inter-600.woff2 +0 -0
  108. package/src/fonts/woff2/inter-700.woff2 +0 -0
  109. package/src/fonts/woff2/jetbrains-mono-400.woff2 +0 -0
  110. package/src/fonts/woff2/jetbrains-mono-400i.woff2 +0 -0
  111. package/src/fonts/woff2/jetbrains-mono-700.woff2 +0 -0
  112. package/src/fonts/woff2/lora-400.woff2 +0 -0
  113. package/src/fonts/woff2/lora-400i.woff2 +0 -0
  114. package/src/fonts/woff2/lora-700.woff2 +0 -0
  115. package/src/fonts/woff2/merriweather-400.woff2 +0 -0
  116. package/src/fonts/woff2/merriweather-700.woff2 +0 -0
  117. package/src/fonts/woff2/oswald-400.woff2 +0 -0
  118. package/src/fonts/woff2/oswald-700.woff2 +0 -0
  119. package/src/fonts/woff2/playfair-display-400.woff2 +0 -0
  120. package/src/fonts/woff2/playfair-display-700.woff2 +0 -0
  121. package/src/fonts/woff2/pt-serif-400.woff2 +0 -0
  122. package/src/fonts/woff2/pt-serif-700.woff2 +0 -0
  123. package/src/fonts/woff2/roboto-400.woff2 +0 -0
  124. package/src/fonts/woff2/roboto-400i.woff2 +0 -0
  125. package/src/fonts/woff2/roboto-700.woff2 +0 -0
  126. package/src/fonts/woff2/source-serif-4-400.woff2 +0 -0
  127. package/src/fonts/woff2/source-serif-4-400i.woff2 +0 -0
  128. package/src/fonts/woff2/source-serif-4-700.woff2 +0 -0
  129. package/src/hooks/useAutoSave.ts +87 -29
  130. package/src/icons.tsx +10 -0
  131. package/src/index.ts +1 -1
  132. package/src/preferences/versioning.ts +69 -0
  133. package/src/styles/docblocks.css +1037 -55
@@ -3,17 +3,42 @@
3
3
  */
4
4
 
5
5
  import { useState, useCallback, useRef, useEffect } from 'react';
6
+ import type { VersioningPreference } from '../preferences/versioning.js';
7
+
8
+ export type ThemePreference = 'auto' | 'light' | 'dark';
6
9
 
7
10
  export interface AppMenuProps {
8
11
  /** URL for the about page. */
9
12
  aboutUrl?: string;
10
13
  /** Optional logo image URL to display instead of the text label. */
11
14
  logoUrl?: string;
15
+ /** Current theme preference. */
16
+ themePreference?: ThemePreference;
17
+ /** Called when the user changes the theme preference. */
18
+ onThemeChange?: (theme: ThemePreference) => void;
19
+ /** Current global versioning preference. */
20
+ versioningPreference?: VersioningPreference;
21
+ /** Called when the user changes the global versioning preference. */
22
+ onVersioningPreferenceChange?: (pref: VersioningPreference) => void;
23
+ /**
24
+ * Called when the user clicks "Download all workspaces". When omitted,
25
+ * the menu item is hidden.
26
+ */
27
+ onDownloadAllWorkspaces?: () => void | Promise<void>;
12
28
  }
13
29
 
14
- export function AppMenu({ aboutUrl: _aboutUrl = '#about', logoUrl }: AppMenuProps) {
30
+ export function AppMenu({
31
+ aboutUrl: _aboutUrl = '#about',
32
+ logoUrl,
33
+ themePreference = 'auto',
34
+ onThemeChange,
35
+ versioningPreference = 'browser-only',
36
+ onVersioningPreferenceChange,
37
+ onDownloadAllWorkspaces,
38
+ }: AppMenuProps) {
15
39
  const [isOpen, setIsOpen] = useState(false);
16
40
  const [showAbout, setShowAbout] = useState(false);
41
+ const [showSettings, setShowSettings] = useState(false);
17
42
  const menuRef = useRef<HTMLDivElement>(null);
18
43
 
19
44
  useEffect(() => {
@@ -53,6 +78,23 @@ export function AppMenu({ aboutUrl: _aboutUrl = '#about', logoUrl }: AppMenuProp
53
78
 
54
79
  {isOpen && (
55
80
  <div className="db-app-menu-dropdown" role="menu">
81
+ <button
82
+ className="db-app-menu-item"
83
+ role="menuitem"
84
+ onClick={() => handleAction(() => setShowSettings(true))}
85
+ >
86
+ Settings
87
+ </button>
88
+ {onDownloadAllWorkspaces && (
89
+ <button
90
+ className="db-app-menu-item"
91
+ role="menuitem"
92
+ onClick={() => handleAction(() => void onDownloadAllWorkspaces())}
93
+ >
94
+ Download all workspaces
95
+ </button>
96
+ )}
97
+ <div className="db-app-menu-divider" />
56
98
  <button
57
99
  className="db-app-menu-item"
58
100
  role="menuitem"
@@ -64,6 +106,104 @@ export function AppMenu({ aboutUrl: _aboutUrl = '#about', logoUrl }: AppMenuProp
64
106
  )}
65
107
  </div>
66
108
 
109
+ {showSettings && (
110
+ <div className="db-dialog-overlay" onClick={() => setShowSettings(false)}>
111
+ <div
112
+ className="db-dialog"
113
+ role="dialog"
114
+ aria-label="Settings"
115
+ onClick={(e) => e.stopPropagation()}
116
+ >
117
+ <div className="db-dialog-header">
118
+ <h2 className="db-dialog-title">Settings</h2>
119
+ <button
120
+ className="db-dialog-close"
121
+ onClick={() => setShowSettings(false)}
122
+ aria-label="Close"
123
+ >
124
+ &times;
125
+ </button>
126
+ </div>
127
+ <div className="db-dialog-body">
128
+ <fieldset className="db-settings-fieldset">
129
+ <legend className="db-settings-legend">Theme</legend>
130
+ <label className="db-settings-radio">
131
+ <input
132
+ type="radio"
133
+ name="theme"
134
+ value="auto"
135
+ checked={themePreference === 'auto'}
136
+ onChange={() => onThemeChange?.('auto')}
137
+ />
138
+ System default
139
+ </label>
140
+ <label className="db-settings-radio">
141
+ <input
142
+ type="radio"
143
+ name="theme"
144
+ value="light"
145
+ checked={themePreference === 'light'}
146
+ onChange={() => onThemeChange?.('light')}
147
+ />
148
+ Light
149
+ </label>
150
+ <label className="db-settings-radio">
151
+ <input
152
+ type="radio"
153
+ name="theme"
154
+ value="dark"
155
+ checked={themePreference === 'dark'}
156
+ onChange={() => onThemeChange?.('dark')}
157
+ />
158
+ Dark
159
+ </label>
160
+ </fieldset>
161
+
162
+ {onVersioningPreferenceChange && (
163
+ <fieldset className="db-settings-fieldset">
164
+ <legend className="db-settings-legend">Version history</legend>
165
+ <p className="db-settings-hint">
166
+ When on, DocBlocks keeps prior revisions of each document inside a sibling{' '}
167
+ <code>&lt;name&gt;_files/.versions/</code> folder. Individual workspaces can
168
+ override this default in their own settings.
169
+ </p>
170
+ <label className="db-settings-radio">
171
+ <input
172
+ type="radio"
173
+ name="versioning"
174
+ value="on"
175
+ checked={versioningPreference === 'on'}
176
+ onChange={() => onVersioningPreferenceChange('on')}
177
+ />
178
+ On for all workspaces
179
+ </label>
180
+ <label className="db-settings-radio">
181
+ <input
182
+ type="radio"
183
+ name="versioning"
184
+ value="browser-only"
185
+ checked={versioningPreference === 'browser-only'}
186
+ onChange={() => onVersioningPreferenceChange('browser-only')}
187
+ />
188
+ On in browser workspaces, off for local folders
189
+ </label>
190
+ <label className="db-settings-radio">
191
+ <input
192
+ type="radio"
193
+ name="versioning"
194
+ value="off"
195
+ checked={versioningPreference === 'off'}
196
+ onChange={() => onVersioningPreferenceChange('off')}
197
+ />
198
+ Off for all workspaces
199
+ </label>
200
+ </fieldset>
201
+ )}
202
+ </div>
203
+ </div>
204
+ </div>
205
+ )}
206
+
67
207
  {showAbout && (
68
208
  <div className="db-dialog-overlay" onClick={() => setShowAbout(false)}>
69
209
  <div
@@ -90,7 +230,7 @@ export function AppMenu({ aboutUrl: _aboutUrl = '#about', logoUrl }: AppMenuProp
90
230
  <p>
91
231
  Built on{' '}
92
232
  <a
93
- href="https://github.com/nicoth-in/squisq"
233
+ href="https://github.com/bendyline/squisq"
94
234
  target="_blank"
95
235
  rel="noopener noreferrer"
96
236
  >
@@ -1,2 +1,2 @@
1
1
  export { AppMenu } from './AppMenu.js';
2
- export type { AppMenuProps } from './AppMenu.js';
2
+ export type { AppMenuProps, ThemePreference } from './AppMenu.js';