@bendyline/docblocks-react 2.4.0 → 2.5.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.
@@ -6,7 +6,7 @@ Run `npm run generate:notices` from the repository root.
6
6
  Resolved runtime and optional dependency closure declared by packages/react/package.json. Peer dependencies are supplied by the consuming application and are not included.
7
7
 
8
8
  Inventory source: package-lock.json.
9
- Components: 344.
9
+ Components: 373.
10
10
 
11
11
  This notice is included in the published npm tarball. Transitive packages installed by npm also retain their package-local license files.
12
12
 
@@ -130,14 +130,20 @@ This notice is included in the published npm tarball. Transitive packages instal
130
130
  | @types/use-sync-external-store | 0.0.6 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
131
131
  | @upsetjs/venn.js | 2.0.0 | MIT | https://github.com/upsetjs/venn.js |
132
132
  | @xmldom/xmldom | 0.9.11 | MIT | https://github.com/xmldom/xmldom |
133
+ | ansi-regex | 5.0.1 | MIT | https://github.com/chalk/ansi-regex |
134
+ | ansi-styles | 4.3.0 | MIT | https://github.com/chalk/ansi-styles |
133
135
  | argparse | 2.0.1 | Python-2.0 | https://github.com/nodeca/argparse |
134
136
  | bail | 2.0.2 | MIT | https://github.com/wooorm/bail |
135
137
  | base64-arraybuffer | 1.0.2 | MIT | https://github.com/niklasvh/base64-arraybuffer |
138
+ | camelcase | 5.3.1 | MIT | https://github.com/sindresorhus/camelcase |
136
139
  | ccount | 2.0.1 | MIT | https://github.com/wooorm/ccount |
137
140
  | character-entities | 2.0.2 | MIT | https://github.com/wooorm/character-entities |
138
141
  | character-entities-html4 | 2.1.0 | MIT | https://github.com/wooorm/character-entities-html4 |
139
142
  | character-entities-legacy | 3.0.0 | MIT | https://github.com/wooorm/character-entities-legacy |
140
143
  | character-reference-invalid | 2.0.1 | MIT | https://github.com/wooorm/character-reference-invalid |
144
+ | cliui | 6.0.0 | ISC | http://github.com/yargs/cliui |
145
+ | color-convert | 2.0.1 | MIT | https://github.com/Qix-/color-convert |
146
+ | color-name | 1.1.4 | MIT | git@github.com:colorjs/color-name |
141
147
  | comma-separated-tokens | 2.0.3 | MIT | https://github.com/wooorm/comma-separated-tokens |
142
148
  | commander | 7.2.0 | MIT | https://github.com/tj/commander.js |
143
149
  | commander | 8.3.0 | MIT | https://github.com/tj/commander.js |
@@ -187,11 +193,14 @@ This notice is included in the published npm tarball. Transitive packages instal
187
193
  | dagre-d3-es | 7.0.14 | MIT | https://github.com/tbo47/dagre-es |
188
194
  | dayjs | 1.11.21 | MIT | https://github.com/iamkun/dayjs |
189
195
  | debug | 4.4.3 | MIT | https://github.com/debug-js/debug |
196
+ | decamelize | 1.2.0 | MIT | https://github.com/sindresorhus/decamelize |
190
197
  | decode-named-character-reference | 1.3.0 | MIT | https://github.com/wooorm/decode-named-character-reference |
191
198
  | delaunator | 5.1.0 | ISC | https://github.com/mapbox/delaunator |
192
199
  | dequal | 2.0.3 | MIT | https://github.com/lukeed/dequal |
193
200
  | devlop | 1.1.0 | MIT | https://github.com/wooorm/devlop |
201
+ | dijkstrajs | 1.0.3 | MIT | https://github.com/tcort/dijkstrajs |
194
202
  | dompurify | 3.4.13 | (MPL-2.0 OR Apache-2.0) | https://github.com/cure53/DOMPurify |
203
+ | emoji-regex | 8.0.0 | MIT | https://github.com/mathiasbynens/emoji-regex |
195
204
  | entities | 4.5.0 | BSD-2-Clause | https://github.com/fb55/entities |
196
205
  | entities | 6.0.1 | BSD-2-Clause | https://github.com/fb55/entities |
197
206
  | es-toolkit | 1.50.0 | MIT | https://github.com/toss/es-toolkit |
@@ -200,8 +209,10 @@ This notice is included in the published npm tarball. Transitive packages instal
200
209
  | extend | 3.0.2 | MIT | https://github.com/justmoon/node-extend |
201
210
  | fast-deep-equal | 3.1.3 | MIT | https://github.com/epoberezkin/fast-deep-equal |
202
211
  | fault | 2.0.1 | MIT | https://github.com/wooorm/fault |
212
+ | find-up | 4.1.0 | MIT | https://github.com/sindresorhus/find-up |
203
213
  | format | 0.2.2 | MIT | https://github.com/samsonjs/format |
204
214
  | genson-js | 0.0.8 | Apache-2.0 | git+ssh://git@github.com/aspecto-io/genson-js |
215
+ | get-caller-file | 2.0.5 | ISC | https://github.com/stefanpenner/get-caller-file |
205
216
  | hachure-fill | 0.5.2 | MIT | https://github.com/pshihn/hachure-fill |
206
217
  | hast-util-from-html | 2.0.3 | MIT | https://github.com/syntax-tree/hast-util-from-html |
207
218
  | hast-util-from-parse5 | 8.0.3 | MIT | https://github.com/syntax-tree/hast-util-from-parse5 |
@@ -217,6 +228,7 @@ This notice is included in the published npm tarball. Transitive packages instal
217
228
  | is-alphabetical | 2.0.1 | MIT | https://github.com/wooorm/is-alphabetical |
218
229
  | is-alphanumerical | 2.0.1 | MIT | https://github.com/wooorm/is-alphanumerical |
219
230
  | is-decimal | 2.0.1 | MIT | https://github.com/wooorm/is-decimal |
231
+ | is-fullwidth-code-point | 3.0.0 | MIT | https://github.com/sindresorhus/is-fullwidth-code-point |
220
232
  | is-hexadecimal | 2.0.1 | MIT | https://github.com/wooorm/is-hexadecimal |
221
233
  | is-plain-obj | 4.1.0 | MIT | https://github.com/sindresorhus/is-plain-obj |
222
234
  | isarray | 1.0.0 | MIT | https://github.com/juliangruber/isarray |
@@ -230,6 +242,7 @@ This notice is included in the published npm tarball. Transitive packages instal
230
242
  | linkify-it | 5.0.2 | MIT | https://github.com/markdown-it/linkify-it |
231
243
  | linkifyjs | 4.3.3 | MIT | https://github.com/nfrasser/linkifyjs |
232
244
  | localforage | 1.10.0 | Apache-2.0 | https://github.com/localForage/localForage |
245
+ | locate-path | 5.0.0 | MIT | https://github.com/sindresorhus/locate-path |
233
246
  | lodash-es | 4.18.1 | MIT | https://github.com/lodash/lodash |
234
247
  | longest-streak | 3.1.0 | MIT | https://github.com/wooorm/longest-streak |
