@djangocfg/ui-tools 2.1.418 → 2.1.419

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 (304) hide show
  1. package/dist/file-icon/index.cjs +3 -3
  2. package/dist/file-icon/index.cjs.map +1 -1
  3. package/dist/file-icon/index.mjs +3 -3
  4. package/dist/file-icon/index.mjs.map +1 -1
  5. package/package.json +93 -28
  6. package/src/common/FloatingToolbar/actions/CopyAction.tsx +31 -0
  7. package/src/{components → common}/FloatingToolbar/actions/DownloadAction.tsx +15 -10
  8. package/src/common/FloatingToolbar/actions/ExpandAction.tsx +33 -0
  9. package/src/common/FloatingToolbar/actions/FullscreenAction.tsx +38 -0
  10. package/src/{components → common}/FloatingToolbar/index.tsx +39 -0
  11. package/src/lib/http.ts +64 -0
  12. package/src/tools/chat/index.ts +1 -1
  13. package/src/tools/chat/launcher/ChatFAB.tsx +66 -74
  14. package/src/tools/chat/launcher/header/ChatHeaderActionButton.tsx +2 -3
  15. package/src/tools/chat/lazy.tsx +1 -1
  16. package/src/tools/chat/messages/MessageBubble.tsx +1 -1
  17. package/src/tools/chat/messages/blocks/builtin.tsx +1 -1
  18. package/src/tools/chat/messages/blocks/renderers/CodeBlock.tsx +2 -2
  19. package/src/tools/chat/messages/blocks/renderers/JsonBlock.tsx +12 -1
  20. package/src/tools/data/DataGrid/lazy.tsx +1 -1
  21. package/src/tools/data/DataTable/lazy.tsx +1 -1
  22. package/src/tools/data/JsonTree/JsonViewer.tsx +720 -0
  23. package/src/tools/data/JsonTree/README.md +126 -73
  24. package/src/tools/data/JsonTree/index.tsx +3 -95
  25. package/src/tools/data/JsonTree/lazy.tsx +10 -50
  26. package/src/tools/data/JsonTree/types.ts +82 -63
  27. package/src/tools/data/Kanban/lazy.tsx +1 -1
  28. package/src/tools/data/Listbox/lazy.tsx +1 -1
  29. package/src/tools/data/Masonry/lazy.tsx +1 -1
  30. package/src/tools/data/Timeline/lazy.tsx +1 -1
  31. package/src/tools/data/Tree/lazy.tsx +1 -1
  32. package/src/tools/dev/Map/lazy.tsx +1 -1
  33. package/src/tools/dev/Mermaid/Mermaid.client.tsx +2 -2
  34. package/src/tools/dev/Mermaid/lazy.tsx +1 -1
  35. package/src/tools/dev/api/ApiRefTable/ApiRefTable.tsx +65 -0
  36. package/src/tools/dev/api/ApiRefTable/README.md +31 -0
  37. package/src/tools/dev/api/ApiRefTable/components/Row.tsx +96 -0
  38. package/src/tools/dev/api/ApiRefTable/components/TypeDisplay.tsx +44 -0
  39. package/src/tools/dev/api/ApiRefTable/index.ts +6 -0
  40. package/src/tools/dev/api/ApiRefTable/lazy.tsx +21 -0
  41. package/src/tools/dev/api/ApiRefTable/types.ts +82 -0
  42. package/src/tools/dev/api/ApiRefTable/utils.ts +42 -0
  43. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/ApiIntroSection.tsx +1 -1
  44. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/index.tsx +1 -1
  45. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/index.tsx +1 -1
  46. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseBody.tsx +7 -21
  47. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/RequestPanel.tsx +1 -1
  48. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/PrettyView.tsx +13 -19
  49. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/types.ts +1 -1
  50. package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/lazy.tsx +1 -1
  51. package/src/tools/dev/api/RequestViewer/README.md +33 -0
  52. package/src/tools/dev/api/RequestViewer/RequestViewer.tsx +121 -0
  53. package/src/tools/dev/api/RequestViewer/components/BodyTab.tsx +44 -0
  54. package/src/tools/dev/api/RequestViewer/components/EmptyState.tsx +13 -0
  55. package/src/tools/dev/api/RequestViewer/components/HeadersTab.tsx +78 -0
  56. package/src/tools/dev/api/RequestViewer/components/TimingTab.tsx +113 -0
  57. package/src/tools/dev/api/RequestViewer/components/utils.ts +31 -0
  58. package/src/tools/dev/api/RequestViewer/index.ts +16 -0
  59. package/src/tools/dev/api/RequestViewer/lazy.tsx +30 -0
  60. package/src/tools/dev/api/RequestViewer/types.ts +81 -0
  61. package/src/tools/dev/code/DiffViewer/DiffViewer.tsx +144 -0
  62. package/src/tools/dev/code/DiffViewer/README.md +33 -0
  63. package/src/tools/dev/code/DiffViewer/components/CopyButton.tsx +49 -0
  64. package/src/tools/dev/code/DiffViewer/components/DiffLineContent.tsx +48 -0
  65. package/src/tools/dev/code/DiffViewer/components/SplitView.tsx +220 -0
  66. package/src/tools/dev/code/DiffViewer/components/UnifiedView.tsx +154 -0
  67. package/src/tools/dev/code/DiffViewer/hooks/useDiff.ts +47 -0
  68. package/src/tools/dev/code/DiffViewer/hooks/useHighlighter.ts +54 -0
  69. package/src/tools/dev/code/DiffViewer/index.ts +22 -0
  70. package/src/tools/dev/code/DiffViewer/lazy.tsx +22 -0
  71. package/src/tools/dev/code/DiffViewer/types.ts +109 -0
  72. package/src/tools/dev/code/DiffViewer/utils/computeDiff.ts +159 -0
  73. package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/CollapseToggle.tsx +1 -1
  74. package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/MarkdownMessage.tsx +1 -1
  75. package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/components.tsx +2 -2
  76. package/src/tools/dev/{PrettyCode → code/PrettyCode}/PrettyCode.client.tsx +2 -2
  77. package/src/tools/dev/{PrettyCode → code/PrettyCode}/lazy.tsx +1 -1
  78. package/src/tools/dev/ops/EnvTable/EnvTable.tsx +228 -0
  79. package/src/tools/dev/ops/EnvTable/README.md +29 -0
  80. package/src/tools/dev/ops/EnvTable/hooks/useEnvMask.ts +121 -0
  81. package/src/tools/dev/ops/EnvTable/index.ts +12 -0
  82. package/src/tools/dev/ops/EnvTable/lazy.tsx +21 -0
  83. package/src/tools/dev/ops/EnvTable/types.ts +76 -0
  84. package/src/tools/dev/ops/LogViewer/LogViewer.tsx +194 -0
  85. package/src/tools/dev/ops/LogViewer/README.md +30 -0
  86. package/src/tools/dev/ops/LogViewer/components/LogRow.tsx +151 -0
  87. package/src/tools/dev/ops/LogViewer/components/Toolbar.tsx +199 -0
  88. package/src/tools/dev/ops/LogViewer/hooks/useAutoScroll.ts +68 -0
  89. package/src/tools/dev/ops/LogViewer/hooks/useLogFilter.ts +58 -0
  90. package/src/tools/dev/ops/LogViewer/index.ts +18 -0
  91. package/src/tools/dev/ops/LogViewer/lazy.tsx +25 -0
  92. package/src/tools/dev/ops/LogViewer/types.ts +142 -0
  93. package/src/tools/dev/ops/LogViewer/utils/ansi.ts +231 -0
  94. package/src/tools/forms/CodeEditor/hooks/useEditorTheme.ts +13 -73
  95. package/src/tools/forms/CodeEditor/lazy.tsx +1 -1
  96. package/src/tools/forms/FileUpload/lazy.tsx +1 -1
  97. package/src/tools/forms/JsonEditor/JsonEditor.tsx +115 -0
  98. package/src/tools/forms/JsonEditor/index.ts +1 -0
  99. package/src/tools/forms/JsonEditor/lazy.tsx +24 -0
  100. package/src/tools/forms/JsonForm/index.ts +1 -1
  101. package/src/tools/forms/JsonForm/lazy.tsx +1 -1
  102. package/src/tools/forms/MarkdownEditor/lazy.tsx +1 -1
  103. package/src/tools/forms/NotionEditor/README.md +237 -0
  104. package/src/tools/forms/NotionEditor/lazy.tsx +1 -1
  105. package/src/tools/index.ts +153 -13
  106. package/src/tools/input/Combobox/lazy.tsx +1 -1
  107. package/src/tools/input/CronScheduler/components/CronPreview.README.md +28 -0
  108. package/src/tools/input/CronScheduler/components/CronPreview.tsx +136 -0
  109. package/src/tools/input/CronScheduler/components/index.ts +3 -0
  110. package/src/tools/input/CronScheduler/index.tsx +5 -1
  111. package/src/tools/input/CronScheduler/lazy.tsx +5 -1
  112. package/src/tools/input/CronScheduler/utils/cron-next-runs.ts +122 -0
  113. package/src/tools/input/CronScheduler/utils/index.ts +1 -0
  114. package/src/tools/input/Scroller/lazy.tsx +1 -1
  115. package/src/tools/input/Sortable/lazy.tsx +1 -1
  116. package/src/tools/input/SpeechRecognition/lazy.tsx +1 -1
  117. package/src/tools/input/SpeechRecognition/widgets/VoiceComposerSlot.tsx +41 -36
  118. package/src/tools/media/ImageViewer/components/ImageToolbar.tsx +58 -47
  119. package/src/tools/media/ImageViewer/components/ImageViewer.tsx +27 -19
  120. package/src/tools/media/ImageViewer/lazy.tsx +1 -1
  121. package/src/tools/media/LottiePlayer/lazy.tsx +1 -1
  122. package/src/tools/media/VideoPlayer/VideoPlayer.tsx +28 -1
  123. package/src/tools/media/VideoPlayer/parts/fullscreen.tsx +21 -4
  124. package/src/tools/media/VideoPlayer/parts/pip.tsx +21 -4
  125. package/src/tools/media/VideoPlayer/parts/play-button.tsx +21 -4
  126. package/src/tools/media/VideoPlayer/parts/playback-rate.tsx +19 -3
  127. package/src/tools/media/VideoPlayer/parts/volume.tsx +237 -18
  128. package/src/tools/media/VideoPlayer/styles/video-player.css +87 -7
  129. package/src/tools/overlay/ResponsiveDialog/lazy.tsx +1 -1
  130. package/src/tools/overlay/ScrollSpy/lazy.tsx +1 -1
  131. package/src/tools/overlay/SelectionToolbar/lazy.tsx +1 -1
  132. package/src/tools/overlay/Tour/lazy.tsx +1 -1
  133. package/src/tools/visual/Marquee/lazy.tsx +1 -1
  134. package/src/tools/visual/QRCode/lazy.tsx +1 -1
  135. package/src/tools/visual/charts/ActivityGraph/ActivityGraph.tsx +195 -0
  136. package/src/tools/visual/charts/ActivityGraph/README.md +28 -0
  137. package/src/tools/visual/charts/ActivityGraph/index.ts +8 -0
  138. package/src/tools/visual/charts/ActivityGraph/lazy.tsx +21 -0
  139. package/src/tools/visual/charts/ActivityGraph/types.ts +59 -0
  140. package/src/tools/visual/charts/ActivityGraph/utils.ts +88 -0
  141. package/src/tools/visual/charts/CommitGraph/CommitGraph.tsx +80 -0
  142. package/src/tools/visual/charts/CommitGraph/README.md +28 -0
  143. package/src/tools/visual/charts/CommitGraph/components/CommitDetail.tsx +107 -0
  144. package/src/tools/visual/charts/CommitGraph/components/CommitRow.tsx +122 -0
  145. package/src/tools/visual/charts/CommitGraph/components/Rails.tsx +171 -0
  146. package/src/tools/visual/charts/CommitGraph/hooks/useGraphLayout.ts +169 -0
  147. package/src/tools/visual/charts/CommitGraph/hooks/useLaneColors.ts +45 -0
  148. package/src/tools/visual/charts/CommitGraph/index.ts +14 -0
  149. package/src/tools/visual/charts/CommitGraph/lazy.tsx +25 -0
  150. package/src/tools/visual/charts/CommitGraph/types.ts +85 -0
  151. package/src/tools/visual/charts/CommitGraph/utils.ts +53 -0
  152. package/src/tools/visual/{Gauge → charts/Gauge}/lazy.tsx +1 -1
  153. package/src/tools/visual/charts/Sparkline/README.md +29 -0
  154. package/src/tools/visual/charts/Sparkline/Sparkline.tsx +217 -0
  155. package/src/tools/visual/charts/Sparkline/index.ts +9 -0
  156. package/src/tools/visual/charts/Sparkline/lazy.tsx +26 -0
  157. package/src/tools/visual/charts/Sparkline/types.ts +58 -0
  158. package/src/tools/visual/design/ColorPalette/ColorPalette.tsx +129 -0
  159. package/src/tools/visual/design/ColorPalette/README.md +34 -0
  160. package/src/tools/visual/design/ColorPalette/components/Swatch.tsx +102 -0
  161. package/src/tools/visual/design/ColorPalette/hooks/useCopyToClipboard.ts +41 -0
  162. package/src/tools/visual/design/ColorPalette/index.ts +12 -0
  163. package/src/tools/visual/design/ColorPalette/lazy.tsx +21 -0
  164. package/src/tools/visual/design/ColorPalette/types.ts +63 -0
  165. package/src/tools/visual/design/ColorPalette/utils.ts +83 -0
  166. package/src/tools/visual/{ColorPicker → design/ColorPicker}/lazy.tsx +1 -1
  167. package/src/tools/visual/{FileIcon → design/FileIcon}/treeAdapter.tsx +1 -1
  168. package/src/tools/visual/{Fps → indicators/Fps}/lazy.tsx +1 -1
  169. package/src/tools/visual/{Rating → indicators/Rating}/lazy.tsx +1 -1
  170. package/src/tools/visual/indicators/StatusIndicator/README.md +28 -0
  171. package/src/tools/visual/indicators/StatusIndicator/StatusIndicator.tsx +83 -0
  172. package/src/tools/visual/indicators/StatusIndicator/index.ts +14 -0
  173. package/src/tools/visual/indicators/StatusIndicator/lazy.tsx +21 -0
  174. package/src/tools/visual/indicators/StatusIndicator/types.ts +133 -0
  175. package/src/components/FloatingToolbar/actions/CopyAction.tsx +0 -22
  176. package/src/components/FloatingToolbar/actions/ExpandAction.tsx +0 -25
  177. package/src/components/FloatingToolbar/actions/FullscreenAction.tsx +0 -30
  178. package/src/tools/data/JsonTree/components/JsonContent.tsx +0 -197
  179. package/src/tools/data/JsonTree/hooks/useJsonExpand.ts +0 -50
  180. /package/src/{components → common}/FloatingToolbar/FloatingToolbar.css +0 -0
  181. /package/src/{components → common}/FloatingToolbar/actions/index.ts +0 -0
  182. /package/src/{components → common}/FloatingToolbar/hooks/useElementCorner.ts +0 -0
  183. /package/src/{components → common}/FloatingToolbar/hooks/useScrollIsolation.ts +0 -0
  184. /package/src/{components → common}/index.ts +0 -0
  185. /package/src/{components → common}/lazy-wrapper.tsx +0 -0
  186. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/README.md +0 -0
  187. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/DocsView.tsx +0 -0
  188. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/LanguageTabs.tsx +0 -0
  189. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/useCodeSnippet.ts +0 -0
  190. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MetaActions.tsx +0 -0
  191. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MethodBadge.tsx +0 -0
  192. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/PathDisplay.tsx +0 -0
  193. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamGroup.tsx +0 -0
  194. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamRow.tsx +0 -0
  195. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/index.tsx +0 -0
  196. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/RequestBody/index.tsx +0 -0
  197. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseRow.tsx +0 -0
  198. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/StatusTag.tsx +0 -0
  199. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/index.tsx +0 -0
  200. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/FieldRow.tsx +0 -0
  201. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/buildTree.ts +0 -0
  202. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/index.tsx +0 -0
  203. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/types.ts +0 -0
  204. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/SectionHeader.tsx +0 -0
  205. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/defaults.ts +0 -0
  206. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/index.tsx +0 -0
  207. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/context.tsx +0 -0
  208. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/hooks/useSectionHash.ts +0 -0
  209. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/index.tsx +0 -0
  210. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/index.ts +0 -0
  211. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/selectors.ts +0 -0
  212. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/types.ts +0 -0
  213. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/SchemaCopyMenu.tsx +0 -0
  214. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/BrandHeader.tsx +0 -0
  215. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/CategoryBlock.tsx +0 -0
  216. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/EndpointRow.tsx +0 -0
  217. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SchemaSection.tsx +0 -0
  218. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SearchInput.tsx +0 -0
  219. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SidebarBody.tsx +0 -0
  220. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/Toolbar.tsx +0 -0
  221. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/buildVM.ts +0 -0
  222. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/index.tsx +0 -0
  223. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/types.ts +0 -0
  224. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/useDebouncedValue.ts +0 -0
  225. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/SlideInPlayground.tsx +0 -0
  226. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/TryItSheet.tsx +0 -0
  227. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/anchor.ts +0 -0
  228. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/grouping.ts +0 -0
  229. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/index.tsx +0 -0
  230. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/sidebarLabel.ts +0 -0
  231. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/index.ts +0 -0
  232. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/BodyFormEditor.tsx +0 -0
  233. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/EndpointDraftSync.tsx +0 -0
  234. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/EndpointResetButton.tsx +0 -0
  235. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/PreviewView.tsx +0 -0
  236. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/RawView.tsx +0 -0
  237. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/StatusBar.tsx +0 -0
  238. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/ViewTabs.tsx +0 -0
  239. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/detectContent.ts +0 -0
  240. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/index.tsx +0 -0
  241. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/useResponseView.ts +0 -0
  242. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/SendButton.tsx +0 -0
  243. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ui.tsx +0 -0
  244. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/constants.ts +0 -0
  245. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/context/PlaygroundContext.tsx +0 -0
  246. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/index.ts +0 -0
  247. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useDocsUrlSync.ts +0 -0
  248. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useEndpointDraft.ts +0 -0
  249. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useMobile.ts +0 -0
  250. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useOpenApiSchema.ts +0 -0
  251. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/index.tsx +0 -0
  252. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/types.ts +0 -0
  253. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/apiKeyManager.ts +0 -0
  254. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/codeSamples.ts +0 -0
  255. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/formatters.ts +0 -0
  256. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/index.ts +0 -0
  257. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/operationToHar.ts +0 -0
  258. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/sampler.ts +0 -0
  259. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/schemaExport.ts +0 -0
  260. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/scrollParent.ts +0 -0
  261. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/url.ts +0 -0
  262. /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/versionManager.ts +0 -0
  263. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/ActionRow.tsx +0 -0
  264. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/ChatMessageRow.tsx +0 -0
  265. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/CodeBlock.tsx +0 -0
  266. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/README.md +0 -0
  267. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/index.ts +0 -0
  268. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/linkRules.ts +0 -0
  269. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/plainText.ts +0 -0
  270. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/sanitize.ts +0 -0
  271. /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/types.ts +0 -0
  272. /package/src/tools/dev/{PrettyCode → code/PrettyCode}/README.md +0 -0
  273. /package/src/tools/dev/{PrettyCode → code/PrettyCode}/index.tsx +0 -0
  274. /package/src/tools/dev/{PrettyCode → code/PrettyCode}/registerPrismLanguages.ts +0 -0
  275. /package/src/tools/visual/{Gauge → charts/Gauge}/Gauge.tsx +0 -0
  276. /package/src/tools/visual/{Gauge → charts/Gauge}/index.ts +0 -0
  277. /package/src/tools/visual/{Gauge → charts/Gauge}/types.ts +0 -0
  278. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/ColorPicker.tsx +0 -0
  279. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/ColorPickerContext.tsx +0 -0
  280. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/ColorPickerStore.tsx +0 -0
  281. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/index.ts +0 -0
  282. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/index.ts +0 -0
  283. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/lib/color-utils.ts +0 -0
  284. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerAlphaSlider.tsx +0 -0
  285. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerArea.tsx +0 -0
  286. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerEyeDropper.tsx +0 -0
  287. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerFormatSelect.tsx +0 -0
  288. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerHueSlider.tsx +0 -0
  289. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerInput.tsx +0 -0
  290. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerSwatch.tsx +0 -0
  291. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/index.ts +0 -0
  292. /package/src/tools/visual/{ColorPicker → design/ColorPicker}/types.ts +0 -0
  293. /package/src/tools/visual/{FileIcon → design/FileIcon}/FileIcon.tsx +0 -0
  294. /package/src/tools/visual/{FileIcon → design/FileIcon}/get-file-icon.ts +0 -0
  295. /package/src/tools/visual/{FileIcon → design/FileIcon}/icons/icon-data.ts +0 -0
  296. /package/src/tools/visual/{FileIcon → design/FileIcon}/index.ts +0 -0
  297. /package/src/tools/visual/{FileIcon → design/FileIcon}/loader.ts +0 -0
  298. /package/src/tools/visual/{FileIcon → design/FileIcon}/specialFolders.ts +0 -0
  299. /package/src/tools/visual/{Fps → indicators/Fps}/Fps.tsx +0 -0
  300. /package/src/tools/visual/{Fps → indicators/Fps}/index.ts +0 -0
  301. /package/src/tools/visual/{Fps → indicators/Fps}/types.ts +0 -0
  302. /package/src/tools/visual/{Rating → indicators/Rating}/Rating.tsx +0 -0
  303. /package/src/tools/visual/{Rating → indicators/Rating}/index.ts +0 -0
  304. /package/src/tools/visual/{Rating → indicators/Rating}/types.ts +0 -0
