@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/README.md CHANGED
@@ -6,264 +6,91 @@
6
6
 
7
7
  # @djangocfg/ui-tools
8
8
 
9
- Heavy React tools with lazy loading. No Next.js dependency — works with Electron, Vite, CRA, any React environment.
9
+ Heavy, lazy-loaded React components for admin, devtools, and dashboards. Pairs with [`@djangocfg/ui-core`](../ui-core) (primitives + theme tokens).
10
10
 
11
- Part of [DjangoCFG](https://djangocfg.com).
11
+ Every tool is `React.lazy` by default — import what you use, pay only its bundle cost.
12
12
 
13
- ```bash
14
- pnpm add @djangocfg/ui-tools
15
- ```
16
-
17
- ---
18
-
19
- ## What's inside
20
-
21
- Sixteen tools, each one lazy-loaded so it doesn't ship until used. Bundle size is the gzipped tool by itself; deps (mapbox, monaco, etc.) load on first render.
22
-
23
- | Tool | Bundle | Docs |
24
- |------|--------|------|
25
- | `Map` | ~800KB | MapLibre maps, markers, clusters, layers. [README](src/tools/Map/README.md) |
26
- | `Mermaid` | ~800KB | Diagrams + declarative builders |
27
- | `CodeEditor` | ~550KB | Monaco editor + diff view |
28
- | `PrettyCode` | ~500KB | Syntax-highlighted read-only code |
29
- | `OpenapiViewer` | ~400KB | OpenAPI schema viewer + playground |
30
- | `JsonForm` | ~300KB | JSON-Schema-driven form generator |
31
- | `MarkdownEditor` | ~200KB | Tiptap WYSIWYG with `@`-mentions |
32
- | `LottiePlayer` | ~200KB | Lottie animation player |
33
- | `Chat` | ~150KB | Streaming chat (SSE + tool calls + attachments). [README](src/tools/Chat/README.md) |
34
- | `SpeechRecognition` | ~40KB | Mic capture + STT with pluggable engines (Web Speech / HTTP / WS). [README](src/tools/SpeechRecognition/README.md) |
35
- | `VideoPlayer` | ~12KB core | media-chrome player — YouTube / Vimeo / HLS / MP4 in one composable shell. [README](src/tools/VideoPlayer/README.md) |
36
- | `MarkdownMessage` | ~120KB | Read-only chat-tuned markdown. **SSR-safe** — use as a Client Component, the result is server-rendered. [README](src/components/markdown/MarkdownMessage/README.md) |
37
- | `JsonTree` | ~100KB | JSON visualization (full/compact/inline modes) |
38
- | `AudioPlayer` | ~80KB | WebView-safe waveform player |
39
- | `Gallery` | ~50KB | Image/video gallery + lightbox |
40
- | `ImageViewer` | ~50KB | Zoom/pan/rotate viewer |
41
- | `CronScheduler` | ~15KB | Cron expression builder |
42
- | `Masonry` | ~8KB | Virtualised window-scroll masonry grid with column balancing. [README](src/tools/data/Masonry/README.md) |
43
-
44
- Plus utility primitives: `Tree`, `Tour` (with spotlight overlay), `FileIcon`, `UploadDropzone`.
13
+ ## Install
45
14
 
46
- ---
47
-
48
- ## Imports
49
-
50
- **There is no root barrel** — `import … from '@djangocfg/ui-tools'` is intentionally **not** supported. Always import from a tool subpath.
51
-
52
- Why: a root barrel plus per-tool subpaths would inevitably ship the same modules twice (the bundled `dist/` copy via the root, plus the raw `src/` copy via the subpath). Different physical modules mean different `React.createContext()` instances — `ChatProvider`, `MapProvider`, `TreeProvider` all silently break across the boundary.
53
-
54
- The TypeScript / bundler error you'll see is `Cannot find module '@djangocfg/ui-tools'`. That's intentional; fix it by picking a subpath:
55
-
56
- ```tsx
57
- import { LazyJsonTree } from '@djangocfg/ui-tools/json-tree';
58
- import { Gallery } from '@djangocfg/ui-tools/gallery';
59
- import { LazyMapContainer, MapMarker } from '@djangocfg/ui-tools/map';
60
- import { MarkdownMessage } from '@djangocfg/ui-tools/markdown-message';
61
- import { LazyEditor, useMonaco } from '@djangocfg/ui-tools/code-editor';
62
- import { LazyChat, createPydanticAIChatTransport } from '@djangocfg/ui-tools/chat';
63
- import { LazyMarkdownEditor, mentionPresets } from '@djangocfg/ui-tools/markdown-editor';
64
- import { LazyPlayer, PlayerProvider } from '@djangocfg/ui-tools/audio-player';
65
- // …same pattern for every tool
15
+ ```bash
16
+ pnpm add @djangocfg/ui-tools @djangocfg/ui-core
66
17
  ```
67
18
 
68
- Subpaths come in three flavors:
19
+ Wrap your app in `<UiProviders>` from `@djangocfg/ui-core` once at the root (gives Tooltip/Dialog/Toast context to every tool).
69
20
 
70
- - **Lazy + light surface.** The heavy component is exported only as a `Lazy*` wrapper; types, hooks, transports, slot components, and pure helpers are exported synchronously. This is the standard pattern.
71
- - **Lazy primitives co-exist with light primitives.** `./map` exports `LazyMapContainer` (heavy MapLibre GL) plus `MapMarker` / `MapPopup` etc. — the markers are thin `react-map-gl` wrappers that don't import the heavy lib at module scope.
72
- - **Synchronous, SSR-safe.** `./markdown-message` is intentionally not lazy — the component is `'use client'` but produces plain HTML, so Next renders it on the server.
21
+ ## Catalogue
73
22
 
74
- | Subpath | Ships | Notes |
75
- |---------|-------|-------|
76
- | `@djangocfg/ui-tools/chat` | `LazyChat`, `LazyChatLauncher`, plus the raw components (`ChatRoot`, `ChatLauncher`, `MessageBubble`, `Composer`, `MessageBlocks`, header buttons, …), the composer kit (`ComposerMenuButton`, `ComposerBanner`, `ComposerToolPill`, `ComposerModelPicker`, `ComposerRichTextarea`, …), transports (`createPydanticAIChatTransport`, `createHttpTransport`, …), hooks (`useChat`, `useChatComposer`, …), reducer/core/types/style tokens | Use the `Lazy*` wrappers when possible. The raw components are re-exported synchronously for callers that compose custom chat shells — importing them pulls the dependency graph eagerly. |
77
- | `@djangocfg/ui-tools/code-editor` | `LazyEditor`, `LazyDiffEditor`, `useMonaco`, `useEditor`, `useLanguage`, `useEditorTheme`, `EditorProvider`, types | Monaco (~550 KB) loads only when an editor mounts. `useMonaco` does its own dynamic import. |
78
- | `@djangocfg/ui-tools/audio-player` | `LazyPlayer`, `PlayerProvider`, selector hooks, slot components (`Cover`, `Title`, `PlayButton`, `Waveform`, …), peaks-cache helpers, store, types | Slot components are presentational — safe synchronous re-exports. They only do anything inside a `<LazyPlayer>` provider. |
79
- | `@djangocfg/ui-tools/markdown-editor` | `LazyMarkdownEditor`, `mentionPresets`, types | TipTap + ProseMirror (~200 KB) only loads via the lazy wrapper. |
80
- | `@djangocfg/ui-tools/map` | `LazyMapContainer`, `LazyMapView`, plus light primitives (`MapMarker`, `MapPopup`, `MapCluster`, `MapSource`, `MapLayer`, `MapControls`, `MapProvider`, types) | The heavy MapLibre GL chunk (~800 KB) only loads when `LazyMapContainer` actually mounts. Markers and popups are thin `react-map-gl` wrappers — exported synchronously. |
81
- | `@djangocfg/ui-tools/markdown-message` | `MarkdownMessage`, `ChatMessageRow`, `ActionRow`, `extractTextFromChildren`, types | **SSR-safe.** The component itself is `'use client'`, but rendering produces plain HTML — Next.js will pre-render it on the server when imported from a Client Component. Use this when you want the markdown renderer without dragging in the full chat. |
82
- | `@djangocfg/ui-tools/video-player` | `VideoPlayer` (+ `LazyVideoPlayer` alias), `parseEmbedUrl`, composable parts (`PlayButton`, `SeekBar`, `Volume`, `ControlsBar`, …), per-engine canvases, types | media-chrome shell — YouTube / Vimeo / HLS / MP4 / iframe behind one API. Provider engines (`youtube-video-element`, `hls-video-element`, …) are imported only by the matching canvas, so unused engines tree-shake. [README](src/tools/VideoPlayer/README.md) |
83
- | `@djangocfg/ui-tools/<tool-name>` | One tool | `mermaid`, `speech-recognition`, `json-tree`, `pretty-code`, `openapi-viewer`, `json-form`, `lottie-player`, `video-player`, `image-viewer`, `cron-scheduler`, `gallery`, `tour`, `tree`, `file-icon`, `upload` |
84
- | `@djangocfg/ui-tools/json-form/full` | `JsonSchemaForm`, `ObjectFieldTemplate`, `evaluateDisabledWhen`, all widgets / templates / utils | Eager bundle. Use only for storybook / internal tooling that needs the template + util APIs at module scope. Production code should import `LazyJsonSchemaForm` from `/json-form` instead. |
85
- | `@djangocfg/ui-tools/styles` | Tailwind source CSS | |
86
- | `@djangocfg/ui-tools/dist.css` | Pre-compiled CSS | |
23
+ | Group | Tools |
24
+ |---|---|
25
+ | `chat/` | ChatLauncher, MessageList, Composer, SuggestedPrompts |
26
+ | `data/` | DataGrid · DataTable · JsonTree · Kanban · Listbox · Masonry · Timeline · Tree |
27
+ | `dev/code/` | PrettyCode · DiffViewer · MarkdownMessage |
28
+ | `dev/api/` | OpenapiViewer · ApiRefTable · RequestViewer |
29
+ | `dev/ops/` | LogViewer · EnvTable |
30
+ | `dev/` (top) | Mermaid · Map |
31
+ | `forms/` | CodeEditor (Monaco) · JsonEditor · JsonForm · MarkdownEditor · NotionEditor · FileUpload · Uploader |
32
+ | `input/` | Combobox · CronScheduler (+ CronPreview) · Scroller · Sortable · SpeechRecognition |
33
+ | `media/` | AudioPlayer · VideoPlayer · ImageViewer · LottiePlayer · Gallery |
34
+ | `overlay/` | ResponsiveDialog · ScrollSpy · SelectionToolbar · Tour |
35
+ | `visual/charts/` | Gauge · ActivityGraph · CommitGraph · Sparkline |
36
+ | `visual/indicators/` | StatusIndicator · Fps · Rating |
37
+ | `visual/design/` | ColorPicker · ColorPalette · FileIcon |
38
+ | `visual/` (top) | Marquee · QRCode |
87
39
 
88
- ### Code & data inspectors are always-dark by design
40
+ Sub-grouping is internal public imports stay flat.
89
41
 
90
- `PrettyCode` and `JsonTree` render on a fixed dark surface (`#0d1117`)
91
- regardless of the host UI theme. Same convention as GitHub, VSCode,
92
- ChatGPT, Chrome DevTools. Syntax highlighting / typed-value coloring
93
- ship their own contrast model — mixing them with light UI surfaces
94
- flattens everything into low-contrast pastels.
95
-
96
- The chrome (border, padding, toolbars) still uses semantic UI tokens.
97
- Only the *content surface* is fixed. See per-tool READMEs for details.
98
-
99
- ---
100
-
101
- ## Lazy loading
102
-
103
- Every heavy tool ships in two flavors:
104
-
105
- - `Lazy*` — wrapped in `React.lazy` + `Suspense` + skeleton. Use by default.
106
- - bare tool (`Mermaid`, `JsonTree`, …) — for explicit loading control.
42
+ ## Usage
107
43
 
108
44
  ```tsx
109
- import { LazyChat } from '@djangocfg/ui-tools/chat';
45
+ import { JsonTree, LogViewer, DiffViewer, CronScheduler } from '@djangocfg/ui-tools';
110
46
 
111
- <LazyChat transport={transport} /> // loads on mount
112
- <LazyChat fallback={<MySkeleton />} ... /> // custom loading UI
47
+ <JsonTree data={response} compactHeader />
48
+ <LogViewer entries={logs} />
49
+ <DiffViewer oldCode={a} newCode={b} language="ts" view="split" />
50
+ <CronScheduler value={cron} onChange={setCron} />
113
51
  ```
114
52
 
115
- Skeletons match the tool's final layout so swap-in is jank-free.
116
-
117
- ---
118
-
119
- ## Chat — quick start
120
-
121
- The most-used tool. Headless reducer + composable UI: streaming SSE transport, pydantic-AI mapper, decomposed parts (`MessageBubble`, `Composer`, `MessageList`, `ToolCalls`, …), role-aware styling. Floating launcher with FAB, popover/side dock, proactive greeting, live-push notifications, audio mute toggle, reset-with-confirm, Linear-style hotkeys.
53
+ Subpath imports avoid loading siblings:
122
54
 
123
55
  ```tsx
124
- import {
125
- ChatLauncher,
126
- ChatRoot,
127
- createPydanticAIChatTransport,
128
- } from '@djangocfg/ui-tools/chat';
129
-
130
- const transport = createPydanticAIChatTransport({
131
- buildStreamUrl: (sid, msg) => `${API}/chat/sessions/${sid}/stream?message=${encodeURIComponent(msg)}`,
132
- streamMethod: 'GET',
133
- buildHeaders: async () => ({ Authorization: `Bearer ${getToken()}` }),
134
- });
135
-
136
- function Chat() {
137
- // ChatLauncher mounts <ChatProvider> internally — pass transport / audio /
138
- // config here, then render <ChatRoot /> as a child without props.
139
- return (
140
- <ChatLauncher
141
- transport={transport}
142
- audio={{}} // ChatAudioConfig (sounds map). `{}` uses bundled defaults.
143
- hotkey={{ key: '/', meta: true }}
144
- fab={{ variant: 'animated' }} // size='responsive' default — phone/tablet/desktop
145
- dock={{ title: 'Assistant', height: 600 }}
146
- greeting="Hi 👋 Need help?"
147
- headerSlots={{ // declarative header buttons, rendered inside the provider
148
- languagePicker: true,
149
- modeToggle: { persistAs: 'my.chat.dock' },
150
- reset: {
151
- onReset: async () => { await api.clearChat(); return true; },
152
- },
153
- }}
154
- >
155
- <ChatRoot />
156
- </ChatLauncher>
157
- );
158
- }
56
+ import { JsonTree } from '@djangocfg/ui-tools/json-tree';
57
+ import { LogViewer } from '@djangocfg/ui-tools/log-viewer';
159
58
  ```
160
59
 
161
- **What's wired by default:** desktop side-mode toggle (auto-hides on narrow screens), persisted dock prefs, two-step Escape, click-to-focus composer, mobile fullscreen with `dvh` heights, push-preview bubble for inbound messages while closed, **ChatGPT-style autoscroll** (sticky-to-bottom within 120 px, every user-send re-anchors the viewport), **bundled chat notification sounds** (sent/received/start/error/mention/notification, ~136KB inlined as `data:`-URLs inside the lazy chat chunk — zero host setup). Native hosts (cmdop_go / Tauri) pass `audio={{ silenced: true, onSoundEvent }}` to keep web silent while routing triggers to the backend.
162
-
163
- Need a fully custom input row (e.g. mention autocomplete via `MarkdownEditor`)? Pass `composer={{ render: ({ composer }) => <YourComposer composer={composer} /> }}` to `<ChatRoot>` — it replaces the default `<Composer>` while keeping autoscroll, JumpToLatest, and history behaviour. Story: `UI Tools / Chat / Composer / Mentions`.
164
-
165
- Drop `<VoiceComposerSlot />` from `@djangocfg/ui-tools/speech-recognition` into the composer's `slots.blockStart` (`composer={{ slots: { blockStart: <VoiceComposerSlot /> } }}`) for live mic-to-text — **zero props**, reads / writes the composer through `ComposerHandle` registered in chat context. Set `headerSlots={{ languagePicker: true }}` on `<ChatLauncher>` for a flag-button language picker (66 BCP-47 tags). Both auto-hide on Firefox / in-app browsers / missing `getUserMedia`. See [`SpeechRecognition`](#speech-recognition--quick-start) below.
60
+ ## Theming
166
61
 
167
- **Page-context.** The assistant can see the page the user is on. The `page-snapshot` engine (`src/lib/page-snapshot`) walks the live DOM into a token-efficient, redacted snapshot; wire `getDynamicMetadata` on `<ChatRoot>` / `<ChatProvider>` (typically from `usePageSnapshot().getChatMetadata`) and it rides the request `metadata`. When the assistant replies with `point` directives, `<HighlightOverlay>` (`src/tools/Chat/highlight`) spotlights the referenced elements. Story: `UI Tools/Chat/Highlight`.
62
+ All tools render through `@djangocfg/ui-core` semantic tokens (`bg-card`, `text-foreground`, `border-border`, status surfaces) they adapt automatically to light/dark and to the theme presets in ui-core.
168
63
 
169
- Full docs: [`Chat/README.md`](src/tools/Chat/README.md). Stories are grouped under `UI Tools/Chat` into `Getting Started`, `Messages`, `Composer`, `Launcher`, `Transports`, `Highlight` — plus `Overview` and a one-screen `Showcase`.
64
+ Two intentional exceptions, both opt-in via prop:
170
65
 
171
- ---
66
+ - **`PrettyCode`** — fixed dark surface regardless of UI theme. Code blocks ship their own contrast model (GitHub/VSCode/ChatGPT convention); mixing with light UI produces low-contrast pastel renders. Override via `mode="light"`.
67
+ - **`DiffViewer`** — adaptive; uses `themes.github` on light, `themes.vsDark` on dark via `useResolvedTheme()`.
172
68
 
173
- <a id="speech-recognition--quick-start"></a>
69
+ Canvas/SVG components (charts, viz) sample theme colors via `useThemeColor`/`alpha` from `@djangocfg/ui-core/styles/palette` — never `color-mix`/`oklch` strings (Canvas2D rejects them).
174
70
 
175
- ## Speech Recognition — quick start
176
-
177
- Decomposed STT (Speech-to-Text) tool. Headless hook + composable UI + lazy bundle, same shape as `Chat` and `AudioPlayer`. Default backend is the browser Web Speech API (zero deps, zero network); custom engines plug in via a small interface — Deepgram, AssemblyAI, OpenAI Whisper REST, your own gateway, all without vendor SDKs on the critical path.
178
-
179
- ```tsx
180
- import {
181
- DictationButton,
182
- TranscriptView,
183
- useSpeechRecognition,
184
- } from '@djangocfg/ui-tools/speech-recognition';
185
-
186
- function Dictate() {
187
- const rec = useSpeechRecognition(); // Web Speech engine, browser language
188
- return (
189
- <>
190
- <DictationButton status={rec.status} onClick={() => rec.toggle()} />
191
- <TranscriptView transcript={rec.transcript} />
192
- </>
193
- );
194
- }
195
- ```
196
-
197
- For the chat composer:
198
-
199
- ```tsx
200
- import { VoiceComposerSlot } from '@djangocfg/ui-tools/speech-recognition';
201
-
202
- <ChatRoot
203
- transport={transport}
204
- composer={{ slots: { blockStart: <VoiceComposerSlot /> } }}
205
- />
206
-
207
- // Plus a flag-button language picker in the dock header:
208
- <ChatLauncher headerSlots={{ languagePicker: true }} ... >
209
- ```
210
-
211
- **What's wired by default:** auto-hide on Firefox / in-app WebViews / missing `getUserMedia` (via `useVoiceSupport`); live interim+final stream into the composer via `ComposerHandle` (works transparently for the built-in textarea Composer and a TipTap MarkdownEditor); typed prefix anchored; focus + cursor-to-end on start and every partial; 90-second countdown + 2.5-second silence auto-stop; Esc cancels (without closing the chat) / Enter finishes (without submitting); persisted prefs (`djangocfg-stt:prefs`); `<SpeechRecognitionProvider>` for sharing engine state across the tree. Language picker shows 66 BCP-47 tags sourced from the Chrome Web Speech demo with country flags. Custom engines through `createHttpEngine` (REST/Whisper), `createWebSocketEngine` (Deepgram-style streaming), or `createExternalEngine` (Wails / Tauri / native sidecar — `onStart` / `onStop` / `subscribe` and you're done).
212
-
213
- Full docs: [`SpeechRecognition/README.md`](src/tools/SpeechRecognition/README.md). Stories: `UI Tools/Speech/{Dictation, ComposerSlot, PushToTalk, MicMeter, Engines, Languages, Errors}` + `UI Tools/Chat/Composer/Speech & Attachments` and `UI Tools/Chat/Launcher/Playground` (flag-button picker in the dock header). Unit-tested with vitest (`pnpm test`, 21 cases).
214
-
215
- ---
216
-
217
- ## Markdown
218
-
219
- Read-only `<MarkdownMessage>` powers every chat bubble. Stays useful standalone for docs, AI replies, system messages.
220
-
221
- ```tsx
222
- import { MarkdownMessage } from '@djangocfg/ui-tools/markdown-message';
223
-
224
- <MarkdownMessage content="# Hello\n\nGFM + emoji 😄 + code:\n\n```ts\nconst x = 1;\n```" />
225
- ```
226
-
227
- GFM, soft line breaks, smart typography, emoji shortcodes, sanitized HTML, mermaid blocks, syntax-highlighted code, declarative `linkRules` for custom URL schemes (e.g. `cmdop://`, `vehicle://`). Details: [`MarkdownMessage/README.md`](src/tools/MarkdownMessage/README.md).
228
-
229
- ---
230
-
231
- ## Map
232
-
233
- MapLibre GL maps with markers, clusters, layers, drawing, geocoding. Subpath: `@djangocfg/ui-tools/map`. Details: [`Map/README.md`](src/tools/Map/README.md).
234
-
235
- ```tsx
236
- import { MapContainer, MapMarker } from '@djangocfg/ui-tools/map';
71
+ ## Lazy loading
237
72
 
238
- <MapContainer style="streets" center={[37.6, 55.7]} zoom={10}>
239
- <MapMarker position={[37.6, 55.7]} />
240
- </MapContainer>
241
- ```
73
+ Every tool's default export is `React.lazy`-wrapped; initial bundle stays small. Heaviest:
242
74
 
