vzcode 2.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/assets/{buildWorker-Dsx6rOdK.js → buildWorker-wLkQ0yz1.js} +64 -64
  2. package/dist/assets/{index-BM8tDh6M.css → index-BoFeK4GL.css} +1 -1
  3. package/dist/assets/{index-BgqNq-ww.js → index-DuUjtrt6.js} +107 -107
  4. package/dist/assets/{worker-BeBZGG1n.js → worker-DHxSPM7N.js} +78 -78
  5. package/dist/cli.js +113 -0
  6. package/dist/index.html +2 -2
  7. package/{src/ot.ts → dist/ot.js} +2 -14
  8. package/{src/randomId.ts → dist/randomId.js} +5 -6
  9. package/dist/runCode.js +20 -0
  10. package/dist/server/aiChatHandler/aiEditing.js +89 -0
  11. package/dist/server/aiChatHandler/chatOperations.js +360 -0
  12. package/dist/server/aiChatHandler/errorHandling.js +49 -0
  13. package/dist/server/aiChatHandler/index.js +112 -0
  14. package/dist/server/aiChatHandler/llmStreaming.js +284 -0
  15. package/dist/server/aiChatHandler/validation.js +19 -0
  16. package/dist/server/computeInitialDocument.js +146 -0
  17. package/{src/server/config.ts → dist/server/config.js} +4 -7
  18. package/{src/server/featureFlags.ts → dist/server/featureFlags.js} +0 -3
  19. package/dist/server/generateAIResponse.js +129 -0
  20. package/dist/server/handleAIAssist.js +39 -0
  21. package/dist/server/handleAICopilot.js +81 -0
  22. package/dist/server/index.js +297 -0
  23. package/dist/server/livekit.js +17 -0
  24. package/dist/server/prettier.js +90 -0
  25. package/{src/server/setupEnv.ts → dist/server/setupEnv.js} +1 -2
  26. package/dist/submitOperation.js +14 -0
  27. package/dist/types.js +1 -0
  28. package/dist/utils/fileDiff.js +66 -0
  29. package/package.json +23 -22
  30. package/src/client/AIAssist/AIAssistCodeMirrorKeyMap.ts +0 -42
  31. package/src/client/AIAssist/AIAssistWidget/index.tsx +0 -135
  32. package/src/client/AIAssist/AIAssistWidget/style.scss +0 -47
  33. package/src/client/AIAssist/Spinner.jsx +0 -76
  34. package/src/client/AIAssist/formatFile.ts +0 -27
  35. package/src/client/AIAssist/generateFilesContext.ts +0 -25
  36. package/src/client/AIAssist/index.ts +0 -2
  37. package/src/client/AIAssist/startAIAssist.ts +0 -95
  38. package/src/client/App/index.tsx +0 -153
  39. package/src/client/App/style.scss +0 -82
  40. package/src/client/App/usePending.ts +0 -51
  41. package/src/client/App/useShareDB.ts +0 -161
  42. package/src/client/CodeEditor/Copilot/index.ts +0 -74
  43. package/src/client/CodeEditor/InteractiveWidgets/boolToggler.ts +0 -12
  44. package/src/client/CodeEditor/InteractiveWidgets/colorPicker.ts +0 -68
  45. package/src/client/CodeEditor/InteractiveWidgets/colorsInTextPlugin.ts +0 -174
  46. package/src/client/CodeEditor/InteractiveWidgets/highlightWidgets.ts +0 -79
  47. package/src/client/CodeEditor/InteractiveWidgets/index.ts +0 -44
  48. package/src/client/CodeEditor/InteractiveWidgets/markdownCheckboxToggler.ts +0 -12
  49. package/src/client/CodeEditor/InteractiveWidgets/numberDragger.ts +0 -20
  50. package/src/client/CodeEditor/InteractiveWidgets/rotateWidget.ts +0 -143
  51. package/src/client/CodeEditor/InteractiveWidgets/urlClicker.test.ts +0 -48
  52. package/src/client/CodeEditor/InteractiveWidgets/urlClicker.ts +0 -12
  53. package/src/client/CodeEditor/InteractiveWidgets/vec2Slider.ts +0 -25
  54. package/src/client/CodeEditor/basicSetup.ts +0 -73
  55. package/src/client/CodeEditor/getOrCreateEditor.tsx +0 -615
  56. package/src/client/CodeEditor/index.tsx +0 -202
  57. package/src/client/CodeEditor/json1PresenceBroadcast.ts +0 -41
  58. package/src/client/CodeEditor/json1PresenceDisplay.ts +0 -350
  59. package/src/client/CodeEditor/rainbowBrackets.ts +0 -122
  60. package/src/client/CodeEditor/style.scss +0 -156
  61. package/src/client/CodeEditor/typescriptExtension/worker.ts +0 -32
  62. package/src/client/CodeErrorOverlay/index.tsx +0 -77
  63. package/src/client/CodeErrorOverlay/style.scss +0 -33
  64. package/src/client/Fonts/fonts.ts +0 -8
  65. package/src/client/Icons/AdjustmentSVG.tsx +0 -19
  66. package/src/client/Icons/BugSVG.tsx +0 -20
  67. package/src/client/Icons/CloseSVG.tsx +0 -19
  68. package/src/client/Icons/CssSVG.tsx +0 -16
  69. package/src/client/Icons/DirectoryArrowSVG.tsx +0 -19
  70. package/src/client/Icons/EditSVG.tsx +0 -19
  71. package/src/client/Icons/FileSVG.tsx +0 -19
  72. package/src/client/Icons/FolderSVG.tsx +0 -20
  73. package/src/client/Icons/GearSVG.tsx +0 -16
  74. package/src/client/Icons/HtmlSVG.tsx +0 -16
  75. package/src/client/Icons/JavaScriptSVG.tsx +0 -16
  76. package/src/client/Icons/JsonSVG.tsx +0 -16
  77. package/src/client/Icons/MarkdownSVG.tsx +0 -16
  78. package/src/client/Icons/MicSVG.tsx +0 -25
  79. package/src/client/Icons/NewSVG.tsx +0 -19
  80. package/src/client/Icons/PinSVG.tsx +0 -14
  81. package/src/client/Icons/PlaySVG.tsx +0 -16
  82. package/src/client/Icons/QuestionMarkSVG.tsx +0 -18
  83. package/src/client/Icons/ReactSVG.tsx +0 -16
  84. package/src/client/Icons/SearchSVG.tsx +0 -20
  85. package/src/client/Icons/SparklesSVG.tsx +0 -23
  86. package/src/client/Icons/SplitEditorSVG.tsx +0 -34
  87. package/src/client/Icons/StopSVG.tsx +0 -15
  88. package/src/client/Icons/SvelteSVG.tsx +0 -16
  89. package/src/client/Icons/TrashSVG.tsx +0 -19
  90. package/src/client/Icons/TypeScriptSVG.tsx +0 -16
  91. package/src/client/Icons/index.tsx +0 -24
  92. package/src/client/ImageViewer/index.tsx +0 -91
  93. package/src/client/ImageViewer/style.scss +0 -41
  94. package/src/client/PresenceNotifications/PresenceNotifications.test.ts +0 -134
  95. package/src/client/PresenceNotifications/index.tsx +0 -158
  96. package/src/client/PresenceNotifications/style.scss +0 -17
  97. package/src/client/RunCodeWidget/index.tsx +0 -117
  98. package/src/client/RunCodeWidget/style.scss +0 -24
  99. package/src/client/SplitPaneResizeContext.tsx +0 -159
  100. package/src/client/TabList/Tab.tsx +0 -73
  101. package/src/client/TabList/index.tsx +0 -35
  102. package/src/client/TabList/style.scss +0 -51
  103. package/src/client/VZCodeContext/index.tsx +0 -29
  104. package/src/client/VZCodeContext/types.ts +0 -249
  105. package/src/client/VZCodeContext/useVZCodeState.ts +0 -584
  106. package/src/client/VZKeyboardShortcutsDoc.tsx +0 -148
  107. package/src/client/VZLeft.tsx +0 -28
  108. package/src/client/VZMiddle.tsx +0 -172
  109. package/src/client/VZResizer/index.tsx +0 -128
  110. package/src/client/VZResizer/styles.scss +0 -33
  111. package/src/client/VZRight.tsx +0 -113
  112. package/src/client/VZSettings.tsx +0 -275
  113. package/src/client/VZSidebar/AIChat/ChatInput.tsx +0 -196
  114. package/src/client/VZSidebar/AIChat/DiffView.scss +0 -136
  115. package/src/client/VZSidebar/AIChat/DiffView.tsx +0 -176
  116. package/src/client/VZSidebar/AIChat/Message.tsx +0 -143
  117. package/src/client/VZSidebar/AIChat/MessageList.tsx +0 -205
  118. package/src/client/VZSidebar/AIChat/StreamingMessage.tsx +0 -35
  119. package/src/client/VZSidebar/AIChat/ThinkingScratchpad.tsx +0 -156
  120. package/src/client/VZSidebar/AIChat/TypingIndicator.tsx +0 -19
  121. package/src/client/VZSidebar/AIChat/index.tsx +0 -273
  122. package/src/client/VZSidebar/AIChat/styles.scss +0 -627
  123. package/src/client/VZSidebar/CreateDirModal.tsx +0 -111
  124. package/src/client/VZSidebar/CreateFileModal.tsx +0 -111
  125. package/src/client/VZSidebar/DeleteConfirmationModal.tsx +0 -76
  126. package/src/client/VZSidebar/DirectoryListing.tsx +0 -89
  127. package/src/client/VZSidebar/EmptyState.tsx +0 -11
  128. package/src/client/VZSidebar/FileListing.tsx +0 -91
  129. package/src/client/VZSidebar/FileTypeIcon.tsx +0 -49
  130. package/src/client/VZSidebar/Item.tsx +0 -237
  131. package/src/client/VZSidebar/Listing.tsx +0 -47
  132. package/src/client/VZSidebar/Search.tsx +0 -527
  133. package/src/client/VZSidebar/VisualEditor.tsx +0 -295
  134. package/src/client/VZSidebar/VoiceChatModal.tsx +0 -121
  135. package/src/client/VZSidebar/aiCopyPaste.ts +0 -199
  136. package/src/client/VZSidebar/index.tsx +0 -728
  137. package/src/client/VZSidebar/styles.scss +0 -612
  138. package/src/client/VZSidebar/useDragAndDrop.tsx +0 -408
  139. package/src/client/bootstrap.ts +0 -26
  140. package/src/client/buildWorker.ts +0 -3
  141. package/src/client/featureFlags.ts +0 -8
  142. package/src/client/generateRequestId.ts +0 -6
  143. package/src/client/getFileTree.ts +0 -53
  144. package/src/client/index.ts +0 -19
  145. package/src/client/main.jsx +0 -10
  146. package/src/client/presenceColor.ts +0 -8
  147. package/src/client/shouldTriggerRun.ts +0 -31
  148. package/src/client/sortFileTree.ts +0 -21
  149. package/src/client/tabsSearchParameters.test.ts +0 -79
  150. package/src/client/tabsSearchParameters.ts +0 -137
  151. package/src/client/themes/index.ts +0 -7
  152. package/src/client/themes/themes.ts +0 -77
  153. package/src/client/themes/uiwImports.ts +0 -32
  154. package/src/client/themes/useDynamicTheme.ts +0 -29
  155. package/src/client/themes/vizhubTheme/colors.ts +0 -80
  156. package/src/client/themes/vizhubTheme/index.ts +0 -193
  157. package/src/client/useActions.ts +0 -288
  158. package/src/client/useESLint/index.ts +0 -72
  159. package/src/client/useESLint/worker.ts +0 -113
  160. package/src/client/useEditorCache.ts +0 -35
  161. package/src/client/useFileCRUD.ts +0 -228
  162. package/src/client/useKeyboardShortcuts.ts +0 -451
  163. package/src/client/useOpenDirectories.ts +0 -99
  164. package/src/client/usePresenceAutoFollow.ts +0 -85
  165. package/src/client/usePrettier/index.ts +0 -178
  166. package/src/client/usePrettier/worker.ts +0 -109
  167. package/src/client/useRunCode.tsx +0 -15
  168. package/src/client/useRuntimeError.ts +0 -32
  169. package/src/client/useSubmitOperation.ts +0 -15
  170. package/src/client/useURLSync.ts +0 -137
  171. package/src/client/usernameLocalStorage.ts +0 -43
  172. package/src/client/utils/fileExtension.ts +0 -10
  173. package/src/client/utils/isImageFile.ts +0 -12
  174. package/src/client/vzReducer/aiChatReducer.ts +0 -44
  175. package/src/client/vzReducer/closeTabReducer.test.ts +0 -205
  176. package/src/client/vzReducer/closeTabsReducer.ts +0 -96
  177. package/src/client/vzReducer/createInitialState.ts +0 -38
  178. package/src/client/vzReducer/editorNoLongerWantsFocusReducer.ts +0 -9
  179. package/src/client/vzReducer/findPane.ts +0 -19
  180. package/src/client/vzReducer/index.ts +0 -250
  181. package/src/client/vzReducer/openTabReducer.test.ts +0 -127
  182. package/src/client/vzReducer/openTabReducer.ts +0 -74
  183. package/src/client/vzReducer/searchReducer.test.ts +0 -292
  184. package/src/client/vzReducer/searchReducer.ts +0 -181
  185. package/src/client/vzReducer/setActiveFileIdReducer.ts +0 -28
  186. package/src/client/vzReducer/setActiveFileLeftRightReducer.ts +0 -76
  187. package/src/client/vzReducer/setIsDocOpenReducer.ts +0 -9
  188. package/src/client/vzReducer/setIsSettingsOpenReducer.ts +0 -9
  189. package/src/client/vzReducer/setThemeReducer.ts +0 -9
  190. package/src/client/vzReducer/setUsernameReducer.ts +0 -9
  191. package/src/client/vzReducer/splitCurrentPaneReducer.ts +0 -66
  192. package/src/client/vzReducer/toggleAutoFollowReducer.ts +0 -12
  193. package/src/client/vzReducer/updatePane.ts +0 -40
  194. package/src/client/vzReducer/updatePresenceIndicatorReducer.ts +0 -30
  195. package/src/client/vzReducer/visualEditorReducer.ts +0 -9
  196. package/src/reactRouterExports.ts +0 -15
  197. package/src/runCode.ts +0 -27
  198. package/src/server/aiChatHandler/aiEditing.ts +0 -152
  199. package/src/server/aiChatHandler/chatOperations.ts +0 -510
  200. package/src/server/aiChatHandler/errorHandling.ts +0 -66
  201. package/src/server/aiChatHandler/index.ts +0 -200
  202. package/src/server/aiChatHandler/llmStreaming.ts +0 -419
  203. package/src/server/aiChatHandler/undoHandler.ts +0 -97
  204. package/src/server/aiChatHandler/validation.ts +0 -24
  205. package/src/server/computeInitialDocument.ts +0 -220
  206. package/src/server/generateAIResponse.ts +0 -188
  207. package/src/server/handleAIAssist.ts +0 -53
  208. package/src/server/handleAIChatUndo.ts +0 -2
  209. package/src/server/handleAICopilot.ts +0 -97
  210. package/src/server/index.ts +0 -388
  211. package/src/server/livekit.ts +0 -24
  212. package/src/server/prettier.ts +0 -115
  213. package/src/submitOperation.ts +0 -25
  214. package/src/types.ts +0 -205
  215. package/src/utils/fileDiff.ts +0 -117
  216. package/src/vite-env.d.ts +0 -10
  217. /package/{src/server/handleAIChatMessage.ts → dist/server/handleAIChatMessage.js} +0 -0
  218. /package/{src/server/isDirectory.ts → dist/server/isDirectory.js} +0 -0
