create-weave-frontend-app 0.1.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 (272) hide show
  1. package/README.md +11 -0
  2. package/dist/chunk-HZJMO45D.js +437 -0
  3. package/dist/create-app.d.ts +14 -0
  4. package/dist/create-app.js +6 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +106 -0
  7. package/package.json +65 -0
  8. package/template/+nextjs+azure-web-pubsub/README.md +36 -0
  9. package/template/+nextjs+azure-web-pubsub/api/del-image.ts +8 -0
  10. package/template/+nextjs+azure-web-pubsub/api/get-images.ts +15 -0
  11. package/template/+nextjs+azure-web-pubsub/api/post-image.ts +14 -0
  12. package/template/+nextjs+azure-web-pubsub/api/post-remove-background.ts +10 -0
  13. package/template/+nextjs+azure-web-pubsub/app/error/page.tsx +10 -0
  14. package/template/+nextjs+azure-web-pubsub/app/favicon.ico +0 -0
  15. package/template/+nextjs+azure-web-pubsub/app/globals.css +193 -0
  16. package/template/+nextjs+azure-web-pubsub/app/layout.tsx +46 -0
  17. package/template/+nextjs+azure-web-pubsub/app/page.tsx +7 -0
  18. package/template/+nextjs+azure-web-pubsub/app/providers.tsx +18 -0
  19. package/template/+nextjs+azure-web-pubsub/app/room/[roomId]/page.tsx +5 -0
  20. package/template/+nextjs+azure-web-pubsub/assets/images/home.png +0 -0
  21. package/template/+nextjs+azure-web-pubsub/assets/images/logo.png +0 -0
  22. package/template/+nextjs+azure-web-pubsub/components/actions/align-elements-tool/align-elements-tool.ts +94 -0
  23. package/template/+nextjs+azure-web-pubsub/components/actions/color-token-tool/color-token-tool.ts +164 -0
  24. package/template/+nextjs+azure-web-pubsub/components/actions/color-token-tool/constants.ts +5 -0
  25. package/template/+nextjs+azure-web-pubsub/components/actions/color-token-tool/types.ts +12 -0
  26. package/template/+nextjs+azure-web-pubsub/components/error/error.tsx +62 -0
  27. package/template/+nextjs+azure-web-pubsub/components/error/errors.ts +35 -0
  28. package/template/+nextjs+azure-web-pubsub/components/home/home.tsx +92 -0
  29. package/template/+nextjs+azure-web-pubsub/components/home-components/home-showcase-animation.tsx +119 -0
  30. package/template/+nextjs+azure-web-pubsub/components/home-components/login-form.tsx +117 -0
  31. package/template/+nextjs+azure-web-pubsub/components/nodes/color-token/color-token.ts +171 -0
  32. package/template/+nextjs+azure-web-pubsub/components/room/room.layout.tsx +115 -0
  33. package/template/+nextjs+azure-web-pubsub/components/room/room.tsx +125 -0
  34. package/template/+nextjs+azure-web-pubsub/components/room-components/color-tokens-library/color-token.tsx +31 -0
  35. package/template/+nextjs+azure-web-pubsub/components/room-components/color-tokens-library/color-tokens-library.tsx +64 -0
  36. package/template/+nextjs+azure-web-pubsub/components/room-components/connected-users.tsx +152 -0
  37. package/template/+nextjs+azure-web-pubsub/components/room-components/connection-status.tsx +52 -0
  38. package/template/+nextjs+azure-web-pubsub/components/room-components/context-menu.tsx +152 -0
  39. package/template/+nextjs+azure-web-pubsub/components/room-components/frames-library/frames-library.image.tsx +48 -0
  40. package/template/+nextjs+azure-web-pubsub/components/room-components/frames-library/frames-library.presentation-image.tsx +61 -0
  41. package/template/+nextjs+azure-web-pubsub/components/room-components/frames-library/frames-library.tsx +316 -0
  42. package/template/+nextjs+azure-web-pubsub/components/room-components/frames-library/utils.ts +27 -0
  43. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-arrange.tsx +69 -0
  44. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-drawer.tsx +140 -0
  45. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-edit.tsx +80 -0
  46. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-selection.tsx +30 -0
  47. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-shortcut-element.tsx +24 -0
  48. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-tools.tsx +89 -0
  49. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-view.tsx +30 -0
  50. package/template/+nextjs+azure-web-pubsub/components/room-components/help/help-zoom.tsx +46 -0
  51. package/template/+nextjs+azure-web-pubsub/components/room-components/help/shortcut-element.tsx +42 -0
  52. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-context-menu.tsx +514 -0
  53. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-get-azure-web-pubsub-provider.ts +78 -0
  54. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-get-os.ts +12 -0
  55. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-get-weave-js-props.tsx +120 -0
  56. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-handle-route-params.ts +30 -0
  57. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-key-down.ts +29 -0
  58. package/template/+nextjs+azure-web-pubsub/components/room-components/hooks/use-keyboard-handler.tsx +557 -0
  59. package/template/+nextjs+azure-web-pubsub/components/room-components/images-library/images-library.tsx +146 -0
  60. package/template/+nextjs+azure-web-pubsub/components/room-components/inputs/input-color.tsx +101 -0
  61. package/template/+nextjs+azure-web-pubsub/components/room-components/inputs/input-font-family.tsx +99 -0
  62. package/template/+nextjs+azure-web-pubsub/components/room-components/inputs/input-number.tsx +61 -0
  63. package/template/+nextjs+azure-web-pubsub/components/room-components/inputs/input-text.tsx +51 -0
  64. package/template/+nextjs+azure-web-pubsub/components/room-components/inputs/number-input.tsx +107 -0
  65. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/appearance-properties.tsx +119 -0
  66. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/color-token-properties.tsx +108 -0
  67. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/crop-properties.tsx +156 -0
  68. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/fill-properties.tsx +115 -0
  69. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/frame-properties.tsx +100 -0
  70. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/image-properties.tsx +57 -0
  71. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/position-properties.tsx +156 -0
  72. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/size-properties.tsx +131 -0
  73. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/stroke-properties.tsx +327 -0
  74. package/template/+nextjs+azure-web-pubsub/components/room-components/node-properties/text-properties.tsx +467 -0
  75. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/multiuse-overlay.tsx +127 -0
  76. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/node-properties.tsx +98 -0
  77. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/overlay-animation-wrapper.tsx +31 -0
  78. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/room-information-overlay.tsx +247 -0
  79. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/room-users-overlay.tsx +31 -0
  80. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/tools-overlay.tsx +289 -0
  81. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/variants.ts +58 -0
  82. package/template/+nextjs+azure-web-pubsub/components/room-components/overlay/zoom-handler-overlay.tsx +447 -0
  83. package/template/+nextjs+azure-web-pubsub/components/room-components/room-error.tsx +37 -0
  84. package/template/+nextjs+azure-web-pubsub/components/room-components/room-loader/room-loader.tsx +98 -0
  85. package/template/+nextjs+azure-web-pubsub/components/room-components/selection-information.tsx +74 -0
  86. package/template/+nextjs+azure-web-pubsub/components/room-components/toggle-icon-button.tsx +60 -0
  87. package/template/+nextjs+azure-web-pubsub/components/room-components/toolbar/toolbar-button.tsx +60 -0
  88. package/template/+nextjs+azure-web-pubsub/components/room-components/toolbar/toolbar-toggle-button.tsx +40 -0
  89. package/template/+nextjs+azure-web-pubsub/components/room-components/toolbar/toolbar.tsx +28 -0
  90. package/template/+nextjs+azure-web-pubsub/components/room-components/upload-file.tsx +130 -0
  91. package/template/+nextjs+azure-web-pubsub/components/room-components/with-instance-node.tsx +53 -0
  92. package/template/+nextjs+azure-web-pubsub/components/ui/accordion.tsx +66 -0
  93. package/template/+nextjs+azure-web-pubsub/components/ui/avatar.tsx +53 -0
  94. package/template/+nextjs+azure-web-pubsub/components/ui/button.tsx +58 -0
  95. package/template/+nextjs+azure-web-pubsub/components/ui/card.tsx +68 -0
  96. package/template/+nextjs+azure-web-pubsub/components/ui/checkbox.tsx +32 -0
  97. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/color-picker-component.tsx +69 -0
  98. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/context/color-picker-context.tsx +28 -0
  99. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/editor/color-picker-format-editor.tsx +34 -0
  100. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/index.ts +7 -0
  101. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/selector/color-picker-alpha.tsx +79 -0
  102. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/selector/color-picker-eyedropper.tsx +95 -0
  103. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/selector/color-picker-format-selector.tsx +50 -0
  104. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/selector/color-picker-hue.tsx +67 -0
  105. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/selector/color-picker-saturation.tsx +145 -0
  106. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/text-inputs/color-picker-alpha-percentage.tsx +60 -0
  107. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/text-inputs/color-picker-hexa.tsx +65 -0
  108. package/template/+nextjs+azure-web-pubsub/components/ui/color-picker/text-inputs/color-picker-rgba.tsx +62 -0
  109. package/template/+nextjs+azure-web-pubsub/components/ui/command.tsx +177 -0
  110. package/template/+nextjs+azure-web-pubsub/components/ui/dialog.tsx +135 -0
  111. package/template/+nextjs+azure-web-pubsub/components/ui/drawer.tsx +132 -0
  112. package/template/+nextjs+azure-web-pubsub/components/ui/dropdown-menu.tsx +201 -0
  113. package/template/+nextjs+azure-web-pubsub/components/ui/form.tsx +167 -0
  114. package/template/+nextjs+azure-web-pubsub/components/ui/input.tsx +21 -0
  115. package/template/+nextjs+azure-web-pubsub/components/ui/label.tsx +24 -0
  116. package/template/+nextjs+azure-web-pubsub/components/ui/popover.tsx +48 -0
  117. package/template/+nextjs+azure-web-pubsub/components/ui/reactbits/Backgrounds/Dither/Dither.tsx +350 -0
  118. package/template/+nextjs+azure-web-pubsub/components/ui/reactbits/Backgrounds/Threads/Threads.tsx +239 -0
  119. package/template/+nextjs+azure-web-pubsub/components/ui/reactbits/TextAnimations/RotatingText/RotatingText.tsx +276 -0
  120. package/template/+nextjs+azure-web-pubsub/components/ui/scroll-area.tsx +58 -0
  121. package/template/+nextjs+azure-web-pubsub/components/ui/select.tsx +185 -0
  122. package/template/+nextjs+azure-web-pubsub/components/ui/sheet.tsx +139 -0
  123. package/template/+nextjs+azure-web-pubsub/components/ui/sonner.tsx +25 -0
  124. package/template/+nextjs+azure-web-pubsub/components/ui/tabs.tsx +66 -0
  125. package/template/+nextjs+azure-web-pubsub/components/ui/tooltip.tsx +61 -0
  126. package/template/+nextjs+azure-web-pubsub/components/utils/constants.ts +118 -0
  127. package/template/+nextjs+azure-web-pubsub/components/utils/logo.tsx +34 -0
  128. package/template/+nextjs+azure-web-pubsub/components.json +21 -0
  129. package/template/+nextjs+azure-web-pubsub/example.env +2 -0
  130. package/template/+nextjs+azure-web-pubsub/example.gitignore +44 -0
  131. package/template/+nextjs+azure-web-pubsub/jsrepo.json +11 -0
  132. package/template/+nextjs+azure-web-pubsub/lib/utils.ts +43 -0
  133. package/template/+nextjs+azure-web-pubsub/new-types.d.ts +8 -0
  134. package/template/+nextjs+azure-web-pubsub/next-env.d.ts +5 -0
  135. package/template/+nextjs+azure-web-pubsub/next.config.js +52 -0
  136. package/template/+nextjs+azure-web-pubsub/postcss.config.mjs +5 -0
  137. package/template/+nextjs+azure-web-pubsub/store/store.ts +241 -0
  138. package/template/+nextjs+azure-web-pubsub/tsconfig.json +37 -0
  139. package/template/+nextjs+azure-web-pubsub/vitest.config.mts +10 -0
  140. package/template/+nextjs+websockets/README.md +39 -0
  141. package/template/+nextjs+websockets/api/del-image.ts +8 -0
  142. package/template/+nextjs+websockets/api/get-images.ts +15 -0
  143. package/template/+nextjs+websockets/api/post-image.ts +14 -0
  144. package/template/+nextjs+websockets/api/post-remove-background.ts +10 -0
  145. package/template/+nextjs+websockets/app/error/page.tsx +10 -0
  146. package/template/+nextjs+websockets/app/favicon.ico +0 -0
  147. package/template/+nextjs+websockets/app/globals.css +193 -0
  148. package/template/+nextjs+websockets/app/layout.tsx +46 -0
  149. package/template/+nextjs+websockets/app/page.tsx +7 -0
  150. package/template/+nextjs+websockets/app/providers.tsx +18 -0
  151. package/template/+nextjs+websockets/app/room/[roomId]/page.tsx +5 -0
  152. package/template/+nextjs+websockets/assets/images/home.png +0 -0
  153. package/template/+nextjs+websockets/assets/images/logo.png +0 -0
  154. package/template/+nextjs+websockets/components/actions/align-elements-tool/align-elements-tool.ts +94 -0
  155. package/template/+nextjs+websockets/components/actions/color-token-tool/color-token-tool.ts +164 -0
  156. package/template/+nextjs+websockets/components/actions/color-token-tool/constants.ts +5 -0
  157. package/template/+nextjs+websockets/components/actions/color-token-tool/types.ts +12 -0
  158. package/template/+nextjs+websockets/components/error/error.tsx +62 -0
  159. package/template/+nextjs+websockets/components/error/errors.ts +35 -0
  160. package/template/+nextjs+websockets/components/home/home.tsx +92 -0
  161. package/template/+nextjs+websockets/components/home-components/home-showcase-animation.tsx +119 -0
  162. package/template/+nextjs+websockets/components/home-components/login-form.tsx +117 -0
  163. package/template/+nextjs+websockets/components/nodes/color-token/color-token.ts +171 -0
  164. package/template/+nextjs+websockets/components/room/room.layout.tsx +115 -0
  165. package/template/+nextjs+websockets/components/room/room.tsx +125 -0
  166. package/template/+nextjs+websockets/components/room-components/color-tokens-library/color-token.tsx +31 -0
  167. package/template/+nextjs+websockets/components/room-components/color-tokens-library/color-tokens-library.tsx +64 -0
  168. package/template/+nextjs+websockets/components/room-components/connected-users.tsx +152 -0
  169. package/template/+nextjs+websockets/components/room-components/connection-status.tsx +52 -0
  170. package/template/+nextjs+websockets/components/room-components/context-menu.tsx +152 -0
  171. package/template/+nextjs+websockets/components/room-components/frames-library/frames-library.image.tsx +48 -0
  172. package/template/+nextjs+websockets/components/room-components/frames-library/frames-library.presentation-image.tsx +61 -0
  173. package/template/+nextjs+websockets/components/room-components/frames-library/frames-library.tsx +316 -0
  174. package/template/+nextjs+websockets/components/room-components/frames-library/utils.ts +27 -0
  175. package/template/+nextjs+websockets/components/room-components/help/help-arrange.tsx +69 -0
  176. package/template/+nextjs+websockets/components/room-components/help/help-drawer.tsx +140 -0
  177. package/template/+nextjs+websockets/components/room-components/help/help-edit.tsx +80 -0
  178. package/template/+nextjs+websockets/components/room-components/help/help-selection.tsx +30 -0
  179. package/template/+nextjs+websockets/components/room-components/help/help-shortcut-element.tsx +24 -0
  180. package/template/+nextjs+websockets/components/room-components/help/help-tools.tsx +89 -0
  181. package/template/+nextjs+websockets/components/room-components/help/help-view.tsx +30 -0
  182. package/template/+nextjs+websockets/components/room-components/help/help-zoom.tsx +46 -0
  183. package/template/+nextjs+websockets/components/room-components/help/shortcut-element.tsx +42 -0
  184. package/template/+nextjs+websockets/components/room-components/hooks/use-context-menu.tsx +514 -0
  185. package/template/+nextjs+websockets/components/room-components/hooks/use-get-os.ts +12 -0
  186. package/template/+nextjs+websockets/components/room-components/hooks/use-get-weave-js-props.tsx +120 -0
  187. package/template/+nextjs+websockets/components/room-components/hooks/use-get-websockets-provider.ts +79 -0
  188. package/template/+nextjs+websockets/components/room-components/hooks/use-handle-route-params.ts +30 -0
  189. package/template/+nextjs+websockets/components/room-components/hooks/use-key-down.ts +29 -0
  190. package/template/+nextjs+websockets/components/room-components/hooks/use-keyboard-handler.tsx +557 -0
  191. package/template/+nextjs+websockets/components/room-components/images-library/images-library.tsx +146 -0
  192. package/template/+nextjs+websockets/components/room-components/inputs/input-color.tsx +101 -0
  193. package/template/+nextjs+websockets/components/room-components/inputs/input-font-family.tsx +99 -0
  194. package/template/+nextjs+websockets/components/room-components/inputs/input-number.tsx +61 -0
  195. package/template/+nextjs+websockets/components/room-components/inputs/input-text.tsx +51 -0
  196. package/template/+nextjs+websockets/components/room-components/inputs/number-input.tsx +107 -0
  197. package/template/+nextjs+websockets/components/room-components/node-properties/appearance-properties.tsx +119 -0
  198. package/template/+nextjs+websockets/components/room-components/node-properties/color-token-properties.tsx +108 -0
  199. package/template/+nextjs+websockets/components/room-components/node-properties/crop-properties.tsx +156 -0
  200. package/template/+nextjs+websockets/components/room-components/node-properties/fill-properties.tsx +115 -0
  201. package/template/+nextjs+websockets/components/room-components/node-properties/frame-properties.tsx +100 -0
  202. package/template/+nextjs+websockets/components/room-components/node-properties/image-properties.tsx +57 -0
  203. package/template/+nextjs+websockets/components/room-components/node-properties/position-properties.tsx +156 -0
  204. package/template/+nextjs+websockets/components/room-components/node-properties/size-properties.tsx +131 -0
  205. package/template/+nextjs+websockets/components/room-components/node-properties/stroke-properties.tsx +327 -0
  206. package/template/+nextjs+websockets/components/room-components/node-properties/text-properties.tsx +467 -0
  207. package/template/+nextjs+websockets/components/room-components/overlay/multiuse-overlay.tsx +127 -0
  208. package/template/+nextjs+websockets/components/room-components/overlay/node-properties.tsx +98 -0
  209. package/template/+nextjs+websockets/components/room-components/overlay/overlay-animation-wrapper.tsx +31 -0
  210. package/template/+nextjs+websockets/components/room-components/overlay/room-information-overlay.tsx +247 -0
  211. package/template/+nextjs+websockets/components/room-components/overlay/room-users-overlay.tsx +31 -0
  212. package/template/+nextjs+websockets/components/room-components/overlay/tools-overlay.tsx +289 -0
  213. package/template/+nextjs+websockets/components/room-components/overlay/variants.ts +58 -0
  214. package/template/+nextjs+websockets/components/room-components/overlay/zoom-handler-overlay.tsx +447 -0
  215. package/template/+nextjs+websockets/components/room-components/room-error.tsx +37 -0
  216. package/template/+nextjs+websockets/components/room-components/room-loader/room-loader.tsx +98 -0
  217. package/template/+nextjs+websockets/components/room-components/selection-information.tsx +74 -0
  218. package/template/+nextjs+websockets/components/room-components/toggle-icon-button.tsx +60 -0
  219. package/template/+nextjs+websockets/components/room-components/toolbar/toolbar-button.tsx +60 -0
  220. package/template/+nextjs+websockets/components/room-components/toolbar/toolbar-toggle-button.tsx +40 -0
  221. package/template/+nextjs+websockets/components/room-components/toolbar/toolbar.tsx +28 -0
  222. package/template/+nextjs+websockets/components/room-components/upload-file.tsx +130 -0
  223. package/template/+nextjs+websockets/components/room-components/with-instance-node.tsx +53 -0
  224. package/template/+nextjs+websockets/components/ui/accordion.tsx +66 -0
  225. package/template/+nextjs+websockets/components/ui/avatar.tsx +53 -0
  226. package/template/+nextjs+websockets/components/ui/button.tsx +58 -0
  227. package/template/+nextjs+websockets/components/ui/card.tsx +68 -0
  228. package/template/+nextjs+websockets/components/ui/checkbox.tsx +32 -0
  229. package/template/+nextjs+websockets/components/ui/color-picker/color-picker-component.tsx +69 -0
  230. package/template/+nextjs+websockets/components/ui/color-picker/context/color-picker-context.tsx +28 -0
  231. package/template/+nextjs+websockets/components/ui/color-picker/editor/color-picker-format-editor.tsx +34 -0
  232. package/template/+nextjs+websockets/components/ui/color-picker/index.ts +7 -0
  233. package/template/+nextjs+websockets/components/ui/color-picker/selector/color-picker-alpha.tsx +79 -0
  234. package/template/+nextjs+websockets/components/ui/color-picker/selector/color-picker-eyedropper.tsx +95 -0
  235. package/template/+nextjs+websockets/components/ui/color-picker/selector/color-picker-format-selector.tsx +50 -0
  236. package/template/+nextjs+websockets/components/ui/color-picker/selector/color-picker-hue.tsx +67 -0
  237. package/template/+nextjs+websockets/components/ui/color-picker/selector/color-picker-saturation.tsx +145 -0
  238. package/template/+nextjs+websockets/components/ui/color-picker/text-inputs/color-picker-alpha-percentage.tsx +60 -0
  239. package/template/+nextjs+websockets/components/ui/color-picker/text-inputs/color-picker-hexa.tsx +65 -0
  240. package/template/+nextjs+websockets/components/ui/color-picker/text-inputs/color-picker-rgba.tsx +62 -0
  241. package/template/+nextjs+websockets/components/ui/command.tsx +177 -0
  242. package/template/+nextjs+websockets/components/ui/dialog.tsx +135 -0
  243. package/template/+nextjs+websockets/components/ui/drawer.tsx +132 -0
  244. package/template/+nextjs+websockets/components/ui/dropdown-menu.tsx +201 -0
  245. package/template/+nextjs+websockets/components/ui/form.tsx +167 -0
  246. package/template/+nextjs+websockets/components/ui/input.tsx +21 -0
  247. package/template/+nextjs+websockets/components/ui/label.tsx +24 -0
  248. package/template/+nextjs+websockets/components/ui/popover.tsx +48 -0
  249. package/template/+nextjs+websockets/components/ui/reactbits/Backgrounds/Dither/Dither.tsx +350 -0
  250. package/template/+nextjs+websockets/components/ui/reactbits/Backgrounds/Threads/Threads.tsx +239 -0
  251. package/template/+nextjs+websockets/components/ui/reactbits/TextAnimations/RotatingText/RotatingText.tsx +276 -0
  252. package/template/+nextjs+websockets/components/ui/scroll-area.tsx +58 -0
  253. package/template/+nextjs+websockets/components/ui/select.tsx +185 -0
  254. package/template/+nextjs+websockets/components/ui/sheet.tsx +139 -0
  255. package/template/+nextjs+websockets/components/ui/sonner.tsx +25 -0
  256. package/template/+nextjs+websockets/components/ui/tabs.tsx +66 -0
  257. package/template/+nextjs+websockets/components/ui/tooltip.tsx +61 -0
  258. package/template/+nextjs+websockets/components/utils/constants.ts +118 -0
  259. package/template/+nextjs+websockets/components/utils/logo.tsx +34 -0
  260. package/template/+nextjs+websockets/components.json +21 -0
  261. package/template/+nextjs+websockets/example.env +2 -0
  262. package/template/+nextjs+websockets/example.gitignore +44 -0
  263. package/template/+nextjs+websockets/jsrepo.json +11 -0
  264. package/template/+nextjs+websockets/lib/utils.ts +43 -0
  265. package/template/+nextjs+websockets/new-types.d.ts +8 -0
  266. package/template/+nextjs+websockets/next-env.d.ts +5 -0
  267. package/template/+nextjs+websockets/next.config.js +52 -0
  268. package/template/+nextjs+websockets/postcss.config.mjs +5 -0
  269. package/template/+nextjs+websockets/store/store.ts +241 -0
  270. package/template/+nextjs+websockets/tsconfig.json +37 -0
  271. package/template/+nextjs+websockets/vitest.config.mts +10 -0
  272. package/template/package.json +81 -0