235
248
  | markdown-it | 14.3.0 | MIT | https://github.com/markdown-it/markdown-it |
@@ -285,13 +298,18 @@ This notice is included in the published npm tarball. Transitive packages instal
285
298
  | ms | 2.1.3 | MIT | https://github.com/vercel/ms |
286
299
  | ngeohash | 0.6.3 | MIT | https://github.com/sunng87/node-geohash |
287
300
  | orderedmap | 2.1.1 | MIT | https://github.com/marijnh/orderedmap |
301
+ | p-limit | 2.3.0 | MIT | https://github.com/sindresorhus/p-limit |
302
+ | p-locate | 4.1.0 | MIT | https://github.com/sindresorhus/p-locate |
303
+ | p-try | 2.2.0 | MIT | https://github.com/sindresorhus/p-try |
288
304
  | package-manager-detector | 1.8.0 | MIT | https://github.com/antfu-collective/package-manager-detector |
289
305
  | pako | 1.0.11 | (MIT AND Zlib) | https://github.com/nodeca/pako |
290
306
  | parse-entities | 4.0.2 | MIT | https://github.com/wooorm/parse-entities |
291
307
  | parse5 | 7.3.0 | MIT | https://github.com/inikulin/parse5 |
292
308
  | path-data-parser | 0.1.0 | MIT | https://github.com/pshihn/path-data-parser |
309
+ | path-exists | 4.0.0 | MIT | https://github.com/sindresorhus/path-exists |
293
310
  | pdf-lib | 1.17.1 | MIT | https://github.com/Hopding/pdf-lib |
294
311
  | pdfjs-dist | 4.10.38 | Apache-2.0 | https://github.com/mozilla/pdf.js |
312
+ | pngjs | 5.0.0 | MIT | https://github.com/lukeapage/pngjs |
295
313
  | points-on-curve | 0.2.0 | MIT | https://github.com/pshihn/bezier-points |
296
314
  | points-on-path | 0.2.1 | MIT | https://github.com/pshihn/points-on-path |
297
315
  | process-nextick-args | 2.0.1 | MIT | https://github.com/calvinmetcalf/process-nextick-args |
@@ -315,6 +333,7 @@ This notice is included in the published npm tarball. Transitive packages instal
315
333
  | prosemirror-transform | 1.11.0 | MIT | https://github.com/prosemirror/prosemirror-transform |
316
334
  | prosemirror-view | 1.42.1 | MIT | https://code.haverbeke.berlin/prosemirror/prosemirror-view |
317
335
  | punycode.js | 2.3.1 | MIT | https://github.com/mathiasbynens/punycode.js |
336
+ | qrcode | 1.5.4 | MIT | https://github.com/soldair/node-qrcode |
318
337
  | readable-stream | 2.3.8 | MIT | https://github.com/nodejs/readable-stream |
319
338
  | remark-directive | 3.0.1 | MIT | https://github.com/remarkjs/remark-directive |
320
339
  | remark-frontmatter | 5.0.0 | MIT | https://github.com/remarkjs/remark-frontmatter |
@@ -322,16 +341,21 @@ This notice is included in the published npm tarball. Transitive packages instal
322
341
  | remark-math | 6.0.0 | MIT | https://github.com/remarkjs/remark-math/tree/main/packages/remark-math |
323
342
  | remark-parse | 11.0.0 | MIT | https://github.com/remarkjs/remark/tree/main/packages/remark-parse |
324
343
  | remark-stringify | 11.0.0 | MIT | https://github.com/remarkjs/remark/tree/main/packages/remark-stringify |
344
+ | require-directory | 2.1.1 | MIT | https://github.com/troygoode/node-require-directory |
345
+ | require-main-filename | 2.0.0 | ISC | git+ssh://git@github.com/yargs/require-main-filename |
325
346
  | robust-predicates | 3.0.3 | Unlicense | https://github.com/mourner/robust-predicates |
326
347
  | rope-sequence | 1.3.4 | MIT | https://github.com/marijnh/rope-sequence |
327
348
  | roughjs | 4.6.6 | MIT | https://github.com/pshihn/rough |
328
349
  | rw | 1.3.3 | BSD-3-Clause | http://github.com/mbostock/rw |
329
350
  | safe-buffer | 5.1.2 | MIT | https://github.com/feross/safe-buffer |
330
351
  | safer-buffer | 2.1.2 | MIT | https://github.com/ChALkeR/safer-buffer |
352
+ | set-blocking | 2.0.0 | ISC | https://github.com/yargs/set-blocking |
331
353
  | setimmediate | 1.0.5 | MIT | https://github.com/YuzuJS/setImmediate |
332
354
  | space-separated-tokens | 2.0.2 | MIT | https://github.com/wooorm/space-separated-tokens |
333
355
  | string_decoder | 1.1.1 | MIT | https://github.com/nodejs/string_decoder |
356
+ | string-width | 4.2.3 | MIT | https://github.com/sindresorhus/string-width |
334
357
  | stringify-entities | 4.0.4 | MIT | https://github.com/wooorm/stringify-entities |
358
+ | strip-ansi | 6.0.1 | MIT | https://github.com/chalk/strip-ansi |
335
359
  | stylis | 4.4.0 | MIT | https://github.com/thysultan/stylis.js |
336
360
  | text-segmentation | 1.0.3 | MIT | git+ssh://git@github.com/niklasvh/text-segmentation |
337
361
  | tinyexec | 1.1.2 | MIT | https://github.com/tinylibs/tinyexec |
@@ -356,6 +380,11 @@ This notice is included in the published npm tarball. Transitive packages instal
356
380
  | vfile-message | 4.0.3 | MIT | https://github.com/vfile/vfile-message |
357
381
  | w3c-keyname | 2.2.8 | MIT | https://github.com/marijnh/w3c-keyname |
358
382
  | web-namespaces | 2.0.1 | MIT | https://github.com/wooorm/web-namespaces |
383
+ | which-module | 2.0.1 | ISC | https://github.com/nexdrew/which-module |
384
+ | wrap-ansi | 6.2.0 | MIT | https://github.com/chalk/wrap-ansi |
385
+ | y18n | 4.0.3 | ISC | git@github.com:yargs/y18n |
386
+ | yargs | 15.4.1 | MIT | https://github.com/yargs/yargs |
387
+ | yargs-parser | 18.1.3 | ISC | https://github.com/yargs/yargs-parser |
359
388
  | zod | 3.25.76 | MIT | https://github.com/colinhacks/zod |
360
389
  | zwitch | 2.0.4 | MIT | https://github.com/wooorm/zwitch |
361
390
 
@@ -7266,6 +7295,44 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
7266
7295
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
7267
7296
  OTHER DEALINGS IN THE SOFTWARE.
7268
7297
 
