@djangocfg/ui-tools 2.1.334 → 2.1.336

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 (196) hide show
  1. package/README.md +68 -2
  2. package/dist/ChatRoot-IIYQEWUU.mjs +5 -0
  3. package/dist/ChatRoot-IIYQEWUU.mjs.map +1 -0
  4. package/dist/ChatRoot-PNNGQCYF.css +7 -0
  5. package/dist/ChatRoot-PNNGQCYF.css.map +1 -0
  6. package/dist/ChatRoot-UUKTYM4N.cjs +14 -0
  7. package/dist/ChatRoot-UUKTYM4N.cjs.map +1 -0
  8. package/dist/{CronScheduler.client-3O3VU4CI.mjs → CronScheduler.client-DLMXCPAJ.mjs} +4 -4
  9. package/dist/{CronScheduler.client-3O3VU4CI.mjs.map → CronScheduler.client-DLMXCPAJ.mjs.map} +1 -1
  10. package/dist/{CronScheduler.client-A4GO6YBY.cjs → CronScheduler.client-WEJF4PWQ.cjs} +14 -14
  11. package/dist/{CronScheduler.client-A4GO6YBY.cjs.map → CronScheduler.client-WEJF4PWQ.cjs.map} +1 -1
  12. package/dist/{DocsLayout-XLDB6CJ2.cjs → DocsLayout-N5ZJZPBY.cjs} +200 -199
  13. package/dist/DocsLayout-N5ZJZPBY.cjs.map +1 -0
  14. package/dist/{DocsLayout-CTJINVBM.mjs → DocsLayout-VFPPNKSQ.mjs} +7 -6
  15. package/dist/DocsLayout-VFPPNKSQ.mjs.map +1 -0
  16. package/dist/JsonSchemaForm-DD7CLRIG.cjs +13 -0
  17. package/dist/{JsonSchemaForm-OSPUUUHM.cjs.map → JsonSchemaForm-DD7CLRIG.cjs.map} +1 -1
  18. package/dist/JsonSchemaForm-XKUIVELK.mjs +4 -0
  19. package/dist/{JsonSchemaForm-TSLX2GRO.mjs.map → JsonSchemaForm-XKUIVELK.mjs.map} +1 -1
  20. package/dist/JsonTree-55625VVH.mjs +5 -0
  21. package/dist/{JsonTree-F27RMYSI.cjs.map → JsonTree-55625VVH.mjs.map} +1 -1
  22. package/dist/JsonTree-DCM5QGWF.cjs +11 -0
  23. package/dist/{JsonTree-QTJYSHCV.mjs.map → JsonTree-DCM5QGWF.cjs.map} +1 -1
  24. package/dist/{LottiePlayer.client-6WVWDO75.cjs → LottiePlayer.client-2S7ISJ2S.cjs} +6 -6
  25. package/dist/{LottiePlayer.client-6WVWDO75.cjs.map → LottiePlayer.client-2S7ISJ2S.cjs.map} +1 -1
  26. package/dist/{LottiePlayer.client-B4I6WNZM.mjs → LottiePlayer.client-5LDSSJWS.mjs} +4 -4
  27. package/dist/{LottiePlayer.client-B4I6WNZM.mjs.map → LottiePlayer.client-5LDSSJWS.mjs.map} +1 -1
  28. package/dist/{MapContainer-RYG4HPH4.cjs → MapContainer-76YL2JXL.cjs} +8 -8
  29. package/dist/{MapContainer-RYG4HPH4.cjs.map → MapContainer-76YL2JXL.cjs.map} +1 -1
  30. package/dist/{MapContainer-GXQLP5WY.mjs → MapContainer-7HXBI3OH.mjs} +3 -3
  31. package/dist/{MapContainer-GXQLP5WY.mjs.map → MapContainer-7HXBI3OH.mjs.map} +1 -1
  32. package/dist/{Mermaid.client-SXRRI2YW.mjs → Mermaid.client-NL4SVR7F.mjs} +4 -4
  33. package/dist/{Mermaid.client-SXRRI2YW.mjs.map → Mermaid.client-NL4SVR7F.mjs.map} +1 -1
  34. package/dist/{Mermaid.client-W76R5AKJ.cjs → Mermaid.client-NNTI6DFX.cjs} +26 -26
  35. package/dist/{Mermaid.client-W76R5AKJ.cjs.map → Mermaid.client-NNTI6DFX.cjs.map} +1 -1
  36. package/dist/Player-BRV7XTWR.mjs +4 -0
  37. package/dist/{Player-M3GC3VPE.mjs.map → Player-BRV7XTWR.mjs.map} +1 -1
  38. package/dist/Player-PM7F7DD7.cjs +13 -0
  39. package/dist/{Player-ZL2X5LGG.cjs.map → Player-PM7F7DD7.cjs.map} +1 -1
  40. package/dist/{PrettyCode.client-RPDIE5CH.cjs → PrettyCode.client-KOHDVPPN.cjs} +13 -13
  41. package/dist/{PrettyCode.client-RPDIE5CH.cjs.map → PrettyCode.client-KOHDVPPN.cjs.map} +1 -1
  42. package/dist/{PrettyCode.client-SPMTQEG4.mjs → PrettyCode.client-ZGYGKE7G.mjs} +4 -4
  43. package/dist/{PrettyCode.client-SPMTQEG4.mjs.map → PrettyCode.client-ZGYGKE7G.mjs.map} +1 -1
  44. package/dist/TreeRoot-N72OYKXU.cjs +19 -0
  45. package/dist/{TreeRoot-A3J65L6F.mjs.map → TreeRoot-N72OYKXU.cjs.map} +1 -1
  46. package/dist/TreeRoot-VGAIXCUA.mjs +4 -0
  47. package/dist/{TreeRoot-DSK5JILT.cjs.map → TreeRoot-VGAIXCUA.mjs.map} +1 -1
  48. package/dist/chunk-2ZLKZ5VR.mjs +631 -0
  49. package/dist/chunk-2ZLKZ5VR.mjs.map +1 -0
  50. package/dist/{chunk-LFWQ36LJ.mjs → chunk-5G5YBFS6.mjs} +4 -4
  51. package/dist/{chunk-LFWQ36LJ.mjs.map → chunk-5G5YBFS6.mjs.map} +1 -1
  52. package/dist/{chunk-IHAY6FO6.cjs → chunk-5I5QNGUG.cjs} +17 -17
  53. package/dist/{chunk-IHAY6FO6.cjs.map → chunk-5I5QNGUG.cjs.map} +1 -1
  54. package/dist/{chunk-F2CMIIOH.cjs → chunk-76NNDZH6.cjs} +42 -42
  55. package/dist/{chunk-F2CMIIOH.cjs.map → chunk-76NNDZH6.cjs.map} +1 -1
  56. package/dist/chunk-B5AWZOHJ.cjs +649 -0
  57. package/dist/chunk-B5AWZOHJ.cjs.map +1 -0
  58. package/dist/{chunk-KR6B3LVY.mjs → chunk-B6IR5KSC.mjs} +3 -3
  59. package/dist/{chunk-KR6B3LVY.mjs.map → chunk-B6IR5KSC.mjs.map} +1 -1
  60. package/dist/{chunk-5LBDYFWH.mjs → chunk-C6GXVH5J.mjs} +3 -3
  61. package/dist/{chunk-5LBDYFWH.mjs.map → chunk-C6GXVH5J.mjs.map} +1 -1
  62. package/dist/{chunk-4IW7GZFQ.cjs → chunk-FEN5S772.cjs} +74 -48
  63. package/dist/chunk-FEN5S772.cjs.map +1 -0
  64. package/dist/{chunk-2SMCH62O.cjs → chunk-FP2RLYQZ.cjs} +11 -11
  65. package/dist/{chunk-2SMCH62O.cjs.map → chunk-FP2RLYQZ.cjs.map} +1 -1
  66. package/dist/{chunk-MOME6KYD.mjs → chunk-G5IEC7SR.mjs} +3 -3
  67. package/dist/{chunk-MOME6KYD.mjs.map → chunk-G5IEC7SR.mjs.map} +1 -1
  68. package/dist/{chunk-EXGXUK2N.mjs → chunk-GYIO7W7M.mjs} +41 -15
  69. package/dist/chunk-GYIO7W7M.mjs.map +1 -0
  70. package/dist/{chunk-3Z3A7FHA.cjs → chunk-IEEAENLX.cjs} +48 -48
  71. package/dist/{chunk-3Z3A7FHA.cjs.map → chunk-IEEAENLX.cjs.map} +1 -1
  72. package/dist/{chunk-DFTVB66S.cjs → chunk-KNDLV4PI.cjs} +85 -85
  73. package/dist/{chunk-DFTVB66S.cjs.map → chunk-KNDLV4PI.cjs.map} +1 -1
  74. package/dist/{chunk-SSUOENAZ.mjs → chunk-KNEQRUBA.mjs} +3 -3
  75. package/dist/{chunk-SSUOENAZ.mjs.map → chunk-KNEQRUBA.mjs.map} +1 -1
  76. package/dist/chunk-KRETIZU6.mjs +2218 -0
  77. package/dist/chunk-KRETIZU6.mjs.map +1 -0
  78. package/dist/{chunk-CGILA3WO.mjs → chunk-N2XQF2OL.mjs} +5 -3
  79. package/dist/{chunk-CGILA3WO.mjs.map → chunk-N2XQF2OL.mjs.map} +1 -1
  80. package/dist/{chunk-EUADAUBQ.mjs → chunk-N4MZYNR4.mjs} +4 -4
  81. package/dist/{chunk-EUADAUBQ.mjs.map → chunk-N4MZYNR4.mjs.map} +1 -1
  82. package/dist/chunk-NRXYYO5V.cjs +2257 -0
  83. package/dist/chunk-NRXYYO5V.cjs.map +1 -0
  84. package/dist/{chunk-GGKGH5PM.mjs → chunk-OBRSGM64.mjs} +4 -4
  85. package/dist/{chunk-GGKGH5PM.mjs.map → chunk-OBRSGM64.mjs.map} +1 -1
  86. package/dist/{chunk-6JTB2X72.mjs → chunk-ODO4GMW7.mjs} +3 -3
  87. package/dist/{chunk-6JTB2X72.mjs.map → chunk-ODO4GMW7.mjs.map} +1 -1
  88. package/dist/{chunk-WGEGR3DF.cjs → chunk-OLISEQHS.cjs} +5 -2
  89. package/dist/{chunk-WGEGR3DF.cjs.map → chunk-OLISEQHS.cjs.map} +1 -1
  90. package/dist/{chunk-PZKAH7WQ.mjs → chunk-PVAX67JG.mjs} +3 -3
  91. package/dist/{chunk-PZKAH7WQ.mjs.map → chunk-PVAX67JG.mjs.map} +1 -1
  92. package/dist/{chunk-PRPG2T2E.cjs → chunk-QJ6GTUCO.cjs} +6 -6
  93. package/dist/{chunk-PRPG2T2E.cjs.map → chunk-QJ6GTUCO.cjs.map} +1 -1
  94. package/dist/chunk-QW4RBGHN.cjs +961 -0
  95. package/dist/chunk-QW4RBGHN.cjs.map +1 -0
  96. package/dist/{chunk-33AMWFBZ.cjs → chunk-SGP7V2UW.cjs} +15 -15
  97. package/dist/{chunk-33AMWFBZ.cjs.map → chunk-SGP7V2UW.cjs.map} +1 -1
  98. package/dist/{chunk-FX2QFYWF.mjs → chunk-VWQ5WOIL.mjs} +3 -3
  99. package/dist/{chunk-FX2QFYWF.mjs.map → chunk-VWQ5WOIL.mjs.map} +1 -1
  100. package/dist/{chunk-ZLQHUZDU.cjs → chunk-YDPDTOSP.cjs} +139 -139
  101. package/dist/{chunk-ZLQHUZDU.cjs.map → chunk-YDPDTOSP.cjs.map} +1 -1
  102. package/dist/{chunk-77HQWEQ6.cjs → chunk-YW5IVWHQ.cjs} +33 -33
  103. package/dist/{chunk-77HQWEQ6.cjs.map → chunk-YW5IVWHQ.cjs.map} +1 -1
  104. package/dist/{chunk-YXBOAGIM.cjs → chunk-YXZ6GU7H.cjs} +7 -7
  105. package/dist/{chunk-YXBOAGIM.cjs.map → chunk-YXZ6GU7H.cjs.map} +1 -1
  106. package/dist/{chunk-62Y65TGK.mjs → chunk-ZUFTH5IR.mjs} +8 -631
  107. package/dist/chunk-ZUFTH5IR.mjs.map +1 -0
  108. package/dist/components-EHOGXATG.cjs +22 -0
  109. package/dist/{components-5UXYNAKR.cjs.map → components-EHOGXATG.cjs.map} +1 -1
  110. package/dist/components-MQ6DR7TX.cjs +26 -0
  111. package/dist/{components-CFXOEVPN.mjs.map → components-MQ6DR7TX.cjs.map} +1 -1
  112. package/dist/components-XRX7QGLB.mjs +5 -0
  113. package/dist/{components-WYEZL5TE.cjs.map → components-XRX7QGLB.mjs.map} +1 -1
  114. package/dist/components-YATKRWLH.mjs +5 -0
  115. package/dist/{components-ZAGG2PBO.mjs.map → components-YATKRWLH.mjs.map} +1 -1
  116. package/dist/file-icon/index.cjs +6 -6
  117. package/dist/file-icon/index.mjs +1 -1
  118. package/dist/index.cjs +735 -215
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.cts +972 -39
  121. package/dist/index.d.ts +972 -39
  122. package/dist/index.mjs +387 -31
  123. package/dist/index.mjs.map +1 -1
  124. package/dist/tree/index.cjs +38 -38
  125. package/dist/tree/index.d.cts +2 -2
  126. package/dist/tree/index.d.ts +2 -2
  127. package/dist/tree/index.mjs +3 -3
  128. package/package.json +6 -6
  129. package/src/index.ts +5 -0
  130. package/src/stories/index.ts +3 -1
  131. package/src/tools/Chat/Chat.story.tsx +1006 -0
  132. package/src/tools/Chat/README.md +528 -0
  133. package/src/tools/Chat/components/Attachments.tsx +192 -0
  134. package/src/tools/Chat/components/ChatRoot.tsx +201 -0
  135. package/src/tools/Chat/components/Composer.tsx +134 -0
  136. package/src/tools/Chat/components/EmptyState.tsx +47 -0
  137. package/src/tools/Chat/components/ErrorBanner.tsx +47 -0
  138. package/src/tools/Chat/components/JumpToLatest.tsx +30 -0
  139. package/src/tools/Chat/components/MessageActions.tsx +72 -0
  140. package/src/tools/Chat/components/MessageBubble.tsx +228 -0
  141. package/src/tools/Chat/components/MessageList.tsx +82 -0
  142. package/src/tools/Chat/components/Sources.tsx +55 -0
  143. package/src/tools/Chat/components/StreamingIndicator.tsx +29 -0
  144. package/src/tools/Chat/components/ToolCalls.tsx +172 -0
  145. package/src/tools/Chat/components/index.ts +24 -0
  146. package/src/tools/Chat/config.ts +55 -0
  147. package/src/tools/Chat/context/ChatProvider.tsx +122 -0
  148. package/src/tools/Chat/context/index.ts +9 -0
  149. package/src/tools/Chat/core/audio/audioBus.ts +172 -0
  150. package/src/tools/Chat/core/audio/index.ts +8 -0
  151. package/src/tools/Chat/core/audio/preferences.ts +68 -0
  152. package/src/tools/Chat/core/audio/types.ts +49 -0
  153. package/src/tools/Chat/core/ids.ts +16 -0
  154. package/src/tools/Chat/core/index.ts +5 -0
  155. package/src/tools/Chat/core/markdown.ts +56 -0
  156. package/src/tools/Chat/core/payload-dispatch.ts +54 -0
  157. package/src/tools/Chat/core/persona.ts +35 -0
  158. package/src/tools/Chat/core/reducer.ts +335 -0
  159. package/src/tools/Chat/core/transport/http.ts +167 -0
  160. package/src/tools/Chat/core/transport/index.ts +13 -0
  161. package/src/tools/Chat/core/transport/mock.ts +134 -0
  162. package/src/tools/Chat/core/transport/sse.ts +116 -0
  163. package/src/tools/Chat/core/transport/types.ts +24 -0
  164. package/src/tools/Chat/hooks/index.ts +26 -0
  165. package/src/tools/Chat/hooks/useChat.ts +440 -0
  166. package/src/tools/Chat/hooks/useChatAudio.ts +191 -0
  167. package/src/tools/Chat/hooks/useChatComposer.ts +227 -0
  168. package/src/tools/Chat/hooks/useChatHistory.ts +59 -0
  169. package/src/tools/Chat/hooks/useChatLayout.ts +111 -0
  170. package/src/tools/Chat/hooks/useChatLightbox.ts +34 -0
  171. package/src/tools/Chat/hooks/useChatScroll.ts +132 -0
  172. package/src/tools/Chat/index.ts +158 -0
  173. package/src/tools/Chat/lazy.tsx +14 -0
  174. package/src/tools/Chat/types.ts +237 -0
  175. package/src/tools/Chat/utils/collectImageAttachments.ts +13 -0
  176. package/src/tools/JsonForm/JsonSchemaForm.tsx +32 -1
  177. package/src/tools/Map/README.md +384 -0
  178. package/dist/DocsLayout-CTJINVBM.mjs.map +0 -1
  179. package/dist/DocsLayout-XLDB6CJ2.cjs.map +0 -1
  180. package/dist/JsonSchemaForm-OSPUUUHM.cjs +0 -13
  181. package/dist/JsonSchemaForm-TSLX2GRO.mjs +0 -4
  182. package/dist/JsonTree-F27RMYSI.cjs +0 -11
  183. package/dist/JsonTree-QTJYSHCV.mjs +0 -5
  184. package/dist/Player-M3GC3VPE.mjs +0 -4
  185. package/dist/Player-ZL2X5LGG.cjs +0 -13
  186. package/dist/TreeRoot-A3J65L6F.mjs +0 -4
  187. package/dist/TreeRoot-DSK5JILT.cjs +0 -19
  188. package/dist/chunk-4IW7GZFQ.cjs.map +0 -1
  189. package/dist/chunk-62Y65TGK.mjs.map +0 -1
  190. package/dist/chunk-EXGXUK2N.mjs.map +0 -1
  191. package/dist/chunk-TKSFZHCG.cjs +0 -1597
  192. package/dist/chunk-TKSFZHCG.cjs.map +0 -1
  193. package/dist/components-5UXYNAKR.cjs +0 -22
  194. package/dist/components-CFXOEVPN.mjs +0 -5
  195. package/dist/components-WYEZL5TE.cjs +0 -26
  196. package/dist/components-ZAGG2PBO.mjs +0 -5
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
3
+ var chunkOLISEQHS_cjs = require('./chunk-OLISEQHS.cjs');
4
4
  var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var components = require('@djangocfg/ui-core/components');
