@particle-academy/react-fancy 5.71.3 → 5.72.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 (58) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/button.cjs +3 -3
  3. package/dist/button.js +1 -1
  4. package/dist/chat-thread.cjs +5 -5
  5. package/dist/chat-thread.js +3 -3
  6. package/dist/{chunk-FJJ3GMXI.js → chunk-2MDU3W7E.js} +3 -3
  7. package/dist/{chunk-FJJ3GMXI.js.map → chunk-2MDU3W7E.js.map} +1 -1
  8. package/dist/{chunk-VV5435PS.js → chunk-3KF3OYWS.js} +28 -5
  9. package/dist/chunk-3KF3OYWS.js.map +1 -0
  10. package/dist/{chunk-7PUTP2N7.cjs → chunk-5WVEW3Q5.cjs} +10 -10
  11. package/dist/chunk-5WVEW3Q5.cjs.map +1 -0
  12. package/dist/{chunk-7OKF6M32.cjs → chunk-7DSHA4CL.cjs} +15 -15
  13. package/dist/{chunk-7OKF6M32.cjs.map → chunk-7DSHA4CL.cjs.map} +1 -1
  14. package/dist/{chunk-JGEFIWDA.cjs → chunk-A5CACIHR.cjs} +9 -9
  15. package/dist/{chunk-JGEFIWDA.cjs.map → chunk-A5CACIHR.cjs.map} +1 -1
  16. package/dist/{chunk-CINWSRA2.js → chunk-B6AIHYOP.js} +3 -3
  17. package/dist/{chunk-CINWSRA2.js.map → chunk-B6AIHYOP.js.map} +1 -1
  18. package/dist/{chunk-MPUR2ZLF.cjs → chunk-C2LVHAIG.cjs} +6 -6
  19. package/dist/{chunk-MPUR2ZLF.cjs.map → chunk-C2LVHAIG.cjs.map} +1 -1
  20. package/dist/{chunk-FUMX6TYZ.js → chunk-EWE4TOG7.js} +3 -3
  21. package/dist/{chunk-FUMX6TYZ.js.map → chunk-EWE4TOG7.js.map} +1 -1
  22. package/dist/{chunk-2KQVBD7K.cjs → chunk-FBGCSGCE.cjs} +28 -4
  23. package/dist/chunk-FBGCSGCE.cjs.map +1 -0
  24. package/dist/{chunk-WFEX7DAR.js → chunk-GUCUYDFB.js} +5 -5
  25. package/dist/chunk-GUCUYDFB.js.map +1 -0
  26. package/dist/{chunk-EEKIVROJ.cjs → chunk-KDISJ64Q.cjs} +4 -4
  27. package/dist/{chunk-EEKIVROJ.cjs.map → chunk-KDISJ64Q.cjs.map} +1 -1
  28. package/dist/{chunk-BL6HCIP4.cjs → chunk-L6TFJIFB.cjs} +12 -12
  29. package/dist/{chunk-BL6HCIP4.cjs.map → chunk-L6TFJIFB.cjs.map} +1 -1
  30. package/dist/{chunk-AWIUXZTG.cjs → chunk-NWB6YCZY.cjs} +4 -4
  31. package/dist/{chunk-AWIUXZTG.cjs.map → chunk-NWB6YCZY.cjs.map} +1 -1
  32. package/dist/{chunk-R2MFCR7H.js → chunk-QIH7DDRO.js} +3 -3
  33. package/dist/{chunk-R2MFCR7H.js.map → chunk-QIH7DDRO.js.map} +1 -1
  34. package/dist/{chunk-7T7L5IK5.js → chunk-TW52N55D.js} +3 -3
  35. package/dist/{chunk-7T7L5IK5.js.map → chunk-TW52N55D.js.map} +1 -1
  36. package/dist/{chunk-HTPMFADD.js → chunk-VIQEWB6M.js} +4 -4
  37. package/dist/{chunk-HTPMFADD.js.map → chunk-VIQEWB6M.js.map} +1 -1
  38. package/dist/content-renderer.cjs +5 -5
  39. package/dist/content-renderer.js +2 -2
  40. package/dist/editor.cjs +5 -5
  41. package/dist/editor.js +3 -3
  42. package/dist/index.cjs +40 -40
  43. package/dist/index.d.cts +5 -3
  44. package/dist/index.d.ts +5 -3
  45. package/dist/index.js +8 -8
  46. package/dist/json-editor.cjs +13 -13
  47. package/dist/json-editor.js +2 -2
  48. package/dist/magic-wand.cjs +3 -3
  49. package/dist/magic-wand.js +2 -2
  50. package/dist/prompt-input.cjs +5 -5
  51. package/dist/prompt-input.js +2 -2
  52. package/dist/reason-tag.cjs +3 -3
  53. package/dist/reason-tag.js +2 -2
  54. package/package.json +1 -1
  55. package/dist/chunk-2KQVBD7K.cjs.map +0 -1
  56. package/dist/chunk-7PUTP2N7.cjs.map +0 -1
  57. package/dist/chunk-VV5435PS.js.map +0 -1
  58. package/dist/chunk-WFEX7DAR.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -11,6 +11,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [5.72.0] - 2026-11-01
