@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.8 → 0.10.1-dev.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 (274) hide show
  1. package/README.ko.md +1186 -0
  2. package/README.md +1137 -57
  3. package/cli/README.md +239 -7
  4. package/cli/bin/create-muscat-plugin.mjs +1 -1
  5. package/cli/bin/muscat-pk.mjs +123 -27
  6. package/cli/bundle-templates.mjs +31 -0
  7. package/cli/docker/Dockerfile.cpp +28 -0
  8. package/cli/docker/Dockerfile.dev +17 -0
  9. package/cli/docker/Dockerfile.python +21 -0
  10. package/cli/prepack.mjs +10 -0
  11. package/cli/src/__pycache__/host_agent.cpython-37.pyc +0 -0
  12. package/cli/src/ai-rules.mjs +107 -0
  13. package/cli/src/build.mjs +333 -93
  14. package/cli/src/check-package.mjs +8 -23
  15. package/cli/src/completion.mjs +168 -0
  16. package/cli/src/cpp.mjs +78 -0
  17. package/cli/src/cppIde.mjs +76 -0
  18. package/cli/src/dev.mjs +195 -6
  19. package/cli/src/devBack.mjs +671 -60
  20. package/cli/src/devId.mjs +54 -0
  21. package/cli/src/devSession.mjs +67 -0
  22. package/cli/src/devUi.mjs +214 -25
  23. package/cli/src/esbuild.mjs +27 -10
  24. package/cli/src/host_agent.py +223 -0
  25. package/cli/src/manifest.mjs +288 -0
  26. package/cli/src/mcp.mjs +1153 -0
  27. package/cli/src/mcpProxy.mjs +110 -0
  28. package/cli/src/muscatLocal.mjs +292 -0
  29. package/cli/src/new.mjs +205 -68
  30. package/cli/src/pluginDevServer.mjs +111 -0
  31. package/cli/src/ports.mjs +193 -0
  32. package/cli/src/projectCheck.mjs +102 -0
  33. package/cli/src/python.mjs +112 -0
  34. package/cli/src/ros2.mjs +62 -18
  35. package/cli/src/sdk.mjs +74 -24
  36. package/cli/src/sim.mjs +177 -0
  37. package/cli/src/storybook.mjs +150 -0
  38. package/cli/src/templates-embedded.mjs +4 -0
  39. package/cli/src/type.mjs +93 -34
  40. package/cli/src/uninstall.mjs +81 -0
  41. package/cli/src/update.mjs +364 -35
  42. package/cli/src/util.mjs +341 -11
  43. package/cli/src/zenohDev.mjs +83 -0
  44. package/cli/src/zip.mjs +121 -0
  45. package/cli/storybook-dist/_design-tokens.css +4957 -0
  46. package/cli/storybook-dist/_stories-src/NxAvatar.stories.tsx +27 -0
  47. package/cli/storybook-dist/_stories-src/NxPagination.stories.tsx +28 -0
  48. package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordion.stories.tsx +46 -0
  49. package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordionGroup.stories.tsx +73 -0
  50. package/cli/storybook-dist/_stories-src/RBBadge/RBBadge.stories.tsx +93 -0
  51. package/cli/storybook-dist/_stories-src/RBBattery/RBBattery.stories.tsx +74 -0
  52. package/cli/storybook-dist/_stories-src/RBButton/RBCheckIconButton.stories.tsx +28 -0
  53. package/cli/storybook-dist/_stories-src/RBButton/RBCheckLabelButton.stories.tsx +84 -0
  54. package/cli/storybook-dist/_stories-src/RBButton/RBIconButton.stories.tsx +57 -0
  55. package/cli/storybook-dist/_stories-src/RBButton/RBInlineLabelButton.stories.tsx +41 -0
  56. package/cli/storybook-dist/_stories-src/RBButton/RBLabelButton.stories.tsx +60 -0
  57. package/cli/storybook-dist/_stories-src/RBDatePicker/RBDateInput.stories.tsx +44 -0
  58. package/cli/storybook-dist/_stories-src/RBDatePicker/RBRangeDateInput.stories.tsx +56 -0
  59. package/cli/storybook-dist/_stories-src/RBDialog/RBAlert.stories.tsx +51 -0
  60. package/cli/storybook-dist/_stories-src/RBDialog/RBConfirm.stories.tsx +55 -0
  61. package/cli/storybook-dist/_stories-src/RBDialog/RBPrompt.stories.tsx +52 -0
  62. package/cli/storybook-dist/_stories-src/RBDivider/RBDivider.stories.tsx +93 -0
  63. package/cli/storybook-dist/_stories-src/RBEmptyView/RBEmptyView.stories.tsx +49 -0
  64. package/cli/storybook-dist/_stories-src/RBIcons/RBColorIcons.stories.tsx +108 -0
  65. package/cli/storybook-dist/_stories-src/RBIcons/RBIcons.stories.tsx +106 -0
  66. package/cli/storybook-dist/_stories-src/RBInput/RBCheckBox.stories.tsx +89 -0
  67. package/cli/storybook-dist/_stories-src/RBInput/RBMultiRangeInput.stories.tsx +64 -0
  68. package/cli/storybook-dist/_stories-src/RBInput/RBRadioBox.stories.tsx +65 -0
  69. package/cli/storybook-dist/_stories-src/RBInput/RBRadioButton.stories.tsx +68 -0
  70. package/cli/storybook-dist/_stories-src/RBInput/RBSelectBox.stories.tsx +216 -0
  71. package/cli/storybook-dist/_stories-src/RBInput/RBSideNumberInput.stories.tsx +90 -0
  72. package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextArea.stories.tsx +45 -0
  73. package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextInput.stories.tsx +50 -0
  74. package/cli/storybook-dist/_stories-src/RBInput/RBTextField.stories.tsx +102 -0
  75. package/cli/storybook-dist/_stories-src/RBJoyStick/RBJoyStick.stories.tsx +31 -0
  76. package/cli/storybook-dist/_stories-src/RBLight/RBLight.stories.tsx +36 -0
  77. package/cli/storybook-dist/_stories-src/RBPagination/RBPagination.stories.tsx +49 -0
  78. package/cli/storybook-dist/_stories-src/RBShadcn/RBCard/RBCard.stories.tsx +89 -0
  79. package/cli/storybook-dist/_stories-src/RBShadcn/RBCommand/RBCommand.stories.tsx +116 -0
  80. package/cli/storybook-dist/_stories-src/RBShadcn/RBDialog/RBDialog.stories.tsx +74 -0
  81. package/cli/storybook-dist/_stories-src/RBShadcn/RBDrawer/RBDrawer.stories.tsx +99 -0
  82. package/cli/storybook-dist/_stories-src/RBShadcn/RBDropdownMenu/RBDropdownMenu.stories.tsx +123 -0
  83. package/cli/storybook-dist/_stories-src/RBShadcn/RBMenubar/RBMenubar.stories.tsx +135 -0
  84. package/cli/storybook-dist/_stories-src/RBShadcn/RBPopover/RBPopover.stories.tsx +69 -0
  85. package/cli/storybook-dist/_stories-src/RBShadcn/RBResizable/RBResizable.stories.tsx +49 -0
  86. package/cli/storybook-dist/_stories-src/RBShadcn/RBSheet/RBSheet.stories.tsx +91 -0
  87. package/cli/storybook-dist/_stories-src/RBShadcn/RBSlider/RBSlider.stories.tsx +38 -0
  88. package/cli/storybook-dist/_stories-src/RBShadcn/RBSwitch/RBSwitch.stories.tsx +112 -0
  89. package/cli/storybook-dist/_stories-src/RBShadcn/RBTabs/RBTabs.stories.tsx +75 -0
  90. package/cli/storybook-dist/_stories-src/RBShadcn/RBToggle/RBToggle.stories.tsx +51 -0
  91. package/cli/storybook-dist/_stories-src/RBShadcn/RBToggleGroup/RBToggleGroup.stories.tsx +84 -0
  92. package/cli/storybook-dist/_stories-src/RBTab/RBChipTab.stories.tsx +102 -0
  93. package/cli/storybook-dist/_stories-src/RBTab/RBChipsBoxTab.stories.tsx +78 -0
  94. package/cli/storybook-dist/_stories-src/RBTab/RBTab.stories.tsx +57 -0
  95. package/cli/storybook-dist/_stories-src/RBTable/RBTable.stories.tsx +177 -0
  96. package/cli/storybook-dist/_stories-src/RBTable/RBTableRow.stories.tsx +64 -0
  97. package/cli/storybook-dist/_stories-src/RBToast/RBToast.stories.tsx +117 -0
  98. package/cli/storybook-dist/_stories-src/RBTooltip/RBTooltip.stories.tsx +50 -0
  99. package/cli/storybook-dist/_stories-src/loading/RBSpinner.stories.tsx +30 -0
  100. package/cli/storybook-dist/_stories-src/nx-button/NxButton.stories.tsx +54 -0
  101. package/cli/storybook-dist/_stories-src/nx-button/NxPointerHoldButton.stories.tsx +57 -0
  102. package/cli/storybook-dist/_stories-src/nx-icons/NxIcons.stories.tsx +48 -0
  103. package/cli/storybook-dist/_stories-src/nx-inputs/NxNumberInput.stories.tsx +103 -0
  104. package/cli/storybook-dist/_stories-src/nx-inputs/NxRangeInput.stories.tsx +27 -0
  105. package/cli/storybook-dist/_stories-src/nx-inputs/NxSelectBox.stories.tsx +67 -0
  106. package/cli/storybook-dist/_stories-src/nx-inputs/NxSlideRange.stories.tsx +45 -0
  107. package/cli/storybook-dist/_stories-src/nx-inputs/NxSwitch.stories.tsx +27 -0
  108. package/cli/storybook-dist/_stories-src/nx-inputs/NxTextArea.stories.tsx +48 -0
  109. package/cli/storybook-dist/_stories-src/nx-inputs/NxTextInput.stories.tsx +46 -0
  110. package/cli/storybook-dist/assets/Color-YHDXOIA2-pCKrjUal.js +1 -0
  111. package/cli/storybook-dist/assets/Docs-B-Y7I1GA.js +7 -0
  112. package/cli/storybook-dist/assets/Docs-BFJcE_VS.js +8 -0
  113. package/cli/storybook-dist/assets/Docs-B_QaTtz8.js +8 -0
  114. package/cli/storybook-dist/assets/Docs-CryDGmfh.js +20 -0
  115. package/cli/storybook-dist/assets/Docs-Cw2AVNKx.js +7 -0
  116. package/cli/storybook-dist/assets/Docs-Q6r1fBeL.js +12 -0
  117. package/cli/storybook-dist/assets/DocsRenderer-CFRXHY34-_OmZBCn8.js +2 -0
  118. package/cli/storybook-dist/assets/NxAvatar.stories-Ctf5G2FQ.js +13 -0
  119. package/cli/storybook-dist/assets/NxButton.stories-DeLObVSj.js +20 -0
  120. package/cli/storybook-dist/assets/NxIcons.stories-DeqrVzVs.js +3 -0
  121. package/cli/storybook-dist/assets/NxNumberInput.stories-LqoY0ed1.js +26 -0
  122. package/cli/storybook-dist/assets/NxPagination.stories-DI6bXuJM.js +11 -0
  123. package/cli/storybook-dist/assets/NxPointerHoldButton.stories-3HSV1XmN.js +14 -0
  124. package/cli/storybook-dist/assets/NxRangeInput.stories-1pjgQVaG.js +17 -0
  125. package/cli/storybook-dist/assets/NxSelectBox.stories-bcQPZEuF.js +17 -0
  126. package/cli/storybook-dist/assets/NxSlideRange.stories-BosX4axk.js +14 -0
  127. package/cli/storybook-dist/assets/NxSwitch.stories-DxV6dS33.js +11 -0
  128. package/cli/storybook-dist/assets/NxTextArea.stories-CO545-LP.js +11 -0
  129. package/cli/storybook-dist/assets/NxTextInput.stories-BP0npai1.js +11 -0
  130. package/cli/storybook-dist/assets/PretendardVariable-CJuje-Rk.woff2 +0 -0
  131. package/cli/storybook-dist/assets/RBAccordion.stories-fVR4Va2a.js +17 -0
  132. package/cli/storybook-dist/assets/RBAccordionGroup.stories-Du5bsckD.js +33 -0
  133. package/cli/storybook-dist/assets/RBAlert.stories-DNkMXUu6.js +17 -0
  134. package/cli/storybook-dist/assets/RBBadge.stories-C44pXt8D.js +1 -0
  135. package/cli/storybook-dist/assets/RBBattery.stories-DE2JHvfL.js +10 -0
  136. package/cli/storybook-dist/assets/RBCard.stories-CuIda7NI.js +45 -0
  137. package/cli/storybook-dist/assets/RBCheckBox.stories-D1qM1ayr.js +1 -0
  138. package/cli/storybook-dist/assets/RBCheckIconButton.stories-e4gkliBO.js +1 -0
  139. package/cli/storybook-dist/assets/RBCheckLabelButton.stories-CDzCtsMI.js +24 -0
  140. package/cli/storybook-dist/assets/RBChipTab.stories-DBrc_3Mp.js +21 -0
  141. package/cli/storybook-dist/assets/RBChipsBoxTab.stories-hlrsHjKY.js +1 -0
  142. package/cli/storybook-dist/assets/RBColorIcons.stories-BHUvpkdu.js +3 -0
  143. package/cli/storybook-dist/assets/RBCommand.stories-azAF41NP.js +73 -0
  144. package/cli/storybook-dist/assets/RBConfirm.stories-BMNjwbmT.js +20 -0
  145. package/cli/storybook-dist/assets/RBDateInput.stories-D0VezDzv.js +15 -0
  146. package/cli/storybook-dist/assets/RBDialog.stories-AOJ975Fy.js +38 -0
  147. package/cli/storybook-dist/assets/RBDivider.stories-NSvnj43Z.js +1 -0
  148. package/cli/storybook-dist/assets/RBDrawer.stories-Du0oTvD1.js +14 -0
  149. package/cli/storybook-dist/assets/RBDropdownMenu.stories-Hsxve4PW.js +86 -0
  150. package/cli/storybook-dist/assets/RBEmptyView.stories-BlwHx3zp.js +12 -0
  151. package/cli/storybook-dist/assets/RBIconButton.stories-DAPDY63x.js +1 -0
  152. package/cli/storybook-dist/assets/RBIcons.stories-W5ZUV2L1.js +3 -0
  153. package/cli/storybook-dist/assets/RBInlineLabelButton.stories-C99j0Y3g.js +1 -0
  154. package/cli/storybook-dist/assets/RBJoyStick.stories-Du0H1iAS.js +11 -0
  155. package/cli/storybook-dist/assets/RBLabelButton.stories-BlvHaU_Z.js +1 -0
  156. package/cli/storybook-dist/assets/RBLight.stories-BY6DKrre.js +1 -0
  157. package/cli/storybook-dist/assets/RBMenubar.stories-D2PEGpM9.js +3 -0
  158. package/cli/storybook-dist/assets/RBMultiRangeInput.stories-Bm2qSmjq.js +14 -0
  159. package/cli/storybook-dist/assets/RBPagination.stories-DDleJa5N.js +17 -0
  160. package/cli/storybook-dist/assets/RBPopover.stories-27YxPSFG.js +11 -0
  161. package/cli/storybook-dist/assets/RBPrompt.stories-BFaIOctr.js +20 -0
  162. package/cli/storybook-dist/assets/RBRadioBox.stories-BroDar0t.js +1 -0
  163. package/cli/storybook-dist/assets/RBRadioButton.stories-M3O-wX7V.js +11 -0
  164. package/cli/storybook-dist/assets/RBRangeDateInput.stories-CWlM_D5X.js +15 -0
  165. package/cli/storybook-dist/assets/RBResizable.stories-ui8X1qnc.js +20 -0
  166. package/cli/storybook-dist/assets/RBSelectBox.stories-C8T6cfA0.js +74 -0
  167. package/cli/storybook-dist/assets/RBSheet.stories-BCOo_Zcc.js +39 -0
  168. package/cli/storybook-dist/assets/RBSideNumberInput.stories-CU2_MVlJ.js +5 -0
  169. package/cli/storybook-dist/assets/RBSlider.stories-DgOp1TFc.js +5 -0
  170. package/cli/storybook-dist/assets/RBSpinner.stories-qLScY3zZ.js +14 -0
  171. package/cli/storybook-dist/assets/RBSwitch.stories-SXSY1QMb.js +65 -0
  172. package/cli/storybook-dist/assets/RBTab.stories-BzXXTsXP.js +1 -0
  173. package/cli/storybook-dist/assets/RBTable.stories-DHTeRNVk.js +62 -0
  174. package/cli/storybook-dist/assets/RBTableRow.stories-DRNRsd15.js +11 -0
  175. package/cli/storybook-dist/assets/RBTabs.stories-DP0noBLp.js +21 -0
  176. package/cli/storybook-dist/assets/RBTextArea.stories-TkaejfxJ.js +5 -0
  177. package/cli/storybook-dist/assets/RBTextField.stories-B6VpCGyt.js +45 -0
  178. package/cli/storybook-dist/assets/RBTextInput.stories-D3hZ08e-.js +5 -0
  179. package/cli/storybook-dist/assets/RBToast.stories-BQ2wS2U0.js +11 -0
  180. package/cli/storybook-dist/assets/RBToggle.stories-GVOjGqo3.js +12 -0
  181. package/cli/storybook-dist/assets/RBToggleGroup.stories-pzx0btOD.js +17 -0
  182. package/cli/storybook-dist/assets/RBTooltip.stories-jufB6fa1.js +9 -0
  183. package/cli/storybook-dist/assets/SideNumberInput-BYlmNHEw.js +1109 -0
  184. package/cli/storybook-dist/assets/SideNumberInput-SAkhydsn.css +21 -0
  185. package/cli/storybook-dist/assets/browserUtils-CQM9Za7e.js +1 -0
  186. package/cli/storybook-dist/assets/chunk-XP5HYGXS-BHXC9YeQ.js +1 -0
  187. package/cli/storybook-dist/assets/client-DTf7SId2.js +1 -0
  188. package/cli/storybook-dist/assets/entry-preview-CAkU-e0D.js +2 -0
  189. package/cli/storybook-dist/assets/entry-preview-docs-b8bpVBXy.js +46 -0
  190. package/cli/storybook-dist/assets/iframe-B-BmTsxV.js +211 -0
  191. package/cli/storybook-dist/assets/index-B4FGfHer.js +1 -0
  192. package/cli/storybook-dist/assets/index-BRq5TIsn.js +24 -0
  193. package/cli/storybook-dist/assets/index-CT3U1fyk.js +1 -0
  194. package/cli/storybook-dist/assets/index-ChsGqxH_.js +9 -0
  195. package/cli/storybook-dist/assets/index-CkB0GfaI.js +575 -0
  196. package/cli/storybook-dist/assets/index-ClAc6FBW.js +240 -0
  197. package/cli/storybook-dist/assets/index-DKFBREX_.js +1 -0
  198. package/cli/storybook-dist/assets/index-DgH-xKnr.js +11 -0
  199. package/cli/storybook-dist/assets/index-Dmy2JGbm.js +1 -0
  200. package/cli/storybook-dist/assets/index-DrFu-skq.js +6 -0
  201. package/cli/storybook-dist/assets/jsx-runtime-BTJTZTIL.js +9 -0
  202. package/cli/storybook-dist/assets/preview-B8lJiyuQ.js +34 -0
  203. package/cli/storybook-dist/assets/preview-BBWR9nbA.js +1 -0
  204. package/cli/storybook-dist/assets/preview-BVJwlGUF.js +1 -0
  205. package/cli/storybook-dist/assets/preview-BWzBA1C2.js +396 -0
  206. package/cli/storybook-dist/assets/preview-CVgpLj3b.js +1 -0
  207. package/cli/storybook-dist/assets/preview-CvbIS5ZJ.js +1 -0
  208. package/cli/storybook-dist/assets/preview-CznQwwbo.js +3 -0
  209. package/cli/storybook-dist/assets/preview-DD_OYowb.js +1 -0
  210. package/cli/storybook-dist/assets/preview-DGUiP6tS.js +7 -0
  211. package/cli/storybook-dist/assets/preview-DHQbi4pV.js +1 -0
  212. package/cli/storybook-dist/assets/preview-M77JRg1A.js +2 -0
  213. package/cli/storybook-dist/assets/preview-kTZPgP6D.css +1 -0
  214. package/cli/storybook-dist/assets/react-18-hB3smqWJ.js +1 -0
  215. package/cli/storybook-dist/assets/react-resizable-panels-HsFbxPbn.css +1 -0
  216. package/cli/storybook-dist/assets/react-resizable-panels.browser-DuxpZLkF.js +120 -0
  217. package/cli/storybook-dist/assets/test-utils-BQudk2xt.js +9 -0
  218. package/cli/storybook-dist/favicon.svg +1 -0
  219. package/cli/storybook-dist/iframe.html +666 -0
  220. package/cli/storybook-dist/index.html +190 -0
  221. package/cli/storybook-dist/index.json +1 -0
  222. package/cli/storybook-dist/nunito-sans-bold-italic.woff2 +0 -0
  223. package/cli/storybook-dist/nunito-sans-bold.woff2 +0 -0
  224. package/cli/storybook-dist/nunito-sans-italic.woff2 +0 -0
  225. package/cli/storybook-dist/nunito-sans-regular.woff2 +0 -0
  226. package/cli/storybook-dist/project.json +1 -0
  227. package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js +331 -0
  228. package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js.LEGAL.txt +51 -0
  229. package/cli/storybook-dist/sb-addons/essentials-actions-3/manager-bundle.js +3 -0
  230. package/cli/storybook-dist/sb-addons/essentials-backgrounds-5/manager-bundle.js +12 -0
  231. package/cli/storybook-dist/sb-addons/essentials-controls-2/manager-bundle.js +405 -0
  232. package/cli/storybook-dist/sb-addons/essentials-docs-4/manager-bundle.js +245 -0
  233. package/cli/storybook-dist/sb-addons/essentials-measure-8/manager-bundle.js +3 -0
  234. package/cli/storybook-dist/sb-addons/essentials-outline-9/manager-bundle.js +3 -0
  235. package/cli/storybook-dist/sb-addons/essentials-toolbars-7/manager-bundle.js +3 -0
  236. package/cli/storybook-dist/sb-addons/essentials-viewport-6/manager-bundle.js +3 -0
  237. package/cli/storybook-dist/sb-addons/links-1/manager-bundle.js +3 -0
  238. package/cli/storybook-dist/sb-addons/storybook-13/manager-bundle.js +3 -0
  239. package/cli/storybook-dist/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +3 -0
  240. package/cli/storybook-dist/sb-addons/storybook-experimental-addon-test-12/manager-bundle.js +223 -0
  241. package/cli/storybook-dist/sb-addons/themes-11/manager-bundle.js +3 -0
  242. package/cli/storybook-dist/sb-common-assets/favicon.svg +1 -0
  243. package/cli/storybook-dist/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
  244. package/cli/storybook-dist/sb-common-assets/nunito-sans-bold.woff2 +0 -0
  245. package/cli/storybook-dist/sb-common-assets/nunito-sans-italic.woff2 +0 -0
  246. package/cli/storybook-dist/sb-common-assets/nunito-sans-regular.woff2 +0 -0
  247. package/cli/storybook-dist/sb-manager/globals-module-info.js +1052 -0
  248. package/cli/storybook-dist/sb-manager/globals-runtime.js +41775 -0
  249. package/cli/storybook-dist/sb-manager/globals.js +48 -0
  250. package/cli/storybook-dist/sb-manager/runtime.js +12048 -0
  251. package/cli/templates/common/README.md +1070 -83
  252. package/cli/templates/common/assets/icon.svg +44 -2
  253. package/cli/templates/common/manifest.json +14 -13
  254. package/cli/templates/common/package.json +11 -4
  255. package/cli/templates/common/py/main.py +125 -0
  256. package/cli/templates/common/requirements.txt +4 -3
  257. package/cli/templates/common/tsconfig.json +1 -1
  258. package/cli/templates/common/ui/content.tsx +216 -0
  259. package/cli/templates/common/ui/style.css +6 -0
  260. package/cli/templates/common/vite.config.ts +6 -25
  261. package/cli/templates/cpp/cpp/CMakeLists.txt +14 -0
  262. package/cli/templates/cpp/cpp/main.cpp +73 -0
  263. package/cli/templates/readme-cpp/README.md +1012 -0
  264. package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +12 -1
  265. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt +22 -0
  266. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml +11 -0
  267. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp +41 -0
  268. package/cli/vite.d.mts +25 -0
  269. package/cli/vite.mjs +292 -0
  270. package/package.json +34 -7
  271. package/cli/src/pack.mjs +0 -61
  272. package/cli/src/preview.mjs +0 -91
  273. package/cli/templates/common/main.py +0 -114
  274. package/cli/templates/common/src/content.tsx +0 -33
