@djangocfg/ui-tools 2.1.418 → 2.1.420

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 (310) hide show
  1. package/README.md +51 -224
  2. package/dist/file-icon/index.cjs +3 -3
  3. package/dist/file-icon/index.cjs.map +1 -1
  4. package/dist/file-icon/index.mjs +3 -3
  5. package/dist/file-icon/index.mjs.map +1 -1
  6. package/package.json +93 -28
  7. package/src/common/FloatingToolbar/actions/CopyAction.tsx +31 -0
  8. package/src/{components → common}/FloatingToolbar/actions/DownloadAction.tsx +15 -10
  9. package/src/common/FloatingToolbar/actions/ExpandAction.tsx +33 -0
  10. package/src/common/FloatingToolbar/actions/FullscreenAction.tsx +38 -0
  11. package/src/{components → common}/FloatingToolbar/index.tsx +39 -0
  12. package/src/lib/http.ts +64 -0
  13. package/src/tools/chat/index.ts +1 -1
  14. package/src/tools/chat/launcher/ChatFAB.tsx +66 -74
  15. package/src/tools/chat/launcher/header/ChatHeaderActionButton.tsx +2 -3
  16. package/src/tools/chat/lazy.tsx +1 -1
  17. package/src/tools/chat/messages/MessageBubble.tsx +1 -1
  18. package/src/tools/chat/messages/blocks/builtin.tsx +1 -1
  19. package/src/tools/chat/messages/blocks/renderers/CodeBlock.tsx +2 -2
  20. package/src/tools/chat/messages/blocks/renderers/JsonBlock.tsx +12 -1
  21. package/src/tools/data/DataGrid/README.md +48 -0
  22. package/src/tools/data/DataGrid/lazy.tsx +1 -1
  23. package/src/tools/data/DataTable/README.md +42 -0
  24. package/src/tools/data/DataTable/lazy.tsx +1 -1
  25. package/src/tools/data/JsonTree/JsonViewer.tsx +720 -0
  26. package/src/tools/data/JsonTree/README.md +126 -73
  27. package/src/tools/data/JsonTree/index.tsx +3 -95
  28. package/src/tools/data/JsonTree/lazy.tsx +10 -50
  29. package/src/tools/data/JsonTree/types.ts +82 -63
  30. package/src/tools/data/Kanban/lazy.tsx +1 -1
  31. package/src/tools/data/Listbox/lazy.tsx +1 -1
  32. package/src/tools/data/Masonry/lazy.tsx +1 -1
  33. package/src/tools/data/Timeline/lazy.tsx +1 -1
  34. package/src/tools/data/Tree/lazy.tsx +1 -1
  35. package/src/tools/dev/Map/lazy.tsx +1 -1
  36. package/src/tools/dev/Mermaid/Mermaid.client.tsx +2 -2
  37. package/src/tools/dev/Mermaid/README.md +46 -0
  38. package/src/tools/dev/Mermaid/lazy.tsx +1 -1
  39. package/src/tools/dev/api/ApiRefTable/ApiRefTable.tsx +65 -0
  40. package/src/tools/dev/api/ApiRefTable/README.md +31 -0
  41. package/src/tools/dev/api/ApiRefTable/components/Row.tsx +96 -0
  42. package/src/tools/dev/api/ApiRefTable/components/TypeDisplay.tsx +44 -0
  43. package/src/tools/dev/api/ApiRefTable/index.ts +6 -0
  44. package/src/tools/dev/api/ApiRefTable/lazy.tsx +21 -0
  45. package/src/tools/dev/api/ApiRefTable/types.ts +82 -0
  46. package/src/tools/dev/api/ApiRefTable/utils.ts +42 -0
  47. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/ApiIntroSection.tsx +1 -1
  48. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/index.tsx +1 -1
  49. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/index.tsx +1 -1
  50. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseBody.tsx +7 -21
  51. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/RequestPanel.tsx +1 -1
  52. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/PrettyView.tsx +13 -19
  53. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/types.ts +1 -1
  54. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/lazy.tsx +1 -1
  55. package/src/tools/dev/api/RequestViewer/README.md +33 -0
  56. package/src/tools/dev/api/RequestViewer/RequestViewer.tsx +121 -0
  57. package/src/tools/dev/api/RequestViewer/components/BodyTab.tsx +44 -0
  58. package/src/tools/dev/api/RequestViewer/components/EmptyState.tsx +13 -0
  59. package/src/tools/dev/api/RequestViewer/components/HeadersTab.tsx +78 -0
  60. package/src/tools/dev/api/RequestViewer/components/TimingTab.tsx +113 -0
  61. package/src/tools/dev/api/RequestViewer/components/utils.ts +31 -0
  62. package/src/tools/dev/api/RequestViewer/index.ts +16 -0
  63. package/src/tools/dev/api/RequestViewer/lazy.tsx +30 -0
  64. package/src/tools/dev/api/RequestViewer/types.ts +81 -0
  65. package/src/tools/dev/code/DiffViewer/DiffViewer.tsx +144 -0
  66. package/src/tools/dev/code/DiffViewer/README.md +33 -0
  67. package/src/tools/dev/code/DiffViewer/components/CopyButton.tsx +49 -0
  68. package/src/tools/dev/code/DiffViewer/components/DiffLineContent.tsx +48 -0
  69. package/src/tools/dev/code/DiffViewer/components/SplitView.tsx +220 -0
  70. package/src/tools/dev/code/DiffViewer/components/UnifiedView.tsx +154 -0
  71. package/src/tools/dev/code/DiffViewer/hooks/useDiff.ts +47 -0
  72. package/src/tools/dev/code/DiffViewer/hooks/useHighlighter.ts +54 -0
  73. package/src/tools/dev/code/DiffViewer/index.ts +22 -0
  74. package/src/tools/dev/code/DiffViewer/lazy.tsx +22 -0
  75. package/src/tools/dev/code/DiffViewer/types.ts +109 -0
  76. package/src/tools/dev/code/DiffViewer/utils/computeDiff.ts +159 -0
  77. package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/CollapseToggle.tsx +1 -1
  78. package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/MarkdownMessage.tsx +1 -1
  79. package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/components.tsx +2 -2
  80. package/src/tools/dev/{PrettyCode → code/PrettyCode}/PrettyCode.client.tsx +2 -2
  81. package/src/tools/dev/{PrettyCode → code/PrettyCode}/lazy.tsx +1 -1
  82. package/src/tools/dev/ops/EnvTable/EnvTable.tsx +228 -0
  83. package/src/tools/dev/ops/EnvTable/README.md +29 -0
  84. package/src/tools/dev/ops/EnvTable/hooks/useEnvMask.ts +121 -0
  85. package/src/tools/dev/ops/EnvTable/index.ts +12 -0
  86. package/src/tools/dev/ops/EnvTable/lazy.tsx +21 -0
  87. package/src/tools/dev/ops/EnvTable/types.ts +76 -0
  88. package/src/tools/dev/ops/LogViewer/LogViewer.tsx +194 -0
  89. package/src/tools/dev/ops/LogViewer/README.md +30 -0
  90. package/src/tools/dev/ops/LogViewer/components/LogRow.tsx +151 -0
  91. package/src/tools/dev/ops/LogViewer/components/Toolbar.tsx +199 -0
  92. package/src/tools/dev/ops/LogViewer/hooks/useAutoScroll.ts +68 -0
  93. package/src/tools/dev/ops/LogViewer/hooks/useLogFilter.ts +58 -0
  94. package/src/tools/dev/ops/LogViewer/index.ts +18 -0
  95. package/src/tools/dev/ops/LogViewer/lazy.tsx +25 -0
  96. package/src/tools/dev/ops/LogViewer/types.ts +142 -0
  97. package/src/tools/dev/ops/LogViewer/utils/ansi.ts +231 -0
  98. package/src/tools/forms/CodeEditor/hooks/useEditorTheme.ts +13 -73
  99. package/src/tools/forms/CodeEditor/lazy.tsx +1 -1
  100. package/src/tools/forms/FileUpload/lazy.tsx +1 -1
  101. package/src/tools/forms/JsonEditor/JsonEditor.tsx +115 -0
  102. package/src/tools/forms/JsonEditor/index.ts +1 -0
  103. package/src/tools/forms/JsonEditor/lazy.tsx +24 -0
  104. package/src/tools/forms/JsonForm/index.ts +1 -1
  105. package/src/tools/forms/JsonForm/lazy.tsx +1 -1
  106. package/src/tools/forms/MarkdownEditor/lazy.tsx +1 -1
  107. package/src/tools/forms/NotionEditor/README.md +237 -0
  108. package/src/tools/forms/NotionEditor/lazy.tsx +1 -1
  109. package/src/tools/index.ts +153 -13
  110. package/src/tools/input/Combobox/lazy.tsx +1 -1
  111. package/src/tools/input/CronScheduler/README.md +61 -0
  112. package/src/tools/input/CronScheduler/components/CronPreview.README.md +28 -0
  113. package/src/tools/input/CronScheduler/components/CronPreview.tsx +136 -0
  114. package/src/tools/input/CronScheduler/components/index.ts +3 -0
  115. package/src/tools/input/CronScheduler/index.tsx +5 -1
  116. package/src/tools/input/CronScheduler/lazy.tsx +5 -1
  117. package/src/tools/input/CronScheduler/utils/cron-next-runs.ts +122 -0
  118. package/src/tools/input/CronScheduler/utils/index.ts +1 -0
  119. package/src/tools/input/Scroller/lazy.tsx +1 -1
  120. package/src/tools/input/Sortable/lazy.tsx +1 -1
  121. package/src/tools/input/SpeechRecognition/lazy.tsx +1 -1
  122. package/src/tools/input/SpeechRecognition/widgets/VoiceComposerSlot.tsx +41 -36
  123. package/src/tools/media/ImageViewer/components/ImageToolbar.tsx +58 -47
  124. package/src/tools/media/ImageViewer/components/ImageViewer.tsx +27 -19
  125. package/src/tools/media/ImageViewer/lazy.tsx +1 -1
  126. package/src/tools/media/LottiePlayer/lazy.tsx +1 -1
  127. package/src/tools/media/VideoPlayer/VideoPlayer.tsx +28 -1
  128. package/src/tools/media/VideoPlayer/parts/fullscreen.tsx +21 -4
  129. package/src/tools/media/VideoPlayer/parts/pip.tsx +21 -4
  130. package/src/tools/media/VideoPlayer/parts/play-button.tsx +21 -4
  131. package/src/tools/media/VideoPlayer/parts/playback-rate.tsx +19 -3
  132. package/src/tools/media/VideoPlayer/parts/volume.tsx +237 -18
  133. package/src/tools/media/VideoPlayer/styles/video-player.css +87 -7
  134. package/src/tools/overlay/ResponsiveDialog/lazy.tsx +1 -1
  135. package/src/tools/overlay/ScrollSpy/lazy.tsx +1 -1
  136. package/src/tools/overlay/SelectionToolbar/lazy.tsx +1 -1
  137. package/src/tools/overlay/Tour/lazy.tsx +1 -1
  138. package/src/tools/visual/Marquee/lazy.tsx +1 -1
  139. package/src/tools/visual/QRCode/lazy.tsx +1 -1
  140. package/src/tools/visual/charts/ActivityGraph/ActivityGraph.tsx +195 -0
  141. package/src/tools/visual/charts/ActivityGraph/README.md +28 -0
  142. package/src/tools/visual/charts/ActivityGraph/index.ts +8 -0
  143. package/src/tools/visual/charts/ActivityGraph/lazy.tsx +21 -0
  144. package/src/tools/visual/charts/ActivityGraph/types.ts +59 -0
  145. package/src/tools/visual/charts/ActivityGraph/utils.ts +88 -0
  146. package/src/tools/visual/charts/CommitGraph/CommitGraph.tsx +80 -0
  147. package/src/tools/visual/charts/CommitGraph/README.md +28 -0
  148. package/src/tools/visual/charts/CommitGraph/components/CommitDetail.tsx +107 -0
  149. package/src/tools/visual/charts/CommitGraph/components/CommitRow.tsx +122 -0
  150. package/src/tools/visual/charts/CommitGraph/components/Rails.tsx +171 -0
  151. package/src/tools/visual/charts/CommitGraph/hooks/useGraphLayout.ts +169 -0
  152. package/src/tools/visual/charts/CommitGraph/hooks/useLaneColors.ts +45 -0
  153. package/src/tools/visual/charts/CommitGraph/index.ts +14 -0
  154. package/src/tools/visual/charts/CommitGraph/lazy.tsx +25 -0
  155. package/src/tools/visual/charts/CommitGraph/types.ts +85 -0
  156. package/src/tools/visual/charts/CommitGraph/utils.ts +53 -0
  157. package/src/tools/visual/charts/Gauge/README.md +45 -0
  158. package/src/tools/visual/{Gauge → charts/Gauge}/lazy.tsx +1 -1
  159. package/src/tools/visual/charts/Sparkline/README.md +29 -0
  160. package/src/tools/visual/charts/Sparkline/Sparkline.tsx +217 -0
  161. package/src/tools/visual/charts/Sparkline/index.ts +9 -0
  162. package/src/tools/visual/charts/Sparkline/lazy.tsx +26 -0
  163. package/src/tools/visual/charts/Sparkline/types.ts +58 -0
  164. package/src/tools/visual/design/ColorPalette/ColorPalette.tsx +129 -0
  165. package/src/tools/visual/design/ColorPalette/README.md +34 -0
  166. package/src/tools/visual/design/ColorPalette/components/Swatch.tsx +102 -0
  167. package/src/tools/visual/design/ColorPalette/hooks/useCopyToClipboard.ts +41 -0
  168. package/src/tools/visual/design/ColorPalette/index.ts +12 -0
  169. package/src/tools/visual/design/ColorPalette/lazy.tsx +21 -0
  170. package/src/tools/visual/design/ColorPalette/types.ts +63 -0
  171. package/src/tools/visual/design/ColorPalette/utils.ts +83 -0
  172. package/src/tools/visual/{ColorPicker → design/ColorPicker}/lazy.tsx +1 -1
  173. package/src/tools/visual/{FileIcon → design/FileIcon}/treeAdapter.tsx +1 -1
  174. package/src/tools/visual/{Fps → indicators/Fps}/lazy.tsx +1 -1
  175. package/src/tools/visual/{Rating → indicators/Rating}/lazy.tsx +1 -1
  176. package/src/tools/visual/indicators/StatusIndicator/README.md +28 -0
  177. package/src/tools/visual/indicators/StatusIndicator/StatusIndicator.tsx +83 -0
  178. package/src/tools/visual/indicators/StatusIndicator/index.ts +14 -0
  179. package/src/tools/visual/indicators/StatusIndicator/lazy.tsx +21 -0
  180. package/src/tools/visual/indicators/StatusIndicator/types.ts +133 -0
  181. package/src/components/FloatingToolbar/actions/CopyAction.tsx +0 -22
  182. package/src/components/FloatingToolbar/actions/ExpandAction.tsx +0 -25
  183. package/src/components/FloatingToolbar/actions/FullscreenAction.tsx +0 -30
  184. package/src/tools/data/JsonTree/components/JsonContent.tsx +0 -197
  185. package/src/tools/data/JsonTree/hooks/useJsonExpand.ts +0 -50
  186. /package/src/{components → common}/FloatingToolbar/FloatingToolbar.css +0 -0
  187. /package/src/{components → common}/FloatingToolbar/actions/index.ts +0 -0
  188. /package/src/{components → common}/FloatingToolbar/hooks/useElementCorner.ts +0 -0
  189. /package/src/{components → common}/FloatingToolbar/hooks/useScrollIsolation.ts +0 -0
  190. /package/src/{components → common}/index.ts +0 -0
  191. /package/src/{components → common}/lazy-wrapper.tsx +0 -0
  192. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/README.md +0 -0
  193. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/DocsView.tsx +0 -0
  194. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/LanguageTabs.tsx +0 -0
  195. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/useCodeSnippet.ts +0 -0
  196. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MetaActions.tsx +0 -0
  197. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MethodBadge.tsx +0 -0
  198. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/PathDisplay.tsx +0 -0
  199. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamGroup.tsx +0 -0
  200. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamRow.tsx +0 -0
  201. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/index.tsx +0 -0
  202. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/RequestBody/index.tsx +0 -0
  203. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseRow.tsx +0 -0
  204. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/StatusTag.tsx +0 -0
  205. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/index.tsx +0 -0
  206. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/FieldRow.tsx +0 -0
  207. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/buildTree.ts +0 -0
  208. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/index.tsx +0 -0
  209. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/types.ts +0 -0
  210. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/SectionHeader.tsx +0 -0
  211. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/defaults.ts +0 -0
  212. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/index.tsx +0 -0
  213. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/context.tsx +0 -0
  214. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/hooks/useSectionHash.ts +0 -0
  215. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/index.tsx +0 -0
  216. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/index.ts +0 -0
  217. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/selectors.ts +0 -0
  218. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/types.ts +0 -0
  219. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/SchemaCopyMenu.tsx +0 -0
  220. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/BrandHeader.tsx +0 -0
  221. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/CategoryBlock.tsx +0 -0
  222. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/EndpointRow.tsx +0 -0
  223. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SchemaSection.tsx +0 -0
  224. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SearchInput.tsx +0 -0
  225. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SidebarBody.tsx +0 -0
  226. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/Toolbar.tsx +0 -0
  227. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/buildVM.ts +0 -0
  228. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/index.tsx +0 -0
  229. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/types.ts +0 -0
  230. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/useDebouncedValue.ts +0 -0
  231. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/SlideInPlayground.tsx +0 -0
  232. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/TryItSheet.tsx +0 -0
  233. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/anchor.ts +0 -0
  234. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/grouping.ts +0 -0
  235. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/index.tsx +0 -0
  236. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/sidebarLabel.ts +0 -0
  237. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/index.ts +0 -0
  238. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/BodyFormEditor.tsx +0 -0
  239. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/EndpointDraftSync.tsx +0 -0
  240. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/EndpointResetButton.tsx +0 -0
  241. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/PreviewView.tsx +0 -0
  242. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/RawView.tsx +0 -0
  243. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/StatusBar.tsx +0 -0
  244. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/ViewTabs.tsx +0 -0
  245. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/detectContent.ts +0 -0
  246. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/index.tsx +0 -0
  247. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/useResponseView.ts +0 -0
  248. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/SendButton.tsx +0 -0
  249. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ui.tsx +0 -0
  250. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/constants.ts +0 -0
  251. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/context/PlaygroundContext.tsx +0 -0
  252. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/index.ts +0 -0
  253. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useDocsUrlSync.ts +0 -0
  254. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useEndpointDraft.ts +0 -0
  255. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useMobile.ts +0 -0
  256. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useOpenApiSchema.ts +0 -0
  257. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/index.tsx +0 -0
  258. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/types.ts +0 -0
  259. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/apiKeyManager.ts +0 -0
  260. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/codeSamples.ts +0 -0
  261. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/formatters.ts +0 -0
  262. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/index.ts +0 -0
  263. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/operationToHar.ts +0 -0
  264. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/sampler.ts +0 -0
  265. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/schemaExport.ts +0 -0
  266. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/scrollParent.ts +0 -0
  267. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/url.ts +0 -0
  268. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/versionManager.ts +0 -0
  269. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/ActionRow.tsx +0 -0
  270. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/ChatMessageRow.tsx +0 -0
  271. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/CodeBlock.tsx +0 -0
  272. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/README.md +0 -0
  273. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/index.ts +0 -0
  274. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/linkRules.ts +0 -0
  275. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/plainText.ts +0 -0
  276. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/sanitize.ts +0 -0
  277. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/types.ts +0 -0
  278. /package/src/tools/dev/{PrettyCode → code/PrettyCode}/README.md +0 -0
  279. /package/src/tools/dev/{PrettyCode → code/PrettyCode}/index.tsx +0 -0
  280. /package/src/tools/dev/{PrettyCode → code/PrettyCode}/registerPrismLanguages.ts +0 -0
  281. /package/src/tools/visual/{Gauge → charts/Gauge}/Gauge.tsx +0 -0
  282. /package/src/tools/visual/{Gauge → charts/Gauge}/index.ts +0 -0
  283. /package/src/tools/visual/{Gauge → charts/Gauge}/types.ts +0 -0
  284. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/ColorPicker.tsx +0 -0
  285. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/ColorPickerContext.tsx +0 -0
  286. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/ColorPickerStore.tsx +0 -0
  287. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/index.ts +0 -0
  288. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/index.ts +0 -0
  289. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/lib/color-utils.ts +0 -0
  290. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerAlphaSlider.tsx +0 -0
  291. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerArea.tsx +0 -0
  292. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerEyeDropper.tsx +0 -0
  293. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerFormatSelect.tsx +0 -0
  294. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerHueSlider.tsx +0 -0
  295. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerInput.tsx +0 -0
  296. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerSwatch.tsx +0 -0
  297. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/index.ts +0 -0
  298. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/types.ts +0 -0
  299. /package/src/tools/visual/{FileIcon → design/FileIcon}/FileIcon.tsx +0 -0
  300. /package/src/tools/visual/{FileIcon → design/FileIcon}/get-file-icon.ts +0 -0
  301. /package/src/tools/visual/{FileIcon → design/FileIcon}/icons/icon-data.ts +0 -0
  302. /package/src/tools/visual/{FileIcon → design/FileIcon}/index.ts +0 -0
  303. /package/src/tools/visual/{FileIcon → design/FileIcon}/loader.ts +0 -0
  304. /package/src/tools/visual/{FileIcon → design/FileIcon}/specialFolders.ts +0 -0
  305. /package/src/tools/visual/{Fps → indicators/Fps}/Fps.tsx +0 -0
  306. /package/src/tools/visual/{Fps → indicators/Fps}/index.ts +0 -0
  307. /package/src/tools/visual/{Fps → indicators/Fps}/types.ts +0 -0
  308. /package/src/tools/visual/{Rating → indicators/Rating}/Rating.tsx +0 -0
  309. /package/src/tools/visual/{Rating → indicators/Rating}/index.ts +0 -0
  310. /package/src/tools/visual/{Rating → indicators/Rating}/types.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djangocfg/ui-tools",