@@ -1,25 +0,0 @@
1
- export const MicSVG = () => (
2
- <svg
3
- fill="#000000"
4
- height="24"
5
- width="24"
6
- stroke="currentColor"
7
- version="1.1"
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 512 512"
10
- enableBackground="new 0 0 512 512"
11
- >
12
- <g>
13
- <g>
14
- <path
15
- fill="currentColor"
16
- d="m439.5,236c0-11.3-9.1-20.4-20.4-20.4s-20.4,9.1-20.4,20.4c0,70-64,126.9-142.7,126.9-78.7,0-142.7-56.9-142.7-126.9 0-11.3-9.1-20.4-20.4-20.4s-20.4,9.1-20.4,20.4c0,86.2 71.5,157.4 163.1,166.7v57.5h-23.6c-11.3,0-20.4,9.1-20.4,20.4 0,11.3 9.1,20.4 20.4,20.4h88c11.3,0 20.4-9.1 20.4-20.4 0-11.3-9.1-20.4-20.4-20.4h-23.6v-57.5c91.6-9.3 163.1-80.5 163.1-166.7z"
17
- />
18
- <path
19
- fill="currentColor"
20
- d="m256,323.5c51,0 92.3-41.3 92.3-92.3v-127.9c0-51-41.3-92.3-92.3-92.3s-92.3,41.3-92.3,92.3v127.9c0,51 41.3,92.3 92.3,92.3zm-52.3-220.2c0-28.8 23.5-52.3 52.3-52.3s52.3,23.5 52.3,52.3v127.9c0,28.8-23.5,52.3-52.3,52.3s-52.3-23.5-52.3-52.3v-127.9z"
21
- />
22
- </g>
23
- </g>
24
- </svg>
25
- );
@@ -1,19 +0,0 @@
1
- export const NewSVG = () => {
2
- return (
3
- <svg
4
- xmlns="http://www.w3.org/2000/svg"
5
- width="24"
6
- height="24"
7
- viewBox="0 0 24 24"
8
- fill="none"
9
- >
10
- <path
11
- stroke="currentColor"
12
- strokeLinecap="round"
13
- strokeLinejoin="round"
14
- strokeWidth="1.5"
15
- d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"
16
- />
17
- </svg>
18
- );
19
- };
@@ -1,14 +0,0 @@
1
- // From https://primer.style/foundations/icons/pin-24
2
- export const PinSVG = () => (
3
- <svg
4
- xmlns="http://www.w3.org/2000/svg"
5
- viewBox="0 0 24 24"
6
- width="24"
7
- height="24"
8
- >
9
- <path
10
- fill="currentColor"
11
- d="m16.114 1.553 6.333 6.333a1.75 1.75 0 0 1-.603 2.869l-1.63.633a5.67 5.67 0 0 0-3.395 3.725l-1.131 3.959a1.75 1.75 0 0 1-2.92.757L9 16.061l-5.595 5.594a.749.749 0 1 1-1.06-1.06L7.939 15l-3.768-3.768a1.75 1.75 0 0 1 .757-2.92l3.959-1.131a5.666 5.666 0 0 0 3.725-3.395l.633-1.63a1.75 1.75 0 0 1 2.869-.603ZM5.232 10.171l8.597 8.597a.25.25 0 0 0 .417-.108l1.131-3.959A7.17 7.17 0 0 1 19.67 9.99l1.63-.634a.25.25 0 0 0 .086-.409l-6.333-6.333a.25.25 0 0 0-.409.086l-.634 1.63a7.17 7.17 0 0 1-4.711 4.293L5.34 9.754a.25.25 0 0 0-.108.417Z"
12
- ></path>
13
- </svg>
14
- );
@@ -1,16 +0,0 @@
1
- export const PlaySVG = () => (
2
- <svg
3
- width="24"
4
- height="24"
5
- fill="none"
6
- viewBox="0 0 24 24"
7
- strokeWidth={1.5}
8
- stroke="currentColor"
9
- >
10
- <path
11
- strokeLinecap="round"
12
- strokeLinejoin="round"
13
- d="M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.347a1.125 1.125 0 0 1 0 1.972l-11.54 6.347a1.125 1.125 0 0 1-1.667-.986V5.653Z"
14
- />
15
- </svg>
16
- );
@@ -1,18 +0,0 @@
1
- // From https://heroicons.com/
2
- export const QuestionMarkSVG = () => (
3
- <svg
4
- xmlns="http://www.w3.org/2000/svg"
5
- fill="none"
6
- width="24"
7
- height="24"
8
- viewBox="0 0 24 24"
9
- strokeWidth="1.5"
10
- stroke="currentColor"
11
- >
12
- <path
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- d="M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z"
16
- />
17
- </svg>
18
- );
@@ -1,16 +0,0 @@
1
- // https://reactsvgicons.com/
2
- export const ReactSVG = () => {
3
- return (
4
- <svg
5
- width="24"
6
- height="24"
7
- xmlns="http://www.w3.org/2000/svg"
8
- fill="currentColor"
9
- viewBox="0 0 24 24"
10
- strokeWidth="1.5"
11
- stroke="none"
12
- >
13
- <path d="M14.23 12.004a2.236 2.236 0 01-2.235 2.236 2.236 2.236 0 01-2.236-2.236 2.236 2.236 0 012.235-2.236 2.236 2.236 0 012.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38a2.167 2.167 0 00-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44a23.476 23.476 0 00-3.107-.534A23.892 23.892 0 0012.769 4.7c1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442a22.73 22.73 0 00-3.113.538 15.02 15.02 0 01-.254-1.42c-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87a25.64 25.64 0 01-4.412.005 26.64 26.64 0 01-1.183-1.86c-.372-.64-.71-1.29-1.018-1.946a25.17 25.17 0 011.013-1.954c.38-.66.773-1.286 1.18-1.868A25.245 25.245 0 0112 8.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933a25.952 25.952 0 00-1.345-2.32zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493a23.966 23.966 0 00-1.1-2.98c.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98a23.142 23.142 0 00-1.086 2.964c-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39a25.819 25.819 0 001.341-2.338zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143a22.005 22.005 0 01-2.006-.386c.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295a1.185 1.185 0 01-.553-.132c-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z" />
14
- </svg>
15
- );
16
- };
@@ -1,20 +0,0 @@
1
- // From Heroicons
2
- export const SearchSVG = () => {
3
- return (
4
- <svg
5
- width="24"
6
- height="24"
7
- xmlns="http://www.w3.org/2000/svg"
8
- fill="none"
9
- viewBox="0 0 24 24"
10
- strokeWidth="1.5"
11
- stroke="currentColor"
12
- >
13
- <path
14
- strokeLinecap="round"
15
- strokeLinejoin="round"
16
- d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
17
- />
18
- </svg>
19
- );
20
- };
@@ -1,23 +0,0 @@
1
- export const SparklesSVG = ({
2
- width = '32',
3
- height = '32',
4
- }: {
5
- width?: string | number;
6
- height?: string | number;
7
- }) => (
8
- <svg
9
- xmlns="http://www.w3.org/2000/svg"
10
- width={width}
11
- height={height}
12
- viewBox="0 0 24 24"
13
- fill="currentColor"
14
- stroke="currentColor"
15
- strokeWidth="1.5"
16
- strokeLinecap="round"
17
- strokeLinejoin="round"
18
- >
19
- <path d="M9.8132 15.9038L9 18.75L8.1868 15.9038C7.75968 14.4089 6.59112 13.2403 5.09619 12.8132L2.25 12L5.09619 11.1868C6.59113 10.7597 7.75968 9.59112 8.1868 8.09619L9 5.25L9.8132 8.09619C10.2403 9.59113 11.4089 10.7597 12.9038 11.1868L15.75 12L12.9038 12.8132C11.4089 13.2403 10.2403 14.4089 9.8132 15.9038Z" />
20
- <path d="M18.2589 8.71454L18 9.75L17.7411 8.71454C17.4388 7.50533 16.4947 6.56117 15.2855 6.25887L14.25 6L15.2855 5.74113C16.4947 5.43883 17.4388 4.49467 17.7411 3.28546L18 2.25L18.2589 3.28546C18.5612 4.49467 19.5053 5.43883 20.7145 5.74113L21.75 6L20.7145 6.25887C19.5053 6.56117 18.5612 7.50533 18.2589 8.71454Z" />
21
- <path d="M16.8942 20.5673L16.5 21.75L16.1058 20.5673C15.8818 19.8954 15.3546 19.3682 14.6827 19.1442L13.5 18.75L14.6827 18.3558C15.3546 18.1318 15.8818 17.6046 16.1058 16.9327L16.5 15.75L16.8942 16.9327C17.1182 17.6046 17.6454 18.1318 18.3173 18.3558L19.5 18.75L18.3173 19.1442C17.6454 19.3682 17.1182 19.8954 16.8942 20.5673Z" />
22
- </svg>
23
- );
@@ -1,34 +0,0 @@
1
- export const SplitEditorSVG = () => {
2
- return (
3
- <svg
4
- xmlns="http://www.w3.org/2000/svg"
5
- width="24"
6
- height="24"
7
- viewBox="0 0 24 24"
8
- fill="none"
9
- >
10
- <rect
11
- x="5"
12
- y="4"
13
- width="7.5"
14
- height="16"
15
- rx="1"
16
- ry="1"
17
- stroke="currentColor"
18
- strokeWidth="1.5"
19
- fill="none"
20
- />
21
- <rect
22
- x="12"
23
- y="4"
24
- width="7.5"
25
- height="16"
26
- rx="1"
27
- ry="1"
28
- stroke="currentColor"
29
- strokeWidth="1.5"
30
- fill="none"
31
- />
32
- </svg>
33
- );
34
- };
@@ -1,15 +0,0 @@
1
- // From Wikimedia
2
- // https://commons.wikimedia.org/wiki/File:Stopsign.svg
3
- export const StopSVG = () => (
4
- <svg
5
- width="15pt"
6
- height="15pt"
7
- version="1.1"
8
- viewBox="0 0 15 15"
9
- xmlns="http://www.w3.org/2000/svg"
10
- >
11
- <g transform="scale(.75)" fill="#fff" stroke="#000">
12
- <path d="m17.5 0.5c1.1055 0 2 0.89453 2 2v15c0 1.1055-0.89453 2-2 2h-15c-1.1055 0-2-0.89453-2-2v-15c0-1.1055 0.89453-2 2-2z" />
13
- </g>
14
- </svg>
15
- );
@@ -1,16 +0,0 @@
1
- // https://reactsvgicons.com/
2
- export const SvelteSVG = () => {
3
- return (
4
- <svg
5
- width="24"
6
- height="24"
7
- xmlns="http://www.w3.org/2000/svg"
8
- fill="currentColor"
9
- viewBox="0 0 24 24"
10
- strokeWidth="1.5"
11
- stroke="none"
12
- >
13
- <path d="M10.354 21.125a4.44 4.44 0 01-4.765-1.767 4.109 4.109 0 01-.703-3.107 3.898 3.898 0 01.134-.522l.105-.321.287.21a7.21 7.21 0 002.186 1.092l.208.063-.02.208a1.253 1.253 0 00.226.83 1.337 1.337 0 001.435.533 1.231 1.231 0 00.343-.15l5.59-3.562a1.164 1.164 0 00.524-.778 1.242 1.242 0 00-.211-.937 1.338 1.338 0 00-1.435-.533 1.23 1.23 0 00-.343.15l-2.133 1.36a4.078 4.078 0 01-1.135.499 4.44 4.44 0 01-4.765-1.766 4.108 4.108 0 01-.702-3.108 3.855 3.855 0 011.742-2.582l5.589-3.563a4.072 4.072 0 011.135-.499 4.44 4.44 0 014.765 1.767 4.109 4.109 0 01.703 3.107 3.943 3.943 0 01-.134.522l-.105.321-.286-.21a7.204 7.204 0 00-2.187-1.093l-.208-.063.02-.207a1.255 1.255 0 00-.226-.831 1.337 1.337 0 00-1.435-.532 1.231 1.231 0 00-.343.15L8.62 9.368a1.162 1.162 0 00-.524.778 1.24 1.24 0 00.211.937 1.338 1.338 0 001.435.533 1.235 1.235 0 00.344-.151l2.132-1.36a4.067 4.067 0 011.135-.498 4.44 4.44 0 014.765 1.766 4.108 4.108 0 01.702 3.108 3.857 3.857 0 01-1.742 2.583l-5.589 3.562a4.072 4.072 0 01-1.135.499m10.358-17.95C18.484-.015 14.082-.96 10.9 1.068L5.31 4.63a6.412 6.412 0 00-2.896 4.295 6.753 6.753 0 00.666 4.336 6.43 6.43 0 00-.96 2.396 6.833 6.833 0 001.168 5.167c2.229 3.19 6.63 4.135 9.812 2.108l5.59-3.562a6.41 6.41 0 002.896-4.295 6.756 6.756 0 00-.665-4.336 6.429 6.429 0 00.958-2.396 6.831 6.831 0 00-1.167-5.168z" />
14
- </svg>
15
- );
16
- };
@@ -1,19 +0,0 @@
1
- export const TrashSVG = () => {
2
- return (
3
- <svg
4
- xmlns="http://www.w3.org/2000/svg"
5
- width="24"
6
- height="24"
7
- viewBox="0 0 24 24"
8
- >
9
- <path
10
- fill="none"
11
- stroke="currentColor"
12
- d="M14.7404 9L14.3942 18M9.60577 18L9.25962 9M19.2276 5.79057C19.5696 5.84221 19.9104 5.89747 20.25 5.95629M19.2276 5.79057L18.1598 19.6726C18.0696 20.8448 17.0921 21.75 15.9164 21.75H8.08357C6.90786 21.75 5.93037 20.8448 5.8402 19.6726L4.77235 5.79057M19.2276 5.79057C18.0812 5.61744 16.9215 5.48485 15.75 5.39432M3.75 5.95629C4.08957 5.89747 4.43037 5.84221 4.77235 5.79057M4.77235 5.79057C5.91878 5.61744 7.07849 5.48485 8.25 5.39432M15.75 5.39432V4.47819C15.75 3.29882 14.8393 2.31423 13.6606 2.27652C13.1092 2.25889 12.5556 2.25 12 2.25C11.4444 2.25 10.8908 2.25889 10.3394 2.27652C9.16065 2.31423 8.25 3.29882 8.25 4.47819V5.39432M15.75 5.39432C14.5126 5.2987 13.262 5.25 12 5.25C10.738 5.25 9.48744 5.2987 8.25 5.39432"
13
- strokeWidth="1.5"
14
- strokeLinecap="round"
15
- strokeLinejoin="round"
16
- />
17
- </svg>
18
- );
19
- };
@@ -1,16 +0,0 @@
1
- // https://reactsvgicons.com/
2
- export const TypeScriptSVG = () => {
3
- return (
4
- <svg
5
- width="24"
6
- height="24"
7
- xmlns="http://www.w3.org/2000/svg"
8
- fill="currentColor"
9
- viewBox="0 0 24 24"
10
- strokeWidth="1.5"
11
- stroke="none"
12
- >
13
- <path d="M3 3h18v18H3V3m10.71 14.86c.5.98 1.51 1.73 3.09 1.73 1.6 0 2.8-.83 2.8-2.36 0-1.41-.81-2.04-2.25-2.66l-.42-.18c-.73-.31-1.04-.52-1.04-1.02 0-.41.31-.73.81-.73.48 0 .8.21 1.09.73l1.31-.87c-.55-.96-1.33-1.33-2.4-1.33-1.51 0-2.48.96-2.48 2.23 0 1.38.81 2.03 2.03 2.55l.42.18c.78.34 1.24.55 1.24 1.13 0 .48-.45.83-1.15.83-.83 0-1.31-.43-1.67-1.03l-1.38.8M13 11.25H8v1.5h1.5V20h1.75v-7.25H13v-1.5z" />
14
- </svg>
15
- );
16
- };
@@ -1,24 +0,0 @@
1
- export { SparklesSVG } from './SparklesSVG';
2
- export { StopSVG } from './StopSVG';
3
- export { EditSVG } from './EditSVG';
4
- export { NewSVG } from './NewSVG';
5
- export { GearSVG } from './GearSVG';
6
- export { CloseSVG } from './CloseSVG';
7
- export { TrashSVG } from './TrashSVG';
8
- export { BugSVG } from './BugSVG';
9
- export { FileSVG } from './FileSVG';
10
- export { DirectoryArrowSVG } from './DirectoryArrowSVG';
11
- export { PlaySVG } from './PlaySVG';
12
- export { QuestionMarkSVG } from './QuestionMarkSVG';
13
- export { PinSVG } from './PinSVG';
14
- export { FolderSVG } from './FolderSVG';
15
- export { SearchSVG } from './SearchSVG';
16
- export { JavaScriptSVG } from './JavaScriptSVG';
17
- export { TypeScriptSVG } from './TypeScriptSVG';
18
- export { ReactSVG } from './ReactSVG';
19
- export { SvelteSVG } from './SvelteSVG';
20
- export { HtmlSVG } from './HtmlSVG';
21
- export { CssSVG } from './CssSVG';
22
- export { JsonSVG } from './JsonSVG';
23
- export { MarkdownSVG } from './MarkdownSVG';
24
- export { AdjustmentSVG } from './AdjustmentSVG';
@@ -1,91 +0,0 @@
1
- import { useContext } from 'react';
2
- import { VZCodeContext } from '../VZCodeContext';
3
- import './style.scss';
4
-
5
- export const ImageViewer = () => {
6
- const { activePane, content } = useContext(VZCodeContext);
7
-
8
- // Get the active file
9
- const activeFileId = activePane?.activeFileId;
10
- const activeFile =
11
- activeFileId && content?.files?.[activeFileId];
12
-
13
- if (!activeFile) {
14
- return (
15
- <div className="image-viewer-error">
16
- No file selected
17
- </div>
18
- );
19
- }
20
-
21
- // Check if it's an image file based on extension
22
- const isImageFile = activeFile.name.match(
23
- /\.(png|jpg|jpeg|gif|bmp|svg|webp)$/i,
24
- );
25
-
26
- if (!isImageFile) {
27
- return (
28
- <div className="image-viewer-error">
29
- Not an image file
30
- </div>
31
- );
32
- }
33
-
34
- // Get the MIME type from the file extension
35
- const getImageMimeType = (fileName: string): string => {
36
- const extension = fileName
37
- .split('.')
38
- .pop()
39
- ?.toLowerCase();
40
- switch (extension) {
41
- case 'jpg':
42
- case 'jpeg':
43
- return 'image/jpeg';
44
- case 'png':
45
- return 'image/png';
46
- case 'gif':
47
- return 'image/gif';
48
- case 'bmp':
49
- return 'image/bmp';
50
- case 'svg':
51
- return 'image/svg+xml';
52
- case 'webp':
53
- return 'image/webp';
54
- default:
55
- return 'image/png'; // fallback
56
- }
57
- };
58
-
59
- const mimeType = getImageMimeType(activeFile.name);
60
- const extension = activeFile.name
61
- .split('.')
62
- .pop()
63
- ?.toLowerCase();
64
-
65
- // For SVG files, the content might already be the SVG text, not base64
66
- const imageSrc =
67
- extension === 'svg' &&
68
- !activeFile.text.startsWith('PHN2Zw') // Check if it's not base64-encoded SVG
69
- ? `data:${mimeType};utf8,${encodeURIComponent(activeFile.text)}`
70
- : `data:${mimeType};base64,${activeFile.text}`;
71
-
72
- return (
73
- <div className="image-viewer">
74
- <div className="image-viewer-content">
75
- <img
76
- src={imageSrc}
77
- alt={activeFile.name}
78
- className="image-viewer-img"
79
- onError={(e) => {
80
- console.error(
81
- 'Failed to load image:',
82
- activeFile.name,
83
- );
84
- (e.target as HTMLImageElement).style.display =
85
- 'none';
86
- }}
87
- />
88
- </div>
89
- </div>
90
- );
91
- };
@@ -1,41 +0,0 @@
1
- .image-viewer {
2
- height: 100%;
3
- width: 100%;
4
- display: flex;
5
- flex-direction: column;
6
- background-color: var(--bs-body-bg);
7
- color: var(--bs-body-color);
8
- }
9
-
10
- .image-viewer-header {
11
- padding: 12px 16px;
12
- border-bottom: 1px solid var(--bs-border-color);
13
- background-color: var(--bs-tertiary-bg);
14
- }
15
-
16
- .image-viewer-content {
17
- flex: 1;
18
- padding: 20px;
19
- display: flex;
20
- align-items: center;
21
- justify-content: center;
22
- overflow: auto;
23
- }
24
-
25
- .image-viewer-img {
26
- max-width: 100%;
27
- max-height: 100%;
28
- border-radius: 4px;
29
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
30
- object-fit: contain;
31
- }
32
-
33
- .image-viewer-error {
34
- display: flex;
35
- align-items: center;
36
- justify-content: center;
37
- height: 100%;
38
- color: var(--bs-text-muted);
39
- font-family: var(--bs-font-monospace);
40
- font-size: 14px;
41
- }
@@ -1,134 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import {
3
- extractTimestampFromId,
4
- shouldShowNotification,
5
- handleJoin,
6
- handleLeave,
7
- } from '.';
8
-
9
- describe('extractTimestampFromId', () => {
10
- it('Extracts a timestamp from a given ID', () => {
11
- const id = 'abcd-xyz';
12
- const timestamp = extractTimestampFromId(id);
13
- expect(timestamp).toBe(parseInt('abcd', 36));
14
- });
15
- });
16
-
17
- describe('shouldShowNotification', () => {
18
- it('Returns true if remote presence timestamp is greater than local', () => {
19
- const remoteId = 'abcd-xyz';
20
- const localId = 'aaa-xyz';
21
- const result = shouldShowNotification(
22
- remoteId,
23
- localId,
24
- );
25
- expect(result).toBe(true);
26
- });
27
-
28
- it('Returns false if remote presence timestamp is not greater than local', () => {
29
- const remoteId = 'aaa-xyz';
30
- const localId = 'abcd-xyz';
31
- const result = shouldShowNotification(
32
- remoteId,
33
- localId,
34
- );
35
- expect(result).toBe(false);
36
- });
37
- });
38
-
39
- describe('handleJoin', () => {
40
- it('Adds a new user if not already present', () => {
41
- const presenceId = 'abcd-xyz';
42
- const username = 'John';
43
- const alreadyJoined = { current: new Map() };
44
- let notifications = [];
45
- const setNotifications = (updater) => {
46
- notifications = updater(notifications);
47
- };
48
-
49
- handleJoin(
50
- presenceId,
51
- username,
52
- alreadyJoined,
53
- setNotifications,
54
- );
55
-
56
- expect(notifications.length).toBe(1);
57
- expect(notifications[0].user).toBe(username);
58
- expect(notifications[0].join).toBe(true);
59
- expect(alreadyJoined.current.has(presenceId)).toBe(
60
- true,
61
- );
62
- });
63
-
64
- it('Updates username if user already present', () => {
65
- const presenceId = 'abcd-xyz';
66
- const username = 'John';
67
- const alreadyJoined = {
68
- current: new Map([[presenceId, 'Doe']]),
69
- };
70
- let notifications = [];
71
- const setNotifications = (updater) => {
72
- notifications = updater(notifications);
73
- };
74
-
75
- handleJoin(
76
- presenceId,
77
- username,
78
- alreadyJoined,
79
- setNotifications,
80
- );
81
-
82
- expect(notifications.length).toBe(0);
83
- expect(alreadyJoined.current.get(presenceId)).toBe(
84
- username,
85
- );
86
- });
87
- });
88
-
89
- describe('handleLeave', () => {
90
- it('Removes an existing user', () => {
91
- const presenceId = 'abcd-xyz';
92
- const username = 'John';
93
- const alreadyJoined = {
94
- current: new Map([[presenceId, username]]),
95
- };
96
- let notifications = [];
97
- const setNotifications = (updater) => {
98
- notifications = updater(notifications);
99
- };
100
-
101
- handleLeave(
102
- presenceId,
103
- alreadyJoined,
104
- setNotifications,
105
- );
106
-
107
- expect(notifications.length).toBe(1);
108
- expect(notifications[0].user).toBe(username);
109
- expect(notifications[0].join).toBe(false);
110
- expect(alreadyJoined.current.has(presenceId)).toBe(
111
- false,
112
- );
113
- });
114
-
115
- it('Does nothing if user not present', () => {
116
- const presenceId = 'abcd-xyz';
117
- const alreadyJoined = { current: new Map() };
118
- let notifications = [];
119
- const setNotifications = (updater) => {
120
- notifications = updater(notifications);
121
- };
122
-
123
- handleLeave(
124
- presenceId,
125
- alreadyJoined,
126
- setNotifications,
127
- );
128
-
129
- expect(notifications.length).toBe(0);
130
- expect(alreadyJoined.current.has(presenceId)).toBe(
131
- false,
132
- );
133
- });
134
- });