243
- Optional drawing/geocoding peers: `pnpm add mapbox-gl-draw geocoder-control`.
75
+ Mermaid ~800KB · Monaco CodeEditor ~550KB · PrettyCode (shiki) ~500KB · OpenapiViewer ~400KB · JsonForm ~300KB · AudioPlayer (WaveSurfer) ~200KB · LottiePlayer ~200KB · NotionEditor (TipTap) ~200KB · VideoPlayer (media-chrome) ~150KB · JsonTree ~100KB · ImageViewer ~50KB · CronScheduler ~15KB.
244
76
 
245
- ---
77
+ Works in Next.js, Vite, Wails, CRA — no framework lock-in.
246
78
 
247
- ## Storybook
79
+ ## Build discipline
248
80
 
249
- Stories live next to each tool and are registered in [`src/stories/index.ts`](src/stories/index.ts):
81
+ After any `src/` change, **run `pnpm build`** before considering the change done — consumers pick up `dist/` via `pnpm sync:cfg`; a stale `dist/` ships old code silently. See [`CLAUDE.md`](./CLAUDE.md) for details.
250
82
 
251
83
  ```bash
252
- pnpm playground
84
+ pnpm build # rebuild dist/ (tsup)
85
+ pnpm check # tsc --noEmit
253
86
  ```