3
- "version": "2.1.418",
3
+ "version": "2.1.420",
4
4
  "description": "Heavy React tools with lazy loading - for Electron, Vite, CRA, Next.js apps",
5
5
  "keywords": [
6
6
  "ui-tools",
@@ -106,6 +106,11 @@
106
106
  "import": "./src/tools/data/JsonTree/lazy.tsx",
107
107
  "require": "./src/tools/data/JsonTree/lazy.tsx"
108
108
  },
109
+ "./json-editor": {
110
+ "types": "./src/tools/forms/JsonEditor/lazy.tsx",
111
+ "import": "./src/tools/forms/JsonEditor/lazy.tsx",
112
+ "require": "./src/tools/forms/JsonEditor/lazy.tsx"
113
+ },
109
114
  "./lottie-player": {
110
115
  "types": "./src/tools/media/LottiePlayer/lazy.tsx",
111
116
  "import": "./src/tools/media/LottiePlayer/lazy.tsx",
@@ -122,19 +127,34 @@
122
127
  "require": "./src/tools/forms/NotionEditor/lazy.tsx"
123
128
  },
124
129
  "./markdown-message": {
125
- "types": "./src/tools/dev/MarkdownMessage/index.ts",
126
- "import": "./src/tools/dev/MarkdownMessage/index.ts",
127
- "require": "./src/tools/dev/MarkdownMessage/index.ts"
130
+ "types": "./src/tools/dev/code/MarkdownMessage/index.ts",
131
+ "import": "./src/tools/dev/code/MarkdownMessage/index.ts",
132
+ "require": "./src/tools/dev/code/MarkdownMessage/index.ts"
128
133
  },