@@ -0,0 +1,122 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ 'use client';
4
+
5
+ /* eslint-disable @next/next/no-img-element */
6
+
7
+ import * as React from 'react';
8
+ import { alpha } from '@djangocfg/ui-core/styles/palette';
9
+ import { ROW_HEIGHT, type GraphRow } from '../types';
10
+ import { formatRelativeDate, initials } from '../utils';
11
+ import { CommitDetail } from './CommitDetail';
12
+ import { Rails } from './Rails';
13
+
14
+ interface CommitRowProps {
15
+ row: GraphRow;
16
+ prevRow: GraphRow | null;
17
+ railWidth: number;
18
+ maxRails: number;
19
+ truncateHash: number;
20
+ laneColors: string[];
21
+ railColor: string;
22
+ }
23
+
24
+ /**
25
+ * Single commit row: rails column, refs, message, hash + author + time.
26
+ * Wrapped in a {@link CommitDetail} popover.
27
+ */
28
+ export function CommitRow({
29
+ row,
30
+ prevRow,
31
+ railWidth,
32
+ maxRails,
33
+ truncateHash,
34
+ laneColors,
35
+ railColor,
36
+ }: CommitRowProps) {
37
+ const svgWidth = maxRails * railWidth;
38
+ const refStyle = {
39
+ borderColor: alpha(railColor, 0.25),
40
+ backgroundColor: alpha(railColor, 0.0625),
41
+ color: railColor,
42
+ };
43
+ const tagStyle = {
44
+ backgroundColor: alpha(railColor, 0.125),
45
+ color: railColor,
46
+ };
47
+ const initialsLabel = initials(row.commit.author.name);
48
+ const shortHash = row.commit.hash.slice(0, truncateHash);
49
+ const relativeDate = formatRelativeDate(row.commit.date);
50
+
51
+ return (
52
+ <CommitDetail commit={row.commit} hashLength={truncateHash} railColor={railColor}>
53
+ <button
54
+ type="button"
55
+ data-slot="commit-entry"
56
+ className="flex w-full items-center gap-0 border-b border-border/30 transition-colors hover:bg-muted/30 focus-visible:bg-muted/30 focus-visible:outline-none last:border-b-0"
57
+ style={{ height: ROW_HEIGHT }}
58
+ >
59
+ {/* Rails */}
60
+ <div style={{ width: svgWidth }} className="shrink-0">
61
+ <Rails
62
+ row={row}
63
+ prevRow={prevRow}
64
+ railWidth={railWidth}
65
+ maxRails={maxRails}
66
+ laneColors={laneColors}
67
+ />
68
+ </div>
69
+
70
+ {/* Refs + tag */}
71
+ <div className="flex shrink-0 items-center gap-1 px-2">
72
+ {row.commit.refs?.map((ref) => (
73
+ <span
74
+ key={ref}
75
+ className="inline-flex items-center gap-1 rounded-md border px-1.5 py-0.5 text-[10px] font-semibold leading-none"
76
+ style={refStyle}
77
+ >
78
+ {ref}
79
+ </span>
80
+ ))}
81
+ {row.commit.tag && (
82
+ <span
83
+ className="inline-flex items-center rounded-md px-1.5 py-0.5 text-[10px] font-semibold leading-none"
84
+ style={tagStyle}
85
+ >
86
+ {row.commit.tag}
87
+ </span>
88
+ )}
89
+ </div>
90
+
91
+ {/* Message */}
92
+ <p className="min-w-0 flex-1 truncate px-2 text-left text-sm text-foreground/80">
93
+ {row.commit.message}
94
+ </p>
95
+
96
+ {/* Meta */}
97
+ <div className="flex shrink-0 items-center gap-3 px-3">
98
+ <code className="font-mono text-[11px] text-muted-foreground/60">
99
+ {shortHash}
100
+ </code>
101
+ <span className="inline-flex items-center gap-1.5 text-xs text-muted-foreground">
102
+ {row.commit.author.avatarUrl ? (
103
+ <img
104
+ src={row.commit.author.avatarUrl}
105
+ alt=""
106
+ width={16}
107
+ height={16}
108
+ className="size-4 rounded-full border border-border/60 bg-muted"
109
+ />
110
+ ) : (
111
+ <span className="flex size-4 items-center justify-center rounded-full bg-muted text-[8px] font-bold text-muted-foreground">
112
+ {initialsLabel}
113
+ </span>
114
+ )}
115
+ <span className="hidden sm:inline">{row.commit.author.name}</span>
116
+ </span>
117
+ <span className="text-[11px] text-muted-foreground/50">{relativeDate}</span>
118
+ </div>
119
+ </button>
120
+ </CommitDetail>
121
+ );
122
+ }
@@ -0,0 +1,171 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ 'use client';
4
+
5
+ import * as React from 'react';
6
+ import { useThemeColor } from '@djangocfg/ui-core/styles/palette';
7
+ import { ROW_HEIGHT, type GraphRow } from '../types';
8
+ import { pickLaneColor } from '../hooks/useLaneColors';
9
+
10
+ interface RailsProps {
11
+ row: GraphRow;
12
+ prevRow: GraphRow | null;
13
+ railWidth: number;
14
+ maxRails: number;
15
+ laneColors: string[];
16
+ }
17
+
18
+ /**
19
+ * SVG renderer for the rail column of a single commit row.
20
+ *
21
+ * Draws four classes of geometry:
22
+ * 1. Pass-through rails — straight vertical line top→bottom for any rail
23
+ * that is active above *and* below this row and is not the commit rail.
24
+ * 2. Commit rail incoming/outgoing — half-height verticals on the commit's
25
+ * own rail, depending on whether the rail was active above/below.
26
+ * 3. Fork-out curves — bezier from the commit's rail down to a freshly
27
+ * allocated rail (a new branch coming off this commit).
28
+ * 4. Merge curves — bezier from a source rail into the commit dot
29
+ * (or from the dot down to a target rail).
30
+ *
31
+ * SVG fill/stroke values are hex strings resolved via the theme palette;
32
+ * raw Tailwind classes do not work inside `stroke=`.
33
+ */
34
+ export function Rails({ row, prevRow, railWidth, maxRails, laneColors }: RailsProps) {
35
+ // Background color for the commit dot ring — matches the surface the row
36
+ // is mounted on so the dot reads as "popped out" on every preset.
37
+ const background = useThemeColor('background');
38
+
39
+ const w = maxRails * railWidth;
40
+ const h = ROW_HEIGHT;
41
+ const cy = h / 2;
42
+ const rx = (rail: number) => rail * railWidth + railWidth / 2;
43
+ const color = (rail: number) => pickLaneColor(laneColors, rail);
44
+
45
+ const commitX = rx(row.rail);
46
+
47
+ const activeAbove = new Set<number>();
48
+ if (prevRow) {
49
+ for (let r = 0; r < prevRow.rails.length; r++) {
50
+ if (prevRow.rails[r] !== null) activeAbove.add(r);
51
+ }
52
+ }
53
+ const activeBelow = new Set<number>();
54
+ for (let r = 0; r < row.rails.length; r++) {
55
+ if (row.rails[r] !== null) activeBelow.add(r);
56
+ }
57
+
58
+ const passThroughRails = Array.from(activeAbove).filter(
59
+ (r) => r !== row.rail && activeBelow.has(r),
60
+ );
61
+ const endingRails = Array.from(activeAbove).filter(
62
+ (r) => r !== row.rail && !activeBelow.has(r),
63
+ );
64
+ const forkEdges = row.edges.filter((e) => e.type === 'fork-out');
65
+ const mergeEdges = row.edges.filter((e) => e.type === 'merge-in');
66
+
67
+ return (
68
+ <svg
69
+ width={w}
70
+ height={h}
71
+ viewBox={`0 0 ${w} ${h}`}
72
+ className="shrink-0"
73
+ aria-hidden="true"
74
+ >
75
+ {passThroughRails.map((r) => {
76
+ const x = rx(r);
77
+ return (
78
+ <line
79
+ key={`pt-${r}`}
80
+ x1={x}
81
+ y1={0}
82
+ x2={x}
83
+ y2={h}
84
+ stroke={color(r)}
85
+ strokeWidth={2}
86
+ strokeOpacity={0.6}
87
+ />
88
+ );
89
+ })}
90
+
91
+ {activeAbove.has(row.rail) && (
92
+ <line
93
+ x1={commitX}
94
+ y1={0}
95
+ x2={commitX}
96
+ y2={cy}
97
+ stroke={color(row.rail)}
98
+ strokeWidth={2}
99
+ strokeOpacity={0.6}
100
+ />
101
+ )}
102
+
103
+ {activeBelow.has(row.rail) && (
104
+ <line
105
+ x1={commitX}
106
+ y1={cy}
107
+ x2={commitX}
108
+ y2={h}
109
+ stroke={color(row.rail)}
110
+ strokeWidth={2}
111
+ strokeOpacity={0.6}
112
+ />
113
+ )}
114
+
115
+ {forkEdges.map((edge, i) => (
116
+ <path
117
+ key={`f-${i}`}
118
+ d={`M${rx(edge.fromRail)},${cy} C${rx(edge.fromRail)},${h} ${rx(edge.toRail)},${cy} ${rx(edge.toRail)},${h}`}
119
+ stroke={edge.color}
120
+ strokeWidth={2}
121
+ strokeOpacity={0.6}
122
+ fill="none"
123
+ />
124
+ ))}
125
+
126
+ {mergeEdges.map((edge, i) => {
127
+ const isOutgoing = edge.fromRail === row.rail;
128
+ const x1 = rx(edge.fromRail);
129
+ const x2 = rx(edge.toRail);
130
+ const d = isOutgoing
131
+ ? `M${x1},${cy} C${x1},${h} ${x2},${cy} ${x2},${h}`
132
+ : `M${x1},${0} C${x1},${cy} ${x2},${0} ${x2},${cy}`;
133
+ return (
134
+ <path
135
+ key={`m-${i}`}
136
+ d={d}
137
+ stroke={edge.color}
138
+ strokeWidth={2}
139
+ strokeOpacity={0.6}
140
+ fill="none"
141
+ />
142
+ );
143
+ })}
144
+
145
+ {endingRails.map((r) => {
146
+ const x = rx(r);
147
+ return (
148
+ <line
149
+ key={`end-${r}`}
150
+ x1={x}
151
+ y1={0}
152
+ x2={x}
153
+ y2={cy}
154
+ stroke={color(r)}
155
+ strokeWidth={2}
156
+ strokeOpacity={0.6}
157
+ />
158
+ );
159
+ })}
160
+
161
+ <circle
162
+ cx={commitX}
163
+ cy={cy}
164
+ r={5}
165
+ fill={color(row.rail)}
166
+ stroke={background}
167
+ strokeWidth={2}
168
+ />
169
+ </svg>
170
+ );
171
+ }
@@ -0,0 +1,169 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ 'use client';
4
+
5
+ import { useMemo } from 'react';
6
+ import type { Commit, Edge, GraphRow } from '../types';
7
+ import { pickLaneColor } from './useLaneColors';
8
+
9
+ /**
10
+ * Topological layout pass for the commit graph.
11
+ *
12
+ * Walks the commit list in order (newest first) and tracks active rails —
13
+ * each slot holds the hash of the parent the rail is "waiting for". The
14
+ * algorithm produces:
15
+ *
16
+ * - The rail a commit's dot occupies.
17
+ * - The rails state after the row (for the next iteration).
18
+ * - Edges to draw on this row (pass-throughs, merge curves, fork curves).
19
+ *
20
+ * Rail colors are looked up at layout time so the rendered SVG can use raw
21
+ * hex `stroke=` values — Canvas2D/SVG won't parse Tailwind classes.
22
+ */
23
+ function computeLayout(commits: Commit[], laneColors: string[]): GraphRow[] {
24
+ const rows: GraphRow[] = [];
25
+ const rails: (string | null)[] = [];
26
+ const color = (rail: number) => pickLaneColor(laneColors, rail);
27
+
28
+ for (const commit of commits) {
29
+ const hash = commit.hash;
30
+
31
+ // Find which rail this commit occupies (if any rail is waiting for it).
32
+ let commitRail = rails.indexOf(hash);
33
+
34
+ if (commitRail === -1) {
35
+ // New branch — find first empty slot or append.
36
+ const emptySlot = rails.indexOf(null);
37
+ if (emptySlot !== -1) {
38
+ commitRail = emptySlot;
39
+ rails[commitRail] = hash;
40
+ } else {
41
+ commitRail = rails.length;
42
+ rails.push(hash);
43
+ }
44
+ }
45
+
46
+ const commitColor = color(commitRail);
47
+ const edges: Edge[] = [];
48
+
49
+ // Pass-through rails (everything not on the commit rail).
50
+ for (let r = 0; r < rails.length; r++) {
51
+ if (r !== commitRail && rails[r] !== null) {
52
+ edges.push({ fromRail: r, toRail: r, color: color(r), type: 'straight' });
53
+ }
54
+ }
55
+
56
+ // Clear this rail — the commit has been rendered.
57
+ rails[commitRail] = null;
58
+
59
+ // First parent continues on the commit's rail unless already expected
60
+ // elsewhere (merge of two existing branches).
61
+ const parents = commit.parents;
62
+ if (parents.length >= 1) {
63
+ const firstParent = parents[0];
64
+ const existingRail = rails.indexOf(firstParent);
65
+ if (existingRail !== -1) {
66
+ edges.push({
67
+ fromRail: commitRail,
68
+ toRail: existingRail,
69
+ color: commitColor,
70
+ type: 'merge-in',
71
+ });
72
+ } else {
73
+ rails[commitRail] = firstParent;
74
+ edges.push({
75
+ fromRail: commitRail,
76
+ toRail: commitRail,
77
+ color: commitColor,
78
+ type: 'straight',
79
+ });
80
+ }
81
+ }
82
+
83
+ // Second+ parents (merge sources / forks).
84
+ for (let p = 1; p < parents.length; p++) {
85
+ const parentHash = parents[p];
86
+ const existingRail = rails.indexOf(parentHash);
87
+ if (existingRail !== -1) {
88
+ edges.push({
89
+ fromRail: existingRail,
90
+ toRail: commitRail,
91
+ color: color(existingRail),
92
+ type: 'merge-in',
93
+ });
94
+ } else {
95
+ const emptySlot = rails.indexOf(null);
96
+ const newRail = emptySlot !== -1 ? emptySlot : rails.length;
97
+ if (newRail >= rails.length) rails.push(null);
98
+ rails[newRail] = parentHash;
99
+ edges.push({
100
+ fromRail: commitRail,
101
+ toRail: newRail,
102
+ color: color(newRail),
103
+ type: 'fork-out',
104
+ });
105
+ }
106
+ }
107
+
108
+ // Trim trailing nulls so `maxRails` stays accurate.
109
+ while (rails.length > 0 && rails[rails.length - 1] === null) {
110
+ rails.pop();
111
+ }
112
+
113
+ rows.push({
114
+ commit,
115
+ rail: commitRail,
116
+ rails: [...rails],
117
+ edges,
118
+ });
119
+ }
120
+
121
+ return rows;
122
+ }
123
+
124
+ /**
125
+ * Auto-infer a linear topology when no commit declares parents — the
126
+ * jalcoui examples ship a flat list and rely on the component to chain
127
+ * them.
128
+ */
129
+ function ensureTopology(commits: Commit[]): Commit[] {
130
+ const hasTopology = commits.some((c) => c.parents && c.parents.length > 0);
131
+ if (hasTopology) return commits;
132
+ return commits.map((c, i) => ({
133
+ ...c,
134
+ parents: i < commits.length - 1 ? [commits[i + 1].hash] : [],
135
+ }));
136
+ }
137
+
138
+ export interface GraphLayout {
139
+ rows: GraphRow[];
140
+ maxRails: number;
141
+ }
142
+
143
+ /**
144
+ * React-friendly wrapper around {@link computeLayout}. Memoizes on
145
+ * `commits` + `laneColors` identity so theme switches re-color but do not
146
+ * reshuffle topology.
147
+ */
148
+ export function useGraphLayout(
149
+ commits: Commit[],
150
+ laneColors: string[],
151
+ ): GraphLayout {
152
+ return useMemo(() => {
153
+ const resolved = ensureTopology(commits);
154
+ if (resolved.length === 0) {
155
+ return { rows: [], maxRails: 0 };
156
+ }
157
+ const rows = computeLayout(resolved, laneColors);
158
+ const maxRails = Math.max(
159
+ ...rows.map((r) =>
160
+ Math.max(
161
+ r.rail + 1,
162
+ r.rails.length,
163
+ ...r.edges.map((e) => Math.max(e.fromRail, e.toRail) + 1),
164
+ ),
165
+ ),
166
+ );
167
+ return { rows, maxRails };
168
+ }, [commits, laneColors]);
169
+ }
@@ -0,0 +1,45 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ 'use client';
4
+
5
+ import { useMemo } from 'react';
6
+ import { useStylePresets } from '@djangocfg/ui-core/styles/palette';
7
+
8
+ /**
9
+ * Hook returning the categorical lane palette as an array of hex strings.
10
+ *
11
+ * jalcoui hard-codes 8 raw colors (`#3b82f6`, `#22c55e`, …) — that would
12
+ * break every non-default theme preset. We instead derive the palette from
13
+ * {@link useStylePresets}: 8 distinguishable categorical fills that already
14
+ * respect the active theme. Branches beyond index 7 cycle modulo the
15
+ * palette length.
16
+ *
17
+ * Order is chosen for maximum perceptual distance between adjacent rails:
18
+ * primary → success → warning → danger → info → chart3 → chart4 → chart5.
19
+ */
20
+ export function useLaneColors(): string[] {
21
+ const presets = useStylePresets();
22
+
23
+ return useMemo(
24
+ () => [
25
+ presets.primary.fill,
26
+ presets.success.fill,
27
+ presets.warning.fill,
28
+ presets.danger.fill,
29
+ presets.info.fill,
30
+ presets.chart3.fill,
31
+ presets.chart4.fill,
32
+ presets.chart5.fill,
33
+ ],
34
+ [presets],
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Pick the color for a rail index, cycling when there are more rails than
40
+ * palette entries.
41
+ */
42
+ export function pickLaneColor(colors: string[], rail: number): string {
43
+ if (colors.length === 0) return '#000000';
44
+ return colors[((rail % colors.length) + colors.length) % colors.length];
45
+ }
@@ -0,0 +1,14 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ export { CommitGraph } from './CommitGraph';
4
+ export { useLaneColors, pickLaneColor } from './hooks/useLaneColors';
5
+ export { useGraphLayout } from './hooks/useGraphLayout';
6
+ export { ROW_HEIGHT } from './types';
7
+ export type {
8
+ Commit,
9
+ CommitAuthor,
10
+ CommitGraphProps,
11
+ Edge,
12
+ EdgeType,
13
+ GraphRow,
14
+ } from './types';
@@ -0,0 +1,25 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ 'use client';
4
+
5
+ import { createLazyComponent } from '../../../../common/lazy-wrapper';
6
+ import type { CommitGraphProps } from './types';
7
+
8
+ export const LazyCommitGraph = createLazyComponent<CommitGraphProps>(
9
+ () => import('./CommitGraph').then((mod) => ({ default: mod.CommitGraph })),
10
+ {
11
+ displayName: 'LazyCommitGraph',
12
+ fallback: (
13
+ <div
14
+ data-slot="commit-graph-skeleton"
15
+ className="h-40 w-full animate-pulse rounded-xl bg-muted"
16
+ />
17
+ ),
18
+ },
19
+ );
20
+
21
+ export type {
22
+ CommitGraphProps,
23
+ Commit,
24
+ CommitAuthor,
25
+ } from './types';
@@ -0,0 +1,85 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ import type * as React from 'react';
4
+
5
+ /**
6
+ * Author metadata rendered next to each commit row and inside the detail
7
+ * popover. Avatar URLs are optional — when omitted, the initials of
8
+ * {@link CommitAuthor.name} are shown instead.
9
+ */
10
+ export interface CommitAuthor {
11
+ name: string;
12
+ avatarUrl?: string;
13
+ }
14
+
15
+ /**
16
+ * Single commit node fed into {@link CommitGraph}. Commits must be passed in
17
+ * topological order (newest first). The `parents` array drives the rail
18
+ * topology — empty for root commits, one entry for normal commits, two or
19
+ * more for merges.
20
+ */
21
+ export interface Commit {
22
+ /** Commit hash (full or abbreviated). */
23
+ hash: string;
24
+ /** Commit message (first line). */
25
+ message: string;
26
+ /** Commit author. */
27
+ author: CommitAuthor;
28
+ /** ISO date string or Date object. */
29
+ date: string | Date;
30
+ /** Parent commit hashes. Empty for root commits. Two parents = merge commit. */
31
+ parents: string[];
32
+ /** Branch or ref labels (e.g. `"main"`, `"feat/auth"`). */
33
+ refs?: string[];
34
+ /** Tag label (e.g. `"v1.0.0"`). */
35
+ tag?: string;
36
+ }
37
+
38
+ /**
39
+ * Props for {@link CommitGraph}.
40
+ */
41
+ export interface CommitGraphProps
42
+ extends Omit<React.ComponentProps<'div'>, 'children'> {
43
+ /** Commits in topological order (newest first). */
44
+ commits: Commit[];
45
+ /** Number of hash characters to display. @default 7 */
46
+ truncateHash?: number;
47
+ /** Pixel width per rail column. @default 24 */
48
+ railWidth?: number;
49
+ }
50
+
51
+ /**
52
+ * Type of edge a rail segment renders inside a row. The layout pass tags
53
+ * every drawn segment with one of these — the SVG renderer only needs to
54
+ * pick the geometry per type.
55
+ */
56
+ export type EdgeType = 'straight' | 'merge-in' | 'fork-out';
57
+
58
+ /**
59
+ * A single edge inside a {@link GraphRow}. Indices refer to rail slots
60
+ * (left-to-right) and `color` is a hex string already resolved through the
61
+ * theme palette — never a raw scale.
62
+ */
63
+ export interface Edge {
64
+ fromRail: number;
65
+ toRail: number;
66
+ color: string;
67
+ type: EdgeType;
68
+ }
69
+
70
+ /**
71
+ * Output of {@link computeLayout}. One row per commit, with the rail
72
+ * topology snapshot needed to draw rails + edges.
73
+ */
74
+ export interface GraphRow {
75
+ commit: Commit;
76
+ /** Rail index this commit's dot occupies. */
77
+ rail: number;
78
+ /** Rails state after this row (`null` = empty slot). */
79
+ rails: (string | null)[];
80
+ /** Edges to draw between the previous row and this row. */
81
+ edges: Edge[];
82
+ }
83
+
84
+ /** Pixel height of a single commit row. */
85
+ export const ROW_HEIGHT = 40;
@@ -0,0 +1,53 @@
1
+ // Adapted from jalcoui (MIT) — github.com/jal-co/ui
2
+
3
+ /**
4
+ * Author initials fallback for the avatar slot. Returns up to 2 uppercase
5
+ * characters drawn from the first letter of each whitespace-separated word.
6
+ */
7
+ export function initials(name: string): string {
8
+ return name
9
+ .split(/\s+/)
10
+ .map((w) => w[0] ?? '')
11
+ .join('')
12
+ .toUpperCase()
13
+ .slice(0, 2);
14
+ }
15
+
16
+ /**
17
+ * Relative "x ago" formatter used on each commit row. Falls back to a
18
+ * locale-formatted date once the gap exceeds a week.
19
+ */
20
+ export function formatRelativeDate(date: string | Date): string {
21
+ const d = typeof date === 'string' ? new Date(date) : date;
22
+ const now = new Date();
23
+ const diffMs = now.getTime() - d.getTime();
24
+ const diffMins = Math.floor(diffMs / 60_000);
25
+ const diffHours = Math.floor(diffMs / 3_600_000);
26
+ const diffDays = Math.floor(diffMs / 86_400_000);
27
+
28
+ if (diffMins < 1) return 'just now';
29
+ if (diffMins < 60) return `${diffMins}m ago`;
30
+ if (diffHours < 24) return `${diffHours}h ago`;
31
+ if (diffDays < 7) return `${diffDays}d ago`;
32
+
33
+ return d.toLocaleDateString('en-US', {
34
+ month: 'short',
35
+ day: 'numeric',
36
+ year: d.getFullYear() !== now.getFullYear() ? 'numeric' : undefined,
37
+ });
38
+ }
39
+
40
+ /**
41
+ * Fully-qualified date shown inside the commit detail popover.
42
+ */
43
+ export function formatFullDate(date: string | Date): string {
44
+ const d = typeof date === 'string' ? new Date(date) : date;
45
+ return d.toLocaleDateString('en-US', {
46
+ weekday: 'short',
47
+ month: 'short',
48
+ day: 'numeric',
49
+ year: 'numeric',
50
+ hour: 'numeric',
51
+ minute: '2-digit',
52
+ });
53
+ }
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { createLazyComponent } from '../../../components/lazy-wrapper';
3
+ import { createLazyComponent } from '../../../../common/lazy-wrapper';
4
4
  import type { GaugeProps } from './types';
5
5
 
6
6
  export const LazyGauge = createLazyComponent<GaugeProps>(