15
+
16
+ ### Added
17
+
18
+ - **`blob:` hrefs are accepted** (reported by Genie). A `URL.createObjectURL`
19
+ URL for an in-memory file was refused by `sanitizeHref` without a word, so
20
+ `<Button href="blob:...">` rendered a plain `<button>` and the link was
21
+ dead. `blob:` is accepted in the form a browser mints it,
22
+ `blob:<origin>/<id>` with an `http(s)://`, `null` or `file://` origin;
23
+ `blob:javascript:...`, `blob:data:...` and other wrappers stay refused. The
24
+ allow-list is shared, so this reaches every caller of it:
25
+ - `Button` (`href`, anchor mode)
26
+ - `ChatThread` / `ChatMessage` attachment links (`attachment.url`)
27
+ - `ContentRenderer` extension-tag attributes (`href`, `src`, `action`,
28
+ `formaction`, `xlink:href`)
29
+ - `sanitizeHtml` in its default (blocklist) mode, and so `ContentRenderer`,
30
+ `Editor` and `renderMarkdown` without `sanitize` options. Allowlist mode
31
+ (`sanitizeHtml(html, options)`) is unchanged: it keeps only the schemes
32
+ you list.
33
+ - the exported `sanitizeHref` itself
34
+ - **A development warning when a component drops an href.** `Button` and
35
+ `ChatMessage` now `console.warn` once per distinct href when a non-empty
36
+ href is refused, naming the component and the scheme and showing only a
37
+ short prefix of the URL. Nothing is logged in production
38
+ (`NODE_ENV === "production"`), for an empty or missing href, or when
39
+ sanitising content (markdown, HTML, extension tags), where refusing hostile
40
+ markup is the job rather than a mistake.
41
+
42
+ ### Security
43
+
44
+ - **`data:` remains refused, by decision**, for every media type and with or
45
+ without `download`: a navigable `data:text/html` is the risky case. Now
46
+ pinned by tests, together with `javascript:`, `vbscript:`, `file:` and the
47
+ obfuscated spellings (leading control characters, mixed case, whitespace
48
+ inside the scheme, entity and percent-encoded colons).
49
+
50
+ **Consumer action: none.** An href that was silently dropped now works if it
51
+ is `blob:`, and otherwise warns in development.
52
+
14
53
  ## [5.71.3] - 2026-11-01
15
54
 
16
55
  ### Fixed
package/dist/button.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  require('./chunk-M5MUGSON.cjs');
4
- var chunk2KQVBD7K_cjs = require('./chunk-2KQVBD7K.cjs');
4
+ var chunkFBGCSGCE_cjs = require('./chunk-FBGCSGCE.cjs');
5
5
  require('./chunk-XCZZVRBY.cjs');
6
6
  require('./chunk-MXWR3T3N.cjs');
7
7
  require('./chunk-ZU5Q77OT.cjs');
@@ -10,11 +10,11 @@ require('./chunk-ZU5Q77OT.cjs');
10
10
 
11
11
  Object.defineProperty(exports, "Action", {
12
12
  enumerable: true,
13
- get: function () { return chunk2KQVBD7K_cjs.Action; }
13
+ get: function () { return chunkFBGCSGCE_cjs.Action; }
14
14
  });
15
15
  Object.defineProperty(exports, "Button", {
16
16
  enumerable: true,
17
- get: function () { return chunk2KQVBD7K_cjs.Button; }
17
+ get: function () { return chunkFBGCSGCE_cjs.Button; }
18
18
  });
19
19
  //# sourceMappingURL=button.cjs.map
20
20
  //# sourceMappingURL=button.cjs.map