129
134
  "./openapi-viewer": {
130
- "types": "./src/tools/dev/OpenapiViewer/lazy.tsx",
131
- "import": "./src/tools/dev/OpenapiViewer/lazy.tsx",
132
- "require": "./src/tools/dev/OpenapiViewer/lazy.tsx"
135
+ "types": "./src/tools/dev/api/OpenapiViewer/lazy.tsx",
136
+ "import": "./src/tools/dev/api/OpenapiViewer/lazy.tsx",
137
+ "require": "./src/tools/dev/api/OpenapiViewer/lazy.tsx"
138
+ },
139
+ "./request-viewer": {
140
+ "types": "./src/tools/dev/api/RequestViewer/index.ts",
141
+ "import": "./src/tools/dev/api/RequestViewer/index.ts",
142
+ "require": "./src/tools/dev/api/RequestViewer/index.ts"
133
143
  },
134
144
  "./pretty-code": {
135
- "types": "./src/tools/dev/PrettyCode/lazy.tsx",
136
- "import": "./src/tools/dev/PrettyCode/lazy.tsx",
137
- "require": "./src/tools/dev/PrettyCode/lazy.tsx"
145
+ "types": "./src/tools/dev/code/PrettyCode/lazy.tsx",
146
+ "import": "./src/tools/dev/code/PrettyCode/lazy.tsx",
147
+ "require": "./src/tools/dev/code/PrettyCode/lazy.tsx"
148
+ },
149
+ "./diff-viewer": {
150
+ "types": "./src/tools/dev/code/DiffViewer/lazy.tsx",
151
+ "import": "./src/tools/dev/code/DiffViewer/lazy.tsx",
152
+ "require": "./src/tools/dev/code/DiffViewer/lazy.tsx"
153
+ },
154
+ "./diff-viewer/full": {
155
+ "types": "./src/tools/dev/code/DiffViewer/index.ts",
156
+ "import": "./src/tools/dev/code/DiffViewer/index.ts",
157
+ "require": "./src/tools/dev/code/DiffViewer/index.ts"
138
158
  },
