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,514 @@
1
+ import {
2
+ Weave,
3
+ WeaveContextMenuPlugin,
4
+ WeaveCopyPasteNodesPlugin,
5
+ WeaveExportNodeActionParams,
6
+ } from '@inditextech/weave-sdk';
7
+ import { WeaveSelection } from '@inditextech/weave-types';
8
+ import { useMutation } from '@tanstack/react-query';
9
+ import { postRemoveBackground } from '@/api/post-remove-background';
10
+ import {
11
+ Copy,
12
+ ClipboardCopy,
13
+ ClipboardPaste,
14
+ Group,
15
+ Ungroup,
16
+ Trash,
17
+ SendToBack,
18
+ BringToFront,
19
+ ArrowUp,
20
+ ArrowDown,
21
+ ImageDown,
22
+ ImageMinus,
23
+ } from 'lucide-react';
24
+ import { useCollaborationRoom } from '@/store/store';
25
+ import React from 'react';
26
+ import { ContextMenuOption } from '../context-menu';
27
+ import { ShortcutElement } from '../help/shortcut-element';
28
+ import { SYSTEM_OS } from '@/lib/utils';
29
+ import Konva from 'konva';
30
+
31
+ function useContextMenu() {
32
+ const room = useCollaborationRoom((state) => state.room);
33
+ const setContextMenuShow = useCollaborationRoom(
34
+ (state) => state.setContextMenuShow
35
+ );
36
+ const setContextMenuPosition = useCollaborationRoom(
37
+ (state) => state.setContextMenuPosition
38
+ );
39
+ const setContextMenuOptions = useCollaborationRoom(
40
+ (state) => state.setContextMenuOptions
41
+ );
42
+ const setTransformingImage = useCollaborationRoom(
43
+ (state) => state.setTransformingImage
44
+ );
45
+ const setNodePropertiesVisible = useCollaborationRoom(
46
+ (state) => state.setNodePropertiesVisible
47
+ );
48
+ const setFramesLibraryVisible = useCollaborationRoom(
49
+ (state) => state.setFramesLibraryVisible
50
+ );
51
+ const setImagesLibraryVisible = useCollaborationRoom(
52
+ (state) => state.setImagesLibraryVisible
53
+ );
54
+ const setColorTokensLibraryVisible = useCollaborationRoom(
55
+ (state) => state.setColorTokensLibraryVisible
56
+ );
57
+
58
+ const mutationUpload = useMutation({
59
+ mutationFn: async (imageId: string) => {
60
+ return await postRemoveBackground(room ?? '', imageId);
61
+ },
62
+ });
63
+
64
+ const getContextMenu = React.useCallback(
65
+ ({
66
+ actInstance,
67
+ actActionActive,
68
+ canUnGroup,
69
+ nodes,
70
+ canGroup,
71
+ }: {
72
+ actInstance: Weave;
73
+ actActionActive: string | undefined;
74
+ canUnGroup: boolean;
75
+ canGroup: boolean;
76
+ nodes: WeaveSelection[];
77
+ }): ContextMenuOption[] => {
78
+ const options: ContextMenuOption[] = [];
79
+
80
+ if (nodes.length > 0) {
81
+ // DUPLICATE
82
+ options.push({
83
+ id: 'duplicate',
84
+ type: 'button',
85
+ label: (
86
+ <div className="w-full flex justify-between items-center">
87
+ <div>Duplicate</div>
88
+ <ShortcutElement
89
+ shortcuts={{
90
+ [SYSTEM_OS.MAC]: '⌘ D',
91
+ [SYSTEM_OS.OTHER]: 'Ctrl D',
92
+ }}
93
+ />
94
+ </div>
95
+ ),
96
+ icon: <Copy size={16} />,
97
+ disabled: nodes.length > 1,
98
+ onClick: async () => {
99
+ if (nodes.length === 1) {
100
+ const weaveCopyPasteNodesPlugin =
101
+ actInstance.getPlugin<WeaveCopyPasteNodesPlugin>(
102
+ 'copyPasteNodes'
103
+ );
104
+ if (weaveCopyPasteNodesPlugin) {
105
+ await weaveCopyPasteNodesPlugin.copy();
106
+ weaveCopyPasteNodesPlugin.paste();
107
+ }
108
+ setContextMenuShow(false);
109
+ }
110
+ },
111
+ });
112
+ }
113
+ if (nodes.length > 0) {
114
+ // SEPARATOR
115
+ options.push({
116
+ id: 'div--1',
117
+ type: 'divider',
118
+ });
119
+ }
120
+ if (nodes.length > 0) {
121
+ // EXPORT
122
+ options.push({
123
+ id: 'export',
124
+ type: 'button',
125
+ label: (
126
+ <div className="w-full flex justify-between items-center">
127
+ <div>Export as image</div>
128
+ <ShortcutElement
129
+ shortcuts={{
130
+ [SYSTEM_OS.MAC]: '⇧ ⌘ E',
131
+ [SYSTEM_OS.OTHER]: '⇧ Ctrl E',
132
+ }}
133
+ />
134
+ </div>
135
+ ),
136
+ icon: <ImageDown size={16} />,
137
+ disabled: nodes.length > 1,
138
+ onClick: () => {
139
+ if (nodes.length === 1) {
140
+ actInstance.triggerAction<WeaveExportNodeActionParams>(
141
+ 'exportNodeTool',
142
+ {
143
+ node: nodes[0].instance,
144
+ options: {
145
+ padding: 20,
146
+ pixelRatio: 2,
147
+ },
148
+ }
149
+ );
150
+ }
151
+ setContextMenuShow(false);
152
+ },
153
+ });
154
+ }
155
+ if (nodes.length > 0) {
156
+ // SEPARATOR
157
+ options.push({
158
+ id: 'div-0',
159
+ type: 'divider',
160
+ });
161
+ // COPY
162
+ }
163
+ // COPY
164
+ options.push({
165
+ id: 'copy',
166
+ type: 'button',
167
+ label: (
168
+ <div className="w-full flex justify-between items-center">
169
+ <div>Copy</div>
170
+ <ShortcutElement
171
+ shortcuts={{
172
+ [SYSTEM_OS.MAC]: '⌘ C',
173
+ [SYSTEM_OS.OTHER]: 'Ctrl C',
174
+ }}
175
+ />
176
+ </div>
177
+ ),
178
+ icon: <ClipboardCopy size={16} />,
179
+ disabled: !['selectionTool'].includes(actActionActive ?? ''),
180
+ onClick: async () => {
181
+ const weaveCopyPasteNodesPlugin =
182
+ actInstance.getPlugin<WeaveCopyPasteNodesPlugin>('copyPasteNodes');
183
+ if (weaveCopyPasteNodesPlugin) {
184
+ await weaveCopyPasteNodesPlugin.copy();
185
+ }
186
+ setContextMenuShow(false);
187
+ },
188
+ });
189
+ // PASTE
190
+ options.push({
191
+ id: 'paste',
192
+ type: 'button',
193
+ label: (
194
+ <div className="w-full flex justify-between items-center">
195
+ <div>Paste</div>
196
+ <ShortcutElement
197
+ shortcuts={{
198
+ [SYSTEM_OS.MAC]: '⌘ P',
199
+ [SYSTEM_OS.OTHER]: 'Ctrl P',
200
+ }}
201
+ />
202
+ </div>
203
+ ),
204
+ icon: <ClipboardPaste size={16} />,
205
+ disabled: !['selectionTool'].includes(actActionActive ?? ''),
206
+ onClick: () => {
207
+ const weaveCopyPasteNodesPlugin =
208
+ actInstance.getPlugin<WeaveCopyPasteNodesPlugin>('copyPasteNodes');
209
+ if (weaveCopyPasteNodesPlugin) {
210
+ return weaveCopyPasteNodesPlugin.paste();
211
+ }
212
+ setContextMenuShow(false);
213
+ },
214
+ });
215
+ if (nodes.length > 0) {
216
+ // SEPARATOR
217
+ options.push({
218
+ id: 'div-1',
219
+ type: 'divider',
220
+ });
221
+ }
222
+ if (nodes.length > 0) {
223
+ // BRING TO FRONT
224
+ options.push({
225
+ id: 'bring-to-front',
226
+ type: 'button',
227
+ label: (
228
+ <div className="w-full flex justify-between items-center">
229
+ <div>Bring to front</div>
230
+ <ShortcutElement
231
+ shortcuts={{
232
+ [SYSTEM_OS.MAC]: ']',
233
+ [SYSTEM_OS.OTHER]: ']',
234
+ }}
235
+ />
236
+ </div>
237
+ ),
238
+ icon: <BringToFront size={16} />,
239
+ disabled: nodes.length !== 1,
240
+ onClick: () => {
241
+ actInstance.bringToFront(nodes[0].instance);
242
+ setContextMenuShow(false);
243
+ },
244
+ });
245
+ // MOVE UP
246
+ options.push({
247
+ id: 'move-up',
248
+ type: 'button',
249
+ label: (
250
+ <div className="w-full flex justify-between items-center">
251
+ <div>Move up</div>
252
+ <ShortcutElement
253
+ shortcuts={{
254
+ [SYSTEM_OS.MAC]: '⌘ ]',
255
+ [SYSTEM_OS.OTHER]: 'Ctrl ]',
256
+ }}
257
+ />
258
+ </div>
259
+ ),
260
+ icon: <ArrowUp size={16} />,
261
+ disabled: nodes.length !== 1,
262
+ onClick: () => {
263
+ actInstance.moveUp(nodes[0].instance);
264
+ setContextMenuShow(false);
265
+ },
266
+ });
267
+ // MOVE DOWN
268
+ options.push({
269
+ id: 'move-down',
270
+ type: 'button',
271
+ label: (
272
+ <div className="w-full flex justify-between items-center">
273
+ <div>Move down</div>
274
+ <ShortcutElement
275
+ shortcuts={{
276
+ [SYSTEM_OS.MAC]: '⌘ [',
277
+ [SYSTEM_OS.OTHER]: 'Ctrl [',
278
+ }}
279
+ />
280
+ </div>
281
+ ),
282
+ icon: <ArrowDown size={16} />,
283
+ disabled: nodes.length !== 1,
284
+ onClick: () => {
285
+ actInstance.moveDown(nodes[0].instance);
286
+ setContextMenuShow(false);
287
+ },
288
+ });
289
+ // SEND TO BACK
290
+ options.push({
291
+ id: 'send-to-back',
292
+ type: 'button',
293
+ label: (
294
+ <div className="w-full flex justify-between items-center">
295
+ <div>Send to back</div>
296
+ <ShortcutElement
297
+ shortcuts={{
298
+ [SYSTEM_OS.MAC]: '[',
299
+ [SYSTEM_OS.OTHER]: '[',
300
+ }}
301
+ />
302
+ </div>
303
+ ),
304
+ icon: <SendToBack size={16} />,
305
+ disabled: nodes.length !== 1,
306
+ onClick: () => {
307
+ actInstance.sendToBack(nodes[0].instance);
308
+ setContextMenuShow(false);
309
+ },
310
+ });
311
+ }
312
+ if (nodes.length > 0) {
313
+ options.push({
314
+ id: 'div-2',
315
+ type: 'divider',
316
+ });
317
+ }
318
+ if (nodes.length > 0) {
319
+ // GROUP
320
+ options.push({
321
+ id: 'group',
322
+ type: 'button',
323
+ label: (
324
+ <div className="w-full flex justify-between items-center">
325
+ <div>Group</div>
326
+ <ShortcutElement
327
+ shortcuts={{
328
+ [SYSTEM_OS.MAC]: '⇧ ⌘ G',
329
+ [SYSTEM_OS.OTHER]: '⇧ Ctrl G',
330
+ }}
331
+ />
332
+ </div>
333
+ ),
334
+ icon: <Group size={16} />,
335
+ disabled: !canGroup,
336
+ onClick: () => {
337
+ actInstance.group(nodes.map((n) => n.node));
338
+ setContextMenuShow(false);
339
+ },
340
+ });
341
+ // UNGROUP
342
+ options.push({
343
+ id: 'ungroup',
344
+ type: 'button',
345
+ label: (
346
+ <div className="w-full flex justify-between items-center">
347
+ <div>Un-group</div>
348
+ <ShortcutElement
349
+ shortcuts={{
350
+ [SYSTEM_OS.MAC]: '⇧ ⌘ U',
351
+ [SYSTEM_OS.OTHER]: '⇧ Ctrl U',
352
+ }}
353
+ />
354
+ </div>
355
+ ),
356
+ icon: <Ungroup size={16} />,
357
+ disabled: !canUnGroup,
358
+ onClick: () => {
359
+ actInstance.unGroup(nodes[0].node);
360
+ setContextMenuShow(false);
361
+ },
362
+ });
363
+ }
364
+ if (nodes.length > 0) {
365
+ // SEPARATOR
366
+ options.push({
367
+ id: 'div-3',
368
+ type: 'divider',
369
+ });
370
+ }
371
+ if (nodes.length > 0) {
372
+ // DELETE
373
+ options.push({
374
+ id: 'delete',
375
+ type: 'button',
376
+ label: (
377
+ <div className="w-full flex justify-between items-center">
378
+ <div>Delete</div>
379
+ <ShortcutElement
380
+ shortcuts={{
381
+ [SYSTEM_OS.MAC]: 'Del',
382
+ [SYSTEM_OS.OTHER]: 'Del',
383
+ }}
384
+ />
385
+ </div>
386
+ ),
387
+ icon: <Trash size={16} />,
388
+ onClick: () => {
389
+ for (const node of nodes) {
390
+ actInstance.removeNode(node.node);
391
+ }
392
+
393
+ setContextMenuShow(false);
394
+ },
395
+ });
396
+ }
397
+
398
+ if (nodes.length === 1 && nodes[0].node.type === 'image') {
399
+ options.unshift({
400
+ id: 'div-image',
401
+ type: 'divider',
402
+ });
403
+ options.unshift({
404
+ id: 'removeBackground',
405
+ type: 'button',
406
+ label: 'Remove background',
407
+ icon: <ImageMinus size={16} />,
408
+ onClick: () => {
409
+ if (actInstance) {
410
+ const nodeImage = nodes[0].instance as Konva.Group | undefined;
411
+ if (nodeImage) {
412
+ const nodeImageInternal = nodeImage?.findOne(
413
+ `#${nodeImage.getAttrs().id}-image`
414
+ );
415
+ const imageTokens = nodeImageInternal
416
+ ?.getAttr('image')
417
+ .src.split('/');
418
+ const imageId = imageTokens[imageTokens.length - 1];
419
+ setTransformingImage(true);
420
+ mutationUpload.mutate(imageId, {
421
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
422
+ onSuccess: (data: any) => {
423
+ const room = data.fileName.split('/')[0];
424
+ const imageId = data.fileName.split('/')[1];
425
+
426
+ const { finishUploadCallback } = actInstance.triggerAction(
427
+ 'imageTool'
428
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
429
+ ) as any;
430
+
431
+ finishUploadCallback(
432
+ `${process.env.NEXT_PUBLIC_API_ENDPOINT}/rooms/${room}/images/${imageId}`
433
+ );
434
+ },
435
+ onError: () => {
436
+ console.error('Error uploading image');
437
+ },
438
+ onSettled: () => {
439
+ setTransformingImage(false);
440
+ },
441
+ });
442
+ }
443
+ }
444
+ setContextMenuShow(false);
445
+ },
446
+ });
447
+ }
448
+
449
+ return options;
450
+ },
451
+ [mutationUpload, setTransformingImage, setContextMenuShow]
452
+ );
453
+
454
+ const onNodeMenu = React.useCallback(
455
+ (
456
+ actInstance: Weave,
457
+ nodes: WeaveSelection[],
458
+ point: { x: number; y: number },
459
+ visible: boolean
460
+ ) => {
461
+ const canGroup = nodes.length > 1;
462
+ const canUnGroup = nodes.length === 1 && nodes[0].node.type === 'group';
463
+
464
+ const actActionActive = actInstance.getActiveAction();
465
+
466
+ if (visible) {
467
+ setNodePropertiesVisible(false);
468
+ setColorTokensLibraryVisible(false);
469
+ setFramesLibraryVisible(false);
470
+ setImagesLibraryVisible(false);
471
+ }
472
+
473
+ setContextMenuShow(visible);
474
+ setContextMenuPosition(point);
475
+
476
+ const contextMenu = getContextMenu({
477
+ actInstance,
478
+ actActionActive,
479
+ canUnGroup,
480
+ nodes,
481
+ canGroup,
482
+ });
483
+ setContextMenuOptions(contextMenu);
484
+ },
485
+ [
486
+ getContextMenu,
487
+ setContextMenuOptions,
488
+ setContextMenuPosition,
489
+ setContextMenuShow,
490
+ setFramesLibraryVisible,
491
+ setImagesLibraryVisible,
492
+ setNodePropertiesVisible,
493
+ setColorTokensLibraryVisible,
494
+ ]
495
+ );
496
+
497
+ const contextMenu = React.useMemo(
498
+ () =>
499
+ new WeaveContextMenuPlugin(
500
+ {
501
+ xOffset: 10,
502
+ yOffset: 10,
503
+ },
504
+ {
505
+ onNodeMenu,
506
+ }
507
+ ),
508
+ [onNodeMenu]
509
+ );
510
+
511
+ return { contextMenu };
512
+ }
513
+
514
+ export default useContextMenu;
@@ -0,0 +1,12 @@
1
+ import { detectOS, SYSTEM_OS, SystemOs } from "@/lib/utils";
2
+ import React from "react";
3
+
4
+ export const useGetOs = () => {
5
+ const [os, setOs] = React.useState<SystemOs>(SYSTEM_OS.OTHER);
6
+
7
+ React.useEffect(() => {
8
+ setOs(detectOS());
9
+ }, []);
10
+
11
+ return os;
12
+ };
@@ -0,0 +1,120 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React from 'react';
3
+
4
+ import {
5
+ WeaveBrushToolAction,
6
+ WeaveCopyPasteNodesPlugin,
7
+ WeaveFrameToolAction,
8
+ WeaveImageToolAction,
9
+ WeavePenToolAction,
10
+ WeaveRectangleToolAction,
11
+ } from '@inditextech/weave-sdk';
12
+ import { toast } from 'sonner';
13
+ import { useCollaborationRoom } from '@/store/store';
14
+ import {
15
+ ACTIONS,
16
+ CUSTOM_PLUGINS,
17
+ FONTS,
18
+ NODES,
19
+ } from '@/components/utils/constants';
20
+ import useContextMenu from './use-context-menu';
21
+ import { ColorTokenToolAction } from '@/components/actions/color-token-tool/color-token-tool';
22
+
23
+ function useGetWeaveJSProps() {
24
+ const setLoadingImage = useCollaborationRoom(
25
+ (state) => state.setLoadingImage
26
+ );
27
+
28
+ const setNodePropertiesCreateProps = useCollaborationRoom(
29
+ (state) => state.setNodePropertiesCreateProps
30
+ );
31
+ const setFinishUploadCallbackImage = useCollaborationRoom(
32
+ (state) => state.setFinishUploadCallbackImage
33
+ );
34
+
35
+ const { contextMenu } = useContextMenu();
36
+
37
+ const memoizedActions = React.useMemo(
38
+ () => [
39
+ new WeaveRectangleToolAction({
40
+ onPropsChange: (props) => {
41
+ setNodePropertiesCreateProps(props);
42
+ },
43
+ }),
44
+ new WeavePenToolAction({
45
+ onPropsChange: (props) => {
46
+ setNodePropertiesCreateProps(props);
47
+ },
48
+ }),
49
+ new WeaveBrushToolAction({
50
+ onPropsChange: (props) => {
51
+ setNodePropertiesCreateProps(props);
52
+ },
53
+ }),
54
+ new WeaveImageToolAction({
55
+ onPropsChange: (props) => {
56
+ setNodePropertiesCreateProps(props);
57
+ },
58
+ onUploadImage: async (finished: (imageURL: string) => void) => {
59
+ setFinishUploadCallbackImage(finished);
60
+ },
61
+ onImageLoadStart: () => {
62
+ setLoadingImage(true);
63
+ },
64
+ onImageLoadEnd: () => {
65
+ setLoadingImage(false);
66
+ },
67
+ }),
68
+ new WeaveFrameToolAction({
69
+ onPropsChange: (props) => {
70
+ setNodePropertiesCreateProps(props);
71
+ },
72
+ }),
73
+ new ColorTokenToolAction({
74
+ onPropsChange: (props) => {
75
+ setNodePropertiesCreateProps(props);
76
+ },
77
+ }),
78
+ ...ACTIONS,
79
+ ],
80
+ [
81
+ setNodePropertiesCreateProps,
82
+ setLoadingImage,
83
+ setFinishUploadCallbackImage,
84
+ ]
85
+ );
86
+
87
+ const memoizedCustomPlugins = React.useMemo(() => {
88
+ return [
89
+ ...CUSTOM_PLUGINS,
90
+ contextMenu,
91
+ new WeaveCopyPasteNodesPlugin({
92
+ onCopy: (error?: Error) => {
93
+ if (error) {
94
+ console.error('onCopy', error);
95
+ toast.error('Aan error occurred when copying to the clipboard');
96
+ } else {
97
+ toast.success('Copy successful');
98
+ }
99
+ },
100
+ onPaste: (error?: Error) => {
101
+ if (error) {
102
+ console.error('onPaste', error);
103
+ toast.error('Aan error occurred when reading from the clipboard');
104
+ } else {
105
+ toast.success('Paste successful');
106
+ }
107
+ },
108
+ }),
109
+ ];
110
+ }, [contextMenu]);
111
+
112
+ return {
113
+ fonts: FONTS,
114
+ nodes: NODES,
115
+ customPlugins: memoizedCustomPlugins,
116
+ actions: memoizedActions,
117
+ };
118
+ }
119
+
120
+ export default useGetWeaveJSProps;