@@ -12,7 +12,7 @@ function useScrollIsolation(ref, enabled) {
12
12
  const unlock = react.useCallback(() => setLocked(false), []);
13
13
  react.useEffect(() => {
14
14
  if (!enabled) return;
15
- const handleDocClick = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((e) => {
15
+ const handleDocClick = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((e) => {
16
16
  const el = ref.current;
17
17
  if (!el) return;
18
18
  if (!el.contains(e.target)) {
@@ -37,8 +37,8 @@ function useScrollIsolation(ref, enabled) {
37
37
  }, [enabled]);
38
38
  return { locked, unlock };
39
39
  }
40
- chunkWGEGR3DF_cjs.__name(useScrollIsolation, "useScrollIsolation");
41
- var FloatingToolbar = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
40
+ chunkOLISEQHS_cjs.__name(useScrollIsolation, "useScrollIsolation");
41
+ var FloatingToolbar = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({
42
42
  containerRef,
43
43
  children,
44
44
  label,
@@ -108,7 +108,7 @@ var FloatingToolbar = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
108
108
  ] });
109
109
  }, "FloatingToolbar");
110
110
  var BUTTON_CLASS = "h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm";
111
- var CopyAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ value, title = "Copy" }) => /* @__PURE__ */ jsxRuntime.jsx(
111
+ var CopyAction = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ value, title = "Copy" }) => /* @__PURE__ */ jsxRuntime.jsx(
112
112
  components.CopyButton,
113
113
  {
114
114
  value,
@@ -120,13 +120,13 @@ var CopyAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ value, title = "Cop
120
120
  }
121
121
  ), "CopyAction");