254
87
 
255
- Open browser to the URL printed in the console. Categories: `Tools/<ToolName>` plus per-feature subsections for Chat and Map.
256
-
257
- ---
258
-
259
88
  ## Requirements
260
89
 
261
- - React 18+ / React 19
262
- - Tailwind CSS (or import `@djangocfg/ui-tools/dist.css`)
263
- - Peer deps for individual tools auto-installed by your package manager.
264
-
265
- ---
90
+ - React 18 or 19
91
+ - `@djangocfg/ui-core` (peer)
92
+ - Tailwind CSS v4 (host imports `@djangocfg/ui-core/styles`)
266
93
 
267
94
  ## License
268
95
 
269
- MIT — see [LICENSE](./LICENSE).
96
+ MIT — © djangocfg.
@@ -5,7 +5,7 @@ var lib = require('@djangocfg/ui-core/lib');
5
5
  var lucideReact = require('lucide-react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
8
- // src/tools/visual/FileIcon/icons/icon-data.ts
8
+ // src/tools/visual/design/FileIcon/icons/icon-data.ts
9
9
  var DEFAULT_FILE_ICON = { name: "file", svg: '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:100%"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m5 2H6v16h12v-9h-7V4z" fill="#42a5f5"/></svg>' };
10
10
  var FILE_ICONS = [
11
11
  { name: "html", svg: '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:100%"><path d="m12 17.56 4.07-1.13.55-6.1H9.38L9.2 8.3h7.6l.2-1.99H7l.56 6.01h6.89l-.23 2.58-2.22.6-2.22-.6-.14-1.66h-2l.29 3.19L12 17.56M4.07 3h15.86L18.5 19.2 12 21l-6.5-1.8L4.07 3z" fill="#e44d26"/></svg>', extensions: ["htm", "xhtml", "html_vm", "asp", "html", "shtml", "xht", "mdoc", "aspx", "jshtm", "volt", "rhtml"] },
@@ -386,7 +386,7 @@ var FILE_ICONS = [
386
386
  { name: "php", svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width:100%;height:100%"><path d="M12 18.08c-6.63 0-12-2.72-12-6.08s5.37-6.08 12-6.08S24 8.64 24 12s-5.37 6.08-12 6.08m-5.19-7.95c.54 0 .91.1 1.09.31.18.2.22.56.13 1.03-.1.53-.29.87-.58 1.09-.28.22-.71.33-1.29.33h-.87l.53-2.76h.99m-3.5 5.55h1.44l.34-1.75h1.23c.54 0 .98-.06 1.33-.17.35-.12.67-.31.96-.58.24-.22.43-.46.58-.73.15-.26.26-.56.31-.88.16-.78.05-1.39-.33-1.82-.39-.44-.99-.65-1.82-.65H4.59l-1.28 6.58m7.25-8.33-1.28 6.58h1.42l.74-3.77h1.14c.36 0 .6.06.71.18.11.12.13.34.07.66l-.57 2.93h1.45l.59-3.07c.13-.62.03-1.07-.27-1.36-.3-.27-.85-.4-1.65-.4h-1.27L12 7.35h-1.44M18 10.13c.55 0 .91.1 1.09.31.18.2.22.56.13 1.03-.1.53-.29.87-.57 1.09-.29.22-.72.33-1.3.33h-.85l.5-2.76h1m-3.5 5.55h1.44l.34-1.75h1.22c.55 0 1-.06 1.35-.17.35-.12.65-.31.95-.58.24-.22.44-.46.58-.73.15-.26.26-.56.32-.88.15-.78.04-1.39-.34-1.82-.36-.44-.99-.65-1.82-.65h-2.75l-1.29 6.58z" fill="#1E88E5"/></svg>', extensions: ["php", "php4", "php5", "phtml", "ctp"] }
387
387
  ];
388
388
 
389
- // src/tools/visual/FileIcon/get-file-icon.ts
389
+ // src/tools/visual/design/FileIcon/get-file-icon.ts
390
390
  var fileMap = null;
391
391
  var extMap = null;
392
392
  function buildIndex() {
@@ -539,7 +539,7 @@ function createFileIconSlot({
539
539
  }
540
540
  chunkPK6SKIKE_cjs.__name(createFileIconSlot, "createFileIconSlot");
541
541
 
542
- // src/tools/visual/FileIcon/loader.ts
542
+ // src/tools/visual/design/FileIcon/loader.ts
543
543
  var localGetIcon = /* @__PURE__ */ chunkPK6SKIKE_cjs.__name((name) => ({ svg: getFileIcon(name).svg }), "localGetIcon");
544
544
  function loadMaterialIcons() {
545
545
  return Promise.resolve(localGetIcon);