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,31 @@
1
+ import { motion } from "framer-motion";
2
+ import { rightElementVariants } from "./variants";
3
+ import { SelectionInformation } from "../selection-information";
4
+
5
+ function OverlayAnimationWrapper({
6
+ children,
7
+ panelId,
8
+ }: {
9
+ children: React.ReactNode;
10
+ panelId: string;
11
+ }) {
12
+ return (
13
+ <motion.div
14
+ key={panelId}
15
+ initial="hidden"
16
+ animate="visible"
17
+ exit="hidden"
18
+ variants={rightElementVariants}
19
+ className="absolute top-[calc(50px+16px)] right-2 bottom-[calc(50px+16px)] flex flex-col gap-5 justify-center items-center"
20
+ >
21
+ <div className="w-[320px] p-0 h-full bg-white border border-zinc-200 shadow-lg flex justify-start items-center gap-3 overflow-hidden">
22
+ <div className="w-full h-full overflow-auto custom-scrollbar !px-0">
23
+ {children}
24
+ <SelectionInformation />
25
+ </div>
26
+ </div>
27
+ </motion.div>
28
+ );
29
+ }
30
+
31
+ export default OverlayAnimationWrapper;
@@ -0,0 +1,247 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { cn } from '@/lib/utils';
5
+ import { useRouter } from 'next/navigation';
6
+ import { motion } from 'framer-motion';
7
+ import { useWeave } from '@inditextech/weave-react';
8
+ import { useCollaborationRoom } from '@/store/store';
9
+ import {
10
+ DropdownMenu,
11
+ DropdownMenuContent,
12
+ DropdownMenuItem,
13
+ DropdownMenuSeparator,
14
+ DropdownMenuTrigger,
15
+ } from '@/components/ui/dropdown-menu';
16
+
17
+ import { Logo } from '@/components/utils/logo';
18
+ import {
19
+ Image as ImageIcon,
20
+ LogOut,
21
+ ChevronDown,
22
+ ChevronUp,
23
+ Grid2X2PlusIcon,
24
+ Grid2x2XIcon,
25
+ Grid3X3Icon,
26
+ GripIcon,
27
+ CheckIcon,
28
+ } from 'lucide-react';
29
+ import {
30
+ WEAVE_GRID_TYPES,
31
+ WeaveExportStageActionParams,
32
+ WeaveStageGridPlugin,
33
+ WeaveStageGridType,
34
+ } from '@inditextech/weave-sdk';
35
+ import { ConnectionStatus } from '../connection-status';
36
+ import { topElementVariants } from './variants';
37
+ import { DropdownMenuLabel } from '@radix-ui/react-dropdown-menu';
38
+
39
+ export function RoomInformationOverlay() {
40
+ const router = useRouter();
41
+
42
+ const instance = useWeave((state) => state.instance);
43
+ const weaveConnectionStatus = useWeave((state) => state.connection.status);
44
+
45
+ const showUI = useCollaborationRoom((state) => state.ui.show);
46
+ const room = useCollaborationRoom((state) => state.room);
47
+
48
+ const [menuOpen, setMenuOpen] = React.useState(false);
49
+ const [gridEnabled, setGridEnabled] = React.useState(true);
50
+ const [gridType, setGridType] = React.useState<WeaveStageGridType>(
51
+ WEAVE_GRID_TYPES.LINES
52
+ );
53
+
54
+ const handleToggleGrid = React.useCallback(() => {
55
+ if (instance && instance.isPluginEnabled('stageGrid')) {
56
+ instance.disablePlugin('stageGrid');
57
+ setGridEnabled(instance.isPluginEnabled('stageGrid'));
58
+ return;
59
+ }
60
+ if (instance && !instance.isPluginEnabled('stageGrid')) {
61
+ instance.enablePlugin('stageGrid');
62
+ setGridEnabled(instance.isPluginEnabled('stageGrid'));
63
+ return;
64
+ }
65
+ }, [instance]);
66
+
67
+ const handleSetGridType = React.useCallback(
68
+ (type: WeaveStageGridType) => {
69
+ if (instance) {
70
+ (instance.getPlugin('stageGrid') as WeaveStageGridPlugin)?.setType(
71
+ type
72
+ );
73
+ setGridType(type);
74
+ }
75
+ },
76
+ [instance]
77
+ );
78
+
79
+ const handleExportToImage = React.useCallback(() => {
80
+ if (instance) {
81
+ instance.triggerAction<WeaveExportStageActionParams>('exportStageTool', {
82
+ options: {
83
+ padding: 20,
84
+ pixelRatio: 2,
85
+ },
86
+ });
87
+ }
88
+ }, [instance]);
89
+
90
+ React.useEffect(() => {
91
+ if (instance) {
92
+ setGridEnabled(instance.isPluginEnabled('stageGrid'));
93
+ }
94
+ }, [instance]);
95
+
96
+ React.useEffect(() => {
97
+ if (instance) {
98
+ const stageGridPlugin = instance.getPlugin(
99
+ 'stageGrid'
100
+ ) as WeaveStageGridPlugin;
101
+ setGridType(stageGridPlugin?.getType());
102
+ }
103
+ }, [instance]);
104
+
105
+ // const handleExportToPdf = React.useCallback(() => {
106
+ // if (instance) {
107
+ // instance.triggerAction<WeaveExportStageActionParams>("exportStageTool", {
108
+ // options: {
109
+ // padding: 20,
110
+ // pixelRatio: 2,
111
+ // },
112
+ // });
113
+ // }
114
+ // }, [instance]);
115
+
116
+ const handleExitRoom = React.useCallback(() => {
117
+ router.push('/');
118
+ }, [router]);
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={topElementVariants}
130
+ className="pointer-events-none absolute top-2 left-2 flex gap-1 justify-center items-center"
131
+ >
132
+ <div className="bg-white border border-zinc-200 shadow-lg flex justify-start items-center gap-0 pr-1">
133
+ <div className="bg-accent h-[48px] flex justify-start items-center py-0 px-2">
134
+ <Logo kind="small" />
135
+ </div>
136
+ <div className="flex justify-start items-center p-1 gap-1">
137
+ <DropdownMenu onOpenChange={(open: boolean) => setMenuOpen(open)}>
138
+ <DropdownMenuTrigger
139
+ className={cn(
140
+ 'pointer-events-auto rounded-none cursor-pointer p-1 px-3 hover:bg-accent focus:outline-none',
141
+ {
142
+ ['bg-accent']: menuOpen,
143
+ ['bg-white']: !menuOpen,
144
+ }
145
+ )}
146
+ >
147
+ <div className="flex justify-start items-center gap-2 font-noto-sans-mono text-foreground !normal-case min-h-[32px]">
148
+ <div className="font-noto-sans text-lg font-extralight">
149
+ {room}
150
+ </div>
151
+ {menuOpen ? <ChevronUp /> : <ChevronDown />}
152
+ </div>
153
+ </DropdownMenuTrigger>
154
+ <DropdownMenuContent
155
+ align="start"
156
+ side="bottom"
157
+ alignOffset={0}
158
+ sideOffset={4}
159
+ className="font-noto-sans-mono rounded-none"
160
+ >
161
+ <DropdownMenuLabel className="px-2 py-1 pt-2 text-zinc-600 text-xs">
162
+ Grid Visibility
163
+ </DropdownMenuLabel>
164
+ <DropdownMenuItem
165
+ className="text-foreground cursor-pointer hover:rounded-none"
166
+ onClick={handleToggleGrid}
167
+ >
168
+ {!gridEnabled && (
169
+ <>
170
+ <Grid2X2PlusIcon /> Enable
171
+ </>
172
+ )}
173
+ {gridEnabled && (
174
+ <>
175
+ <Grid2x2XIcon /> Disable
176
+ </>
177
+ )}
178
+ </DropdownMenuItem>
179
+ <DropdownMenuLabel className="px-2 py-1 pt-2 text-zinc-600 text-xs">
180
+ Grid Kind
181
+ </DropdownMenuLabel>
182
+ <DropdownMenuItem
183
+ disabled={
184
+ !gridEnabled ||
185
+ (gridEnabled && gridType === WEAVE_GRID_TYPES.DOTS)
186
+ }
187
+ className="text-foreground cursor-pointer hover:rounded-none"
188
+ onClick={() => {
189
+ handleSetGridType(WEAVE_GRID_TYPES.DOTS);
190
+ }}
191
+ >
192
+ <div className="w-full flex justify-between items-center">
193
+ <div className="w-full flex justify-start items-center gap-2">
194
+ <GripIcon size={16} /> Dots
195
+ </div>
196
+ {gridType === WEAVE_GRID_TYPES.DOTS && <CheckIcon />}
197
+ </div>
198
+ </DropdownMenuItem>
199
+ <DropdownMenuItem
200
+ disabled={
201
+ !gridEnabled ||
202
+ (gridEnabled && gridType === WEAVE_GRID_TYPES.LINES)
203
+ }
204
+ className="text-foreground cursor-pointer hover:rounded-none"
205
+ onClick={() => {
206
+ handleSetGridType(WEAVE_GRID_TYPES.LINES);
207
+ }}
208
+ >
209
+ <div className="w-full flex justify-between items-center">
210
+ <div className="w-full flex justify-start items-center gap-2">
211
+ <Grid3X3Icon size={16} /> Lines
212
+ </div>
213
+ {gridType === WEAVE_GRID_TYPES.LINES && <CheckIcon />}
214
+ </div>
215
+ </DropdownMenuItem>
216
+ <DropdownMenuSeparator />
217
+ <DropdownMenuLabel className="px-2 py-1 pt-2 text-zinc-600 text-xs">
218
+ Exporting
219
+ </DropdownMenuLabel>
220
+ <DropdownMenuItem
221
+ className="text-foreground cursor-pointer hover:rounded-none"
222
+ onClick={handleExportToImage}
223
+ >
224
+ <ImageIcon /> Stage to image
225
+ </DropdownMenuItem>
226
+ {/* <DropdownMenuItem
227
+ className="text-foreground cursor-pointer hover:rounded-none"
228
+ onClick={handleExportToPdf}
229
+ >
230
+ <FileText />
231
+ Export to PDF
232
+ </DropdownMenuItem> */}
233
+ <DropdownMenuSeparator />
234
+ <DropdownMenuItem
235
+ className="text-foreground cursor-pointer hover:rounded-none"
236
+ onClick={handleExitRoom}
237
+ >
238
+ <LogOut /> Exit room
239
+ </DropdownMenuItem>
240
+ </DropdownMenuContent>
241
+ </DropdownMenu>
242
+ <ConnectionStatus weaveConnectionStatus={weaveConnectionStatus} />
243
+ </div>
244
+ </div>
245
+ </motion.div>
246
+ );
247
+ }
@@ -0,0 +1,31 @@
1
+ "use client";
2
+
3
+ import React from "react";
4
+ import { motion } from "framer-motion";
5
+ import { ConnectedUsers } from "../connected-users";
6
+ import { topElementVariants } from "./variants";
7
+ import { useCollaborationRoom } from "@/store/store";
8
+
9
+ export function RoomUsersOverlay() {
10
+ const showUI = useCollaborationRoom((state) => state.ui.show);
11
+
12
+ if (!showUI) {
13
+ return null;
14
+ }
15
+
16
+ return (
17
+ <motion.div
18
+ initial="hidden"
19
+ animate="visible"
20
+ exit="hidden"
21
+ variants={topElementVariants}
22
+ className="pointer-events-none absolute top-2 right-2 flex flex-col gap-1 justify-center items-center"
23
+ >
24
+ <div className="w-[320px] min-h-[50px] p-2 py-1 bg-white border border-zinc-200 shadow-lg flex flex-col justify-start items-center">
25
+ <div className="w-full min-h-[40px] h-full flex flex-col justify-between items-center gap-2">
26
+ <ConnectedUsers />
27
+ </div>
28
+ </div>
29
+ </motion.div>
30
+ );
31
+ }
@@ -0,0 +1,289 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { ToolbarButton } from '../toolbar/toolbar-button';
5
+ import { useMutation } from '@tanstack/react-query';
6
+ import { postImage } from '@/api/post-image';
7
+ import {
8
+ Brush,
9
+ ImagePlus,
10
+ PenTool,
11
+ Square,
12
+ Type,
13
+ Frame,
14
+ MousePointer,
15
+ Hand,
16
+ Tags,
17
+ } from 'lucide-react';
18
+ import { useWeave } from '@inditextech/weave-react';
19
+ import { Toolbar } from '../toolbar/toolbar';
20
+ import { motion } from 'framer-motion';
21
+ import { leftElementVariants } from './variants';
22
+ import { useCollaborationRoom } from '@/store/store';
23
+ import { ShortcutElement } from '../help/shortcut-element';
24
+ import { SYSTEM_OS } from '@/lib/utils';
25
+ import { useKeyboardHandler } from '../hooks/use-keyboard-handler';
26
+
27
+ export function ToolsOverlay() {
28
+ useKeyboardHandler();
29
+
30
+ const instance = useWeave((state) => state.instance);
31
+ const actualAction = useWeave((state) => state.actions.actual);
32
+
33
+ const room = useCollaborationRoom((state) => state.room);
34
+ const showUI = useCollaborationRoom((state) => state.ui.show);
35
+ const setUploadingImage = useCollaborationRoom(
36
+ (state) => state.setUploadingImage
37
+ );
38
+
39
+ const mutationUpload = useMutation({
40
+ mutationFn: async (file: File) => {
41
+ return await postImage(room ?? '', file);
42
+ },
43
+ });
44
+
45
+ const setShowSelectFileImage = useCollaborationRoom(
46
+ (state) => state.setShowSelectFileImage
47
+ );
48
+
49
+ const triggerTool = React.useCallback(
50
+ (toolName: string) => {
51
+ if (instance && actualAction !== toolName) {
52
+ instance.triggerAction(toolName);
53
+ }
54
+ if (instance && actualAction === toolName) {
55
+ instance.cancelAction(toolName);
56
+ }
57
+ },
58
+ [instance, actualAction]
59
+ );
60
+
61
+ React.useEffect(() => {
62
+ const onPasteExternalImage = async (item: ClipboardItem) => {
63
+ let blob: Blob | null = null;
64
+ if (item.types.includes('image/png')) {
65
+ blob = await item.getType('image/png');
66
+ }
67
+ if (item.types.includes('image/jpeg')) {
68
+ blob = await item.getType('image/jpeg');
69
+ }
70
+ if (item.types.includes('image/gif')) {
71
+ blob = await item.getType('image/gif');
72
+ }
73
+
74
+ if (!blob) {
75
+ return;
76
+ }
77
+
78
+ setUploadingImage(true);
79
+ const file = new File([blob], 'external.image');
80
+ mutationUpload.mutate(file, {
81
+ onSuccess: (data) => {
82
+ const room = data.fileName.split('/')[0];
83
+ const imageId = data.fileName.split('/')[1];
84
+
85
+ const { finishUploadCallback } = instance?.triggerAction(
86
+ 'imageTool'
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ ) as any;
89
+
90
+ finishUploadCallback?.(
91
+ `${process.env.NEXT_PUBLIC_API_ENDPOINT}/rooms/${room}/images/${imageId}`
92
+ );
93
+ },
94
+ onError: () => {
95
+ console.error('Error uploading image');
96
+ },
97
+ onSettled: () => {
98
+ setUploadingImage(false);
99
+ },
100
+ });
101
+ };
102
+
103
+ if (instance) {
104
+ instance.addEventListener('onPasteExternal', onPasteExternalImage);
105
+ }
106
+
107
+ return () => {
108
+ if (instance) {
109
+ instance.removeEventListener('onPasteExternal', onPasteExternalImage);
110
+ }
111
+ };
112
+ }, [instance, mutationUpload, setShowSelectFileImage, setUploadingImage]);
113
+
114
+ if (!showUI) {
115
+ return null;
116
+ }
117
+
118
+ return (
119
+ <motion.div
120
+ initial="hidden"
121
+ animate="visible"
122
+ exit="hidden"
123
+ variants={leftElementVariants}
124
+ className="pointer-events-none absolute top-[calc(50px+16px)] left-2 bottom-2 flex flex-col gap-2 justify-center items-center"
125
+ >
126
+ <Toolbar>
127
+ <ToolbarButton
128
+ icon={<Hand />}
129
+ active={actualAction === 'moveTool'}
130
+ onClick={() => triggerTool('moveTool')}
131
+ label={
132
+ <div className="flex gap-3 justify-start items-center">
133
+ <p>Move</p>
134
+ <ShortcutElement
135
+ variant="light"
136
+ shortcuts={{
137
+ [SYSTEM_OS.MAC]: 'M',
138
+ [SYSTEM_OS.OTHER]: 'M',
139
+ }}
140
+ />
141
+ </div>
142
+ }
143
+ />
144
+ <ToolbarButton
145
+ icon={<MousePointer />}
146
+ active={actualAction === 'selectionTool'}
147
+ onClick={() => triggerTool('selectionTool')}
148
+ label={
149
+ <div className="flex gap-3 justify-start items-center">
150
+ <p>Selection</p>
151
+ <ShortcutElement
152
+ variant="light"
153
+ shortcuts={{
154
+ [SYSTEM_OS.MAC]: 'S',
155
+ [SYSTEM_OS.OTHER]: 'S',
156
+ }}
157
+ />
158
+ </div>
159
+ }
160
+ />
161
+ <ToolbarButton
162
+ icon={<Square />}
163
+ active={actualAction === 'rectangleTool'}
164
+ onClick={() => triggerTool('rectangleTool')}
165
+ label={
166
+ <div className="flex gap-3 justify-start items-center">
167
+ <p>Add a rectangle</p>
168
+ <ShortcutElement
169
+ variant="light"
170
+ shortcuts={{
171
+ [SYSTEM_OS.MAC]: 'R',
172
+ [SYSTEM_OS.OTHER]: 'R',
173
+ }}
174
+ />
175
+ </div>
176
+ }
177
+ />
178
+ <ToolbarButton
179
+ icon={<PenTool />}
180
+ active={actualAction === 'penTool'}
181
+ onClick={() => triggerTool('penTool')}
182
+ label={
183
+ <div className="flex gap-3 justify-start items-center">
184
+ <p>Add a line</p>
185
+ <ShortcutElement
186
+ variant="light"
187
+ shortcuts={{
188
+ [SYSTEM_OS.MAC]: 'L',
189
+ [SYSTEM_OS.OTHER]: 'L',
190
+ }}
191
+ />
192
+ </div>
193
+ }
194
+ />
195
+ <ToolbarButton
196
+ icon={<Brush />}
197
+ active={actualAction === 'brushTool'}
198
+ onClick={() => triggerTool('brushTool')}
199
+ label={
200
+ <div className="flex gap-3 justify-start items-center">
201
+ <p>Free draw</p>
202
+ <ShortcutElement
203
+ variant="light"
204
+ shortcuts={{
205
+ [SYSTEM_OS.MAC]: 'B',
206
+ [SYSTEM_OS.OTHER]: 'B',
207
+ }}
208
+ />
209
+ </div>
210
+ }
211
+ />
212
+ <ToolbarButton
213
+ icon={<Type />}
214
+ active={actualAction === 'textTool'}
215
+ onClick={() => triggerTool('textTool')}
216
+ label={
217
+ <div className="flex gap-3 justify-start items-center">
218
+ <p>Add text</p>
219
+ <ShortcutElement
220
+ variant="light"
221
+ shortcuts={{
222
+ [SYSTEM_OS.MAC]: 'T',
223
+ [SYSTEM_OS.OTHER]: 't',
224
+ }}
225
+ />
226
+ </div>
227
+ }
228
+ />
229
+ <ToolbarButton
230
+ icon={<ImagePlus />}
231
+ active={actualAction === 'imageTool'}
232
+ onClick={() => {
233
+ triggerTool('imageTool');
234
+ setShowSelectFileImage(true);
235
+ }}
236
+ label={
237
+ <div className="flex gap-3 justify-start items-center">
238
+ <p>Add an image</p>
239
+ <ShortcutElement
240
+ variant="light"
241
+ shortcuts={{
242
+ [SYSTEM_OS.MAC]: 'I',
243
+ [SYSTEM_OS.OTHER]: 'I',
244
+ }}
245
+ />
246
+ </div>
247
+ }
248
+ />
249
+ <ToolbarButton
250
+ icon={<Frame />}
251
+ active={actualAction === 'frameTool'}
252
+ onClick={() => triggerTool('frameTool')}
253
+ label={
254
+ <div className="flex gap-3 justify-start items-center">
255
+ <p>Add a frame</p>
256
+ <ShortcutElement
257
+ variant="light"
258
+ shortcuts={{
259
+ [SYSTEM_OS.MAC]: 'F',
260
+ [SYSTEM_OS.OTHER]: 'F',
261
+ }}
262
+ />
263
+ </div>
264
+ }
265
+ />
266
+ <div className="w-full justify-center items-center flex">
267
+ <div className="w-[20px] h-[1px] bg-zinc-200 my-1"></div>
268
+ </div>
269
+ <ToolbarButton
270
+ icon={<Tags />}
271
+ active={actualAction === 'colorTokenTool'}
272
+ onClick={() => triggerTool('colorTokenTool')}
273
+ label={
274
+ <div className="flex gap-3 justify-start items-center">
275
+ <p>Add color token</p>
276
+ <ShortcutElement
277
+ variant="light"
278
+ shortcuts={{
279
+ [SYSTEM_OS.MAC]: 'P',
280
+ [SYSTEM_OS.OTHER]: 'P',
281
+ }}
282
+ />
283
+ </div>
284
+ }
285
+ />
286
+ </Toolbar>
287
+ </motion.div>
288
+ );
289
+ }
@@ -0,0 +1,58 @@
1
+ const topElementVariants = {
2
+ hidden: {
3
+ transform: "translateY(-20%)",
4
+ opacity: 0,
5
+ transition: { duration: 0.2, ease: [0.25, 0.1, 0.25, 1] },
6
+ },
7
+ visible: {
8
+ transform: "translateY(0)",
9
+ opacity: 1,
10
+ transition: { duration: 1, ease: [0.25, 0.1, 0.25, 1], delay: 0.5 },
11
+ },
12
+ };
13
+
14
+ const bottomElementVariants = {
15
+ hidden: {
16
+ transform: "translateY(20%)",
17
+ opacity: 0,
18
+ transition: { duration: 0.2, ease: [0.25, 0.1, 0.25, 1] },
19
+ },
20
+ visible: {
21
+ transform: "translateY(0)",
22
+ opacity: 1,
23
+ transition: { duration: 1, ease: [0.25, 0.1, 0.25, 1], delay: 0.5 },
24
+ },
25
+ };
26
+
27
+ const leftElementVariants = {
28
+ hidden: {
29
+ transform: "translateX(-20%)",
30
+ opacity: 0,
31
+ transition: { duration: 0.2, ease: [0.25, 0.1, 0.25, 1], delay: 0.5 },
32
+ },
33
+ visible: {
34
+ transform: "translateX(0)",
35
+ opacity: 1,
36
+ transition: { duration: 2, ease: [0.25, 0.1, 0.25, 1], delay: 0.5 },
37
+ },
38
+ };
39
+
40
+ const rightElementVariants = {
41
+ hidden: {
42
+ transform: "translateX(10%)",
43
+ opacity: 0,
44
+ transition: { duration: 0.2, ease: [0.25, 0.1, 0.25, 1] },
45
+ },
46
+ visible: {
47
+ transform: "translateX(0)",
48
+ opacity: 1,
49
+ transition: { duration: 0.2, ease: [0.25, 0.1, 0.25, 1] },
50
+ },
51
+ };
52
+
53
+ export {
54
+ topElementVariants,
55
+ bottomElementVariants,
56
+ leftElementVariants,
57
+ rightElementVariants,
58
+ };