7298
+ ==============================================================================
7299
+ Components: color-convert@2.0.1
7300
+ Source files: node_modules/color-convert/LICENSE
7301
+ ==============================================================================
7302
+ Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
7303
+
7304
+ Permission is hereby granted, free of charge, to any person obtaining
7305
+ a copy of this software and associated documentation files (the
7306
+ "Software"), to deal in the Software without restriction, including
7307
+ without limitation the rights to use, copy, modify, merge, publish,
7308
+ distribute, sublicense, and/or sell copies of the Software, and to
7309
+ permit persons to whom the Software is furnished to do so, subject to
7310
+ the following conditions:
7311
+
7312
+ The above copyright notice and this permission notice shall be
7313
+ included in all copies or substantial portions of the Software.
7314
+
7315
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
7316
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
7317
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
7318
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
7319
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
7320
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
7321
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7322
+
7323
+ ==============================================================================
7324
+ Components: color-name@1.1.4
7325
+ Source files: node_modules/color-name/LICENSE
7326
+ ==============================================================================
7327
+ The MIT License (MIT)
7328
+ Copyright (c) 2015 Dmitry Ivanov
7329
+
7330
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7331
+
7332
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7333
+
7334
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7335
+
7269
7336
  ==============================================================================
7270
7337
  Components: comma-separated-tokens@2.0.3, hast-util-parse-selector@4.0.0, is-alphabetical@2.0.1, is-alphanumerical@2.0.1, is-decimal@2.0.1, is-hexadecimal@2.0.1, space-separated-tokens@2.0.2, unist-util-remove-position@5.0.0, unist-util-stringify-position@4.0.0, unist-util-visit-parents@6.0.2, vfile-location@5.0.3, web-namespaces@2.0.1, zwitch@2.0.4
7271
7338
  Source files: node_modules/comma-separated-tokens/license, node_modules/hast-util-parse-selector/license, node_modules/is-alphabetical/license, node_modules/is-alphanumerical/license, node_modules/is-decimal/license, node_modules/is-hexadecimal/license, node_modules/space-separated-tokens/license, node_modules/unist-util-remove-position/license, node_modules/unist-util-stringify-position/license, node_modules/unist-util-visit-parents/license, node_modules/vfile-location/license, node_modules/web-namespaces/license, node_modules/zwitch/license
@@ -8175,6 +8242,30 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
8175
8242
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
8176
8243
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8177
8244
 
8245
+ ==============================================================================
8246
+ Components: dijkstrajs@1.0.3
8247
+ Source files: node_modules/dijkstrajs/LICENSE.md
8248
+ ==============================================================================
8249
+ ```
8250
+ Dijkstra path-finding functions. Adapted from the Dijkstar Python project.
8251
+
8252
+ Copyright (C) 2008
8253
+ Wyatt Baldwin <self@wyattbaldwin.com>
8254
+ All rights reserved
8255
+
8256
+ Licensed under the MIT license.
8257
+
8258
+ http://www.opensource.org/licenses/mit-license.php
8259
+
8260
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8261
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
8262
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
8263
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
8264
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
8265
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
8266
+ THE SOFTWARE.
8267
+ ```
8268
+
8178
8269
  ==============================================================================
8179
8270
  Components: dompurify@3.4.13
8180
8271
  Source files: node_modules/dompurify/LICENSE-MPL
@@ -8904,6 +8995,17 @@ Source files: node_modules/genson-js/LICENSE
8904
8995
  See the License for the specific language governing permissions and
8905
8996
  limitations under the License.
8906
8997
 
8998
+ ==============================================================================
8999
+ Components: get-caller-file@2.0.5
9000
+ Source files: node_modules/get-caller-file/LICENSE.md
9001
+ ==============================================================================
9002
+ ISC License (ISC)
9003
+ Copyright 2018 Stefan Penner
9004
+
9005
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
9006
+
9007
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
9008
+
8907
9009
  ==============================================================================
8908
9010
  Components: hachure-fill@0.5.2
8909
9011
  Source files: node_modules/hachure-fill/LICENSE
@@ -9081,6 +9183,20 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
9081
9183
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
9082
9184
  PERFORMANCE OF THIS SOFTWARE.
9083
9185
 
9186
+ ==============================================================================
9187
+ Components: ansi-regex@5.0.1, ansi-styles@4.3.0, camelcase@5.3.1, find-up@4.1.0, is-fullwidth-code-point@3.0.0, locate-path@5.0.0, p-limit@2.3.0, p-locate@4.1.0, p-try@2.2.0, path-exists@4.0.0, string-width@4.2.3, strip-ansi@6.0.1, wrap-ansi@6.2.0
9188
+ Source files: node_modules/is-fullwidth-code-point/license, node_modules/p-try/license, node_modules/qrcode/node_modules/ansi-regex/license, node_modules/qrcode/node_modules/ansi-styles/license, node_modules/qrcode/node_modules/camelcase/license, node_modules/qrcode/node_modules/find-up/license, node_modules/qrcode/node_modules/locate-path/license, node_modules/qrcode/node_modules/p-limit/license, node_modules/qrcode/node_modules/p-locate/license, node_modules/qrcode/node_modules/path-exists/license, node_modules/qrcode/node_modules/string-width/license, node_modules/qrcode/node_modules/strip-ansi/license, node_modules/qrcode/node_modules/wrap-ansi/license
9189
+ ==============================================================================
9190
+ MIT License
9191
+
9192
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
9193
+
9194
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9195
+
9196
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9197
+
9198
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9199
+
9084
9200
  ==============================================================================
9085
9201
  Components: isarray@1.0.0
9086
9202
  Source files: node_modules/isarray/README.md
@@ -10859,6 +10975,31 @@ Source files: node_modules/pdfjs-dist/LICENSE
10859
10975
 
10860
10976
  END OF TERMS AND CONDITIONS
10861
10977
 
10978
+ ==============================================================================
10979
+ Components: pngjs@5.0.0
10980
+ Source files: node_modules/pngjs/LICENSE
10981
+ ==============================================================================
10982
+ pngjs2 original work Copyright (c) 2015 Luke Page & Original Contributors
10983
+ pngjs derived work Copyright (c) 2012 Kuba Niegowski
10984
+
10985
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10986
+ of this software and associated documentation files (the "Software"), to deal
10987
+ in the Software without restriction, including without limitation the rights
10988
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10989
+ copies of the Software, and to permit persons to whom the Software is
10990
+ furnished to do so, subject to the following conditions:
10991
+
10992
+ The above copyright notice and this permission notice shall be included in
10993
+ all copies or substantial portions of the Software.
10994
+
10995
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
10996
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
10997
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10998
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
10999
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
11000
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
11001
+ THE SOFTWARE.
11002
+
10862
11003
  ==============================================================================
10863
11004
  Components: points-on-path@0.2.1
10864
11005
  Source files: node_modules/points-on-path/LICENSE
@@ -10982,8 +11123,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
10982
11123
  THE SOFTWARE.
10983
11124
 
10984
11125
  ==============================================================================
10985
- Components: punycode.js@2.3.1, uc.micro@2.1.0
10986
- Source files: node_modules/punycode.js/LICENSE-MIT.txt, node_modules/uc.micro/LICENSE.txt
11126
+ Components: emoji-regex@8.0.0, punycode.js@2.3.1, uc.micro@2.1.0
11127
+ Source files: node_modules/punycode.js/LICENSE-MIT.txt, node_modules/qrcode/node_modules/emoji-regex/LICENSE-MIT.txt, node_modules/uc.micro/LICENSE.txt
10987
11128
  ==============================================================================
