@particle-academy/react-fancy 5.71.2 → 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 +58 -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-NAYXNVNU.js → chunk-2MDU3W7E.js} +3 -3
  7. package/dist/{chunk-NAYXNVNU.js.map → chunk-2MDU3W7E.js.map} +1 -1
  8. package/dist/{chunk-OXERDFFF.js → chunk-3KF3OYWS.js} +34 -6
  9. package/dist/chunk-3KF3OYWS.js.map +1 -0
  10. package/dist/{chunk-5IE65DIH.cjs → chunk-5WVEW3Q5.cjs} +10 -10
  11. package/dist/chunk-5WVEW3Q5.cjs.map +1 -0
  12. package/dist/{chunk-FGOFG2UZ.cjs → chunk-7DSHA4CL.cjs} +15 -15
  13. package/dist/{chunk-FGOFG2UZ.cjs.map → chunk-7DSHA4CL.cjs.map} +1 -1
  14. package/dist/{chunk-R3EJNGJV.cjs → chunk-A5CACIHR.cjs} +9 -9
  15. package/dist/{chunk-R3EJNGJV.cjs.map → chunk-A5CACIHR.cjs.map} +1 -1
  16. package/dist/{chunk-WFR7HKJL.js → chunk-B6AIHYOP.js} +3 -3
  17. package/dist/{chunk-WFR7HKJL.js.map → chunk-B6AIHYOP.js.map} +1 -1
  18. package/dist/{chunk-PS7C6GKI.cjs → chunk-C2LVHAIG.cjs} +6 -6
  19. package/dist/{chunk-PS7C6GKI.cjs.map → chunk-C2LVHAIG.cjs.map} +1 -1
  20. package/dist/{chunk-BL5IKSB3.js → chunk-EWE4TOG7.js} +3 -3
  21. package/dist/{chunk-BL5IKSB3.js.map → chunk-EWE4TOG7.js.map} +1 -1
  22. package/dist/{chunk-3U7PUZLI.cjs → chunk-FBGCSGCE.cjs} +34 -5
  23. package/dist/chunk-FBGCSGCE.cjs.map +1 -0
  24. package/dist/{chunk-UWYSJARZ.js → chunk-GUCUYDFB.js} +5 -5
  25. package/dist/chunk-GUCUYDFB.js.map +1 -0
  26. package/dist/{chunk-RALJMI7C.cjs → chunk-KDISJ64Q.cjs} +4 -4
  27. package/dist/{chunk-RALJMI7C.cjs.map → chunk-KDISJ64Q.cjs.map} +1 -1
  28. package/dist/{chunk-5YRSYS2F.cjs → chunk-L6TFJIFB.cjs} +12 -12
  29. package/dist/{chunk-5YRSYS2F.cjs.map → chunk-L6TFJIFB.cjs.map} +1 -1
  30. package/dist/{chunk-S3NB6LDV.cjs → chunk-NWB6YCZY.cjs} +4 -4
  31. package/dist/{chunk-S3NB6LDV.cjs.map → chunk-NWB6YCZY.cjs.map} +1 -1
  32. package/dist/{chunk-OPDHSOUN.js → chunk-QIH7DDRO.js} +3 -3
  33. package/dist/{chunk-OPDHSOUN.js.map → chunk-QIH7DDRO.js.map} +1 -1
  34. package/dist/{chunk-FYUEDPST.js → chunk-TW52N55D.js} +3 -3
  35. package/dist/{chunk-FYUEDPST.js.map → chunk-TW52N55D.js.map} +1 -1
  36. package/dist/{chunk-F4GMOMUT.js → chunk-VIQEWB6M.js} +4 -4
  37. package/dist/{chunk-F4GMOMUT.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-3U7PUZLI.cjs.map +0 -1
  56. package/dist/chunk-5IE65DIH.cjs.map +0 -1
  57. package/dist/chunk-OXERDFFF.js.map +0 -1
  58. package/dist/chunk-UWYSJARZ.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -11,6 +11,64 @@ 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
+
53
+ ## [5.71.3] - 2026-11-01
54
+
55
+ ### Fixed
56
+
57
+ - **`Button` shows a pointer cursor when enabled.** Tailwind v4's preflight
58
+ sets `cursor: default` on `<button>`, and Button added no cursor of its own,
59
+ so every enabled Button showed the arrow (reported by Genie). Button now
60
+ carries `cursor-pointer`; `disabled:cursor-not-allowed` is unchanged, so a
61
+ disabled or `loading` Button still shows not-allowed. A cursor class in
62
+ `className` (e.g. `cursor-wait`) still wins via twMerge. Anchor mode gets the
63
+ same class, matching what the `<a>` already did.
64
+ - **`Button` sets `aria-busy="true"` while `loading`**, on both the `<button>`
65
+ and anchor (`href`) modes. The attribute is omitted entirely when not loading
66
+ (never `aria-busy="false"`), and an `aria-busy` you pass yourself still wins.
67
+
68
+ **Consumer action: none.** If you added your own
69
+ `[data-react-fancy-button] { cursor: pointer }` rule to work around the arrow,
70
+ you can remove it.
71
+
14
72
  ## [5.71.2] - 2026-10-30
15
73
 
16
74
  ### Fixed
package/dist/button.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  require('./chunk-M5MUGSON.cjs');
4
- var chunk3U7PUZLI_cjs = require('./chunk-3U7PUZLI.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 chunk3U7PUZLI_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 chunk3U7PUZLI_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-OXERDFFF.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 chunk5IE65DIH_cjs = require('./chunk-5IE65DIH.cjs');
3
+ var chunk5WVEW3Q5_cjs = require('./chunk-5WVEW3Q5.cjs');
4
4
  require('./chunk-S3TRSECD.cjs');
5
- require('./chunk-R3EJNGJV.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-3U7PUZLI.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 chunk5IE65DIH_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 chunk5IE65DIH_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-UWYSJARZ.js';
1
+ export { ChatMessage, ChatThread } from './chunk-GUCUYDFB.js';
2
2
  import './chunk-AUTW5O4W.js';
3
- import './chunk-NAYXNVNU.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-OXERDFFF.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-OXERDFFF.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-NAYXNVNU.js.map
1404
- //# sourceMappingURL=chunk-NAYXNVNU.js.map
1403
+ //# sourceMappingURL=chunk-2MDU3W7E.js.map
1404
+ //# sourceMappingURL=chunk-2MDU3W7E.js.map