122
122
  var BUTTON_CLASS2 = "h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm";
123
- var DownloadAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
123
+ var DownloadAction = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({
124
124
  value,
125
125
  filename = "download.txt",
126
126
  mimeType = "text/plain",
127
127
  title = "Download"
128
128
  }) => {
129
- const handleDownload = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
129
+ const handleDownload = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(() => {
130
130
  const blob = new Blob([value], { type: mimeType });
131
131
  const url = URL.createObjectURL(blob);
132
132
  const a = document.createElement("a");
@@ -150,7 +150,7 @@ var DownloadAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
150
150
  );
151
151
  }, "DownloadAction");
152
152
  var BUTTON_CLASS3 = "h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm";
153
- var ExpandAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ isExpanded, onToggle }) => /* @__PURE__ */ jsxRuntime.jsx(
153
+ var ExpandAction = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ isExpanded, onToggle }) => /* @__PURE__ */ jsxRuntime.jsx(
154
154
  components.Button,
155
155
  {
156
156
  variant: "ghost",
@@ -162,7 +162,7 @@ var ExpandAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ isExpanded, onTog
162
162
  }
163
163
  ), "ExpandAction");
164
164
  var BUTTON_CLASS4 = "h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm";
165
- var FullscreenAction = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
165
+ var FullscreenAction = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({
166
166
  isFullscreen = false,
167
167
  onToggle,
168
168
  title
@@ -183,5 +183,5 @@ exports.DownloadAction = DownloadAction;
183
183
  exports.ExpandAction = ExpandAction;
184
184
  exports.FloatingToolbar = FloatingToolbar;
185
185
  exports.FullscreenAction = FullscreenAction;
186
- //# sourceMappingURL=chunk-2SMCH62O.cjs.map
187
- //# sourceMappingURL=chunk-2SMCH62O.cjs.map
186
+ //# sourceMappingURL=chunk-FP2RLYQZ.cjs.map
187
+ //# sourceMappingURL=chunk-FP2RLYQZ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/FloatingToolbar/hooks/useScrollIsolation.ts","../src/components/FloatingToolbar/index.tsx","../src/components/FloatingToolbar/actions/CopyAction.tsx","../src/components/FloatingToolbar/actions/DownloadAction.tsx","../src/components/FloatingToolbar/actions/ExpandAction.tsx","../src/components/FloatingToolbar/actions/FullscreenAction.tsx"],"names":["useState","useCallback","useEffect","__name","jsx","jsxs","Fragment","CopyButton","BUTTON_CLASS","Button","Download","ChevronUp","ChevronDown","Minimize2","Maximize2"],"mappings":"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","file":"chunk-2SMCH62O.cjs","sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nconst UNLOCKED_CLASS = 'scroll-unlocked';\n\n/**\n * Scroll isolation — prevents the container from capturing wheel scroll\n * until the user explicitly clicks inside it (like Google Maps).\n *\n * Locked (overlay visible): wheel events on container scroll the PAGE.\n * Unlocked: normal scroll inside the container.\n *\n * Unlock: click anywhere inside the container.\n * Re-lock: click outside the container.\n *\n * When unlocked, adds `scroll-unlocked` class to the container element\n * so it can be styled (e.g. focus ring) via CSS.\n */\nexport function useScrollIsolation(\n ref: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n) {\n const [locked, setLocked] = useState(true);\n\n const unlock = useCallback(() => setLocked(false), []);\n\n // Re-lock when clicking outside the container\n useEffect(() => {\n if (!enabled) return;\n\n const handleDocClick = (e: MouseEvent) => {\n const el = ref.current;\n if (!el) return;\n if (!el.contains(e.target as Node)) {\n setLocked(true);\n }\n };\n\n document.addEventListener('click', handleDocClick, true);\n return () => document.removeEventListener('click', handleDocClick, true);\n }, [enabled, ref]);\n\n // Toggle class on container to allow CSS-driven focus ring\n useEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n if (locked) {\n el.classList.remove(UNLOCKED_CLASS);\n } else {\n el.classList.add(UNLOCKED_CLASS);\n }\n return () => el.classList.remove(UNLOCKED_CLASS);\n }, [locked, enabled, ref]);\n\n // Reset to locked when feature toggled on\n useEffect(() => {\n if (enabled) setLocked(true);\n }, [enabled]);\n\n return { locked, unlock };\n}\n","'use client';\n\nimport React, { useState } from 'react';\n\nimport './FloatingToolbar.css';\nimport { useScrollIsolation } from './hooks/useScrollIsolation';\n\nexport interface FloatingToolbarProps {\n /** Ref to the container element the toolbar anchors to */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Action buttons to render (right side) */\n children: React.ReactNode;\n /** Optional label shown left of the buttons (e.g. language badge) */\n label?: React.ReactNode;\n /** Where to anchor relative to the container (default: bottom-right) */\n position?: 'top-right' | 'bottom-right';\n /** Offset from the edge in px (default: 8) */\n offset?: number;\n /** z-index (default: 30) */\n zIndex?: number;\n /**\n * Block wheel scroll inside the container until user clicks into it.\n * Re-locks when mouse leaves. Like Google Maps scroll isolation.\n * @default true\n */\n scrollIsolation?: boolean;\n}\n\n/**\n * Toolbar is anchored with `position: absolute` inside the container (PrettyCode, etc.).\n * `position: fixed` + viewport coordinates breaks embedded layouts (e.g. chat composer overlap).\n */\nexport const FloatingToolbar: React.FC<FloatingToolbarProps> = ({\n containerRef,\n children,\n label,\n position = 'bottom-right',\n offset = 8,\n zIndex = 30,\n scrollIsolation = true,\n}) => {\n const { locked, unlock } = useScrollIsolation(containerRef, scrollIsolation);\n const [overlayHovered, setOverlayHovered] = useState(false);\n\n const overlay =\n scrollIsolation && locked ? (\n <div\n onClick={unlock}\n onMouseEnter={() => setOverlayHovered(true)}\n onMouseLeave={() => setOverlayHovered(false)}\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: zIndex - 1,\n cursor: 'pointer',\n background: overlayHovered ? 'rgba(0,0,0,0.04)' : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 150ms',\n }}\n >\n {overlayHovered && (\n <span\n style={{\n fontSize: '0.75rem',\n padding: '0.25rem 0.625rem',\n borderRadius: '9999px',\n background: 'rgba(0,0,0,0.55)',\n color: '#fff',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n Click to scroll\n </span>\n )}\n </div>\n ) : null;\n\n const positionStyle: React.CSSProperties =\n position === 'bottom-right'\n ? { bottom: offset, right: offset }\n : { top: offset, right: offset };\n\n const toolbar = (\n <div\n className=\"flex items-center gap-1\"\n style={{\n position: 'absolute',\n ...positionStyle,\n zIndex,\n }}\n >\n {label && (\n <>\n {label}\n <div className=\"w-px h-4 bg-border/50 mx-0.5\" />\n </>\n )}\n {children}\n </div>\n );\n\n return (\n <>\n {overlay}\n {toolbar}\n </>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\ninterface CopyActionProps {\n value: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const CopyAction: React.FC<CopyActionProps> = ({ value, title = 'Copy' }) => (\n <CopyButton\n value={value}\n variant=\"ghost\"\n size=\"icon\"\n className={BUTTON_CLASS}\n iconClassName=\"h-3 w-3\"\n title={title}\n />\n);\n","'use client';\n\nimport { Download } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface DownloadActionProps {\n value: string;\n filename?: string;\n mimeType?: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const DownloadAction: React.FC<DownloadActionProps> = ({\n value,\n filename = 'download.txt',\n mimeType = 'text/plain',\n title = 'Download',\n}) => {\n const handleDownload = () => {\n const blob = new Blob([value], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDownload}\n className={BUTTON_CLASS}\n title={title}\n >\n <Download className=\"h-3 w-3\" />\n </Button>\n );\n};\n","'use client';\n\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface ExpandActionProps {\n isExpanded: boolean;\n onToggle: () => void;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const ExpandAction: React.FC<ExpandActionProps> = ({ isExpanded, onToggle }) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={isExpanded ? 'Collapse All' : 'Expand All'}\n >\n {isExpanded ? <ChevronUp className=\"h-3 w-3\" /> : <ChevronDown className=\"h-3 w-3\" />}\n </Button>\n);\n","'use client';\n\nimport { Maximize2, Minimize2 } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface FullscreenActionProps {\n isFullscreen?: boolean;\n onToggle: () => void;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const FullscreenAction: React.FC<FullscreenActionProps> = ({\n isFullscreen = false,\n onToggle,\n title,\n}) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={title ?? (isFullscreen ? 'Exit fullscreen' : 'Fullscreen')}\n >\n {isFullscreen ? <Minimize2 className=\"h-3 w-3\" /> : <Maximize2 className=\"h-3 w-3\" />}\n </Button>\n);\n"]}
1
+ {"version":3,"sources":["../src/components/FloatingToolbar/hooks/useScrollIsolation.ts","../src/components/FloatingToolbar/index.tsx","../src/components/FloatingToolbar/actions/CopyAction.tsx","../src/components/FloatingToolbar/actions/DownloadAction.tsx","../src/components/FloatingToolbar/actions/ExpandAction.tsx","../src/components/FloatingToolbar/actions/FullscreenAction.tsx"],"names":["useState","useCallback","useEffect","__name","jsx","jsxs","Fragment","CopyButton","BUTTON_CLASS","Button","Download","ChevronUp","ChevronDown","Minimize2","Maximize2"],"mappings":";;;;;;;;AAIA,IAAM,cAAA,GAAiB,iBAAA;AAehB,SAAS,kBAAA,CACd,KACA,OAAA,EACA;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,IAAI,CAAA;AAEzC,EAAA,MAAM,SAASC,iBAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AAGrD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,cAAA,6CAAkB,CAAA,KAAkB;AACxC,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,IAAI,CAAC,EAAA,CAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAClC,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,EANuB,gBAAA,CAAA;AAQvB,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,IAAI,CAAA;AACvD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,gBAAgB,IAAI,CAAA;AAAA,EACzE,CAAA,EAAG,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AAGjB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,EAAS;AACrB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,EAAA,CAAG,SAAA,CAAU,OAAO,cAAc,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,SAAA,CAAU,IAAI,cAAc,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAM,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,cAAc,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,GAAG,CAAC,CAAA;AAGzB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,YAAmB,IAAI,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AA1CgBC,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;ACaT,IAAM,kCAAkDA,wBAAA,CAAA,CAAC;AAAA,EAC9D,YAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,cAAA;AAAA,EACX,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,EAAA;AAAA,EACT,eAAA,GAAkB;AACpB,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,kBAAA,CAAmB,cAAc,eAAe,CAAA;AAC3E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIH,eAAS,KAAK,CAAA;AAE1D,EAAA,MAAM,OAAA,GACJ,mBAAmB,MAAA,mBACjBI,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA;AAAA,MACT,YAAA,EAAc,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,MAC1C,YAAA,EAAc,MAAM,iBAAA,CAAkB,KAAK,CAAA;AAAA,MAC3C,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,QAAQ,MAAA,GAAS,CAAA;AAAA,QACjB,MAAA,EAAQ,SAAA;AAAA,QACR,UAAA,EAAY,iBAAiB,kBAAA,GAAqB,aAAA;AAAA,QAClD,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA,cAAA,oBACCA,cAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,kBAAA;AAAA,YACT,YAAA,EAAc,QAAA;AAAA,YACd,UAAA,EAAY,kBAAA;AAAA,YACZ,KAAA,EAAO,MAAA;AAAA,YACP,aAAA,EAAe,MAAA;AAAA,YACf,UAAA,EAAY;AAAA,WACd;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,GAEJ,GACE,IAAA;AAEN,EAAA,MAAM,aAAA,GACJ,QAAA,KAAa,cAAA,GACT,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,GAChC,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,MAAA,EAAO;AAEnC,EAAA,MAAM,OAAA,mBACJC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,yBAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,GAAG,aAAA;AAAA,QACH;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCA,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,0BACDF,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAA+B;AAAA,SAAA,EAChD,CAAA;AAAA,QAED;AAAA;AAAA;AAAA,GACH;AAGF,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA;AAAA,GAAA,EACH,CAAA;AAEJ,CAAA,EA9E+D,iBAAA;ACtB/D,IAAM,YAAA,GAAe,wFAAA;AAEd,IAAM,6BAAwCH,wBAAA,CAAA,CAAC,EAAE,OAAO,KAAA,GAAQ,MAAA,uBACrEC,cAAAA;AAAA,EAACG,qBAAA;AAAA,EAAA;AAAA,IACC,KAAA;AAAA,IACA,OAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,SAAA,EAAW,YAAA;AAAA,IACX,aAAA,EAAc,SAAA;AAAA,IACd;AAAA;AACF,CAAA,EARmD,YAAA;ACErD,IAAMC,aAAAA,GAAe,wFAAA;AAEd,IAAM,iCAAgDL,wBAAA,CAAA,CAAC;AAAA,EAC5D,KAAA;AAAA,EACA,QAAA,GAAW,cAAA;AAAA,EACX,QAAA,GAAW,YAAA;AAAA,EACX,KAAA,GAAQ;AACV,CAAA,KAAM;AACJ,EAAA,MAAM,iCAAiBA,wBAAA,CAAA,MAAM;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB,CAAA,EAVuB,gBAAA,CAAA;AAYvB,EAAA,uBACEC,cAAAA;AAAA,IAACK,iBAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,SAAA,EAAWD,aAAAA;AAAA,MACX,KAAA;AAAA,MAEA,QAAA,kBAAAJ,cAAAA,CAACM,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,GAChC;AAEJ,CAAA,EA7B6D,gBAAA;ACJ7D,IAAMF,aAAAA,GAAe,wFAAA;AAEd,IAAM,+BAA4CL,wBAAA,CAAA,CAAC,EAAE,UAAA,EAAY,QAAA,uBACtEC,cAAAA;AAAA,EAACK,iBAAAA;AAAA,EAAA;AAAA,IACC,OAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,SAAA,EAAWD,aAAAA;AAAA,IACX,KAAA,EAAO,aAAa,cAAA,GAAiB,YAAA;AAAA,IAEpC,QAAA,EAAA,UAAA,mBAAaJ,cAAAA,CAACO,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAAKP,cAAAA,CAACQ,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AACrF,CAAA,EATuD,cAAA;ACDzD,IAAMJ,aAAAA,GAAe,wFAAA;AAEd,IAAM,mCAAoDL,wBAAA,CAAA,CAAC;AAAA,EAChE,YAAA,GAAe,KAAA;AAAA,EACf,QAAA;AAAA,EACA;AACF,CAAA,qBACEC,cAAAA;AAAA,EAACK,iBAAAA;AAAA,EAAA;AAAA,IACC,OAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,SAAA,EAAWD,aAAAA;AAAA,IACX,KAAA,EAAO,KAAA,KAAU,YAAA,GAAe,iBAAA,GAAoB,YAAA,CAAA;AAAA,IAEnD,QAAA,EAAA,YAAA,mBAAeJ,cAAAA,CAACS,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAAKT,cAAAA,CAACU,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AACrF,CAAA,EAb+D,kBAAA","file":"chunk-FP2RLYQZ.cjs","sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nconst UNLOCKED_CLASS = 'scroll-unlocked';\n\n/**\n * Scroll isolation — prevents the container from capturing wheel scroll\n * until the user explicitly clicks inside it (like Google Maps).\n *\n * Locked (overlay visible): wheel events on container scroll the PAGE.\n * Unlocked: normal scroll inside the container.\n *\n * Unlock: click anywhere inside the container.\n * Re-lock: click outside the container.\n *\n * When unlocked, adds `scroll-unlocked` class to the container element\n * so it can be styled (e.g. focus ring) via CSS.\n */\nexport function useScrollIsolation(\n ref: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n) {\n const [locked, setLocked] = useState(true);\n\n const unlock = useCallback(() => setLocked(false), []);\n\n // Re-lock when clicking outside the container\n useEffect(() => {\n if (!enabled) return;\n\n const handleDocClick = (e: MouseEvent) => {\n const el = ref.current;\n if (!el) return;\n if (!el.contains(e.target as Node)) {\n setLocked(true);\n }\n };\n\n document.addEventListener('click', handleDocClick, true);\n return () => document.removeEventListener('click', handleDocClick, true);\n }, [enabled, ref]);\n\n // Toggle class on container to allow CSS-driven focus ring\n useEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n if (locked) {\n el.classList.remove(UNLOCKED_CLASS);\n } else {\n el.classList.add(UNLOCKED_CLASS);\n }\n return () => el.classList.remove(UNLOCKED_CLASS);\n }, [locked, enabled, ref]);\n\n // Reset to locked when feature toggled on\n useEffect(() => {\n if (enabled) setLocked(true);\n }, [enabled]);\n\n return { locked, unlock };\n}\n","'use client';\n\nimport React, { useState } from 'react';\n\nimport './FloatingToolbar.css';\nimport { useScrollIsolation } from './hooks/useScrollIsolation';\n\nexport interface FloatingToolbarProps {\n /** Ref to the container element the toolbar anchors to */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Action buttons to render (right side) */\n children: React.ReactNode;\n /** Optional label shown left of the buttons (e.g. language badge) */\n label?: React.ReactNode;\n /** Where to anchor relative to the container (default: bottom-right) */\n position?: 'top-right' | 'bottom-right';\n /** Offset from the edge in px (default: 8) */\n offset?: number;\n /** z-index (default: 30) */\n zIndex?: number;\n /**\n * Block wheel scroll inside the container until user clicks into it.\n * Re-locks when mouse leaves. Like Google Maps scroll isolation.\n * @default true\n */\n scrollIsolation?: boolean;\n}\n\n/**\n * Toolbar is anchored with `position: absolute` inside the container (PrettyCode, etc.).\n * `position: fixed` + viewport coordinates breaks embedded layouts (e.g. chat composer overlap).\n */\nexport const FloatingToolbar: React.FC<FloatingToolbarProps> = ({\n containerRef,\n children,\n label,\n position = 'bottom-right',\n offset = 8,\n zIndex = 30,\n scrollIsolation = true,\n}) => {\n const { locked, unlock } = useScrollIsolation(containerRef, scrollIsolation);\n const [overlayHovered, setOverlayHovered] = useState(false);\n\n const overlay =\n scrollIsolation && locked ? (\n <div\n onClick={unlock}\n onMouseEnter={() => setOverlayHovered(true)}\n onMouseLeave={() => setOverlayHovered(false)}\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: zIndex - 1,\n cursor: 'pointer',\n background: overlayHovered ? 'rgba(0,0,0,0.04)' : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 150ms',\n }}\n >\n {overlayHovered && (\n <span\n style={{\n fontSize: '0.75rem',\n padding: '0.25rem 0.625rem',\n borderRadius: '9999px',\n background: 'rgba(0,0,0,0.55)',\n color: '#fff',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n Click to scroll\n </span>\n )}\n </div>\n ) : null;\n\n const positionStyle: React.CSSProperties =\n position === 'bottom-right'\n ? { bottom: offset, right: offset }\n : { top: offset, right: offset };\n\n const toolbar = (\n <div\n className=\"flex items-center gap-1\"\n style={{\n position: 'absolute',\n ...positionStyle,\n zIndex,\n }}\n >\n {label && (\n <>\n {label}\n <div className=\"w-px h-4 bg-border/50 mx-0.5\" />\n </>\n )}\n {children}\n </div>\n );\n\n return (\n <>\n {overlay}\n {toolbar}\n </>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\ninterface CopyActionProps {\n value: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const CopyAction: React.FC<CopyActionProps> = ({ value, title = 'Copy' }) => (\n <CopyButton\n value={value}\n variant=\"ghost\"\n size=\"icon\"\n className={BUTTON_CLASS}\n iconClassName=\"h-3 w-3\"\n title={title}\n />\n);\n","'use client';\n\nimport { Download } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface DownloadActionProps {\n value: string;\n filename?: string;\n mimeType?: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const DownloadAction: React.FC<DownloadActionProps> = ({\n value,\n filename = 'download.txt',\n mimeType = 'text/plain',\n title = 'Download',\n}) => {\n const handleDownload = () => {\n const blob = new Blob([value], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDownload}\n className={BUTTON_CLASS}\n title={title}\n >\n <Download className=\"h-3 w-3\" />\n </Button>\n );\n};\n","'use client';\n\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface ExpandActionProps {\n isExpanded: boolean;\n onToggle: () => void;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const ExpandAction: React.FC<ExpandActionProps> = ({ isExpanded, onToggle }) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={isExpanded ? 'Collapse All' : 'Expand All'}\n >\n {isExpanded ? <ChevronUp className=\"h-3 w-3\" /> : <ChevronDown className=\"h-3 w-3\" />}\n </Button>\n);\n","'use client';\n\nimport { Maximize2, Minimize2 } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface FullscreenActionProps {\n isFullscreen?: boolean;\n onToggle: () => void;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const FullscreenAction: React.FC<FullscreenActionProps> = ({\n isFullscreen = false,\n onToggle,\n title,\n}) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={title ?? (isFullscreen ? 'Exit fullscreen' : 'Fullscreen')}\n >\n {isFullscreen ? <Minimize2 className=\"h-3 w-3\" /> : <Maximize2 className=\"h-3 w-3\" />}\n </Button>\n);\n"]}
@@ -1,4 +1,4 @@
1
- import { __name } from './chunk-CGILA3WO.mjs';
1
+ import { __name } from './chunk-N2XQF2OL.mjs';
2
2
  import * as React from 'react';
3
3
  import { createContext, useMemo, useReducer, useRef, useCallback, useEffect, Fragment as Fragment$1 } from 'react';
4
4
  import { cn } from '@djangocfg/ui-core/lib';
@@ -1266,5 +1266,5 @@ __name(TreeRootShell, "TreeRootShell");
1266
1266
  var TreeRoot_default = TreeRoot;
1267
1267
 
1268
1268
  export { DEFAULT_TREE_APPEARANCE, DEFAULT_TREE_LABELS, TreeChevron, TreeContent, TreeEmpty, TreeIcon, TreeIndentGuides, TreeLabel, TreeProvider, TreeRoot, TreeRoot_default, TreeRow, TreeSearchInput, appearanceToStyle, clearTreeState, createChildCache, flattenTree, loadTreeState, resolveAppearance, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead };
1269
- //# sourceMappingURL=chunk-MOME6KYD.mjs.map
1270
- //# sourceMappingURL=chunk-MOME6KYD.mjs.map
1269
+ //# sourceMappingURL=chunk-G5IEC7SR.mjs.map
1270
+ //# sourceMappingURL=chunk-G5IEC7SR.mjs.map