139
159
  "./video-player": {
140
160
  "types": "./src/tools/media/VideoPlayer/lazy.tsx",
@@ -182,9 +202,14 @@
182
202
  "require": "./src/tools/input/Combobox/index.ts"
183
203
  },
184
204
  "./color-picker": {
185
- "types": "./src/tools/visual/ColorPicker/index.ts",
186
- "import": "./src/tools/visual/ColorPicker/index.ts",
187
- "require": "./src/tools/visual/ColorPicker/index.ts"
205
+ "types": "./src/tools/visual/design/ColorPicker/index.ts",
206
+ "import": "./src/tools/visual/design/ColorPicker/index.ts",
207
+ "require": "./src/tools/visual/design/ColorPicker/index.ts"
208
+ },
209
+ "./color-palette": {
210
+ "types": "./src/tools/visual/design/ColorPalette/index.ts",
211
+ "import": "./src/tools/visual/design/ColorPalette/index.ts",
212
+ "require": "./src/tools/visual/design/ColorPalette/index.ts"
188
213
  },
189
214
  "./file-upload": {
190
215
  "types": "./src/tools/forms/FileUpload/index.ts",
@@ -192,14 +217,14 @@
192
217
  "require": "./src/tools/forms/FileUpload/index.ts"
193
218
  },