@@ -0,0 +1,64 @@
1
+ import type { Meta, StoryObj, StoryFn } from "@storybook/react";
2
+ import { RBMultiRangeInput } from "@repo/rb-components/new_components";
3
+
4
+ type StoryComponent = StoryObj<typeof RBMultiRangeInput>;
5
+ type StoryTemplate = StoryFn<typeof RBMultiRangeInput>;
6
+
7
+ // More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction
8
+ export default {
9
+ component: RBMultiRangeInput,
10
+ tags: ["autodocs"],
11
+ argTypes: {
12
+ min: {
13
+ control: { type: "number" },
14
+ defaultValue: 0,
15
+ },
16
+ max: {
17
+ control: { type: "number" },
18
+ defaultValue: 100,
19
+ },
20
+ step: {
21
+ control: { type: "number" },
22
+ defaultValue: 1,
23
+ },
24
+ thumbSize: {
25
+ control: { type: "number" },
26
+ defaultValue: 20,
27
+ },
28
+ sliderHeight: {
29
+ control: { type: "number" },
30
+ defaultValue: 4,
31
+ },
32
+ thumbBorderColor: {
33
+ control: { type: "color" },
34
+ },
35
+ thumbColor: {
36
+ control: { type: "color" },
37
+ },
38
+ trackColor: {
39
+ control: { type: "color" },
40
+ },
41
+ rangeColor: {
42
+ control: { type: "color" },
43
+ },
44
+ },
45
+ } as Meta<typeof RBMultiRangeInput>;
46
+
47
+ const Template: StoryTemplate = (args) => {
48
+ return <RBMultiRangeInput {...args} />;
49
+ };
50
+
51
+ export const Default: StoryComponent = {
52
+ parameters: {
53
+ docs: {
54
+ description: {
55
+ story: "",
56
+ },
57
+ },
58
+ },
59
+ args: {
60
+ min: 0,
61
+ max: 100,
62
+ },
63
+ render: Template,
64
+ };
@@ -0,0 +1,65 @@
1
+ import { useState } from "react";
2
+ import type { Meta, StoryFn, StoryObj } from "@storybook/react";
3
+
4
+ import { RBRadioBox } from "@repo/rb-components/new_components";
5
+ import type { RadioBoxProps } from "@repo/rb-components/new_components";
6
+
7
+ type StoryComponent = StoryObj<typeof RBRadioBox>;
8
+ type StoryTemplate = StoryFn<typeof RBRadioBox>;
9
+
10
+ const Template: StoryTemplate = (args) => {
11
+ const list = [1, 2, 3, 4];
12
+ const [value, setValue] = useState<RadioBoxProps["value"]>();
13
+
14
+ const handleChange = (nextValue: string | number, name?: string) => {
15
+ setValue(nextValue);
16
+ args.handleChange?.(nextValue, name);
17
+ };
18
+
19
+ return (
20
+ <div className="space-y-3">
21
+ <div className="flex flex-col gap-4">
22
+ {list.map((num) => (
23
+ <RBRadioBox
24
+ key={num}
25
+ {...args}
26
+ name={args.name ?? "rb-radio-demo"}
27
+ checkValue={num}
28
+ value={value}
29
+ handleChange={handleChange}
30
+ >
31
+ {`${args.children ?? "Radio Button Dummy Text"} ${num}`}
32
+ </RBRadioBox>
33
+ ))}
34
+ </div>
35
+ <div className="text-fg-default text-xs">DATA: {String(value ?? "")}</div>
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export default {
41
+ component: RBRadioBox,
42
+ tags: ["autodocs"],
43
+ argTypes: {
44
+ size: {
45
+ control: { type: "select" },
46
+ options: ["sm", "md"],
47
+ table: { type: { summary: '"sm" | "md"' } },
48
+ },
49
+ disabled: { control: { type: "boolean" } },
50
+ children: { control: { type: "text" } },
51
+ checkValue: { control: false },
52
+ value: { control: false },
53
+ handleChange: { control: false },
54
+ },
55
+ args: {
56
+ size: "sm",
57
+ disabled: false,
58
+ children: "Radio Button Dummy Text",
59
+ name: "rb-radio-demo",
60
+ checkValue: "option-1",
61
+ },
62
+ render: Template,
63
+ } as Meta<typeof RBRadioBox>;
64
+
65
+ export const Default: StoryComponent = {};
@@ -0,0 +1,68 @@
1
+ import { useState } from "react";
2
+ import type { Meta, StoryObj, StoryFn } from "@storybook/react";
3
+
4
+ import { RBRadioButton } from "@repo/rb-components/new_components";
5
+ import type { RadioButtonProps } from "@repo/rb-components/new_components";
6
+
7
+ type StoryComponent = StoryObj<typeof RBRadioButton>;
8
+ type StoryTemplate = StoryFn<typeof RBRadioButton>;
9
+
10
+ const Template: StoryTemplate = (args) => {
11
+ const list = [1, 2, 3, 4];
12
+ const [value, setValue] = useState<RadioButtonProps["value"]>();
13
+
14
+ return (
15
+ <div className="flex flex-col gap-3">
16
+ <div className="flex flex-col gap-2">
17
+ {list.map((num) => (
18
+ <RBRadioButton
19
+ key={num}
20
+ {...args}
21
+ name="rb-radio-button-demo"
22
+ checkValue={String(num)}
23
+ value={value}
24
+ handleChange={setValue}
25
+ >
26
+ {`버튼 라벨 ${num}`}
27
+ </RBRadioButton>
28
+ ))}
29
+ </div>
30
+ <div className="text-fg-default text-xs">DATA: {String(value ?? "")}</div>
31
+ </div>
32
+ );
33
+ };
34
+
35
+ export default {
36
+ component: RBRadioButton,
37
+ tags: ["autodocs"],
38
+ argTypes: {
39
+ size: {
40
+ control: { type: "select" },
41
+ options: ["sm", "md"],
42
+ table: { type: { summary: '"sm" | "md"' } },
43
+ },
44
+ disabled: { control: { type: "boolean" } },
45
+ children: { control: false },
46
+ name: { control: false },
47
+ checkValue: { control: false },
48
+ value: { control: false },
49
+ handleChange: { control: false },
50
+ },
51
+ args: {
52
+ size: "sm",
53
+ disabled: false,
54
+ },
55
+ render: Template,
56
+ } as Meta<typeof RBRadioButton>;
57
+
58
+ export const Default: StoryComponent = {
59
+ parameters: {
60
+ docs: {
61
+ description: {
62
+ story: "",
63
+ },
64
+ },
65
+ },
66
+ args: {},
67
+ render: Template,
68
+ };
@@ -0,0 +1,216 @@
1
+ import type { Meta, StoryFn, StoryObj } from "@storybook/react";
2
+ import { expect, userEvent, waitFor, within } from "@storybook/test";
3
+
4
+ import { RBSelectBox, Option } from "@repo/rb-components/new_components";
5
+ import { VStack } from "@repo/rb-components";
6
+
7
+ type StoryComponent = StoryObj<typeof RBSelectBox>;
8
+ type StoryTemplate = StoryFn<typeof RBSelectBox>;
9
+
10
+ const options = Array.from({ length: 40 }, (_, i) => ({
11
+ value: `option-${i + 1}`,
12
+ label: `옵션 ${i + 1}`,
13
+ }));
14
+
15
+ const Template: StoryTemplate = (args) => {
16
+ return (
17
+ <div className="min-h-80 overflow-visible">
18
+ <RBSelectBox {...args} className="w-96">
19
+ {/* <Option value="option-1">옵션 1</Option>
20
+ <Option value="option-2">옵션 2</Option>
21
+ <Option value="option-3">옵션 3</Option>
22
+ <Option value="option-4" disabled>
23
+ 옵션 4 (disabled)
24
+ </Option> */}
25
+ {options.map(({ value, label }) => (
26
+ <Option key={value} value={value}>
27
+ {label}
28
+ </Option>
29
+ ))}
30
+ </RBSelectBox>
31
+ </div>
32
+ );
33
+ };
34
+
35
+ const HasInfoListTemplate: StoryTemplate = (args) => {
36
+ return (
37
+ <div className="min-h-80 overflow-visible">
38
+ <RBSelectBox {...args} className="w-96">
39
+ <Option value="option-1" label="옵션 1" className="h-12">
40
+ <VStack>
41
+ 옵션 1
42
+ <span className="typo-compact-xs-normal">
43
+ Additional Information goes here
44
+ </span>
45
+ </VStack>
46
+ </Option>
47
+ <Option value="option-2" label="옵션 2" className="h-12">
48
+ <VStack>
49
+ 옵션 2
50
+ <span className="typo-compact-xs-normal">
51
+ Additional Information goes here
52
+ </span>
53
+ </VStack>
54
+ </Option>
55
+ <Option value="option-3" label="옵션 3" disabled className="h-12">
56
+ <VStack>
57
+ 옵션 3
58
+ <span className="typo-compact-xs-normal">
59
+ Additional Information goes here
60
+ </span>
61
+ </VStack>
62
+ </Option>
63
+ </RBSelectBox>
64
+ </div>
65
+ );
66
+ };
67
+
68
+ export default {
69
+ component: RBSelectBox,
70
+ tags: ["autodocs"],
71
+ parameters: {
72
+ layout: "padded",
73
+ },
74
+ argTypes: {
75
+ size: {
76
+ control: { type: "select" },
77
+ options: ["xs2", "sm", "md", "lg"],
78
+ },
79
+ maxDropBoxHeight: { control: { type: "number" } },
80
+ disabled: { control: { type: "boolean" } },
81
+ readOnly: { control: { type: "boolean" } },
82
+ search: { control: { type: "boolean" } },
83
+ keepDropDown: { control: { type: "boolean" } },
84
+ showCloseBtn: { control: { type: "boolean" } },
85
+ whenScrollCloseDropBox: { control: { type: "boolean" } },
86
+ enableModal: { control: { type: "boolean" } },
87
+ error: { control: { type: "boolean" } },
88
+ searchPlaceholder: { control: { type: "text" } },
89
+ mobileLabel: { control: { type: "text" } },
90
+ placeholder: { control: { type: "text" } },
91
+ selectArrow: { control: false, table: { disable: true } },
92
+ noDataMsg: { control: false, table: { disable: true } },
93
+ onClick: { action: false, control: false, table: { disable: true } },
94
+ onChange: { action: "onChange", control: false },
95
+ handleChange: { action: "handleChange", control: false },
96
+ },
97
+ args: {
98
+ size: "md",
99
+ maxDropBoxHeight: 200,
100
+ disabled: false,
101
+ readOnly: false,
102
+ placeholder: "placeholder",
103
+ search: false,
104
+ keepDropDown: false,
105
+ showCloseBtn: false,
106
+ whenScrollCloseDropBox: false,
107
+ enableModal: false,
108
+ error: false,
109
+ searchPlaceholder: "Search",
110
+ onClick: undefined,
111
+ },
112
+ render: Template,
113
+ } as Meta<typeof RBSelectBox>;
114
+
115
+ // RBSelectBox는 마운트 시점 기준 300ms 이내의 클릭을 더블클릭 방지 가드로 무시하므로
116
+ // play 함수의 첫 클릭 전에 가드 구간을 지나도록 대기
117
+ const waitPastClickGuard = () =>
118
+ new Promise((resolve) => setTimeout(resolve, 350));
119
+
120
+ export const Default: StoryComponent = {
121
+ play: async ({ canvasElement }) => {
122
+ const canvas = within(canvasElement);
123
+ const doc = canvasElement.ownerDocument;
124
+
125
+ await waitPastClickGuard();
126
+ await userEvent.click(canvas.getByText("placeholder"));
127
+
128
+ const dropBox = await waitFor(() => {
129
+ const el = doc.querySelector('[data-slot="select-drop-box"]');
130
+ if (!el) throw new Error("drop box not opened");
131
+ return el as HTMLElement;
132
+ });
133
+
134
+ const option = within(dropBox).getByText("옵션 3");
135
+ await userEvent.click(option);
136
+
137
+ await waitFor(() => {
138
+ expect(
139
+ canvasElement.querySelector('[data-slot="select-box-value"] span')
140
+ ?.textContent,
141
+ ).toBe("옵션 3");
142
+ expect(doc.querySelector('[data-slot="select-drop-box"]')).toBeNull();
143
+ });
144
+ },
145
+ };
146
+
147
+ export const HasInfoList: StoryComponent = {
148
+ args: {
149
+ value: "option-2",
150
+ },
151
+ render: HasInfoListTemplate,
152
+ play: async ({ canvasElement }) => {
153
+ const canvas = within(canvasElement);
154
+ const doc = canvasElement.ownerDocument;
155
+ // DropBox가 열려있을 때는 옵션 목록에도 같은 라벨 텍스트가 존재해
156
+ // canvas.getByText가 trigger와 옵션을 동시에 매칭해버리므로, trigger는
157
+ // select-box-value 슬롯을 직접 조회해 값이 바뀌었는지 확인한다
158
+ const getTriggerText = () =>
159
+ canvasElement.querySelector('[data-slot="select-box-value"] span')
160
+ ?.textContent;
161
+
162
+ await waitPastClickGuard();
163
+ await userEvent.click(canvas.getByText("옵션 2"));
164
+
165
+ const dropBox = await waitFor(() => {
166
+ const el = doc.querySelector('[data-slot="select-drop-box"]');
167
+ if (!el) throw new Error("drop box not opened");
168
+ return el as HTMLElement;
169
+ });
170
+
171
+ const optionEls = within(dropBox).getAllByRole("button");
172
+ const disabledOption = optionEls.find((el) =>
173
+ el.textContent?.startsWith("옵션 3"),
174
+ );
175
+ expect(disabledOption?.textContent).toContain(
176
+ "Additional Information goes here",
177
+ );
178
+
179
+ // disabled 옵션은 클릭해도 선택이 바뀌지 않고 DropBox도 닫히지 않음
180
+ await userEvent.click(disabledOption!);
181
+ expect(getTriggerText()).toBe("옵션 2");
182
+ expect(doc.querySelector('[data-slot="select-drop-box"]')).not.toBeNull();
183
+
184
+ const enabledOption = optionEls.find((el) =>
185
+ el.textContent?.startsWith("옵션 1"),
186
+ );
187
+ await userEvent.click(enabledOption!);
188
+
189
+ await waitFor(() => {
190
+ expect(getTriggerText()).toBe("옵션 1");
191
+ expect(doc.querySelector('[data-slot="select-drop-box"]')).toBeNull();
192
+ });
193
+ },
194
+ };
195
+
196
+ export const MaxDropBoxHeight: StoryComponent = {
197
+ args: {
198
+ maxDropBoxHeight: 120,
199
+ },
200
+ play: async ({ canvasElement }) => {
201
+ const canvas = within(canvasElement);
202
+
203
+ await waitPastClickGuard();
204
+ await userEvent.click(canvas.getByText("placeholder"));
205
+
206
+ const doc = canvasElement.ownerDocument;
207
+ await waitFor(() => {
208
+ const dropBox = doc.querySelector(
209
+ '[data-slot="select-drop-box"]',
210
+ ) as HTMLElement;
211
+
212
+ expect(dropBox).toBeTruthy();
213
+ expect(dropBox.getBoundingClientRect().height).toBeLessThanOrEqual(121);
214
+ });
215
+ },
216
+ };
@@ -0,0 +1,90 @@
1
+ import type { Meta, StoryFn, StoryObj } from "@storybook/react";
2
+ import {
3
+ RBSideNumberInput,
4
+ RBTextField,
5
+ } from "@repo/rb-components/new_components";
6
+
7
+ type StoryComponent = StoryObj<typeof RBSideNumberInput>;
8
+ type StoryTemplate = StoryFn<typeof RBSideNumberInput>;
9
+
10
+ const Template: StoryTemplate = (args) => <RBSideNumberInput {...args} />;
11
+
12
+ export default {
13
+ component: RBSideNumberInput,
14
+ tags: ["autodocs"],
15
+ argTypes: {
16
+ size: {
17
+ control: { type: "select" },
18
+ options: ["xs2", "sm", "md", "lg"],
19
+ table: { type: { summary: '"xs2" | "sm" | "md" | "lg"' } },
20
+ },
21
+ variant: {
22
+ control: { type: "select" },
23
+ options: ["default", "success"],
24
+ table: {
25
+ type: {
26
+ summary: '"default" | "success"',
27
+ },
28
+ },
29
+ },
30
+ step: {
31
+ control: { type: "number" },
32
+ },
33
+ increaseStep: {
34
+ control: { type: "number" },
35
+ },
36
+ decreaseStep: {
37
+ control: { type: "number" },
38
+ },
39
+ min: {
40
+ control: { type: "number" },
41
+ },
42
+ max: {
43
+ control: { type: "number" },
44
+ },
45
+ maxLength: {
46
+ control: { type: "number" },
47
+ },
48
+ digit: {
49
+ control: { type: "number" },
50
+ },
51
+ isDirect: {
52
+ control: { type: "boolean" },
53
+ },
54
+ detectDobleClick: {
55
+ control: { type: "boolean" },
56
+ },
57
+ type: {
58
+ control: { type: "select" },
59
+ options: ["number", "nx-number"],
60
+ },
61
+ disabled: { control: { type: "boolean" } },
62
+ inputDisabled: { control: { type: "boolean" } },
63
+ readOnly: { control: { type: "boolean" } },
64
+ },
65
+ args: {
66
+ size: "md",
67
+ variant: "default",
68
+ defaultValue: 0.5,
69
+ step: 0.1,
70
+ isDirect: true,
71
+ detectDobleClick: false,
72
+ },
73
+ render: Template,
74
+ } as Meta<typeof RBSideNumberInput>;
75
+
76
+ export const Default: StoryComponent = {};
77
+
78
+ export const WithTextField: StoryComponent = {
79
+ render: (args) => (
80
+ <RBTextField
81
+ label="Node Name"
82
+ description="노드 이름을 입력하세요."
83
+ required
84
+ helperText="중복되지 않는 이름을 사용하세요."
85
+ helperTone="default"
86
+ >
87
+ <RBSideNumberInput {...args} />
88
+ </RBTextField>
89
+ ),
90
+ };
@@ -0,0 +1,45 @@
1
+ import type { Meta, StoryFn, StoryObj } from "@storybook/react";
2
+ import { RBTextField, RBTextArea } from "@repo/rb-components/new_components";
3
+
4
+ type StoryComponent = StoryObj<typeof RBTextArea>;
5
+ type StoryTemplate = StoryFn<typeof RBTextArea>;
6
+
7
+ const Template: StoryTemplate = (args) => (
8
+ <div className="bg-alt-2 py-10">
9
+ <RBTextArea {...args} />
10
+ </div>
11
+ );
12
+
13
+ export default {
14
+ component: RBTextArea,
15
+ tags: ["autodocs"],
16
+ argTypes: {
17
+ variant: {
18
+ control: { type: "select" },
19
+ options: ["default", "success"],
20
+ table: { type: { summary: '"default" | "success"' } },
21
+ },
22
+ },
23
+ args: {
24
+ variant: "default",
25
+ disabled: false,
26
+ readOnly: false,
27
+ },
28
+ render: Template,
29
+ } as Meta<typeof RBTextArea>;
30
+
31
+ export const Default: StoryComponent = {};
32
+
33
+ export const WithTextField: StoryComponent = {
34
+ render: (args) => (
35
+ <RBTextField
36
+ label="Description"
37
+ description="상세 설명을 입력하세요."
38
+ required
39
+ helperText="최대 500자까지 입력할 수 있습니다."
40
+ helperTone="default"
41
+ >
42
+ <RBTextArea {...args} placeholder="내용을 입력해주세요." />
43
+ </RBTextField>
44
+ ),
45
+ };
@@ -0,0 +1,50 @@
1
+ import type { Meta, StoryFn, StoryObj } from "@storybook/react";
2
+ import { RBTextField, RBTextInput } from "@repo/rb-components/new_components";
3
+
4
+ type StoryComponent = StoryObj<typeof RBTextInput>;
5
+ type StoryTemplate = StoryFn<typeof RBTextInput>;
6
+
7
+ const Template: StoryTemplate = (args) => (
8
+ <div className="bg-alt-2 py-10">
9
+ <RBTextInput {...args} />
10
+ </div>
11
+ );
12
+
13
+ export default {
14
+ component: RBTextInput,
15
+ tags: ["autodocs"],
16
+ argTypes: {
17
+ size: {
18
+ control: { type: "select" },
19
+ options: ["xs2", "sm", "md", "lg"],
20
+ table: { type: { summary: '"xs2" | "sm" | "md" | "lg"' } },
21
+ },
22
+ variant: {
23
+ control: { type: "select" },
24
+ options: ["default", "success"],
25
+ table: { type: { summary: '"default" | "success"' } },
26
+ },
27
+ },
28
+ args: {
29
+ variant: "default",
30
+ disabled: false,
31
+ readOnly: false,
32
+ },
33
+ render: Template,
34
+ } as Meta<typeof RBTextInput>;
35
+
36
+ export const Default: StoryComponent = {};
37
+
38
+ export const WithTextField: StoryComponent = {
39
+ render: (args) => (
40
+ <RBTextField
41
+ label="Node Name"
42
+ description="노드 이름을 입력하세요."
43
+ required
44
+ helperText="중복되지 않는 이름을 사용하세요."
45
+ helperTone="default"
46
+ >
47
+ <RBTextInput {...args} placeholder="node_053" />
48
+ </RBTextField>
49
+ ),
50
+ };
@@ -0,0 +1,102 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+
3
+ import {
4
+ Option,
5
+ RBSelectBox,
6
+ RBSideNumberInput,
7
+ RBTextArea,
8
+ RBTextField,
9
+ RBTextInput,
10
+ } from "@repo/rb-components/new_components";
11
+
12
+ type StoryComponent = StoryObj<typeof RBTextField>;
13
+
14
+ export default {
15
+ component: RBTextField,
16
+ tags: ["autodocs"],
17
+ args: {
18
+ label: "Node Name",
19
+ description: "노드 이름을 입력하세요.",
20
+ required: false,
21
+ helperText: "중복되지 않는 이름을 사용하세요.",
22
+ helperTone: "default",
23
+ },
24
+ argTypes: {
25
+ helperTone: {
26
+ control: { type: "select" },
27
+ options: ["default", "error", "success"],
28
+ table: { type: { summary: '"default" | "error" | "success"' } },
29
+ },
30
+ },
31
+ decorators: [
32
+ (Story) => (
33
+ <div className="w-[360px]">
34
+ <Story />
35
+ </div>
36
+ ),
37
+ ],
38
+ } as Meta<typeof RBTextField>;
39
+
40
+ export const WithTextInput: StoryComponent = {
41
+ render: (args) => (
42
+ <RBTextField {...args}>
43
+ <RBTextInput placeholder="node_053" />
44
+ </RBTextField>
45
+ ),
46
+ };
47
+
48
+ export const WithTextArea: StoryComponent = {
49
+ args: {
50
+ label: "Description",
51
+ description: "상세 설명을 입력하세요.",
52
+ helperText: "최대 500자까지 입력할 수 있습니다.",
53
+ },
54
+ render: (args) => (
55
+ <RBTextField {...args}>
56
+ <RBTextArea placeholder="내용을 입력해주세요." />
57
+ </RBTextField>
58
+ ),
59
+ };
60
+
61
+ export const WithSideNumberInput: StoryComponent = {
62
+ args: {
63
+ label: "Threshold",
64
+ description: "숫자 값을 입력하세요.",
65
+ helperText: "증가/감소 버튼으로도 조절할 수 있습니다.",
66
+ },
67
+ render: (args) => (
68
+ <RBTextField {...args}>
69
+ <RBSideNumberInput value="0.5" step={0.1} isDirect />
70
+ </RBTextField>
71
+ ),
72
+ };
73
+
74
+ export const WithSelectBox: StoryComponent = {
75
+ args: {
76
+ label: "Category",
77
+ description: "옵션을 선택하세요.",
78
+ helperText: "필요한 분류를 선택해주세요.",
79
+ },
80
+ render: (args) => (
81
+ <RBTextField {...args}>
82
+ <RBSelectBox placeholder="카테고리 선택">
83
+ <Option value="sensor">Sensor</Option>
84
+ <Option value="network">Network</Option>
85
+ <Option value="power">Power</Option>
86
+ </RBSelectBox>
87
+ </RBTextField>
88
+ ),
89
+ };
90
+
91
+ export const Error: StoryComponent = {
92
+ args: {
93
+ helperText: "이미 사용 중인 이름입니다.",
94
+ helperTone: "error",
95
+ required: true,
96
+ },
97
+ render: (args) => (
98
+ <RBTextField {...args}>
99
+ <RBTextInput placeholder="node_053" />
100
+ </RBTextField>
101
+ ),
102
+ };