package/dist/button.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import './chunk-LQ4ICCN2.js';
2
- export { Action, Button } from './chunk-VV5435PS.js';
2
+ export { Action, Button } from './chunk-3KF3OYWS.js';
3
3
  import './chunk-45BBNJQD.js';
4
4
  import './chunk-J3A4Z2P7.js';
5
5
  import './chunk-MMW2JGKZ.js';
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var chunk7PUTP2N7_cjs = require('./chunk-7PUTP2N7.cjs');
3
+ var chunk5WVEW3Q5_cjs = require('./chunk-5WVEW3Q5.cjs');
4
4
  require('./chunk-S3TRSECD.cjs');
5
- require('./chunk-JGEFIWDA.cjs');
5
+ require('./chunk-A5CACIHR.cjs');
6
6
  require('./chunk-2C64OVOZ.cjs');
7
7
  require('./chunk-BJL3VDRK.cjs');
8
8
  require('./chunk-VBWRH4UW.cjs');
9
9
  require('./chunk-MOU6O324.cjs');
10
10
  require('./chunk-M5MUGSON.cjs');
11
- require('./chunk-2KQVBD7K.cjs');
11
+ require('./chunk-FBGCSGCE.cjs');
12
12
  require('./chunk-XCZZVRBY.cjs');
13
13
  require('./chunk-MXWR3T3N.cjs');
14
14
  require('./chunk-ZU5Q77OT.cjs');
@@ -17,11 +17,11 @@ require('./chunk-ZU5Q77OT.cjs');
17
17
 
18
18
  Object.defineProperty(exports, "ChatMessage", {
19
19
  enumerable: true,
20
- get: function () { return chunk7PUTP2N7_cjs.ChatMessage; }
20
+ get: function () { return chunk5WVEW3Q5_cjs.ChatMessage; }
21
21
  });
22
22
  Object.defineProperty(exports, "ChatThread", {
23
23
  enumerable: true,
24
- get: function () { return chunk7PUTP2N7_cjs.ChatThread; }
24
+ get: function () { return chunk5WVEW3Q5_cjs.ChatThread; }
25
25
  });
26
26
  //# sourceMappingURL=chat-thread.cjs.map
27
27
  //# sourceMappingURL=chat-thread.cjs.map
@@ -1,12 +1,12 @@
1
- export { ChatMessage, ChatThread } from './chunk-WFEX7DAR.js';
1
+ export { ChatMessage, ChatThread } from './chunk-GUCUYDFB.js';
2
2
  import './chunk-AUTW5O4W.js';
3
- import './chunk-FJJ3GMXI.js';
3
+ import './chunk-2MDU3W7E.js';
4
4
  import './chunk-I3LAFKJU.js';
5
5
  import './chunk-UZCR7DK5.js';
6
6
  import './chunk-IQ4KQJAO.js';
7
7
  import './chunk-6FCQD2KQ.js';
8
8
  import './chunk-LQ4ICCN2.js';
9
- import './chunk-VV5435PS.js';
9
+ import './chunk-3KF3OYWS.js';
10
10
  import './chunk-45BBNJQD.js';
11
11
  import './chunk-J3A4Z2P7.js';
12
12
  import './chunk-MMW2JGKZ.js';
@@ -1,5 +1,5 @@
1
1
  import { visuallyHidden } from './chunk-I3LAFKJU.js';
2
- import { sanitizeHtml, sanitizeHref, Button } from './chunk-VV5435PS.js';
2
+ import { sanitizeHtml, sanitizeHref, Button } from './chunk-3KF3OYWS.js';
3
3
  import { cn } from './chunk-MMW2JGKZ.js';
4
4
  import { marked } from 'marked';
5
5
  import { createContext, useMemo, useRef, useState, useCallback, useContext, useLayoutEffect, useEffect } from 'react';
@@ -1400,5 +1400,5 @@ function ContentRenderer({
1400
1400
  ContentRenderer.displayName = "ContentRenderer";
1401
1401
 
1402
1402
  export { ContentRenderer, detectFormat, extensionEditorClasses, htmlToMarkdown, markdownToEditorHtml, mergeExtensions, proseClasses, registerExtension, registerExtensions, renderMarkdown };
1403
- //# sourceMappingURL=chunk-FJJ3GMXI.js.map
1404
- //# sourceMappingURL=chunk-FJJ3GMXI.js.map
1403
+ //# sourceMappingURL=chunk-2MDU3W7E.js.map
1404
+ //# sourceMappingURL=chunk-2MDU3W7E.js.map