194
219
  "./fps": {
195
- "types": "./src/tools/visual/Fps/index.ts",
196
- "import": "./src/tools/visual/Fps/index.ts",
197
- "require": "./src/tools/visual/Fps/index.ts"
220
+ "types": "./src/tools/visual/indicators/Fps/index.ts",
221
+ "import": "./src/tools/visual/indicators/Fps/index.ts",
222
+ "require": "./src/tools/visual/indicators/Fps/index.ts"
198
223
  },
199
224
  "./gauge": {
200
- "types": "./src/tools/visual/Gauge/index.ts",
201
- "import": "./src/tools/visual/Gauge/index.ts",
202
- "require": "./src/tools/visual/Gauge/index.ts"
225
+ "types": "./src/tools/visual/charts/Gauge/index.ts",
226
+ "import": "./src/tools/visual/charts/Gauge/index.ts",
227
+ "require": "./src/tools/visual/charts/Gauge/index.ts"
203
228
  },
204
229
  "./marquee": {
205
230
  "types": "./src/tools/visual/Marquee/index.ts",
@@ -211,10 +236,50 @@
211
236
  "import": "./src/tools/visual/QRCode/index.ts",
212
237
  "require": "./src/tools/visual/QRCode/index.ts"
213
238
  },
239
+ "./status-indicator": {
240
+ "types": "./src/tools/visual/indicators/StatusIndicator/index.ts",
241
+ "import": "./src/tools/visual/indicators/StatusIndicator/index.ts",
242
+ "require": "./src/tools/visual/indicators/StatusIndicator/index.ts"
243
+ },
244
+ "./api-ref-table": {
245
+ "types": "./src/tools/dev/api/ApiRefTable/index.ts",
246
+ "import": "./src/tools/dev/api/ApiRefTable/index.ts",
247
+ "require": "./src/tools/dev/api/ApiRefTable/index.ts"
248
+ },
249
+ "./env-table": {
250
+ "types": "./src/tools/dev/ops/EnvTable/index.ts",
251
+ "import": "./src/tools/dev/ops/EnvTable/index.ts",
252
+ "require": "./src/tools/dev/ops/EnvTable/index.ts"
253
+ },
254
+ "./log-viewer": {
255
+ "types": "./src/tools/dev/ops/LogViewer/lazy.tsx",
256
+ "import": "./src/tools/dev/ops/LogViewer/lazy.tsx",
257
+ "require": "./src/tools/dev/ops/LogViewer/lazy.tsx"
258
+ },
259
+ "./log-viewer/full": {
260
+ "types": "./src/tools/dev/ops/LogViewer/index.ts",
261
+ "import": "./src/tools/dev/ops/LogViewer/index.ts",
262
+ "require": "./src/tools/dev/ops/LogViewer/index.ts"
263
+ },
264
+ "./activity-graph": {
265
+ "types": "./src/tools/visual/charts/ActivityGraph/index.ts",
266
+ "import": "./src/tools/visual/charts/ActivityGraph/index.ts",
267
+ "require": "./src/tools/visual/charts/ActivityGraph/index.ts"
268
+ },
269
+ "./commit-graph": {
270
+ "types": "./src/tools/visual/charts/CommitGraph/index.ts",
271
+ "import": "./src/tools/visual/charts/CommitGraph/index.ts",
272
+ "require": "./src/tools/visual/charts/CommitGraph/index.ts"
273
+ },
274
+ "./sparkline": {
275
+ "types": "./src/tools/visual/charts/Sparkline/index.ts",
276
+ "import": "./src/tools/visual/charts/Sparkline/index.ts",
277
+ "require": "./src/tools/visual/charts/Sparkline/index.ts"
278
+ },
214
279
  "./rating": {
215
- "types": "./src/tools/visual/Rating/index.ts",
216
- "import": "./src/tools/visual/Rating/index.ts",
217
- "require": "./src/tools/visual/Rating/index.ts"
280
+ "types": "./src/tools/visual/indicators/Rating/index.ts",
281
+ "import": "./src/tools/visual/indicators/Rating/index.ts",
282
+ "require": "./src/tools/visual/indicators/Rating/index.ts"
218
283
  },
219
284
  "./listbox": {
220
285
  "types": "./src/tools/data/Listbox/index.ts",
@@ -264,8 +329,8 @@
264
329
  "test:watch": "vitest"
265
330
  },