@@ -0,0 +1,557 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { useWeave } from '@inditextech/weave-react';
5
+ import { useCollaborationRoom } from '@/store/store';
6
+ import { useKeyDown } from '../hooks/use-key-down';
7
+ import { SYSTEM_OS } from '@/lib/utils';
8
+ import { useGetOs } from '../hooks/use-get-os';
9
+ import {
10
+ WeaveCopyPasteNodesPlugin,
11
+ WeaveExportNodeActionParams,
12
+ WeaveExportStageActionParams,
13
+ WeaveNodesSelectionPlugin,
14
+ WeaveUsersPointersPlugin,
15
+ } from '@inditextech/weave-sdk';
16
+
17
+ export function useKeyboardHandler() {
18
+ const os = useGetOs();
19
+
20
+ const instance = useWeave((state) => state.instance);
21
+ const selectedNodes = useWeave((state) => state.selection.nodes);
22
+ const actualAction = useWeave((state) => state.actions.actual);
23
+
24
+ const showUI = useCollaborationRoom((state) => state.ui.show);
25
+ const setShowUi = useCollaborationRoom((state) => state.setShowUi);
26
+ const framesLibraryVisible = useCollaborationRoom(
27
+ (state) => state.frames.library.visible
28
+ );
29
+ const setFramesLibraryVisible = useCollaborationRoom(
30
+ (state) => state.setFramesLibraryVisible
31
+ );
32
+ const imagesLibraryVisible = useCollaborationRoom(
33
+ (state) => state.images.library.visible
34
+ );
35
+ const setImagesLibraryVisible = useCollaborationRoom(
36
+ (state) => state.setImagesLibraryVisible
37
+ );
38
+ const colorTokensLibraryVisible = useCollaborationRoom(
39
+ (state) => state.colorToken.library.visible
40
+ );
41
+ const setColorTokensLibraryVisible = useCollaborationRoom(
42
+ (state) => state.setColorTokensLibraryVisible
43
+ );
44
+ const setShowSelectFileImage = useCollaborationRoom(
45
+ (state) => state.setShowSelectFileImage
46
+ );
47
+
48
+ const triggerTool = React.useCallback(
49
+ (toolName: string) => {
50
+ if (instance && actualAction !== toolName) {
51
+ instance.triggerAction(toolName);
52
+ }
53
+ if (instance && actualAction === toolName) {
54
+ instance.cancelAction(toolName);
55
+ }
56
+ },
57
+ [instance, actualAction]
58
+ );
59
+
60
+ const libraryToggle = React.useCallback(
61
+ (library: string) => {
62
+ switch (library) {
63
+ case 'images':
64
+ setColorTokensLibraryVisible(false);
65
+ setFramesLibraryVisible(false);
66
+ setImagesLibraryVisible(!imagesLibraryVisible);
67
+ break;
68
+ case 'colorTokens':
69
+ setImagesLibraryVisible(false);
70
+ setFramesLibraryVisible(false);
71
+ setColorTokensLibraryVisible(!colorTokensLibraryVisible);
72
+ break;
73
+ case 'frames':
74
+ setImagesLibraryVisible(false);
75
+ setColorTokensLibraryVisible(false);
76
+ setFramesLibraryVisible(!framesLibraryVisible);
77
+ break;
78
+ default:
79
+ break;
80
+ }
81
+ },
82
+ [
83
+ colorTokensLibraryVisible,
84
+ framesLibraryVisible,
85
+ imagesLibraryVisible,
86
+ setImagesLibraryVisible,
87
+ setColorTokensLibraryVisible,
88
+ setFramesLibraryVisible,
89
+ ]
90
+ );
91
+
92
+ const handleTriggerAction = React.useCallback(
93
+ (actionName: string) => {
94
+ if (instance) {
95
+ const triggerSelection = actualAction === 'selectionTool';
96
+ instance.triggerAction(actionName);
97
+ if (triggerSelection) {
98
+ instance.triggerAction('selectionTool');
99
+ }
100
+ }
101
+ },
102
+ [instance, actualAction]
103
+ );
104
+
105
+ const handlePrintToConsoleState = React.useCallback(() => {
106
+ if (instance) {
107
+ // eslint-disable-next-line no-console
108
+ console.log({
109
+ appState: JSON.parse(JSON.stringify(instance.getStore().getState())),
110
+ });
111
+ }
112
+ }, [instance]);
113
+
114
+ /* Keyboard shortcuts toolbar */
115
+
116
+ useKeyDown(
117
+ () => {
118
+ triggerTool('selectionTool');
119
+ },
120
+ ['KeyS'],
121
+ () => {
122
+ return (
123
+ !window.weaveTextEditing &&
124
+ !window.weaveTextEditing &&
125
+ !['textTool'].includes(actualAction ?? '')
126
+ );
127
+ }
128
+ );
129
+
130
+ useKeyDown(
131
+ () => {
132
+ triggerTool('frameTool');
133
+ },
134
+ ['KeyF'],
135
+ () =>
136
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
137
+ (e) => !(e.ctrlKey || e.metaKey)
138
+ );
139
+
140
+ useKeyDown(
141
+ () => {
142
+ triggerTool('rectangleTool');
143
+ },
144
+ ['KeyR'],
145
+ () => !window.weaveTextEditing && !['textTool'].includes(actualAction ?? '')
146
+ );
147
+
148
+ useKeyDown(
149
+ () => {
150
+ triggerTool('penTool');
151
+ },
152
+ ['KeyL'],
153
+ () => !window.weaveTextEditing && !['textTool'].includes(actualAction ?? '')
154
+ );
155
+
156
+ useKeyDown(
157
+ () => {
158
+ triggerTool('brushTool');
159
+ },
160
+ ['KeyB'],
161
+ () => !window.weaveTextEditing && !['textTool'].includes(actualAction ?? '')
162
+ );
163
+
164
+ useKeyDown(
165
+ () => {
166
+ triggerTool('textTool');
167
+ },
168
+ ['KeyT'],
169
+ () => !window.weaveTextEditing && !['textTool'].includes(actualAction ?? '')
170
+ );
171
+
172
+ useKeyDown(
173
+ () => {
174
+ triggerTool('imageTool');
175
+ setShowSelectFileImage(true);
176
+ },
177
+ ['KeyI'],
178
+ () =>
179
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
180
+ (e) => !(e.ctrlKey || e.metaKey)
181
+ );
182
+
183
+ useKeyDown(
184
+ () => {
185
+ triggerTool('colorTokenTool');
186
+ },
187
+ ['KeyP'],
188
+ () =>
189
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
190
+ (e) => !(e.ctrlKey || e.metaKey)
191
+ );
192
+
193
+ useKeyDown(
194
+ () => {
195
+ if (instance) {
196
+ const actualStore = instance.getStore();
197
+ actualStore.undoStateStep();
198
+ }
199
+ },
200
+ ['Comma'],
201
+ () =>
202
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
203
+ (e) =>
204
+ e.shiftKey &&
205
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
206
+ );
207
+
208
+ useKeyDown(
209
+ () => {
210
+ if (instance) {
211
+ const actualStore = instance.getStore();
212
+ actualStore.redoStateStep();
213
+ }
214
+ },
215
+ ['Period'],
216
+ () =>
217
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
218
+ (e) =>
219
+ e.shiftKey &&
220
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
221
+ );
222
+
223
+ /* Keyboard shortcuts visibility */
224
+
225
+ useKeyDown(
226
+ () => {
227
+ setShowUi(!showUI);
228
+ },
229
+ ['IntlBackslash'],
230
+ () =>
231
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
232
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
233
+ );
234
+
235
+ useKeyDown(
236
+ () => {
237
+ if (instance) {
238
+ const usersPointersPlugin =
239
+ instance.getPlugin<WeaveUsersPointersPlugin>('usersPointers');
240
+ if (usersPointersPlugin) {
241
+ usersPointersPlugin.toggleRenderCursors();
242
+ }
243
+ }
244
+ },
245
+ ['KeyU'],
246
+ () =>
247
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
248
+ (e) =>
249
+ e.altKey &&
250
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
251
+ );
252
+
253
+ /* Keyboard shortcuts selection */
254
+
255
+ useKeyDown(
256
+ () => {
257
+ if (instance) {
258
+ const selectionPlugin =
259
+ instance.getPlugin<WeaveNodesSelectionPlugin>('nodesSelection');
260
+ if (selectionPlugin) {
261
+ selectionPlugin.selectAll();
262
+ }
263
+ }
264
+ },
265
+ ['KeyA'],
266
+ () =>
267
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
268
+ (e) =>
269
+ e.shiftKey &&
270
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
271
+ );
272
+
273
+ useKeyDown(
274
+ () => {
275
+ if (instance) {
276
+ const selectionPlugin =
277
+ instance.getPlugin<WeaveNodesSelectionPlugin>('nodesSelection');
278
+ if (selectionPlugin) {
279
+ selectionPlugin.selectNone();
280
+ }
281
+ }
282
+ },
283
+ ['Escape'],
284
+ () =>
285
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
286
+ (e) => e.shiftKey
287
+ );
288
+
289
+ /* Keyboard shortcuts editing */
290
+
291
+ useKeyDown(
292
+ async () => {
293
+ if (instance && selectedNodes.length > 0) {
294
+ const weaveCopyPasteNodesPlugin =
295
+ instance.getPlugin<WeaveCopyPasteNodesPlugin>('copyPasteNodes');
296
+ if (weaveCopyPasteNodesPlugin) {
297
+ await weaveCopyPasteNodesPlugin.copy();
298
+ }
299
+ }
300
+ },
301
+ ['KeyC'],
302
+ () =>
303
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
304
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
305
+ );
306
+
307
+ useKeyDown(
308
+ () => {
309
+ if (instance) {
310
+ const weaveCopyPasteNodesPlugin =
311
+ instance.getPlugin<WeaveCopyPasteNodesPlugin>('copyPasteNodes');
312
+ if (weaveCopyPasteNodesPlugin) {
313
+ weaveCopyPasteNodesPlugin.paste();
314
+ }
315
+ }
316
+ },
317
+ ['KeyP'],
318
+ () =>
319
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
320
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
321
+ );
322
+
323
+ useKeyDown(
324
+ async () => {
325
+ if (instance && selectedNodes.length === 1) {
326
+ const weaveCopyPasteNodesPlugin =
327
+ instance.getPlugin<WeaveCopyPasteNodesPlugin>('copyPasteNodes');
328
+ if (weaveCopyPasteNodesPlugin) {
329
+ await weaveCopyPasteNodesPlugin.copy();
330
+ weaveCopyPasteNodesPlugin.paste();
331
+ }
332
+ }
333
+ },
334
+ ['KeyD'],
335
+ () =>
336
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
337
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
338
+ );
339
+
340
+ useKeyDown(
341
+ () => {
342
+ if (instance && selectedNodes.length === 1) {
343
+ instance.triggerAction<WeaveExportNodeActionParams>('exportNodeTool', {
344
+ node: selectedNodes[0].instance,
345
+ options: {
346
+ padding: 20,
347
+ pixelRatio: 2,
348
+ },
349
+ });
350
+ }
351
+ },
352
+ ['KeyE'],
353
+ () =>
354
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
355
+ (e) =>
356
+ e.shiftKey &&
357
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
358
+ );
359
+
360
+ useKeyDown(
361
+ () => {
362
+ if (instance) {
363
+ instance.triggerAction<WeaveExportStageActionParams>(
364
+ 'exportStageTool',
365
+ {
366
+ options: {
367
+ padding: 20,
368
+ pixelRatio: 2,
369
+ },
370
+ }
371
+ );
372
+ }
373
+ },
374
+ ['KeyV'],
375
+ () =>
376
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
377
+ (e) =>
378
+ e.shiftKey &&
379
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
380
+ );
381
+
382
+ /* Keyboard shortcuts arrange */
383
+
384
+ useKeyDown(
385
+ () => {
386
+ if (instance && selectedNodes.length === 1) {
387
+ instance.bringToFront(selectedNodes[0].instance);
388
+ }
389
+ },
390
+ ['BracketRight'],
391
+ () =>
392
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
393
+ (e) => !([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
394
+ );
395
+
396
+ useKeyDown(
397
+ () => {
398
+ if (instance && selectedNodes.length === 1) {
399
+ instance.moveUp(selectedNodes[0].instance);
400
+ }
401
+ },
402
+ ['BracketRight'],
403
+ () =>
404
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
405
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
406
+ );
407
+
408
+ useKeyDown(
409
+ () => {
410
+ if (instance && selectedNodes.length === 1) {
411
+ instance.moveDown(selectedNodes[0].instance);
412
+ }
413
+ },
414
+ ['BracketLeft'],
415
+ () =>
416
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
417
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
418
+ );
419
+
420
+ useKeyDown(
421
+ () => {
422
+ if (instance && selectedNodes.length === 1) {
423
+ instance.sendToBack(selectedNodes[0].instance);
424
+ }
425
+ },
426
+ ['BracketLeft'],
427
+ () =>
428
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
429
+ (e) => !([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
430
+ );
431
+
432
+ useKeyDown(
433
+ () => {
434
+ if (instance && selectedNodes.length > 1) {
435
+ instance.group(selectedNodes.map((n) => n.node));
436
+ }
437
+ },
438
+ ['KeyG'],
439
+ () =>
440
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
441
+ (e) =>
442
+ e.shiftKey &&
443
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
444
+ );
445
+
446
+ useKeyDown(
447
+ () => {
448
+ if (
449
+ instance &&
450
+ selectedNodes.length === 1 &&
451
+ selectedNodes[0].node.type === 'group'
452
+ ) {
453
+ instance.unGroup(selectedNodes[0].node);
454
+ }
455
+ },
456
+ ['KeyU'],
457
+ () =>
458
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
459
+ (e) =>
460
+ e.shiftKey &&
461
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
462
+ );
463
+
464
+ /* Keyboard shortcuts sidebars */
465
+
466
+ useKeyDown(
467
+ () => {
468
+ libraryToggle('images');
469
+ },
470
+ ['KeyI'],
471
+ () =>
472
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
473
+ (e) =>
474
+ e.altKey &&
475
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
476
+ );
477
+
478
+ useKeyDown(
479
+ () => {
480
+ libraryToggle('colorTokens');
481
+ },
482
+ ['KeyP'],
483
+ () =>
484
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
485
+ (e) =>
486
+ e.altKey &&
487
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
488
+ );
489
+
490
+ useKeyDown(
491
+ () => {
492
+ libraryToggle('frames');
493
+ },
494
+ ['KeyF'],
495
+ () =>
496
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
497
+ (e) =>
498
+ e.altKey &&
499
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
500
+ );
501
+
502
+ /* Keyboard shortcuts zoom */
503
+
504
+ useKeyDown(
505
+ () => {
506
+ handleTriggerAction('zoomInTool');
507
+ },
508
+ ['BracketRight'],
509
+ () =>
510
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
511
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
512
+ );
513
+
514
+ useKeyDown(
515
+ () => {
516
+ handleTriggerAction('zoomOutTool');
517
+ },
518
+ ['Slash'],
519
+ () =>
520
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
521
+ (e) => ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
522
+ );
523
+
524
+ useKeyDown(
525
+ () => {
526
+ handleTriggerAction('fitToScreenTool');
527
+ },
528
+ ['Digit1'],
529
+ () =>
530
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
531
+ (e) => e.shiftKey
532
+ );
533
+
534
+ useKeyDown(
535
+ () => {
536
+ handleTriggerAction('fitToSelectionTool');
537
+ },
538
+ ['Digit2'],
539
+ () =>
540
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
541
+ (e) => e.shiftKey
542
+ );
543
+
544
+ /* Keyboard shortcuts utility */
545
+
546
+ useKeyDown(
547
+ () => {
548
+ handlePrintToConsoleState();
549
+ },
550
+ ['KeyC'],
551
+ () =>
552
+ !window.weaveTextEditing && !['textTool'].includes(actualAction ?? ''),
553
+ (e) =>
554
+ e.altKey &&
555
+ ([SYSTEM_OS.MAC as string].includes(os) ? e.metaKey : e.ctrlKey)
556
+ );
557
+ }
@@ -0,0 +1,146 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { useInfiniteQuery, useMutation } from '@tanstack/react-query';
5
+ import { ImagePlus, Trash } from 'lucide-react';
6
+ import { useWeave } from '@inditextech/weave-react';
7
+ import { useCollaborationRoom } from '@/store/store';
8
+ import { getImages } from '@/api/get-images';
9
+ import { postImage } from '@/api/post-image';
10
+ import { delImage } from '@/api/del-image';
11
+
12
+ export const ImagesLibrary = () => {
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ const inputFileRef = React.useRef<any>(null);
15
+
16
+ const instance = useWeave((state) => state.instance);
17
+
18
+ const room = useCollaborationRoom((state) => state.room);
19
+ const imagesLibraryVisible = useCollaborationRoom(
20
+ (state) => state.images.library.visible
21
+ );
22
+
23
+ const mutationUpload = useMutation({
24
+ mutationFn: async (file: File) => {
25
+ return await postImage(room ?? '', file);
26
+ },
27
+ });
28
+
29
+ const mutationDelete = useMutation({
30
+ mutationFn: async (imageId: string) => {
31
+ return await delImage(room ?? '', imageId);
32
+ },
33
+ });
34
+
35
+ const query = useInfiniteQuery({
36
+ queryKey: ['getImages', room],
37
+ queryFn: async ({ pageParam }) => {
38
+ if (!room) {
39
+ return [];
40
+ }
41
+ return await getImages(room ?? '', 20, pageParam);
42
+ },
43
+ initialPageParam: '',
44
+ getNextPageParam: (lastPage) => lastPage.continuationToken,
45
+ });
46
+
47
+ const linearData = React.useMemo(() => {
48
+ return query.data?.pages.flatMap((page) => page.images) ?? [];
49
+ }, [query.data]);
50
+
51
+ if (!instance) {
52
+ return null;
53
+ }
54
+
55
+ if (!imagesLibraryVisible) {
56
+ return null;
57
+ }
58
+
59
+ return (
60
+ <div className="pointer-events-auto w-full h-full">
61
+ <div className="w-[calc(100%-38px)] font-title-xs p-1 pr-0 flex justify-between items-center">
62
+ <div className="flex justify-between font-noto-sans-mono font-light items-center text-md pl-2">
63
+ Images
64
+ </div>
65
+ <div className="flex justify-end items-center gap-1">
66
+ <input
67
+ type="file"
68
+ accept="image/png,image/gif,image/jpeg"
69
+ name="image"
70
+ ref={inputFileRef}
71
+ className="hidden"
72
+ onChange={(e) => {
73
+ const file = e.target.files?.[0];
74
+ if (file) {
75
+ mutationUpload.mutate(file, {
76
+ onSuccess: () => {
77
+ query.refetch();
78
+ },
79
+ });
80
+ }
81
+ }}
82
+ />
83
+ <button
84
+ className="cursor-pointer bg-transparent hover:bg-accent p-2"
85
+ onClick={() => {
86
+ if (inputFileRef.current) {
87
+ inputFileRef.current.click();
88
+ // instance.triggerAction("imageTool");
89
+ }
90
+ }}
91
+ >
92
+ <ImagePlus size={16} />
93
+ </button>
94
+ </div>
95
+ </div>
96
+ <div className="flex flex-col gap-2 w-full h-[calc(100%-50px)] border-t border-zinc-200">
97
+ <div
98
+ className="grid grid-cols-2 gap-2 w-full weaveDraggable p-4"
99
+ onDragStart={(e) => {
100
+ if (e.target instanceof HTMLImageElement) {
101
+ window.weaveDragImageURL = e.target.src;
102
+ }
103
+ }}
104
+ >
105
+ {linearData.length === 0 && (
106
+ <div className="col-span-2 w-full flex flex-col justify-center items-center text-sm py-5 text-center">
107
+ <b>No images uploaded</b>
108
+ <span className="text-xs">Add an image to the whiteboard</span>
109
+ </div>
110
+ )}
111
+ {linearData.length > 0 &&
112
+ linearData.map((image) => {
113
+ const imageUrl = `${process.env.NEXT_PUBLIC_API_ENDPOINT}/rooms/${room}/images/${image}`;
114
+
115
+ return (
116
+ <div
117
+ key={image}
118
+ className="group w-full h-[100px] bg-light-background-1 object-cover cursor-pointer border border-zinc-200 relative"
119
+ >
120
+ {/* eslint-disable-next-line @next/next/no-img-element */}
121
+ <img
122
+ className="w-full h-full object-cover"
123
+ draggable="true"
124
+ src={imageUrl}
125
+ alt="An image"
126
+ />
127
+ <button
128
+ className="absolute bottom-[8px] right-[8px] bg-white p-2 border border-zinc-200 rounded hidden group-hover:block cursor-pointer"
129
+ onClick={() => {
130
+ mutationDelete.mutate(image, {
131
+ onSuccess: () => {
132
+ query.refetch();
133
+ },
134
+ });
135
+ }}
136
+ >
137
+ <Trash size={16} />
138
+ </button>
139
+ </div>
140
+ );
141
+ })}
142
+ </div>
143
+ </div>
144
+ </div>
145
+ );
146
+ };