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,467 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import {
5
+ AlignCenter,
6
+ AlignCenterHorizontal,
7
+ AlignEndHorizontal,
8
+ AlignLeft,
9
+ AlignRight,
10
+ AlignStartHorizontal,
11
+ Bold,
12
+ CaseSensitive,
13
+ CaseUpper,
14
+ Italic,
15
+ RemoveFormatting,
16
+ Strikethrough,
17
+ Underline,
18
+ } from 'lucide-react';
19
+ import { WeaveStateElement } from '@inditextech/weave-types';
20
+ import { InputNumber } from '../inputs/input-number';
21
+ import { useWeave } from '@inditextech/weave-react';
22
+ import { useCollaborationRoom } from '@/store/store';
23
+ import { InputColor } from '../inputs/input-color';
24
+ import { ToggleIconButton } from '../toggle-icon-button';
25
+ import InputFontFamily from '../inputs/input-font-family';
26
+
27
+ export function TextProperties() {
28
+ const instance = useWeave((state) => state.instance);
29
+ const node = useWeave((state) => state.selection.node);
30
+ const actualAction = useWeave((state) => state.actions.actual);
31
+
32
+ const nodePropertiesAction = useCollaborationRoom(
33
+ (state) => state.nodeProperties.action
34
+ );
35
+
36
+ const nodeCreateProps = useCollaborationRoom(
37
+ (state) => state.nodeProperties.createProps
38
+ );
39
+
40
+ const [actualNode, setActualNode] = React.useState<
41
+ WeaveStateElement | undefined
42
+ >(node);
43
+
44
+ React.useEffect(() => {
45
+ if (!instance) return;
46
+ if (actualAction && nodePropertiesAction === 'create') {
47
+ setActualNode({
48
+ key: 'creating',
49
+ type: 'undefined',
50
+ props: {
51
+ ...nodeCreateProps,
52
+ },
53
+ });
54
+ }
55
+ if (node && nodePropertiesAction === 'update') {
56
+ setActualNode(node);
57
+ }
58
+ if (!actualAction && !node) {
59
+ setActualNode(undefined);
60
+ }
61
+ }, [instance, actualAction, node, nodeCreateProps, nodePropertiesAction]);
62
+
63
+ const updateElement = React.useCallback(
64
+ (updatedNode: WeaveStateElement) => {
65
+ if (!instance) return;
66
+ if (actualAction && nodePropertiesAction === 'create') {
67
+ instance.updatePropsAction(actualAction, updatedNode.props);
68
+ }
69
+ if (nodePropertiesAction === 'update') {
70
+ instance.updateNode(updatedNode);
71
+ }
72
+ },
73
+ [instance, actualAction, nodePropertiesAction]
74
+ );
75
+
76
+ if (!instance || !actualAction || !actualNode) {
77
+ return null;
78
+ }
79
+
80
+ if (!actualAction && !actualNode) return null;
81
+
82
+ if (!['text'].includes(actualNode.type)) {
83
+ return null;
84
+ }
85
+
86
+ return (
87
+ <div className="border-b border-zinc-200">
88
+ <div className="w-full flex justify-between items-center gap-3 p-4 py-3">
89
+ <div className="cursor-pointer hover:no-underline items-center py-0">
90
+ <span className="text-xs font-noto-sans-mono font-light">
91
+ Typography
92
+ </span>
93
+ </div>
94
+ </div>
95
+ <div className="px-4 pb-4">
96
+ <div className="grid grid-cols-2 gap-3 w-full">
97
+ <div className="col-span-2">
98
+ <InputFontFamily
99
+ value={`${actualNode.props.fontFamily ?? null}`}
100
+ onChange={(value) => {
101
+ const updatedNode: WeaveStateElement = {
102
+ ...actualNode,
103
+ props: {
104
+ ...actualNode.props,
105
+ fontFamily: value,
106
+ },
107
+ };
108
+ updateElement(updatedNode);
109
+ }}
110
+ />
111
+ </div>
112
+ <div className="col-span-2">
113
+ <InputColor
114
+ label="Color"
115
+ value={`${actualNode.props.fill.replace('#', '')}`}
116
+ onChange={(value) => {
117
+ const updatedNode: WeaveStateElement = {
118
+ ...actualNode,
119
+ props: {
120
+ ...actualNode.props,
121
+ fill: `#${value}`,
122
+ },
123
+ };
124
+ updateElement(updatedNode);
125
+ }}
126
+ />
127
+ </div>
128
+ <InputNumber
129
+ label="Size (px)"
130
+ value={actualNode.props.fontSize ?? 16}
131
+ onChange={(value) => {
132
+ const updatedNode: WeaveStateElement = {
133
+ ...actualNode,
134
+ props: {
135
+ ...actualNode.props,
136
+ fontSize: value,
137
+ },
138
+ };
139
+ updateElement(updatedNode);
140
+ }}
141
+ />
142
+ <InputNumber
143
+ label="Line Height"
144
+ value={actualNode.props.lineHeight ?? 1}
145
+ onChange={(value) => {
146
+ const updatedNode: WeaveStateElement = {
147
+ ...actualNode,
148
+ props: {
149
+ ...actualNode.props,
150
+ lineHeight: value,
151
+ },
152
+ };
153
+ updateElement(updatedNode);
154
+ }}
155
+ />
156
+
157
+ <div className="w-full flex justify-between items-center gap-4 col-span-2">
158
+ <div className="text-[11px] text-zinc-600 font-noto-sans-mono font-light text-nowrap">
159
+ Style
160
+ </div>
161
+ <div className="w-full flex justify-end items-center gap-1">
162
+ <ToggleIconButton
163
+ kind="switch"
164
+ icon={<RemoveFormatting size={16} />}
165
+ pressed={
166
+ (actualNode.props.fontStyle ?? 'normal').indexOf('normal') !==
167
+ -1
168
+ }
169
+ onClick={() => {
170
+ const updatedNode: WeaveStateElement = {
171
+ ...actualNode,
172
+ props: {
173
+ ...actualNode.props,
174
+ fontStyle: 'normal',
175
+ },
176
+ };
177
+ updateElement(updatedNode);
178
+ }}
179
+ />
180
+ <ToggleIconButton
181
+ kind="switch"
182
+ icon={<Italic size={16} />}
183
+ pressed={
184
+ (actualNode.props.fontStyle ?? 'normal').indexOf('italic') !==
185
+ -1
186
+ }
187
+ onClick={() => {
188
+ let items = [
189
+ ...(actualNode.props.fontStyle ?? 'normal')
190
+ .split(' ')
191
+ .filter((e: string) => e !== 'normal'),
192
+ ];
193
+ if (
194
+ (actualNode.props.fontStyle ?? 'normal').indexOf(
195
+ 'italic'
196
+ ) !== -1
197
+ ) {
198
+ items = items.filter((e: string) => e !== 'italic');
199
+ }
200
+ if (
201
+ (actualNode.props.fontStyle ?? 'normal').indexOf(
202
+ 'italic'
203
+ ) === -1
204
+ ) {
205
+ items = [...items];
206
+ items.push('italic');
207
+ }
208
+
209
+ if (items.length === 0) {
210
+ items = ['normal'];
211
+ }
212
+
213
+ const updatedNode: WeaveStateElement = {
214
+ ...actualNode,
215
+ props: {
216
+ ...actualNode.props,
217
+ fontStyle: items.join(' '),
218
+ },
219
+ };
220
+ updateElement(updatedNode);
221
+ }}
222
+ />
223
+ <ToggleIconButton
224
+ kind="switch"
225
+ icon={<Bold size={16} />}
226
+ pressed={
227
+ (actualNode.props.fontStyle ?? 'normal').indexOf('bold') !==
228
+ -1
229
+ }
230
+ onClick={() => {
231
+ let items = [
232
+ ...(actualNode.props.fontStyle ?? 'normal')
233
+ .split(' ')
234
+ .filter((e: string) => e !== 'normal'),
235
+ ];
236
+ if (
237
+ (actualNode.props.fontStyle ?? 'normal').indexOf('bold') !==
238
+ -1
239
+ ) {
240
+ items = items.filter((e: string) => e !== 'bold');
241
+ }
242
+ if (
243
+ (actualNode.props.fontStyle ?? 'normal').indexOf('bold') ===
244
+ -1
245
+ ) {
246
+ items = [...items];
247
+ items.push('bold');
248
+ }
249
+
250
+ if (items.length === 0) {
251
+ items = ['normal'];
252
+ }
253
+
254
+ const updatedNode: WeaveStateElement = {
255
+ ...actualNode,
256
+ props: {
257
+ ...actualNode.props,
258
+ fontStyle: items.join(' '),
259
+ },
260
+ };
261
+ updateElement(updatedNode);
262
+ }}
263
+ />
264
+ </div>
265
+ </div>
266
+ <div className="w-full flex justify-between items-center gap-4 col-span-2">
267
+ <div className="text-[11px] text-zinc-600 font-noto-sans-mono font-light text-nowrap">
268
+ Variant
269
+ </div>
270
+ <div className="w-full flex justify-end items-center gap-1">
271
+ <ToggleIconButton
272
+ kind="switch"
273
+ icon={<CaseSensitive size={16} />}
274
+ pressed={actualNode.props.fontVariant === 'normal'}
275
+ onClick={() => {
276
+ const updatedNode: WeaveStateElement = {
277
+ ...actualNode,
278
+ props: {
279
+ ...actualNode.props,
280
+ fontVariant: 'normal',
281
+ },
282
+ };
283
+ updateElement(updatedNode);
284
+ }}
285
+ />
286
+ <ToggleIconButton
287
+ kind="switch"
288
+ icon={<CaseUpper size={16} />}
289
+ pressed={actualNode.props.fontVariant === 'small-caps'}
290
+ onClick={() => {
291
+ const updatedNode: WeaveStateElement = {
292
+ ...actualNode,
293
+ props: {
294
+ ...actualNode.props,
295
+ fontVariant: 'small-caps',
296
+ },
297
+ };
298
+ updateElement(updatedNode);
299
+ }}
300
+ />
301
+ </div>
302
+ </div>
303
+ <div className="w-full flex justify-between items-center gap-4 col-span-2">
304
+ <div className="text-[11px] text-zinc-600 font-noto-sans-mono font-light text-nowrap">
305
+ Decoration
306
+ </div>
307
+ <div className="w-full flex justify-end items-center gap-1">
308
+ <ToggleIconButton
309
+ kind="switch"
310
+ icon={<RemoveFormatting size={16} />}
311
+ pressed={(actualNode.props.textDecoration ?? '') === ''}
312
+ onClick={() => {
313
+ const updatedNode: WeaveStateElement = {
314
+ ...actualNode,
315
+ props: {
316
+ ...actualNode.props,
317
+ textDecoration: '',
318
+ },
319
+ };
320
+ updateElement(updatedNode);
321
+ }}
322
+ />
323
+ <ToggleIconButton
324
+ kind="switch"
325
+ icon={<Strikethrough size={16} />}
326
+ pressed={
327
+ (actualNode.props.textDecoration ?? '') === 'line-through'
328
+ }
329
+ onClick={() => {
330
+ const updatedNode: WeaveStateElement = {
331
+ ...actualNode,
332
+ props: {
333
+ ...actualNode.props,
334
+ textDecoration: 'line-through',
335
+ },
336
+ };
337
+ updateElement(updatedNode);
338
+ }}
339
+ />
340
+ <ToggleIconButton
341
+ kind="switch"
342
+ icon={<Underline size={16} />}
343
+ pressed={
344
+ (actualNode.props.textDecoration ?? '') === 'underline'
345
+ }
346
+ onClick={() => {
347
+ const updatedNode: WeaveStateElement = {
348
+ ...actualNode,
349
+ props: {
350
+ ...actualNode.props,
351
+ textDecoration: 'underline',
352
+ },
353
+ };
354
+ updateElement(updatedNode);
355
+ }}
356
+ />
357
+ </div>
358
+ </div>
359
+ <div className="w-full flex justify-between items-center gap-4 col-span-2">
360
+ <div className="text-[11px] text-zinc-600 font-noto-sans-mono font-light text-nowrap">
361
+ Horizontal alignment
362
+ </div>
363
+ <div className="w-full flex justify-end items-center gap-1">
364
+ <ToggleIconButton
365
+ kind="switch"
366
+ icon={<AlignLeft size={16} />}
367
+ pressed={(actualNode.props.align ?? '') === 'left'}
368
+ onClick={() => {
369
+ const updatedNode: WeaveStateElement = {
370
+ ...actualNode,
371
+ props: {
372
+ ...actualNode.props,
373
+ align: 'left',
374
+ },
375
+ };
376
+ updateElement(updatedNode);
377
+ }}
378
+ />
379
+ <ToggleIconButton
380
+ kind="switch"
381
+ icon={<AlignCenter size={16} />}
382
+ pressed={(actualNode.props.align ?? '') === 'center'}
383
+ onClick={() => {
384
+ const updatedNode: WeaveStateElement = {
385
+ ...actualNode,
386
+ props: {
387
+ ...actualNode.props,
388
+ align: 'center',
389
+ },
390
+ };
391
+ updateElement(updatedNode);
392
+ }}
393
+ />
394
+ <ToggleIconButton
395
+ kind="switch"
396
+ icon={<AlignRight size={16} />}
397
+ pressed={(actualNode.props.align ?? '') === 'right'}
398
+ onClick={() => {
399
+ const updatedNode: WeaveStateElement = {
400
+ ...actualNode,
401
+ props: {
402
+ ...actualNode.props,
403
+ align: 'right',
404
+ },
405
+ };
406
+ updateElement(updatedNode);
407
+ }}
408
+ />
409
+ </div>
410
+ </div>
411
+ <div className="w-full flex justify-between items-center gap-4 col-span-2">
412
+ <div className="text-[11px] text-zinc-600 font-noto-sans-mono font-light text-nowrap">
413
+ Vertical alignment
414
+ </div>
415
+ <div className="w-full flex justify-end items-center gap-1">
416
+ <ToggleIconButton
417
+ kind="switch"
418
+ icon={<AlignStartHorizontal size={16} />}
419
+ pressed={(actualNode.props.verticalAlign ?? 'top') === 'top'}
420
+ onClick={() => {
421
+ const updatedNode: WeaveStateElement = {
422
+ ...actualNode,
423
+ props: {
424
+ ...actualNode.props,
425
+ verticalAlign: 'top',
426
+ },
427
+ };
428
+ updateElement(updatedNode);
429
+ }}
430
+ />
431
+ <ToggleIconButton
432
+ kind="switch"
433
+ icon={<AlignCenterHorizontal size={16} />}
434
+ pressed={(actualNode.props.verticalAlign ?? 'top') === 'middle'}
435
+ onClick={() => {
436
+ const updatedNode: WeaveStateElement = {
437
+ ...actualNode,
438
+ props: {
439
+ ...actualNode.props,
440
+ verticalAlign: 'middle',
441
+ },
442
+ };
443
+ updateElement(updatedNode);
444
+ }}
445
+ />
446
+ <ToggleIconButton
447
+ kind="switch"
448
+ icon={<AlignEndHorizontal size={16} />}
449
+ pressed={(actualNode.props.verticalAlign ?? '') === 'bottom'}
450
+ onClick={() => {
451
+ const updatedNode: WeaveStateElement = {
452
+ ...actualNode,
453
+ props: {
454
+ ...actualNode.props,
455
+ verticalAlign: 'bottom',
456
+ },
457
+ };
458
+ updateElement(updatedNode);
459
+ }}
460
+ />
461
+ </div>
462
+ </div>
463
+ </div>
464
+ </div>
465
+ </div>
466
+ );
467
+ }
@@ -0,0 +1,127 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { useWeave } from '@inditextech/weave-react';
5
+ import { NodeProperties } from './node-properties';
6
+ import { useCollaborationRoom } from '@/store/store';
7
+ import { AnimatePresence } from 'framer-motion';
8
+ import OverlayAnimationWrapper from './overlay-animation-wrapper';
9
+
10
+ export function MultiuseOverlay() {
11
+ const instance = useWeave((state) => state.instance);
12
+ const selectedNodes = useWeave((state) => state.selection.nodes);
13
+ const actualAction = useWeave((state) => state.actions.actual);
14
+ const isActionActive = useWeave((state) => state.actions.active);
15
+ const node = useWeave((state) => state.selection.node);
16
+
17
+ const nodePropertiesVisible = useCollaborationRoom(
18
+ (state) => state.nodeProperties.visible
19
+ );
20
+ const contextMenuVisible = useCollaborationRoom(
21
+ (state) => state.contextMenu.show
22
+ );
23
+ const setNodePropertiesAction = useCollaborationRoom(
24
+ (state) => state.setNodePropertiesAction
25
+ );
26
+ const setNodePropertiesVisible = useCollaborationRoom(
27
+ (state) => state.setNodePropertiesVisible
28
+ );
29
+
30
+ React.useEffect(() => {
31
+ if (
32
+ isActionActive &&
33
+ actualAction &&
34
+ ['selectionTool'].includes(actualAction) &&
35
+ selectedNodes.length !== 1 &&
36
+ !contextMenuVisible
37
+ ) {
38
+ setNodePropertiesAction(undefined);
39
+ setNodePropertiesVisible(false);
40
+ }
41
+ if (
42
+ isActionActive &&
43
+ actualAction &&
44
+ ['selectionTool'].includes(actualAction) &&
45
+ selectedNodes.length === 1 &&
46
+ !contextMenuVisible
47
+ ) {
48
+ setNodePropertiesAction('update');
49
+ setNodePropertiesVisible(true);
50
+ }
51
+ if (
52
+ isActionActive &&
53
+ actualAction &&
54
+ [
55
+ 'rectangleTool',
56
+ 'brushTool',
57
+ 'penTool',
58
+ 'imageTool',
59
+ 'colorTokenTool',
60
+ 'frameTool',
61
+ ].includes(actualAction) &&
62
+ !contextMenuVisible
63
+ ) {
64
+ setNodePropertiesAction('create');
65
+ setNodePropertiesVisible(true);
66
+ }
67
+
68
+ if (!actualAction && selectedNodes.length !== 1) {
69
+ setNodePropertiesVisible(false);
70
+ }
71
+ // eslint-disable-next-line react-hooks/exhaustive-deps
72
+ }, [contextMenuVisible, actualAction, selectedNodes]);
73
+
74
+ const nodeType = React.useMemo(() => {
75
+ switch (node?.type) {
76
+ case 'group':
77
+ return 'Group';
78
+ case 'rectangle':
79
+ return 'Rectangle';
80
+ case 'line':
81
+ return 'Vector path';
82
+ case 'text':
83
+ return 'Text';
84
+ case 'image':
85
+ return 'Image';
86
+ case 'colorToken':
87
+ return 'Color token';
88
+ case 'frame':
89
+ return 'Frame';
90
+ default:
91
+ return 'Unknown';
92
+ }
93
+ }, [node]);
94
+
95
+ const actionType = React.useMemo(() => {
96
+ switch (actualAction) {
97
+ case 'rectangleTool':
98
+ return 'Rectangle';
99
+ case 'brushTool':
100
+ return 'Vector path';
101
+ case 'penTool':
102
+ return 'Vector path';
103
+ case 'imageTool':
104
+ return 'Image';
105
+ case 'colorTokenTool':
106
+ return 'Color token';
107
+ case 'frameTool':
108
+ return 'Frame';
109
+ default:
110
+ return 'Unknown';
111
+ }
112
+ }, [actualAction]);
113
+
114
+ if (!instance || !nodePropertiesVisible) {
115
+ return null;
116
+ }
117
+
118
+ return (
119
+ <AnimatePresence mode="wait">
120
+ <OverlayAnimationWrapper
121
+ panelId={`nodeProperties-${nodeType}-${actionType}`}
122
+ >
123
+ <NodeProperties />
124
+ </OverlayAnimationWrapper>
125
+ </AnimatePresence>
126
+ );
127
+ }
@@ -0,0 +1,98 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { useWeave } from '@inditextech/weave-react';
5
+ import { useCollaborationRoom } from '@/store/store';
6
+ import { PositionProperties } from './../node-properties/position-properties';
7
+ import { SizeProperties } from './../node-properties/size-properties';
8
+ import { AppearanceProperties } from './../node-properties/appearance-properties';
9
+ import { FillProperties } from './../node-properties/fill-properties';
10
+ import { StrokeProperties } from './../node-properties/stroke-properties';
11
+ import { TextProperties } from './../node-properties/text-properties';
12
+ import { ImageProperties } from '../node-properties/image-properties';
13
+ import { ColorTokenProperties } from '../node-properties/color-token-properties';
14
+ import { FrameProperties } from '../node-properties/frame-properties';
15
+ import { CropProperties } from '../node-properties/crop-properties';
16
+
17
+ export const NodeProperties = () => {
18
+ const actualAction = useWeave((state) => state.actions.actual);
19
+ const node = useWeave((state) => state.selection.node);
20
+
21
+ const nodePropertiesAction = useCollaborationRoom(
22
+ (state) => state.nodeProperties.action
23
+ );
24
+ const nodePropertiesVisible = useCollaborationRoom(
25
+ (state) => state.nodeProperties.visible
26
+ );
27
+
28
+ const nodeType = React.useMemo(() => {
29
+ switch (node?.type) {
30
+ case 'group':
31
+ return 'Group';
32
+ case 'rectangle':
33
+ return 'Rectangle';
34
+ case 'line':
35
+ return 'Vector path';
36
+ case 'text':
37
+ return 'Text';
38
+ case 'image':
39
+ return 'Image';
40
+ case 'colorToken':
41
+ return 'Color token';
42
+ case 'frame':
43
+ return 'Frame';
44
+ default:
45
+ return 'Unknown';
46
+ }
47
+ }, [node]);
48
+
49
+ const actionType = React.useMemo(() => {
50
+ switch (actualAction) {
51
+ case 'rectangleTool':
52
+ return 'Rectangle';
53
+ case 'brushTool':
54
+ return 'Vector path';
55
+ case 'penTool':
56
+ return 'Vector path';
57
+ case 'imageTool':
58
+ return 'Image';
59
+ case 'colorTokenTool':
60
+ return 'Color token';
61
+ case 'frameTool':
62
+ return 'Frame';
63
+ default:
64
+ return 'Unknown';
65
+ }
66
+ }, [actualAction]);
67
+
68
+ const title = React.useMemo(() => {
69
+ if (nodePropertiesAction === 'create') {
70
+ return actionType;
71
+ }
72
+ return nodeType;
73
+ }, [nodeType, actionType, nodePropertiesAction]);
74
+
75
+ if (!nodePropertiesVisible) {
76
+ return null;
77
+ }
78
+
79
+ return (
80
+ <div className="w-full justify-center items-center">
81
+ <div className="w-full p-3 border-b">
82
+ <h2 className="text-md font-noto-sans-mono font-light">{title}</h2>
83
+ </div>
84
+ <div className="flex-1">
85
+ <ImageProperties />
86
+ <ColorTokenProperties />
87
+ <FrameProperties />
88
+ <PositionProperties />
89
+ <SizeProperties />
90
+ <AppearanceProperties />
91
+ <FillProperties />
92
+ <StrokeProperties />
93
+ <TextProperties />
94
+ <CropProperties />
95
+ </div>
96
+ </div>
97
+ );
98
+ };