266
331
  "peerDependencies": {
267
- "@djangocfg/i18n": "^2.1.418",
268
- "@djangocfg/ui-core": "^2.1.418",
332
+ "@djangocfg/i18n": "^2.1.420",
333
+ "@djangocfg/ui-core": "^2.1.420",
269
334
  "consola": "^3.4.2",
270
335
  "lodash-es": "^4.18.1",
271
336
  "lucide-react": "^0.545.0",
@@ -316,7 +381,7 @@
316
381
  "openapi-sampler": "^1.7.2",
317
382
  "prism-react-renderer": "^2.4.1",
318
383
  "prismjs": "^1.30.0",
319
- "react-json-tree": "^0.20.0",
384
+ "json-edit-react": "^1.30.1",
320
385
  "react-lottie-player": "^2.1.0",
321
386
  "react-map-gl": "^8.1.0",
322
387
  "react-markdown": "10.1.0",
@@ -340,9 +405,9 @@
340
405
  "@maplibre/maplibre-gl-geocoder": "^1.7.0"
341
406
  },
342
407
  "devDependencies": {
343
- "@djangocfg/i18n": "^2.1.418",
344
- "@djangocfg/typescript-config": "^2.1.418",
345
- "@djangocfg/ui-core": "^2.1.418",
408
+ "@djangocfg/i18n": "^2.1.420",
409
+ "@djangocfg/typescript-config": "^2.1.420",
410
+ "@djangocfg/ui-core": "^2.1.420",
346
411
  "@types/lodash-es": "^4.17.12",
347
412
  "@types/mapbox__mapbox-gl-draw": "^1.4.8",
348
413
  "@types/node": "^25.2.3",
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import {
5
+ CopyButton,
6
+ Tooltip,
7
+ TooltipContent,
8
+ TooltipTrigger,
9
+ } from '@djangocfg/ui-core/components';
10
+
11
+ interface CopyActionProps {
12
+ value: string;
13
+ title?: string;
14
+ }
15
+
16
+ const BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';
17
+
18
+ export const CopyAction: React.FC<CopyActionProps> = ({ value, title = 'Copy' }) => (
19
+ <Tooltip>
20
+ <TooltipTrigger asChild>
21
+ <CopyButton
22
+ value={value}
23
+ variant="ghost"
24
+ size="icon"
25
+ className={BUTTON_CLASS}
26
+ iconClassName="h-3 w-3"
27
+ />
28
+ </TooltipTrigger>
29
+ <TooltipContent side="top">{title}</TooltipContent>
30
+ </Tooltip>
31
+ );
@@ -3,7 +3,7 @@
3
3
  import { Download } from 'lucide-react';
4
4
  import React from 'react';
5
5
 
6
- import { Button } from '@djangocfg/ui-core/components';
6
+ import { Button, Tooltip, TooltipContent, TooltipTrigger } from '@djangocfg/ui-core/components';
7
7
 
8
8
  interface DownloadActionProps {
9
9
  value: string;
@@ -33,14 +33,19 @@ export const DownloadAction: React.FC<DownloadActionProps> = ({
33
33
  };
34
34
 
35
35
  return (
36
- <Button
37
- variant="ghost"
38
- size="icon"
39
- onClick={handleDownload}
40
- className={BUTTON_CLASS}
41
- title={title}
42
- >
43
- <Download className="h-3 w-3" />
44
- </Button>
36
+ <Tooltip>
37
+ <TooltipTrigger asChild>
38
+ <Button
39
+ variant="ghost"
40
+ size="icon"
41
+ onClick={handleDownload}
42
+ aria-label={title}
43
+ className={BUTTON_CLASS}
44
+ >
45
+ <Download className="h-3 w-3" />
46
+ </Button>
47
+ </TooltipTrigger>
48
+ <TooltipContent side="top">{title}</TooltipContent>
49
+ </Tooltip>
45
50
  );
46
51
  };
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+
3
+ import { ChevronDown, ChevronUp } from 'lucide-react';
4
+ import React from 'react';
5
+
6
+ import { Button, Tooltip, TooltipContent, TooltipTrigger } from '@djangocfg/ui-core/components';
7
+
8
+ interface ExpandActionProps {
9
+ isExpanded: boolean;
10
+ onToggle: () => void;
11
+ }
12
+
13
+ const BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';
14
+
15
+ export const ExpandAction: React.FC<ExpandActionProps> = ({ isExpanded, onToggle }) => {
16
+ const label = isExpanded ? 'Collapse All' : 'Expand All';
17
+ return (
18
+ <Tooltip>
19
+ <TooltipTrigger asChild>
20
+ <Button
21
+ variant="ghost"
22
+ size="icon"
23
+ onClick={onToggle}
24
+ aria-label={label}
25
+ className={BUTTON_CLASS}
26
+ >
27
+ {isExpanded ? <ChevronUp className="h-3 w-3" /> : <ChevronDown className="h-3 w-3" />}
28
+ </Button>
29
+ </TooltipTrigger>
30
+ <TooltipContent side="top">{label}</TooltipContent>
31
+ </Tooltip>
32
+ );
33
+ };
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+
3
+ import { Maximize2, Minimize2 } from 'lucide-react';
4
+ import React from 'react';
5
+
6
+ import { Button, Tooltip, TooltipContent, TooltipTrigger } from '@djangocfg/ui-core/components';
7
+
8
+ interface FullscreenActionProps {
9
+ isFullscreen?: boolean;
10
+ onToggle: () => void;
11
+ title?: string;
12
+ }
13
+
14
+ const BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';
15
+
16
+ export const FullscreenAction: React.FC<FullscreenActionProps> = ({
17
+ isFullscreen = false,
18
+ onToggle,
19
+ title,
20
+ }) => {
21
+ const label = title ?? (isFullscreen ? 'Exit fullscreen' : 'Fullscreen');
22
+ return (
23
+ <Tooltip>
24
+ <TooltipTrigger asChild>
25
+ <Button
26
+ variant="ghost"
27
+ size="icon"
28
+ onClick={onToggle}
29
+ aria-label={label}
30
+ className={BUTTON_CLASS}
31
+ >
32
+ {isFullscreen ? <Minimize2 className="h-3 w-3" /> : <Maximize2 className="h-3 w-3" />}
33
+ </Button>
34
+ </TooltipTrigger>
35
+ <TooltipContent side="top">{label}</TooltipContent>
36
+ </Tooltip>
37
+ );
38
+ };
@@ -53,6 +53,13 @@ export interface FloatingToolbarProps {
53
53
  * @default true
54
54
  */
55
55
  scrollIsolation?: boolean;
56
+ /**
57
+ * Hide the toolbar until the user hovers the container. ChatGPT /
58
+ * GitHub-style: chrome stays out of the way, appears on demand.
59
+ * Keyboard focus inside the container also reveals it (a11y).
60
+ * @default false (always visible — back-compat)
61
+ */
62
+ autoHide?: boolean;
56
63
  }
57
64
 
58
65
  /**
@@ -67,6 +74,7 @@ export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
67
74
  offset = 8,
68
75
  zIndex = 30,
69
76
  scrollIsolation = true,
77
+ autoHide = false,
70
78
  }) => {
71
79
  // Isolation only engages when the container can actually scroll —
72
80
  // a block that fully fits never shows the "Click to scroll" overlay.
@@ -76,6 +84,29 @@ export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
76
84
  const { locked, unlock } = useScrollIsolation(containerRef, isolationActive);
77
85
  const [overlayHovered, setOverlayHovered] = useState(false);
78
86
 
87
+ // Track container hover + focus for ChatGPT-style auto-hide. We watch
88
+ // `mouseenter/leave` and `focusin/out` on the container so keyboard
89
+ // users still see the toolbar — `:hover` alone would hide it from
90
+ // them entirely.
91
+ const [containerActive, setContainerActive] = useState(false);
92
+ useEffect(() => {
93
+ if (!autoHide) return;
94
+ const el = containerRef.current;
95
+ if (!el) return;
96
+ const enter = () => setContainerActive(true);
97
+ const leave = () => setContainerActive(false);
98
+ el.addEventListener('mouseenter', enter);
99
+ el.addEventListener('mouseleave', leave);
100
+ el.addEventListener('focusin', enter);
101
+ el.addEventListener('focusout', leave);
102
+ return () => {
103
+ el.removeEventListener('mouseenter', enter);
104
+ el.removeEventListener('mouseleave', leave);
105
+ el.removeEventListener('focusin', enter);
106
+ el.removeEventListener('focusout', leave);
107
+ };
108
+ }, [autoHide, containerRef]);
109
+
79
110
  const overlay =
80
111
  isolationActive && locked ? (
81
112
  <div
@@ -117,6 +148,11 @@ export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
117
148
  ? { bottom: offset, right: offset }
118
149
  : { top: offset, right: offset };
119
150
 
151
+ // Auto-hide: invisible until the container is hovered or has keyboard
152
+ // focus inside. Opacity transition keeps the reveal smooth instead of
153
+ // popping. `pointer-events: none` while hidden so the toolbar doesn't
154
+ // intercept clicks on whatever sits behind it.
155
+ const hidden = autoHide && !containerActive;
120
156
  const toolbar = (
121
157
  <div
122
158
  className="flex items-center gap-1"
@@ -124,6 +160,9 @@ export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
124
160
  position: 'absolute',
125
161
  ...positionStyle,
126
162
  zIndex,
163
+ opacity: hidden ? 0 : 1,
164
+ pointerEvents: hidden ? 'none' : undefined,
165
+ transition: 'opacity 120ms ease-out',
127
166
  }}
128
167
  >
129
168
  {label && (
@@ -0,0 +1,64 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+ //
3
+ // HTTP semantic-token helpers shared between RequestViewer, OpenapiViewer,
4
+ // LogViewer, and any other tool that visualizes HTTP traffic.
5
+ //
6
+ // IMPORTANT: these helpers return semantic token *names*, not Tailwind
7
+ // classes or hex colors. Consumers map the token to their own surface
8
+ // (e.g. `bg-success/15 text-success` vs `border-success-border`). This
9
+ // keeps the mapping consistent across tools and theme presets.
10
+ //
11
+ // Source pattern: request-viewer.tsx:70-92.
12
+
13
+ export type HttpStatusTone =
14
+ | 'success' // 2xx
15
+ | 'info' // 3xx
16
+ | 'warning' // 4xx
17
+ | 'destructive' // 5xx
18
+ | 'muted'; // unknown / 1xx
19
+
20
+ export type HttpMethodTone =
21
+ | 'success' // GET
22
+ | 'info' // POST
23
+ | 'warning' // PUT / PATCH
24
+ | 'destructive' // DELETE
25
+ | 'muted'; // OPTIONS / HEAD / unknown
26
+
27
+ /**
28
+ * Map an HTTP status code to a semantic token name.
29
+ *
30
+ * @example
31
+ * statusColor(204) // 'success'
32
+ * statusColor(404) // 'warning'
33
+ * statusColor(503) // 'destructive'
34
+ */
35
+ export function statusColor(status: number): HttpStatusTone {
36
+ if (status >= 200 && status < 300) return 'success';
37
+ if (status >= 300 && status < 400) return 'info';
38
+ if (status >= 400 && status < 500) return 'warning';
39
+ if (status >= 500) return 'destructive';
40
+ return 'muted';
41
+ }
42
+
43
+ /**
44
+ * Map an HTTP method to a semantic token name. Case-insensitive.
45
+ *
46
+ * @example
47
+ * methodColor('GET') // 'success'
48
+ * methodColor('delete') // 'destructive'
49
+ */
50
+ export function methodColor(method: string): HttpMethodTone {
51
+ switch (method.toUpperCase()) {
52
+ case 'GET':
53
+ return 'success';
54
+ case 'POST':
55
+ return 'info';
56
+ case 'PUT':
57
+ case 'PATCH':
58
+ return 'warning';
59
+ case 'DELETE':
60
+ return 'destructive';
61
+ default:
62
+ return 'muted';
63
+ }
64
+ }
@@ -115,4 +115,4 @@ export {
115
115
  extractTextFromChildren,
116
116
  type MarkdownMessageProps,
117
117
  type LinkRule,
118
- } from '../dev/MarkdownMessage';
118
+ } from '../dev/code/MarkdownMessage';
@@ -5,6 +5,11 @@ import type { CSSProperties, ReactNode } from 'react';
5
5
 
6
6
  import { useIsPhone, useIsTabletOrBelow } from '@djangocfg/ui-core/hooks';
7
7
  import { cn } from '@djangocfg/ui-core/lib';
8
+ import {
9
+ Tooltip,
10
+ TooltipContent,
11
+ TooltipTrigger,
12
+ } from '@djangocfg/ui-core/components';
8
13
 
9
14
  import { Z_INDEX } from '../constants';
10
15
 
@@ -80,11 +85,9 @@ function positionStyle(position: ChatFABPosition, offset: number): CSSProperties
80
85
  return { [vert]: offset, [horiz]: offset } as CSSProperties;
81
86
  }