10988
11129
  Copyright Mathias Bynens <https://mathiasbynens.be/>
10989
11130
 
@@ -11006,6 +11147,128 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
11006
11147
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
11007
11148
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11008
11149
 
11150
+ ==============================================================================
11151
+ Components: qrcode@1.5.4
11152
+ Source files: node_modules/qrcode/license
11153
+ ==============================================================================
11154
+ The MIT License (MIT)
11155
+
11156
+ Copyright (c) 2012 Ryan Day
11157
+
11158
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
11159
+
11160
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11161
+
11162
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11163
+
11164
+ ==============================================================================
11165
+ Components: cliui@6.0.0
11166
+ Source files: node_modules/qrcode/node_modules/cliui/LICENSE.txt
11167
+ ==============================================================================
11168
+ Copyright (c) 2015, Contributors
11169
+
11170
+ Permission to use, copy, modify, and/or distribute this software
11171
+ for any purpose with or without fee is hereby granted, provided
11172
+ that the above copyright notice and this permission notice
11173
+ appear in all copies.
11174
+
11175
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11176
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
11177
+ OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
11178
+ LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
11179
+ OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
11180
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
11181
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
11182
+
11183
+ ==============================================================================
11184
+ Components: decamelize@1.2.0
11185
+ Source files: node_modules/qrcode/node_modules/decamelize/license
11186
+ ==============================================================================
11187
+ The MIT License (MIT)
11188
+
11189
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
11190
+
11191
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11192
+ of this software and associated documentation files (the "Software"), to deal
11193
+ in the Software without restriction, including without limitation the rights
11194
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11195
+ copies of the Software, and to permit persons to whom the Software is
11196
+ furnished to do so, subject to the following conditions:
11197
+
11198
+ The above copyright notice and this permission notice shall be included in
11199
+ all copies or substantial portions of the Software.
11200
+
11201
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11202
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11203
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
11204
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
11205
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
11206
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
11207
+ THE SOFTWARE.
11208
+
11209
+ ==============================================================================
11210
+ Components: y18n@4.0.3
11211
+ Source files: node_modules/qrcode/node_modules/y18n/LICENSE
11212
+ ==============================================================================
11213
+ Copyright (c) 2015, Contributors
11214
+
11215
+ Permission to use, copy, modify, and/or distribute this software for any purpose
11216
+ with or without fee is hereby granted, provided that the above copyright notice
11217
+ and this permission notice appear in all copies.
11218
+
11219
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
11220
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
11221
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11222
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
11223
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
11224
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
11225
+ THIS SOFTWARE.
11226
+
11227
+ ==============================================================================
11228
+ Components: require-main-filename@2.0.0, set-blocking@2.0.0, yargs-parser@18.1.3
11229
+ Source files: node_modules/qrcode/node_modules/yargs-parser/LICENSE.txt, node_modules/require-main-filename/LICENSE.txt, node_modules/set-blocking/LICENSE.txt
11230
+ ==============================================================================
11231
+ Copyright (c) 2016, Contributors
11232
+
11233
+ Permission to use, copy, modify, and/or distribute this software
11234
+ for any purpose with or without fee is hereby granted, provided
11235
+ that the above copyright notice and this permission notice
11236
+ appear in all copies.
11237
+
11238
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11239
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
11240
+ OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
11241
+ LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
11242
+ OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
11243
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
11244
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
11245
+
11246
+ ==============================================================================
11247
+ Components: yargs@15.4.1
11248
+ Source files: node_modules/qrcode/node_modules/yargs/LICENSE
11249
+ ==============================================================================
11250
+ MIT License
11251
+
11252
+ Copyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com)
11253
+
11254
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11255
+ of this software and associated documentation files (the "Software"), to deal
11256
+ in the Software without restriction, including without limitation the rights
11257
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11258
+ copies of the Software, and to permit persons to whom the Software is
11259
+ furnished to do so, subject to the following conditions:
11260
+
11261
+ The above copyright notice and this permission notice shall be included in
11262
+ all copies or substantial portions of the Software.
11263
+
11264
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11265
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11266
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
11267
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
11268
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
11269
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
11270
+ THE SOFTWARE.
11271
+
11009
11272
  ==============================================================================
11010
11273
  Components: readable-stream@2.3.8, string_decoder@1.1.1
11011
11274
  Source files: node_modules/readable-stream/LICENSE, node_modules/string_decoder/LICENSE
@@ -11463,6 +11726,33 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
11463
11726
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
11464
11727
  THE SOFTWARE.
11465
11728
 
11729
+ ==============================================================================
11730
+ Components: require-directory@2.1.1
11731
+ Source files: node_modules/require-directory/LICENSE
11732
+ ==============================================================================
11733
+ The MIT License (MIT)
11734
+
11735
+ Copyright (c) 2011 Troy Goode <troygoode@gmail.com>
11736
+
11737
+ Permission is hereby granted, free of charge, to any person obtaining a
11738
+ copy of this software and associated documentation files (the
11739
+ "Software"), to deal in the Software without restriction, including
11740
+ without limitation the rights to use, copy, modify, merge, publish,
11741
+ distribute, sublicense, and/or sell copies of the Software, and to
11742
+ permit persons to whom the Software is furnished to do so, subject to
11743
+ the following conditions:
11744
+
11745
+ The above copyright notice and this permission notice shall be included
11746
+ in all copies or substantial portions of the Software.
11747
+
11748
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11749
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11750
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
11751
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
11752
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
11753
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
11754
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11755
+
11466
11756
  ==============================================================================
11467
11757
  Components: robust-predicates@3.0.3
11468
11758
  Source files: node_modules/robust-predicates/LICENSE
@@ -11946,6 +12236,24 @@ The above copyright notice and this permission notice shall be included in all c
11946
12236
 
11947
12237
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11948
12238
 
12239
+ ==============================================================================
12240
+ Components: which-module@2.0.1
12241
+ Source files: node_modules/which-module/LICENSE
12242
+ ==============================================================================
12243
+ Copyright (c) 2016, Contributors
12244
+
12245
+ Permission to use, copy, modify, and/or distribute this software for any purpose
12246
+ with or without fee is hereby granted, provided that the above copyright notice
12247
+ and this permission notice appear in all copies.
12248
+
12249
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12250
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
12251
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12252
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
12253
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
12254
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
12255
+ THIS SOFTWARE.
12256
+
11949
12257
  ==============================================================================
11950
12258
  Components: zod@3.25.76
11951
12259
  Source files: node_modules/zod/LICENSE
@@ -39,7 +39,7 @@ var ExportDialog = lazy(
39
39
  () => import("./ExportDialog-VBWHFJ2R.js").then((module) => ({ default: module.ExportDialog }))
40
40
  );
41
41
  var ShareDialog = lazy(
42
- () => import("./ShareDialog-PAMOQQFB.js").then((module) => ({ default: module.ShareDialog }))
42
+ () => import("./ShareDialog-4OX3UPJ4.js").then((module) => ({ default: module.ShareDialog }))
43
43
  );
44
44
  var runExportModulePromise = null;
