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,447 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { ToolbarButton } from '../toolbar/toolbar-button';
5
+ import {
6
+ Sheet,
7
+ SheetClose,
8
+ SheetContent,
9
+ SheetTrigger,
10
+ } from '@/components/ui/sheet';
11
+ import {
12
+ XIcon,
13
+ Fullscreen,
14
+ Maximize,
15
+ ZoomIn,
16
+ ZoomOut,
17
+ Braces,
18
+ Images,
19
+ SwatchBook,
20
+ Undo,
21
+ Redo,
22
+ Projector,
23
+ } from 'lucide-react';
24
+ import { useWeave } from '@inditextech/weave-react';
25
+ import { motion } from 'framer-motion';
26
+ import { bottomElementVariants } from './variants';
27
+ import { useCollaborationRoom } from '@/store/store';
28
+ import { ColorTokensLibrary } from '../color-tokens-library/color-tokens-library';
29
+ import { FramesLibrary } from '../frames-library/frames-library';
30
+ import { ImagesLibrary } from '../images-library/images-library';
31
+ import { HelpDrawer } from '../help/help-drawer';
32
+ import { SYSTEM_OS } from '@/lib/utils';
33
+ import { ShortcutElement } from '../help/shortcut-element';
34
+
35
+ export function ZoomHandlerOverlay() {
36
+ const instance = useWeave((state) => state.instance);
37
+ const actualAction = useWeave((state) => state.actions.actual);
38
+ const selectedNodes = useWeave((state) => state.selection.nodes);
39
+ const canUndo = useWeave((state) => state.undoRedo.canUndo);
40
+ const canRedo = useWeave((state) => state.undoRedo.canRedo);
41
+
42
+ const zoomValue = useWeave((state) => state.zoom.value);
43
+ const canZoomIn = useWeave((state) => state.zoom.canZoomIn);
44
+ const canZoomOut = useWeave((state) => state.zoom.canZoomOut);
45
+
46
+ const showUI = useCollaborationRoom((state) => state.ui.show);
47
+ const framesLibraryVisible = useCollaborationRoom(
48
+ (state) => state.frames.library.visible
49
+ );
50
+ const setFramesLibraryVisible = useCollaborationRoom(
51
+ (state) => state.setFramesLibraryVisible
52
+ );
53
+ const imagesLibraryVisible = useCollaborationRoom(
54
+ (state) => state.images.library.visible
55
+ );
56
+ const setImagesLibraryVisible = useCollaborationRoom(
57
+ (state) => state.setImagesLibraryVisible
58
+ );
59
+ const colorTokensLibraryVisible = useCollaborationRoom(
60
+ (state) => state.colorToken.library.visible
61
+ );
62
+ const setColorTokensLibraryVisible = useCollaborationRoom(
63
+ (state) => state.setColorTokensLibraryVisible
64
+ );
65
+
66
+ const handleTriggerActionWithParams = React.useCallback(
67
+ (actionName: string, params: unknown) => {
68
+ if (instance) {
69
+ const triggerSelection = actualAction === 'selectionTool';
70
+ instance.triggerAction(actionName, params);
71
+ if (triggerSelection) {
72
+ instance.triggerAction('selectionTool');
73
+ }
74
+ }
75
+ },
76
+ [instance, actualAction]
77
+ );
78
+
79
+ const handlePrintToConsoleState = React.useCallback(() => {
80
+ if (instance) {
81
+ // eslint-disable-next-line no-console
82
+ console.log({
83
+ appState: JSON.parse(JSON.stringify(instance.getStore().getState())),
84
+ });
85
+ }
86
+ }, [instance]);
87
+
88
+ const libraryToggle = React.useCallback(
89
+ (library: string) => {
90
+ switch (library) {
91
+ case 'images':
92
+ setColorTokensLibraryVisible(false);
93
+ setFramesLibraryVisible(false);
94
+ setImagesLibraryVisible(!imagesLibraryVisible);
95
+ break;
96
+ case 'colorTokens':
97
+ setImagesLibraryVisible(false);
98
+ setFramesLibraryVisible(false);
99
+ setColorTokensLibraryVisible(!colorTokensLibraryVisible);
100
+ break;
101
+ case 'frames':
102
+ setImagesLibraryVisible(false);
103
+ setColorTokensLibraryVisible(false);
104
+ setFramesLibraryVisible(!framesLibraryVisible);
105
+ break;
106
+ default:
107
+ break;
108
+ }
109
+ },
110
+ [
111
+ colorTokensLibraryVisible,
112
+ framesLibraryVisible,
113
+ imagesLibraryVisible,
114
+ setImagesLibraryVisible,
115
+ setColorTokensLibraryVisible,
116
+ setFramesLibraryVisible,
117
+ ]
118
+ );
119
+
120
+ if (!showUI) {
121
+ return null;
122
+ }
123
+
124
+ return (
125
+ <motion.div
126
+ initial="hidden"
127
+ animate="visible"
128
+ exit="hidden"
129
+ variants={bottomElementVariants}
130
+ className="pointer-events-none absolute bottom-2 left-2 right-2 flex gap- justify-between items-center"
131
+ >
132
+ <div className="flex gap-2 justify-start items-center">
133
+ <div className="bg-white border border-zinc-200 shadow-lg p-1 w-full flex justify-between items-center">
134
+ <div className="w-full grid grid-cols-[auto_1fr]">
135
+ <div className="flex justify-start items-center gap-1">
136
+ <Sheet modal={false} open={imagesLibraryVisible}>
137
+ <SheetTrigger asChild>
138
+ <ToolbarButton
139
+ icon={<Images />}
140
+ active={imagesLibraryVisible}
141
+ onClick={() => {
142
+ libraryToggle('images');
143
+ }}
144
+ label={
145
+ <div className="flex flex-col gap-2 justify-start items-end">
146
+ <p>Images toolbar</p>
147
+ <ShortcutElement
148
+ variant="light"
149
+ shortcuts={{
150
+ [SYSTEM_OS.MAC]: '⌥ ⌘ R',
151
+ [SYSTEM_OS.OTHER]: 'Alt Ctrl R',
152
+ }}
153
+ />
154
+ </div>
155
+ }
156
+ tooltipSide="top"
157
+ tooltipAlign="start"
158
+ />
159
+ </SheetTrigger>
160
+ <SheetContent className="w-[328px]">
161
+ <SheetClose className="absolute top-0 right-0 p-1">
162
+ <button
163
+ className="cursor-pointer bg-transparent hover:bg-accent p-2"
164
+ onClick={() => {
165
+ libraryToggle('images');
166
+ }}
167
+ >
168
+ <XIcon size={16} />
169
+ <span className="sr-only">Close</span>
170
+ </button>
171
+ </SheetClose>
172
+ <ImagesLibrary />
173
+ </SheetContent>
174
+ </Sheet>
175
+ <Sheet modal={false} open={framesLibraryVisible}>
176
+ <SheetTrigger asChild>
177
+ <ToolbarButton
178
+ icon={<Projector />}
179
+ active={framesLibraryVisible}
180
+ onClick={() => {
181
+ libraryToggle('frames');
182
+ }}
183
+ label={
184
+ <div className="flex flex-col gap-2 justify-start items-end">
185
+ <p>Frames toolbar</p>
186
+ <ShortcutElement
187
+ variant="light"
188
+ shortcuts={{
189
+ [SYSTEM_OS.MAC]: '⌥ ⌘ F',
190
+ [SYSTEM_OS.OTHER]: 'Alt Ctrl F',
191
+ }}
192
+ />
193
+ </div>
194
+ }
195
+ tooltipSide="top"
196
+ tooltipAlign="start"
197
+ />
198
+ </SheetTrigger>
199
+ <SheetContent className="w-[328px]">
200
+ <SheetClose className="absolute top-0 right-0 p-1">
201
+ <button
202
+ className="cursor-pointer bg-transparent hover:bg-accent p-2"
203
+ onClick={() => {
204
+ libraryToggle('frames');
205
+ }}
206
+ >
207
+ <XIcon size={16} />
208
+ <span className="sr-only">Close</span>
209
+ </button>
210
+ </SheetClose>
211
+ <FramesLibrary />
212
+ </SheetContent>
213
+ </Sheet>
214
+ <Sheet modal={false} open={colorTokensLibraryVisible}>
215
+ <SheetTrigger asChild>
216
+ <ToolbarButton
217
+ icon={<SwatchBook />}
218
+ active={colorTokensLibraryVisible}
219
+ onClick={() => {
220
+ libraryToggle('colorTokens');
221
+ }}
222
+ label={
223
+ <div className="flex flex-col gap-2 justify-start items-end">
224
+ <p>Color Token toolbar</p>
225
+ <ShortcutElement
226
+ variant="light"
227
+ shortcuts={{
228
+ [SYSTEM_OS.MAC]: '⌥ ⌘ P',
229
+ [SYSTEM_OS.OTHER]: 'Alt Ctrl P',
230
+ }}
231
+ />
232
+ </div>
233
+ }
234
+ tooltipSide="top"
235
+ tooltipAlign="start"
236
+ />
237
+ </SheetTrigger>
238
+ <SheetContent className="w-[328px]">
239
+ <SheetClose className="absolute top-0 right-0 p-1">
240
+ <button
241
+ className="cursor-pointer bg-transparent hover:bg-accent p-2"
242
+ onClick={() => {
243
+ libraryToggle('colorTokens');
244
+ }}
245
+ >
246
+ <XIcon size={16} />
247
+ <span className="sr-only">Close</span>
248
+ </button>
249
+ </SheetClose>
250
+ <ColorTokensLibrary />
251
+ </SheetContent>
252
+ </Sheet>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ <div className="bg-white border border-zinc-200 shadow-lg p-1 flex justify-between items-center">
257
+ <div className="w-full grid grid-cols-[auto_1fr]">
258
+ <div className="flex justify-start items-center gap-1">
259
+ <ToolbarButton
260
+ icon={<Undo />}
261
+ disabled={!canUndo}
262
+ onClick={() => {
263
+ if (instance) {
264
+ const actualStore = instance.getStore();
265
+ actualStore.undoStateStep();
266
+ }
267
+ }}
268
+ label={
269
+ <div className="flex flex-col gap-2 justify-start items-end">
270
+ <p>Undo latest changes</p>
271
+ <ShortcutElement
272
+ variant="light"
273
+ shortcuts={{
274
+ [SYSTEM_OS.MAC]: '⇧ ⌘ ,',
275
+ [SYSTEM_OS.OTHER]: '⇧ Ctrl ,',
276
+ }}
277
+ />
278
+ </div>
279
+ }
280
+ tooltipSide="top"
281
+ tooltipAlign="start"
282
+ />
283
+ <ToolbarButton
284
+ icon={<Redo />}
285
+ disabled={!canRedo}
286
+ onClick={() => {
287
+ if (instance) {
288
+ const actualStore = instance.getStore();
289
+ actualStore.redoStateStep();
290
+ }
291
+ }}
292
+ label={
293
+ <div className="flex gap-3 justify-start items-center">
294
+ <p>Redo latest changes</p>
295
+ <ShortcutElement
296
+ variant="light"
297
+ shortcuts={{
298
+ [SYSTEM_OS.MAC]: '⇧ ⌘ .',
299
+ [SYSTEM_OS.OTHER]: '⇧ Ctrl .',
300
+ }}
301
+ />
302
+ </div>
303
+ }
304
+ tooltipSide="top"
305
+ tooltipAlign="start"
306
+ />
307
+ </div>
308
+ </div>
309
+ </div>
310
+ <div className="bg-white border border-zinc-200 shadow-lg p-1 flex justify-between items-center">
311
+ <div className="w-full grid grid-cols-[auto_1fr]">
312
+ <div className="flex justify-start items-center gap-1">
313
+ <HelpDrawer />
314
+ </div>
315
+ </div>
316
+ </div>
317
+ <div className="bg-white border border-zinc-200 shadow-lg p-1 flex justify-between items-center">
318
+ <div className="w-full grid grid-cols-[auto_1fr]">
319
+ <div className="flex justify-start items-center gap-1">
320
+ <ToolbarButton
321
+ icon={<Braces />}
322
+ onClick={handlePrintToConsoleState}
323
+ label={
324
+ <div className="flex flex-col gap-2 justify-start items-end">
325
+ <p>Print model state to browser console</p>
326
+ <ShortcutElement
327
+ variant="light"
328
+ shortcuts={{
329
+ [SYSTEM_OS.MAC]: '⌥ ⌘ C',
330
+ [SYSTEM_OS.OTHER]: 'Alt Ctrl C',
331
+ }}
332
+ />
333
+ </div>
334
+ }
335
+ tooltipSide="top"
336
+ tooltipAlign="start"
337
+ />
338
+ </div>
339
+ </div>
340
+ </div>
341
+ </div>
342
+ <div className="flex justify-end gap-2 items-center">
343
+ <div className="min-w-[320px] w-[320px] gap-1 p-1 bg-white border border-zinc-200 shadow-lg flex justify-end items-center">
344
+ <div className="w-full grid grid-cols-[auto_1fr]">
345
+ <div className="flex justify-start items-center gap-1">
346
+ <ToolbarButton
347
+ icon={<ZoomIn />}
348
+ disabled={!canZoomIn}
349
+ onClick={() => {
350
+ handleTriggerActionWithParams('zoomInTool', {
351
+ previousAction: actualAction,
352
+ });
353
+ }}
354
+ label={
355
+ <div className="flex flex-col gap-2 justify-start items-end">
356
+ {' '}
357
+ <p>Zoom in</p>
358
+ <ShortcutElement
359
+ variant="light"
360
+ shortcuts={{
361
+ [SYSTEM_OS.MAC]: '⌘ +',
362
+ [SYSTEM_OS.OTHER]: 'Ctrl +',
363
+ }}
364
+ />
365
+ </div>
366
+ }
367
+ tooltipSide="top"
368
+ tooltipAlign="end"
369
+ />
370
+ <ToolbarButton
371
+ icon={<ZoomOut />}
372
+ disabled={!canZoomOut}
373
+ onClick={() => {
374
+ handleTriggerActionWithParams('zoomOutTool', {
375
+ previousAction: actualAction,
376
+ });
377
+ }}
378
+ label={
379
+ <div className="flex flex-col gap-2 justify-start items-end">
380
+ <p>Zoom out</p>
381
+ <ShortcutElement
382
+ variant="light"
383
+ shortcuts={{
384
+ [SYSTEM_OS.MAC]: '⌘ -',
385
+ [SYSTEM_OS.OTHER]: 'Ctrl -',
386
+ }}
387
+ />
388
+ </div>
389
+ }
390
+ tooltipSide="top"
391
+ tooltipAlign="end"
392
+ />
393
+ <ToolbarButton
394
+ icon={<Maximize />}
395
+ onClick={() => {
396
+ handleTriggerActionWithParams('fitToScreenTool', {
397
+ previousAction: actualAction,
398
+ });
399
+ }}
400
+ label={
401
+ <div className="flex flex-col gap-2 justify-start items-end">
402
+ <p>Fit to screen</p>
403
+ <ShortcutElement
404
+ variant="light"
405
+ shortcuts={{
406
+ [SYSTEM_OS.MAC]: '⇧ 1',
407
+ [SYSTEM_OS.OTHER]: '⇧ 1',
408
+ }}
409
+ />
410
+ </div>
411
+ }
412
+ tooltipSide="top"
413
+ tooltipAlign="end"
414
+ />
415
+ <ToolbarButton
416
+ icon={<Fullscreen />}
417
+ disabled={selectedNodes.length === 0}
418
+ onClick={() => {
419
+ handleTriggerActionWithParams('fitToSelectionTool', {
420
+ previousAction: actualAction,
421
+ });
422
+ }}
423
+ label={
424
+ <div className="flex flex-col gap-2 justify-start items-end">
425
+ <p>Fit to selection</p>
426
+ <ShortcutElement
427
+ variant="light"
428
+ shortcuts={{
429
+ [SYSTEM_OS.MAC]: '⇧ 2',
430
+ [SYSTEM_OS.OTHER]: '⇧ 2',
431
+ }}
432
+ />
433
+ </div>
434
+ }
435
+ tooltipSide="top"
436
+ tooltipAlign="end"
437
+ />
438
+ </div>
439
+ <div className="w-full px-4 font-noto-sans-mono flex justify-end items-center text-muted-foreground">
440
+ {parseFloat(`${zoomValue * 100}`).toFixed(2)}%
441
+ </div>
442
+ </div>
443
+ </div>
444
+ </div>
445
+ </motion.div>
446
+ );
447
+ }
@@ -0,0 +1,37 @@
1
+ "use client"
2
+
3
+ import { motion } from "framer-motion"
4
+ import { Logo } from "../utils/logo"
5
+
6
+ type RoomLoaderProps = {
7
+ content: string;
8
+ }
9
+
10
+ export function RoomError({ content }: Readonly<RoomLoaderProps>) {
11
+ return (
12
+ <div className="flex flex-col items-center justify-center space-y-4 p-4">
13
+ <motion.div
14
+ animate={{
15
+ rotate: 360,
16
+ }}
17
+ transition={{
18
+ duration: 2,
19
+ repeat: Number.POSITIVE_INFINITY,
20
+ ease: "linear",
21
+ }}
22
+ >
23
+ <Logo kind="large" variant="no-text"/>
24
+ </motion.div>
25
+ <motion.div
26
+ initial={{ opacity: 0 }}
27
+ animate={{ opacity: 1 }}
28
+ transition={{ duration: 0.8 }}
29
+ className="flex flex-col justify-center items-center"
30
+ >
31
+ <p className="text-lg font-semibold text-primary">AN ERROR OCCURRED</p>
32
+ <p className="text-base text-primary">{content}</p>
33
+ </motion.div>
34
+ </div>
35
+ )
36
+ }
37
+
@@ -0,0 +1,98 @@
1
+ "use client";
2
+
3
+ import { AnimatePresence, motion } from "framer-motion";
4
+ import Threads from "@/components/ui/reactbits/Backgrounds/Threads/Threads";
5
+ import { Logo } from "@/components/utils/logo";
6
+
7
+ type RoomLoaderProps = {
8
+ roomId?: string;
9
+ content: string;
10
+ description?: string;
11
+ };
12
+
13
+ const containerVariants = {
14
+ hidden: {
15
+ opacity: 0,
16
+ filter: "blur(10px)",
17
+ transition: { duration: 2, ease: [0.25, 0.1, 0.25, 1], staggerChildren: 0 },
18
+ },
19
+ visible: {
20
+ opacity: 1,
21
+ filter: "blur(0)",
22
+ transition: {
23
+ duration: 1,
24
+ ease: [0.25, 0.1, 0.25, 1],
25
+ staggerChildren: 0.3,
26
+ },
27
+ },
28
+ };
29
+
30
+ const childVariants = {
31
+ hidden: {
32
+ filter: "blur(10px)",
33
+ opacity: 0,
34
+ transition: { duration: 0.2, ease: [0.25, 0.1, 0.25, 1] },
35
+ },
36
+ visible: {
37
+ filter: "blur(0)",
38
+ opacity: 1,
39
+ transition: { duration: 1, ease: [0.25, 0.1, 0.25, 1] },
40
+ },
41
+ };
42
+
43
+ export function RoomLoader({
44
+ roomId,
45
+ content,
46
+ description,
47
+ }: Readonly<RoomLoaderProps>) {
48
+ return (
49
+ <motion.div
50
+ initial="hidden"
51
+ animate="visible"
52
+ exit="hidden"
53
+ variants={containerVariants}
54
+ className="w-full h-full bg-white flex justify-center items-center overflow-hidden absolute"
55
+ >
56
+ <motion.div
57
+ className="absolute top-0 left-0 right-0 h-full"
58
+ variants={childVariants}
59
+ >
60
+ <Threads
61
+ color={[246 / 255, 246 / 255, 246 / 255]}
62
+ amplitude={1}
63
+ distance={0}
64
+ enableMouseInteraction={false}
65
+ />
66
+ </motion.div>
67
+
68
+ <div className="absolute bottom-0 left-0 right-0 h-full flex justify-center items-center">
69
+ <div className="flex flex-col items-center justify-center space-y-4 p-4">
70
+ <motion.div variants={childVariants}>
71
+ <Logo kind="large" variant="no-text" />
72
+ </motion.div>
73
+
74
+ <div className="flex flex-col justify-center items-center text-black gap-3">
75
+ <div className="font-noto-sans font-extralight text-2xl uppercase">
76
+ <motion.span variants={childVariants}>{content}</motion.span>
77
+ </div>
78
+
79
+ {roomId && (
80
+ <div className="font-noto-sans text-2xl font-semibold">
81
+ <motion.span variants={childVariants}>{roomId}</motion.span>
82
+ </div>
83
+ )}
84
+ <AnimatePresence>
85
+ {description && (
86
+ <div className="font-noto-sans-mono text-xl">
87
+ <motion.span variants={childVariants} key={description}>
88
+ {description}
89
+ </motion.span>
90
+ </div>
91
+ )}
92
+ </AnimatePresence>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </motion.div>
97
+ );
98
+ }
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { useWeave } from '@inditextech/weave-react';
5
+
6
+ export const SelectionInformation = () => {
7
+ const instance = useWeave((state) => state.instance);
8
+ const selectedNodes = useWeave((state) => state.selection.nodes);
9
+
10
+ if (!instance) {
11
+ return null;
12
+ }
13
+
14
+ if (selectedNodes.length <= 1) {
15
+ return null;
16
+ }
17
+
18
+ return (
19
+ <div className="w-full justify-center items-center rounded-lg">
20
+ <div className="w-full h-full flex flex-col gap-[1px] bg-light-background-1">
21
+ <div className="w-full font-title-xs p-4 border-b border-light-border-3 bg-light-background-2">
22
+ Selected elements
23
+ </div>
24
+ <div className="w-full flex flex-col gap-1">
25
+ {selectedNodes.map((node) => {
26
+ const stage = instance.getStage();
27
+ try {
28
+ const box = node.instance.getClientRect();
29
+ node.instance.toImage({
30
+ x: box.x,
31
+ y: box.y,
32
+ width: box.width * stage.scaleX(),
33
+ height: box.height * stage.scaleY(),
34
+ callback(img) {
35
+ const containerNode = document.getElementById(
36
+ `selection_${node.node.key}_image_container`
37
+ );
38
+ if (containerNode) {
39
+ containerNode.innerHTML = '';
40
+ img.style.width = '100%';
41
+ img.style.height = '100%';
42
+ img.style.objectFit = 'contain';
43
+ containerNode.appendChild(img);
44
+ }
45
+ },
46
+ });
47
+ } catch (ex) {
48
+ console.error(ex);
49
+ }
50
+ return (
51
+ <div
52
+ key={node.node.key}
53
+ id={`selection_${node.node.key}`}
54
+ className="px-4 py-3 border-b border-light-border-3 flex flex-col"
55
+ >
56
+ <div className="w-full grid grid-cols-[1fr_50px] gap-1">
57
+ <div className="w-full h-full flex flex-col justify-center items-start">
58
+ <div className="font-mono font-body-m-light w-full">
59
+ {node.node.props.nodeType}
60
+ </div>
61
+ </div>
62
+ <div
63
+ className="w-full h-[50px] border border-light-border-3 p-1"
64
+ id={`selection_${node.node.key}_image_container`}
65
+ />
66
+ </div>
67
+ </div>
68
+ );
69
+ })}
70
+ </div>
71
+ </div>
72
+ </div>
73
+ );
74
+ };