82
87
 
83
- function tooltipSideClasses(position: ChatFABPosition): string {
88
+ function tooltipSide(position: ChatFABPosition): 'left' | 'right' {
84
89
  // Tooltip sits opposite-horizontal to the FAB so it doesn't run off-screen.
85
- return position.endsWith('right')
86
- ? 'right-full mr-3 origin-right'
87
- : 'left-full ml-3 origin-left';
90
+ return position.endsWith('right') ? 'left' : 'right';
88
91
  }
89
92
 
90
93
  function Badge({ value }: { value: number }) {
@@ -114,24 +117,6 @@ function PulseDot() {
114
117
  );
115
118
  }
116
119
 
117
- function Tooltip({ text, side }: { text: string; side: string }) {
118
- return (
119
- <span
120
- role="tooltip"
121
- className={cn(
122
- 'pointer-events-none absolute top-1/2 -translate-y-1/2 whitespace-nowrap',
123
- 'rounded-md bg-popover px-2.5 py-1 text-xs font-medium text-popover-foreground shadow-md',
124
- 'border border-border opacity-0 scale-95 transition-all duration-150',
125
- 'group-hover:opacity-100 group-hover:scale-100',
126
- 'group-focus-within:opacity-100 group-focus-within:scale-100',
127
- side,
128
- )}
129
- >
130
- {text}
131
- </span>
132
- );
133
- }
134
-
135
120
  /**
136
121
  * Floating action button for opening a chat dock. Pure presentation — owns
137
122
  * no state. Wire it to whatever toggles your dock open.
@@ -165,65 +150,72 @@ export function ChatFAB({
165
150
  'transition-transform hover:scale-105',
166
151
  );
167
152
 
168
- return (
153
+ const fabNode =
154
+ variant === 'animated' ? (
155
+ <AnimatedFAB
156
+ ariaLabel={ariaLabel}
157
+ onClick={onClick}
158
+ size={px}
159
+ className={className}
160
+ style={style}
161
+ >
162
+ {renderedIcon}
163
+ </AnimatedFAB>
164
+ ) : variant === 'glass' ? (
165
+ <button
166
+ type="button"
167
+ aria-label={ariaLabel}
168
+ onClick={onClick}
169
+ className={cn(
170
+ baseButton,
171
+ 'border border-border/40 bg-background/60 text-foreground shadow-lg backdrop-blur-xl',
172
+ 'hover:bg-background/80',
173
+ className,
174
+ )}
175
+ style={{ width: px, height: px, ...style }}
176
+ >
177
+ {renderedIcon}
178
+ {badge !== undefined ? <Badge value={badge} /> : pulse ? <PulseDot /> : null}
179
+ </button>
180
+ ) : (
181
+ <button
182
+ type="button"
183
+ aria-label={ariaLabel}
184
+ onClick={onClick}
185
+ className={cn(
186
+ baseButton,
187
+ 'bg-primary text-primary-foreground hover:bg-primary/90 shadow-2xl',
188
+ className,
189
+ )}
190
+ style={{ width: px, height: px, ...style }}
191
+ >
192
+ {renderedIcon}
193
+ {badge !== undefined ? <Badge value={badge} /> : pulse ? <PulseDot /> : null}
194
+ </button>
195
+ );
196
+
197
+ // Wrap in our Tooltip when a tooltip label is provided. Animated variant
198
+ // ships a wrapping <div>, so we mount the Tooltip on the FAB node directly
199
+ // rather than relying on `asChild` forwarding through that wrapper.
200
+ const positioned = (
169
201
  <div
170
- className={cn('group', inline ? 'relative inline-flex' : 'fixed')}
202
+ className={inline ? 'relative inline-flex' : 'fixed'}
171
203
  style={
172
- inline
173
- ? undefined
174
- : { ...positionStyle(position, offset), zIndex }
204
+ inline ? undefined : { ...positionStyle(position, offset), zIndex }
175
205
  }
176
206
  >
177
- {variant === 'animated' && (
178
- <AnimatedFAB
179
- ariaLabel={ariaLabel}
180
- onClick={onClick}
181
- size={px}
182
- className={className}
183
- style={style}
184
- >
185
- {renderedIcon}
186
- </AnimatedFAB>
187
- )}
188
-
189
- {variant === 'glass' && (
190
- <button
191
- type="button"
192
- aria-label={ariaLabel}
193
- onClick={onClick}
194
- className={cn(
195
- baseButton,
196
- 'border border-border/40 bg-background/60 text-foreground shadow-lg backdrop-blur-xl',
197
- 'hover:bg-background/80',
198
- className,
199
- )}
200
- style={{ width: px, height: px, ...style }}
201
- >
202
- {renderedIcon}
203
- {badge !== undefined ? <Badge value={badge} /> : pulse ? <PulseDot /> : null}
204
- </button>
205
- )}
206
-
207
- {variant === 'simple' && (
208
- <button
209
- type="button"
210
- aria-label={ariaLabel}
211
- onClick={onClick}
212
- className={cn(
213
- baseButton,
214
- 'bg-primary text-primary-foreground hover:bg-primary/90 shadow-2xl',
215
- className,
216
- )}
217
- style={{ width: px, height: px, ...style }}
218
- >
219
- {renderedIcon}
220
- {badge !== undefined ? <Badge value={badge} /> : pulse ? <PulseDot /> : null}
221
- </button>
207
+ {tooltip ? (
208
+ <Tooltip>
209
+ <TooltipTrigger asChild>{fabNode}</TooltipTrigger>
210
+ <TooltipContent side={tooltipSide(position)}>{tooltip}</TooltipContent>
211
+ </Tooltip>
212
+ ) : (
213
+ fabNode
222
214
  )}
223
-
224
- {tooltip && <Tooltip text={tooltip} side={tooltipSideClasses(position)} />}
225
215
  </div>
226
216
  );
217
+
218
+ return positioned;
227
219
  }
228
220
 
229
221
  // ── Animated variant ──────────────────────────────────────────────────────