45
45
  function loadRunExportModule() {
@@ -7,7 +7,7 @@ import {
7
7
  SHARED_DOCUMENT_LIMITS,
8
8
  createSharedDocumentUrl
9
9
  } from "@bendyline/docblocks/share";
10
- var PUBLIC_DOCBLOCKS_SHARE_URL = "https://bendyline.github.io/docblocks/";
10
+ var PUBLIC_DOCBLOCKS_SHARE_URL = "https://docblocks.com/";
11
11
  function resolveSharedDocumentBaseUrl(currentUrl) {
12
12
  try {
13
13
  const current = new URL(currentUrl);
@@ -45,6 +45,45 @@ async function createSharedDocumentArchive(markdown, selectedFile) {
45
45
  function buildSharedDocumentUrl(baseUrl, archive, mode) {
46
46
  return createSharedDocumentUrl(resolveSharedDocumentBaseUrl(baseUrl), archive, mode);
47
47
  }
48
+ function buildSharedDocumentQrUrl(archive, mode) {
49
+ const url = createSharedDocumentUrl(PUBLIC_DOCBLOCKS_SHARE_URL, archive, mode);
50
+ if (url.length > SHARED_DOCUMENT_LIMITS.qrUrlCharacters) {
51
+ throw new Error(
52
+ "This document is too large for a reliable QR code (maximum " + SHARED_DOCUMENT_LIMITS.qrUrlCharacters.toLocaleString() + " URL characters). Copy the share link instead."
53
+ );
54
+ }
55
+ return url;
56
+ }
57
+ function sharedDocumentQrFilename(selectedFile) {
58
+ return sharedDocumentFilename(selectedFile).replace(/\.md$/iu, "-qr.png");
59
+ }
60
+
61
+ // src/Export/share-qr.ts
62
+ import QRCode from "qrcode";
63
+ async function renderSharedDocumentQrPng(url) {
64
+ return QRCode.toDataURL(url, {
65
+ type: "image/png",
66
+ errorCorrectionLevel: "M",
67
+ margin: 4,
68
+ width: 1024,
69
+ color: {
70
+ dark: "#111111ff",
71
+ light: "#ffffffff"
72
+ }
73
+ });
74
+ }
75
+ function qrPngDataUrlToBlob(dataUrl) {
76
+ const prefix = "data:image/png;base64,";
77
+ if (!dataUrl.startsWith(prefix)) {
78
+ throw new Error("The QR code renderer returned an unsupported image format.");
79
+ }
80
+ const binary = atob(dataUrl.slice(prefix.length));
81
+ const bytes = new Uint8Array(binary.length);
82
+ for (let index = 0; index < binary.length; index += 1) {
83
+ bytes[index] = binary.charCodeAt(index);
84
+ }
85
+ return new Blob([bytes], { type: "image/png" });
86
+ }
48
87
 
49
88
  // src/Export/ShareDialog.tsx
50
89
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -56,11 +95,19 @@ var MODES = [
56
95
  { value: "document", label: "Document" },
57
96
  { value: "narrate", label: "Narrate" }
58
97
  ];
59
- function ShareDialog({ markdown, selectedFile, baseUrl, onClose }) {
98
+ function ShareDialog({
99
+ markdown,
100
+ selectedFile,
101
+ baseUrl,
102
+ onClose
103
+ }) {
60
104
  const [mode, setMode] = useState("");
61
105
  const [archive, setArchive] = useState(null);
62
106
  const [archiveError, setArchiveError] = useState(null);
63
107
  const [copyStatus, setCopyStatus] = useState("idle");
108
+ const [qrDataUrl, setQrDataUrl] = useState(null);
109
+ const [qrRenderError, setQrRenderError] = useState(null);
110
+ const [qrCopyStatus, setQrCopyStatus] = useState("idle");
64
111
  const linkRef = useRef(null);
65
112
  useEffect(() => {
66
113
  let cancelled = false;
@@ -90,6 +137,36 @@ function ShareDialog({ markdown, selectedFile, baseUrl, onClose }) {
90
137
  };
91
138
  }
92
139
  }, [archive, archiveError, baseUrl, mode]);
140
+ const qrLinkResult = useMemo(() => {
141
+ if (!archive) return { url: "", error: archiveError };
142
+ try {
143
+ return { url: buildSharedDocumentQrUrl(archive, mode || null), error: null };
144
+ } catch (error) {
145
+ return {
146
+ url: "",
147
+ error: error instanceof Error ? error.message : "DocBlocks could not create the QR code."
148
+ };
149
+ }
150
+ }, [archive, archiveError, mode]);
151
+ useEffect(() => {
152
+ let cancelled = false;
153
+ setQrDataUrl(null);
154
+ setQrRenderError(null);
155
+ setQrCopyStatus("idle");
156
+ if (!qrLinkResult.url) return;
157
+ void renderSharedDocumentQrPng(qrLinkResult.url).then((dataUrl) => {
158
+ if (!cancelled) setQrDataUrl(dataUrl);
159
+ }).catch((error) => {
160
+ if (!cancelled) {
161
+ setQrRenderError(
162
+ error instanceof Error ? error.message : "DocBlocks could not render the QR code."
163
+ );
164
+ }
165
+ });
166
+ return () => {
167
+ cancelled = true;
168
+ };
169
+ }, [qrLinkResult.url]);
93
170
  useEffect(() => setCopyStatus("idle"), [linkResult.url]);
94
171
  useEffect(() => {
95
172
  const handleKeyDown = (event) => {
@@ -117,7 +194,31 @@ function ShareDialog({ markdown, selectedFile, baseUrl, onClose }) {
117
194
  setCopyStatus("failed");
118
195
  }
119
196
  }, [linkResult.url]);
197
+ const copyQrImage = useCallback(async () => {
198
+ if (!qrDataUrl) return;
199
+ try {
200
+ if (!navigator.clipboard?.write || typeof ClipboardItem === "undefined") {
201
+ throw new Error("Image clipboard access is unavailable.");
202
+ }
203
+ const png = qrPngDataUrlToBlob(qrDataUrl);
204
+ await navigator.clipboard.write([new ClipboardItem({ "image/png": png })]);
205
+ setQrCopyStatus("copied");
206
+ } catch {
207
+ setQrCopyStatus("failed");
208
+ }
209
+ }, [qrDataUrl]);
210
+ const saveQrImage = useCallback(() => {
211
+ if (!qrDataUrl) return;
212
+ const download = document.createElement("a");
213
+ download.href = qrDataUrl;
214
+ download.download = sharedDocumentQrFilename(selectedFile);
215
+ download.style.display = "none";
216
+ document.body.append(download);
217
+ download.click();
218
+ download.remove();
219
+ }, [qrDataUrl, selectedFile]);
120
220
  const isLong = linkResult.url.length > SHARED_DOCUMENT_LIMITS2.portableUrlCharacters;
221
+ const qrError = qrLinkResult.error ?? qrRenderError;
121
222
  return /* @__PURE__ */ jsx(
122
223
  "div",
123
224
  {
@@ -134,7 +235,7 @@ function ShareDialog({ markdown, selectedFile, baseUrl, onClose }) {
134
235
  "aria-labelledby": "db-share-dialog-title",
135
236
  children: [
136
237
  /* @__PURE__ */ jsxs("div", { className: "db-dialog-header", children: [
137
- /* @__PURE__ */ jsx("h2", { className: "db-dialog-title", id: "db-share-dialog-title", children: "Share document via URL" }),
238
+ /* @__PURE__ */ jsx("h2", { className: "db-dialog-title", id: "db-share-dialog-title", children: "Share document" }),
138
239
  /* @__PURE__ */ jsx("button", { className: "db-dialog-close", type: "button", onClick: onClose, "aria-label": "Close", children: "\xD7" })
139
240
  ] }),
140
241
  /* @__PURE__ */ jsxs("div", { className: "db-dialog-body", children: [
@@ -178,6 +279,52 @@ function ShareDialog({ markdown, selectedFile, baseUrl, onClose }) {
178
279
  }
179
280
  )
180
281
  ] }),
282
+ /* @__PURE__ */ jsxs("section", { className: "db-share-qr", "aria-labelledby": "db-share-qr-title", children: [
283
+ /* @__PURE__ */ jsxs("div", { className: "db-share-qr-heading", children: [
284
+ /* @__PURE__ */ jsxs("div", { children: [
285
+ /* @__PURE__ */ jsx("h3", { id: "db-share-qr-title", children: "QR code" }),
286
+ /* @__PURE__ */ jsx("span", { className: "db-export-hint", children: "A self-contained docblocks.com link. No document content is uploaded." })
287
+ ] }),
288
+ /* @__PURE__ */ jsxs("div", { className: "db-share-qr-actions", children: [
289
+ /* @__PURE__ */ jsx(
290
+ "button",
291
+ {
292
+ className: "db-export-btn db-export-btn--secondary",
293
+ type: "button",
294
+ onClick: () => void copyQrImage(),
295
+ disabled: !qrDataUrl,
296
+ children: qrCopyStatus === "copied" ? "Copied QR" : qrCopyStatus === "failed" ? "Copy unavailable" : "Copy QR image"
297
+ }
298
+ ),
299
+ /* @__PURE__ */ jsx(
300
+ "button",
301
+ {
302
+ className: "db-export-btn db-export-btn--secondary",
303
+ type: "button",
304
+ onClick: saveQrImage,
305
+ disabled: !qrDataUrl,
306
+ children: "Save QR PNG"
307
+ }
308
+ )
309
+ ] })
310
+ ] }),
311
+ qrDataUrl ? /* @__PURE__ */ jsx(
312
+ "img",
313
+ {
314
+ className: "db-share-qr-image",
315
+ src: qrDataUrl,
316
+ alt: "QR code for this shared DocBlocks document"
317
+ }
318
+ ) : /* @__PURE__ */ jsx(
319
+ "div",
320
+ {
321
+ className: `db-share-qr-placeholder${qrError ? " db-share-qr-placeholder--error" : ""}`,
322
+ role: qrError ? "note" : "status",
323
+ children: qrError ?? "Rendering QR code..."
324
+ }
325
+ ),
326
+ /* @__PURE__ */ jsx("span", { className: "db-export-hint db-share-qr-status", "aria-live": "polite", children: qrCopyStatus === "failed" ? "This browser could not copy the PNG. Save it instead." : qrDataUrl ? `${qrLinkResult.url.length.toLocaleString()} of ${SHARED_DOCUMENT_LIMITS2.qrUrlCharacters.toLocaleString()} supported QR characters.` : "" })
327
+ ] }),
181
328
  /* @__PURE__ */ jsx("p", { className: "db-share-temporary-note", children: "Opening the link creates a temporary workspace. Changes there do not alter this document or the link." })
182
329
  ] }),
183
330
  /* @__PURE__ */ jsxs("div", { className: "db-export-footer", children: [
package/dist/index.d.ts CHANGED
@@ -146,6 +146,8 @@ interface FileExplorerProps {
146
146
  onTogglePin?: (path: string) => void | Promise<void>;
147
147
  /** Called when any entry is selected (file or directory). */
148
148
  onSelect?: (path: string, kind: 'file' | 'directory') => void;
149
+ /** Opens the active native workspace root in the platform file manager. */
150
+ onOpenWorkspaceFolder?: () => void;
149
151
  /** Host-owned context actions for an entry. */
150
152
  actionsForEntry?: (entry: FileSystemEntry) => readonly FileTreeNodeAction[];
151
153
  /**
@@ -170,7 +172,7 @@ interface FileExplorerProps {
170
172
  /** Optional className for the root element. */
171
173
  className?: string;
172
174
  }
173
- declare function FileExplorer({ provider, metadataRefreshKey, activeFilePath, sortMode, onSortModeChange, activeWorkspaceId, pinnedDocuments, pinnedPaths, onPinnedDocumentSelect, onPinnedDocumentUnpin, onPinnedDocumentRename, onPinnedDocumentDelete, onTogglePin, onSelect, actionsForEntry, onTreeMutation, onTreeChange, onImportFiles, confirmDelete, moveDestinations, onMoveToWorkspace, className, }: FileExplorerProps): react_jsx_runtime.JSX.Element;
175
+ declare function FileExplorer({ provider, metadataRefreshKey, activeFilePath, sortMode, onSortModeChange, activeWorkspaceId, pinnedDocuments, pinnedPaths, onPinnedDocumentSelect, onPinnedDocumentUnpin, onPinnedDocumentRename, onPinnedDocumentDelete, onTogglePin, onSelect, onOpenWorkspaceFolder, actionsForEntry, onTreeMutation, onTreeChange, onImportFiles, confirmDelete, moveDestinations, onMoveToWorkspace, className, }: FileExplorerProps): react_jsx_runtime.JSX.Element;
174
176
 
175
177
  /**
176
178
  * useFileTree — hook that reads from a FileSystemProvider,
package/dist/index.js CHANGED
@@ -98,6 +98,22 @@ function equivalentPathKeys(path) {
98
98
  function hasEquivalentPath(paths, path) {
99
99
  return equivalentPathKeys(path).some((candidate) => paths.has(candidate));
100
100
  }
101
+ function sameEntry(left, right) {
102
+ if (left.kind !== right.kind || left.name !== right.name || left.path !== right.path)
103
+ return false;
104
+ if (left.kind === "file" && right.kind === "file") {
105
+ return left.lastModified === right.lastModified;
106
+ }
107
+ return true;
108
+ }
109
+ function reconcileEntries(current, incoming) {
110
+ const currentByPath = new Map(current.map((entry) => [entry.path, entry]));
111
+ const reconciled = incoming.map((entry) => {
112
+ const previous = currentByPath.get(entry.path);
113
+ return previous && sameEntry(previous, entry) ? previous : entry;
114
+ });
115
+ return reconciled.length === current.length && reconciled.every((entry, index) => entry === current[index]) ? current : reconciled;
116
+ }
101
117
  async function readProviderDirectory(provider, path) {
102
118
  const canonical = parseWorkspacePath(path);
103
119
  const readOnce = async () => {
@@ -173,7 +189,7 @@ function useFileTree(provider, metadataRefreshKey, metadataRefreshPath) {
173
189
  try {
174
190
  const root = await readProviderDirectory(sourceProvider, "");
175
191
  if (!isCurrent()) return;
176
- setEntries(root);
192
+ setEntries((current) => reconcileEntries(current, root));
177
193
  setRootIssue(null);
178
194
  } catch (caught) {
179
195
  if (isCurrent()) setRootIssue(readIssue(caught, ""));
@@ -192,8 +208,11 @@ function useFileTree(provider, metadataRefreshKey, metadataRefreshPath) {
192
208
  const children = await readProviderDirectory(sourceProvider, dirPath);
193
209
  if (!isCurrent()) return;
194
210
  setChildEntries((prev) => {
211
+ const current = prev.get(canonical) ?? [];
212
+ const reconciled = reconcileEntries(current, children);
213
+ if (prev.has(canonical) && reconciled === current) return prev;
195
214
  const next = new Map(prev);
196
- next.set(canonical, children);
215
+ next.set(canonical, reconciled);
197
216
  return next;
198
217
  });
199
218
  setChildIssues((prev) => {
@@ -260,7 +279,7 @@ function useFileTree(provider, metadataRefreshKey, metadataRefreshPath) {
260
279
  [loadChildren]
261
280
  );
262
281
  const refresh = useCallback(async () => {
263
- await loadRoot();
282
+ await loadRoot(false);
264
283
  const expandedPaths = [...expanded];
265
284
  for (const dirPath of expandedPaths) {
266
285
  await loadChildren(dirPath);
@@ -334,18 +353,21 @@ function useFileTree(provider, metadataRefreshKey, metadataRefreshPath) {
334
353
  directoriesToRefresh.clear();
335
354
  drainRefreshes();
336
355
  };
337
- const requestMetadataRefresh = (path) => {
356
+ const requestDirectoryRefresh = (path) => {
338
357
  if (disposed || fullRefreshRequested) return;
339
358
  directoriesToRefresh.add(workspacePathDirname(parseWorkspacePath(path)));
340
359
  drainRefreshes();
341
360
  };
342
361
  const subscription = providerV2.watch(
343
362
  (event) => {
344
- if (event.type === "modified") {
345
- requestMetadataRefresh(event.path);
346
- return;
363
+ if (event.type !== "overflow") {
364
+ requestDirectoryRefresh(event.path);
365
+ if (event.type === "moved" && event.destinationPath !== null) {
366
+ requestDirectoryRefresh(event.destinationPath);
367
+ }
368
+ } else {
369
+ requestRefresh();
347
370
  }
348
- requestRefresh();
349
371
  },
350
372
  {
351
373
  onError: (caught) => {
@@ -499,6 +521,9 @@ function NewFileIcon() {
499
521
  function NewFolderIcon() {
500
522
  return /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: "fa-solid fa-folder-plus" });
501
523
  }
524
+ function OpenFolderIcon() {
525
+ return /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: "fa-solid fa-folder-open" });
526
+ }
502
527
  function SortByNameIcon() {
503
528
  return /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: "fa-solid fa-arrow-down-a-z" });
504
529
  }
@@ -1657,6 +1682,7 @@ function FileExplorer({
1657
1682
  onPinnedDocumentDelete,
1658
1683
  onTogglePin,
1659
1684
  onSelect,
1685
+ onOpenWorkspaceFolder,
1660
1686
  actionsForEntry,
1661
1687
  onTreeMutation,
1662
1688
  onTreeChange,
@@ -2136,6 +2162,17 @@ function FileExplorer({
2136
2162
  )
2137
2163
  ] }),
2138
2164
  /* @__PURE__ */ jsx5("span", { className: "db-explorer-action-divider", "aria-hidden": "true" }),
2165
+ onOpenWorkspaceFolder && /* @__PURE__ */ jsx5(
2166
+ "button",
2167
+ {
2168
+ type: "button",
2169
+ className: "db-explorer-btn",
2170
+ onClick: onOpenWorkspaceFolder,
2171
+ title: "Open this folder",
2172
+ "aria-label": "Open this folder",
2173
+ children: /* @__PURE__ */ jsx5(OpenFolderIcon, {})
2174
+ }
2175
+ ),
2139
2176
  /* @__PURE__ */ jsx5(
2140
2177
  "button",
2141
2178
  {
@@ -3199,7 +3236,7 @@ function useDocumentSession(autoSaveDelayMs = 500) {
3199
3236
  import { lazy, Suspense } from "react";
3200
3237
  import { jsx as jsx10 } from "react/jsx-runtime";
3201
3238
  var ExportToolbarControlsImplementation = lazy(
3202
- () => import("./ExportToolbarControls-N3TCL5DD.js").then((module) => ({
3239
+ () => import("./ExportToolbarControls-BUVJCSMV.js").then((module) => ({
3203
3240
  default: module.ExportToolbarControls
3204
3241
  }))
3205
3242
  );
@@ -4980,6 +5017,21 @@ async function copyTransientWorkspaceContents(source, destination) {
4980
5017
  }
4981
5018
  }
4982
5019
 
5020
+ // src/DocBlocksShell/native-file-actions.ts
5021
+ function createNativeFileActions(entry, workspaceId, host) {
5022
+ if (entry.kind !== "file" || workspaceId === null || host === null) return [];
5023
+ return [
5024
+ {
5025
+ label: "Open containing folder",
5026
+ onSelect: () => host.shell.revealInFolder(workspaceId, entry.path)
5027
+ },
5028
+ {
5029
+ label: "Copy full path",
5030
+ onSelect: () => host.clipboard.writeWorkspacePath(workspaceId, entry.path)
5031
+ }
5032
+ ];
5033
+ }
5034
+
4983
5035
  // src/DocBlocksShell/welcome-document.ts
4984
5036
  var WELCOME_DOCUMENT_PATH = "/aboutDocBlocks.md";
4985
5037
  var WELCOME_DOCUMENT_CONTENT = [
@@ -5670,8 +5722,8 @@ function DocBlocksShell({
5670
5722
  cancelled = true;
5671
5723
  };
5672
5724
  }, [activeWorkspaceDescriptor]);
5673
- const gitWorkspaceId = provider && activeWorkspaceDescriptor?.id === activeWorkspaceId && provider.id === activeWorkspaceId && activeWorkspaceDescriptor.type === "electron-native" ? activeWorkspaceDescriptor.id : null;
5674
- const git = useGit(provider, gitWorkspaceId, resolvedTheme);
5725
+ const nativeWorkspaceId = provider && activeWorkspaceDescriptor?.id === activeWorkspaceId && provider.id === activeWorkspaceId && activeWorkspaceDescriptor.type === "electron-native" ? activeWorkspaceDescriptor.id : null;
5726
+ const git = useGit(provider, nativeWorkspaceId, resolvedTheme);
5675
5727
  const gitRef = useRef15(git);
5676
5728
  gitRef.current = git;
5677
5729
  const { scheduleRefresh: gitScheduleRefresh } = git;
@@ -7285,6 +7337,15 @@ function DocBlocksShell({
7285
7337
  await getDocBlocksHost().shell.revealInFolder(ws.id);
7286
7338
  }
7287
7339
  }, [activeWorkspaceId]);
7340
+ const handleOpenWorkspaceFolder = useCallback15(() => {
7341
+ if (!isElectronHost3() || !nativeWorkspaceId) return;
7342
+ void getDocBlocksHost().shell.openWorkspaceFolder(nativeWorkspaceId).catch((error) => {
7343
+ showToast(
7344
+ "error",
7345
+ error instanceof Error ? error.message : "Could not open this workspace folder."
7346
+ );
7347
+ });
7348
+ }, [nativeWorkspaceId, showToast]);
7288
7349
  useEffect15(() => {
7289
7350
  if (!isElectronHost3()) return;
7290
7351
  const host = getDocBlocksHost();
@@ -7481,6 +7542,13 @@ function DocBlocksShell({
7481
7542
  },
7482
7543
  [handleEnableOutsideInEditing, selectedFile, selectedOutsideInEditingEnabled]
7483
7544
  );
7545
+ const actionsForEntry = useCallback15(
7546
+ (entry) => {
7547
+ const nativeActions = isElectronHost3() ? createNativeFileActions(entry, nativeWorkspaceId, getDocBlocksHost()) : [];
7548
+ return [...nativeActions, ...outsideInActionsForEntry(entry)];
7549
+ },
7550
+ [nativeWorkspaceId, outsideInActionsForEntry]
7551
+ );
7484
7552
  const handleEditorLinkClick = useCallback15(
7485
7553
  (href) => {
7486
7554
  const target = resolveShellEditorLinkTarget(href, selectedSourceFile ?? selectedFile);
@@ -8431,7 +8499,8 @@ function DocBlocksShell({
8431
8499
  onPinnedDocumentDelete: handlePinnedDocumentDelete,
8432
8500
  onTogglePin: handleTogglePin,
8433
8501
  onSelect: handleSelect,
8434
- actionsForEntry: outsideInActionsForEntry,
8502
+ onOpenWorkspaceFolder: isElectronHost3() && nativeWorkspaceId ? handleOpenWorkspaceFolder : void 0,
8503
+ actionsForEntry,
8435
8504
  onTreeMutation: handleTreeMutation,
8436
8505
  onTreeChange: handleTreeChange,
8437
8506
  onImportFiles: handleImportFiles,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/docblocks-react",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "React components for DocBlocks — file explorer, workspace picker, and editor shell",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -75,16 +75,18 @@
75
75
  }
76
76
  },
77
77
  "dependencies": {
78
- "@bendyline/docblocks": "2.4.0",
79
- "@bendyline/squisq": "2.8.0",
80
- "@bendyline/squisq-editor-react": "2.8.0",
81
- "@bendyline/squisq-formats": "2.4.5",
82
- "@bendyline/squisq-react": "2.8.0",
83
- "@bendyline/squisq-video": "2.3.0",
84
- "@bendyline/squisq-video-react": "2.4.0"
78
+ "@bendyline/docblocks": "2.5.0",
79
+ "@bendyline/squisq": "2.9.0",
80
+ "@bendyline/squisq-editor-react": "2.9.0",
81
+ "@bendyline/squisq-formats": "2.4.6",
82
+ "@bendyline/squisq-react": "2.9.0",
83
+ "@bendyline/squisq-video": "2.3.1",
84
+ "@bendyline/squisq-video-react": "2.4.1",
85
+ "qrcode": "1.5.4"
85
86
  },
86
87
  "devDependencies": {
87
88
  "@happy-dom/global-registrator": "20.9.0",
89
+ "@types/qrcode": "1.5.6",
88
90
  "@types/react": "18.3.28",
89
91
  "@types/react-dom": "18.3.7",
90
92
  "happy-dom": "20.9.0",
@@ -2743,7 +2743,7 @@ body.db-resizing-sidebar * {
2743
2743
  /* Shared-document links intentionally resemble export because they package a
2744
2744
  bounded Markdown-only DBK; the warning is the critical distinction. */
2745
2745
  .db-share-dialog {
2746
- width: 480px;
2746
+ width: 560px;
2747
2747
  }
2748
2748
 
2749
2749
  .db-share-warning {
@@ -2783,10 +2783,88 @@ body.db-resizing-sidebar * {
2783
2783
  color: var(--db-danger, #a33a35);
2784
2784
  }
2785
2785
 
2786
+ .db-share-qr {
2787
+ margin: 18px 0 14px;
2788
+ padding-top: 16px;
2789
+ border-top: 1px solid var(--db-border);
2790
+ }
2791
+
2792
+ .db-share-qr-heading {
2793
+ display: flex;
2794
+ align-items: flex-start;
2795
+ justify-content: space-between;
2796
+ gap: 12px;
2797
+ }
2798
+
2799
+ .db-share-qr-heading h3 {
2800
+ margin: 0;
2801
+ color: var(--db-text);
2802
+ font-size: 14px;
2803
+ line-height: 1.4;
2804
+ }
2805
+
2806
+ .db-share-qr-actions {
2807
+ display: flex;
2808
+ flex-shrink: 0;
2809
+ flex-wrap: wrap;
2810
+ justify-content: flex-end;
2811
+ gap: 8px;
2812
+ }
2813
+
2814
+ .db-share-qr-image {
2815
+ display: block;
2816
+ box-sizing: border-box;
2817
+ width: min(100%, 360px);
2818
+ height: auto;
2819
+ margin: 14px auto 0;
2820
+ image-rendering: pixelated;
2821
+ background: #fff;
2822
+ border: 1px solid var(--db-border);
2823
+ border-radius: 4px;
2824
+ }
2825
+
2826
+ .db-share-qr-placeholder {
2827
+ display: flex;
2828
+ align-items: center;
2829
+ justify-content: center;
2830
+ box-sizing: border-box;
2831
+ min-height: 120px;
2832
+ margin-top: 14px;
2833
+ padding: 18px;
2834
+ color: var(--db-text-muted);
2835
+ text-align: center;
2836
+ background: var(--db-bg-subtle);
2837
+ border: 1px dashed var(--db-border);
2838
+ border-radius: 4px;
2839
+ }
2840
+
2841
+ .db-share-qr-placeholder--error {
2842
+ color: var(--db-danger, #a33a35);
2843
+ border-color: currentColor;
2844
+ }
2845
+
2846
+ .db-share-qr-status {
2847
+ display: block;
2848
+ min-height: 1.4em;
2849
+ margin-top: 6px;
2850
+ text-align: center;
2851
+ }
2852
+
2786
2853
  .db-share-temporary-note {
2787
2854
  color: var(--db-text-muted);
2788
2855
  }
2789
2856
 
2857
+ @media (max-width: 560px) {
2858
+ .db-share-qr-heading {
2859
+ display: block;
2860
+ }
2861
+
2862
+ .db-share-qr-actions {
2863
+ justify-content: flex-start;
2864
+ margin-top: 10px;
2865
+ }
2866
+ }
2867
+
2790
2868
  /* ── Squisq editor chrome separators ─────────────────────────── */
2791
2869
  /* Strengthen the dividers so the toolbar, tabs, and editor body
2792
2870
  read as three distinct zones instead of near-identical whites. */