@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.5 → 0.1.2-dev.50
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.
- package/README.md +82 -49
- package/cli/README.md +191 -5
- package/cli/bin/create-muscat-plugin.mjs +1 -1
- package/cli/bin/muscat-pk.mjs +25 -10
- package/cli/bundle-templates.mjs +28 -0
- package/cli/docker/Dockerfile.bridge +17 -0
- package/cli/docker/Dockerfile.cpp +22 -0
- package/cli/docker/Dockerfile.dev +1 -2
- package/cli/docker/Dockerfile.python +20 -0
- package/cli/docker/bridge-package.json +8 -0
- package/cli/prepack.mjs +10 -0
- package/cli/src/bridge.mjs +90 -0
- package/cli/src/build.mjs +377 -85
- package/cli/src/check-package.mjs +8 -23
- package/cli/src/cpp.mjs +61 -0
- package/cli/src/dev.mjs +40 -4
- package/cli/src/devBack.mjs +274 -49
- package/cli/src/devUi.mjs +198 -19
- package/cli/src/esbuild.mjs +27 -10
- package/cli/src/manifest.mjs +208 -0
- package/cli/src/mcp.mjs +592 -0
- package/cli/src/new.mjs +143 -43
- package/cli/src/pluginDevServer.mjs +112 -0
- package/cli/src/ports.mjs +160 -0
- package/cli/src/python.mjs +109 -0
- package/cli/src/ros2.mjs +43 -18
- package/cli/src/sdk.mjs +11 -9
- package/cli/src/socketBridge.mjs +129 -0
- package/cli/src/storybook.mjs +168 -0
- package/cli/src/templates-embedded.mjs +3 -0
- package/cli/src/type.mjs +52 -29
- package/cli/src/uninstall.mjs +98 -0
- package/cli/src/update.mjs +259 -30
- package/cli/src/util.mjs +114 -7
- package/cli/storybook-dist/_design-tokens.css +4957 -0
- package/cli/storybook-dist/_stories-src/NxAvatar.stories.tsx +27 -0
- package/cli/storybook-dist/_stories-src/NxPagination.stories.tsx +28 -0
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordion.stories.tsx +46 -0
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordionGroup.stories.tsx +73 -0
- package/cli/storybook-dist/_stories-src/RBBadge/RBBadge.stories.tsx +93 -0
- package/cli/storybook-dist/_stories-src/RBBattery/RBBattery.stories.tsx +74 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckIconButton.stories.tsx +28 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckLabelButton.stories.tsx +84 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBIconButton.stories.tsx +57 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBInlineLabelButton.stories.tsx +41 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBLabelButton.stories.tsx +60 -0
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBDateInput.stories.tsx +44 -0
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBRangeDateInput.stories.tsx +44 -0
- package/cli/storybook-dist/_stories-src/RBDialog/RBAlert.stories.tsx +51 -0
- package/cli/storybook-dist/_stories-src/RBDialog/RBConfirm.stories.tsx +55 -0
- package/cli/storybook-dist/_stories-src/RBDialog/RBPrompt.stories.tsx +52 -0
- package/cli/storybook-dist/_stories-src/RBDivider/RBDivider.stories.tsx +93 -0
- package/cli/storybook-dist/_stories-src/RBEmptyView/RBEmptyView.stories.tsx +49 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBColorIcons.stories.tsx +108 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBIcons.stories.tsx +106 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBMenuTreeIcons.stories.tsx +108 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBProgramIcons.stories.tsx +116 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBCheckBox.stories.tsx +89 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBMultiRangeInput.stories.tsx +64 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioBox.stories.tsx +65 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioButton.stories.tsx +68 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBSelectBox.stories.tsx +119 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBSideNumberInput.stories.tsx +90 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextArea.stories.tsx +45 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextInput.stories.tsx +50 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBTextField.stories.tsx +102 -0
- package/cli/storybook-dist/_stories-src/RBJoyStick/RBJoyStick.stories.tsx +31 -0
- package/cli/storybook-dist/_stories-src/RBLight/RBLight.stories.tsx +36 -0
- package/cli/storybook-dist/_stories-src/RBPagination/RBPagination.stories.tsx +49 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCard/RBCard.stories.tsx +89 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCommand/RBCommand.stories.tsx +116 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDialog/RBDialog.stories.tsx +74 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDrawer/RBDrawer.stories.tsx +99 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDropdownMenu/RBDropdownMenu.stories.tsx +123 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBMenubar/RBMenubar.stories.tsx +135 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBPopover/RBPopover.stories.tsx +69 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBResizable/RBResizable.stories.tsx +49 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSheet/RBSheet.stories.tsx +91 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSlider/RBSlider.stories.tsx +38 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSwitch/RBSwitch.stories.tsx +112 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBTabs/RBTabs.stories.tsx +75 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggle/RBToggle.stories.tsx +51 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggleGroup/RBToggleGroup.stories.tsx +84 -0
- package/cli/storybook-dist/_stories-src/RBTab/RBChipTab.stories.tsx +102 -0
- package/cli/storybook-dist/_stories-src/RBTab/RBChipsBoxTab.stories.tsx +78 -0
- package/cli/storybook-dist/_stories-src/RBTab/RBTab.stories.tsx +57 -0
- package/cli/storybook-dist/_stories-src/RBTable/RBTable.stories.tsx +177 -0
- package/cli/storybook-dist/_stories-src/RBTable/RBTableRow.stories.tsx +64 -0
- package/cli/storybook-dist/_stories-src/RBToast/RBToast.stories.tsx +117 -0
- package/cli/storybook-dist/_stories-src/RBTooltip/RBTooltip.stories.tsx +50 -0
- package/cli/storybook-dist/_stories-src/loading/RBSpinner.stories.tsx +30 -0
- package/cli/storybook-dist/_stories-src/nx-button/NxButton.stories.tsx +54 -0
- package/cli/storybook-dist/_stories-src/nx-button/NxPointerHoldButton.stories.tsx +57 -0
- package/cli/storybook-dist/_stories-src/nx-icons/NxIcons.stories.tsx +48 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxNumberInput.stories.tsx +103 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxRangeInput.stories.tsx +27 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSelectBox.stories.tsx +67 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSlideRange.stories.tsx +45 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSwitch.stories.tsx +27 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextArea.stories.tsx +48 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextInput.stories.tsx +46 -0
- package/cli/storybook-dist/assets/Color-YHDXOIA2-BjuzF3Je.js +1 -0
- package/cli/storybook-dist/assets/Docs-BAFZYTMR.js +12 -0
- package/cli/storybook-dist/assets/Docs-BQesYW-Q.js +8 -0
- package/cli/storybook-dist/assets/Docs-BsMEe093.js +7 -0
- package/cli/storybook-dist/assets/Docs-By6k6vcM.js +20 -0
- package/cli/storybook-dist/assets/Docs-D1J63cJc.js +7 -0
- package/cli/storybook-dist/assets/Docs-GoNbntAU.js +8 -0
- package/cli/storybook-dist/assets/DocsRenderer-CFRXHY34-BwY_WiM7.js +2 -0
- package/cli/storybook-dist/assets/NxAvatar.stories-CvzBHfYa.js +13 -0
- package/cli/storybook-dist/assets/NxButton.stories-B83PesgN.js +20 -0
- package/cli/storybook-dist/assets/NxIcons.stories-Ca7qpAaO.js +3 -0
- package/cli/storybook-dist/assets/NxNumberInput.stories-DpNcCG6B.js +26 -0
- package/cli/storybook-dist/assets/NxPagination.stories-Xnvd3xhH.js +11 -0
- package/cli/storybook-dist/assets/NxPointerHoldButton.stories-C3YSIpM0.js +14 -0
- package/cli/storybook-dist/assets/NxRangeInput.stories-DIhaNZig.js +17 -0
- package/cli/storybook-dist/assets/NxSelectBox.stories-BGwO2mYJ.js +17 -0
- package/cli/storybook-dist/assets/NxSlideRange.stories-BXlt5Bgt.js +14 -0
- package/cli/storybook-dist/assets/NxSwitch.stories-C5ZqIRtw.js +11 -0
- package/cli/storybook-dist/assets/NxTextArea.stories-hm_ycALo.js +11 -0
- package/cli/storybook-dist/assets/NxTextInput.stories-DkZAySr_.js +11 -0
- package/cli/storybook-dist/assets/PretendardVariable-CJuje-Rk.woff2 +0 -0
- package/cli/storybook-dist/assets/RBAccordion.stories--bY36GZY.js +17 -0
- package/cli/storybook-dist/assets/RBAccordionGroup.stories-BVr1ccI4.js +33 -0
- package/cli/storybook-dist/assets/RBAlert.stories-CkjFBEkv.js +17 -0
- package/cli/storybook-dist/assets/RBBadge.stories-CNXILDPh.js +1 -0
- package/cli/storybook-dist/assets/RBBattery.stories-AokMv8ZY.js +10 -0
- package/cli/storybook-dist/assets/RBCard.stories-CX1sLKB2.js +45 -0
- package/cli/storybook-dist/assets/RBCheckBox.stories-By3QHBFm.js +1 -0
- package/cli/storybook-dist/assets/RBCheckIconButton.stories-Dud1uK3X.js +1 -0
- package/cli/storybook-dist/assets/RBCheckLabelButton.stories-C8iBkZxY.js +24 -0
- package/cli/storybook-dist/assets/RBChipTab.stories-DsgbiS2U.js +21 -0
- package/cli/storybook-dist/assets/RBChipsBoxTab.stories-C3DZGmq0.js +1 -0
- package/cli/storybook-dist/assets/RBColorIcons.stories-CusR20qk.js +3 -0
- package/cli/storybook-dist/assets/RBCommand.stories-DhJNgaLZ.js +73 -0
- package/cli/storybook-dist/assets/RBConfirm.stories-B6LKpCDa.js +20 -0
- package/cli/storybook-dist/assets/RBDateInput.stories-PEEhQ1wJ.js +15 -0
- package/cli/storybook-dist/assets/RBDialog.stories-CAtOdRen.js +38 -0
- package/cli/storybook-dist/assets/RBDivider.stories-0zpIUlXT.js +1 -0
- package/cli/storybook-dist/assets/RBDrawer.stories-CWMG4glY.js +14 -0
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-6fbEYZfk.js +86 -0
- package/cli/storybook-dist/assets/RBEmptyView.stories-BRDZHjn4.js +12 -0
- package/cli/storybook-dist/assets/RBIconButton.stories-sYrRLYob.js +1 -0
- package/cli/storybook-dist/assets/RBIcons.stories-DFe8O1_g.js +3 -0
- package/cli/storybook-dist/assets/RBInlineLabelButton.stories-DX4VdUfk.js +1 -0
- package/cli/storybook-dist/assets/RBJoyStick.stories-SA2Foelf.js +11 -0
- package/cli/storybook-dist/assets/RBLabelButton.stories-CicBns_Y.js +1 -0
- package/cli/storybook-dist/assets/RBLight.stories-WlP3oEmY.js +1 -0
- package/cli/storybook-dist/assets/RBMenuTreeIcons.stories-CrWjPfxj.js +3 -0
- package/cli/storybook-dist/assets/RBMenubar.stories-Di4phWw7.js +3 -0
- package/cli/storybook-dist/assets/RBMultiRangeInput.stories-DS3wrR3l.js +14 -0
- package/cli/storybook-dist/assets/RBPagination.stories-BDVPAUVD.js +17 -0
- package/cli/storybook-dist/assets/RBPopover.stories-DL9b_iX9.js +11 -0
- package/cli/storybook-dist/assets/RBProgramIcons.stories-ByRVx-on.js +3 -0
- package/cli/storybook-dist/assets/RBPrompt.stories-vTmKWyA5.js +20 -0
- package/cli/storybook-dist/assets/RBRadioBox.stories-C9WHt4jb.js +1 -0
- package/cli/storybook-dist/assets/RBRadioButton.stories-D8KYq63j.js +11 -0
- package/cli/storybook-dist/assets/RBRangeDateInput.stories-Bvcf4Su7.js +15 -0
- package/cli/storybook-dist/assets/RBResizable.stories-3O2OMuH_.js +20 -0
- package/cli/storybook-dist/assets/RBSelectBox.stories-CKZLmPzX.js +6 -0
- package/cli/storybook-dist/assets/RBSheet.stories-Dko0It1W.js +39 -0
- package/cli/storybook-dist/assets/RBSideNumberInput.stories-CUvqVtId.js +5 -0
- package/cli/storybook-dist/assets/RBSlider.stories-CcbaKRYo.js +5 -0
- package/cli/storybook-dist/assets/RBSpinner.stories-D15e_JlE.js +14 -0
- package/cli/storybook-dist/assets/RBSwitch.stories-C4JRsYJ6.js +65 -0
- package/cli/storybook-dist/assets/RBTab.stories-BPvzQSM-.js +1 -0
- package/cli/storybook-dist/assets/RBTable.stories-nr8OS1mV.js +62 -0
- package/cli/storybook-dist/assets/RBTableRow.stories-rI0rK8Ci.js +11 -0
- package/cli/storybook-dist/assets/RBTabs.stories-CxMtHGWA.js +21 -0
- package/cli/storybook-dist/assets/RBTextArea.stories-Bru4AhJ3.js +5 -0
- package/cli/storybook-dist/assets/RBTextField.stories-Ah3D9lto.js +45 -0
- package/cli/storybook-dist/assets/RBTextInput.stories-C3qAVngJ.js +5 -0
- package/cli/storybook-dist/assets/RBToast.stories-C1occsvf.js +11 -0
- package/cli/storybook-dist/assets/RBToggle.stories-BNrNERc7.js +12 -0
- package/cli/storybook-dist/assets/RBToggleGroup.stories-D_RRBwxY.js +17 -0
- package/cli/storybook-dist/assets/RBTooltip.stories-DuyOQqrB.js +9 -0
- package/cli/storybook-dist/assets/RainbowUiProvider-BYlbsa69.css +1 -0
- package/cli/storybook-dist/assets/RainbowUiProvider-B_piZBLb.js +31 -0
- package/cli/storybook-dist/assets/browserUtils-DeopUpDy.js +1 -0
- package/cli/storybook-dist/assets/chunk-XP5HYGXS-BHXC9YeQ.js +1 -0
- package/cli/storybook-dist/assets/client-DTf7SId2.js +1 -0
- package/cli/storybook-dist/assets/createConveyorBeltLayer-Cn41pFRH.js +6210 -0
- package/cli/storybook-dist/assets/createConveyorBeltLayer-Ds5AOper.css +21 -0
- package/cli/storybook-dist/assets/entry-preview-D-mLV0cS.js +2 -0
- package/cli/storybook-dist/assets/entry-preview-docs-b8bpVBXy.js +46 -0
- package/cli/storybook-dist/assets/iframe-DNru2eN7.js +211 -0
- package/cli/storybook-dist/assets/index-B4FGfHer.js +1 -0
- package/cli/storybook-dist/assets/index-BRq5TIsn.js +24 -0
- package/cli/storybook-dist/assets/index-C1OzuK6-.js +240 -0
- package/cli/storybook-dist/assets/index-CT3U1fyk.js +1 -0
- package/cli/storybook-dist/assets/index-ChsGqxH_.js +9 -0
- package/cli/storybook-dist/assets/index-Cwr2bQOB.js +575 -0
- package/cli/storybook-dist/assets/index-DKFBREX_.js +1 -0
- package/cli/storybook-dist/assets/index-DgH-xKnr.js +11 -0
- package/cli/storybook-dist/assets/index-Dmy2JGbm.js +1 -0
- package/cli/storybook-dist/assets/index-DrFu-skq.js +6 -0
- package/cli/storybook-dist/assets/jsx-runtime-BTJTZTIL.js +9 -0
- package/cli/storybook-dist/assets/keymapTileIndex.worker-BsNYNbqs.js +1 -0
- package/cli/storybook-dist/assets/preview-B8lJiyuQ.js +34 -0
- package/cli/storybook-dist/assets/preview-BBWR9nbA.js +1 -0
- package/cli/storybook-dist/assets/preview-BWzBA1C2.js +396 -0
- package/cli/storybook-dist/assets/preview-CILRoSnB.js +1 -0
- package/cli/storybook-dist/assets/preview-CVgpLj3b.js +1 -0
- package/cli/storybook-dist/assets/preview-CvbIS5ZJ.js +1 -0
- package/cli/storybook-dist/assets/preview-DD_OYowb.js +1 -0
- package/cli/storybook-dist/assets/preview-DGUiP6tS.js +7 -0
- package/cli/storybook-dist/assets/preview-DHQbi4pV.js +1 -0
- package/cli/storybook-dist/assets/preview-DUTcCPBe.css +1 -0
- package/cli/storybook-dist/assets/preview-QAsoD6Sa.js +2 -0
- package/cli/storybook-dist/assets/preview-rcRMbKPr.js +3 -0
- package/cli/storybook-dist/assets/react-18-hB3smqWJ.js +1 -0
- package/cli/storybook-dist/assets/react-resizable-panels.browser-CvAJUcrm.js +72 -0
- package/cli/storybook-dist/assets/test-utils-BQudk2xt.js +9 -0
- package/cli/storybook-dist/favicon.svg +1 -0
- package/cli/storybook-dist/iframe.html +666 -0
- package/cli/storybook-dist/index.html +190 -0
- package/cli/storybook-dist/index.json +1 -0
- package/cli/storybook-dist/nunito-sans-bold-italic.woff2 +0 -0
- package/cli/storybook-dist/nunito-sans-bold.woff2 +0 -0
- package/cli/storybook-dist/nunito-sans-italic.woff2 +0 -0
- package/cli/storybook-dist/nunito-sans-regular.woff2 +0 -0
- package/cli/storybook-dist/project.json +1 -0
- package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js +331 -0
- package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js.LEGAL.txt +51 -0
- package/cli/storybook-dist/sb-addons/essentials-actions-3/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-backgrounds-5/manager-bundle.js +12 -0
- package/cli/storybook-dist/sb-addons/essentials-controls-2/manager-bundle.js +405 -0
- package/cli/storybook-dist/sb-addons/essentials-docs-4/manager-bundle.js +245 -0
- package/cli/storybook-dist/sb-addons/essentials-measure-8/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-outline-9/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-toolbars-7/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-viewport-6/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/links-1/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/storybook-13/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/storybook-experimental-addon-test-12/manager-bundle.js +223 -0
- package/cli/storybook-dist/sb-addons/themes-11/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-common-assets/favicon.svg +1 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-bold.woff2 +0 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-italic.woff2 +0 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-regular.woff2 +0 -0
- package/cli/storybook-dist/sb-manager/globals-module-info.js +1052 -0
- package/cli/storybook-dist/sb-manager/globals-runtime.js +41775 -0
- package/cli/storybook-dist/sb-manager/globals.js +48 -0
- package/cli/storybook-dist/sb-manager/runtime.js +12048 -0
- package/cli/templates/common/.mcp.json +8 -0
- package/cli/templates/common/README.md +817 -9
- package/cli/templates/common/assets/icon.svg +44 -2
- package/cli/templates/common/manifest.json +13 -13
- package/cli/templates/common/package.json +9 -11
- package/cli/templates/common/py/main.py +98 -0
- package/cli/templates/common/requirements.txt +4 -3
- package/cli/templates/common/tsconfig.json +1 -1
- package/cli/templates/common/ui/content.tsx +216 -0
- package/cli/templates/common/ui/style.css +6 -0
- package/cli/templates/common/vite.config.ts +6 -25
- package/cli/templates/cpp/cpp/CMakeLists.txt +14 -0
- package/cli/templates/cpp/cpp/main.cpp +26 -0
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +5 -0
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt +17 -0
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml +11 -0
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp +22 -0
- package/cli/vite.d.mts +25 -0
- package/cli/vite.mjs +281 -0
- package/package.json +32 -5
- package/cli/src/pack.mjs +0 -61
- package/cli/templates/common/main.py +0 -21
- package/cli/templates/common/src/content.tsx +0 -32
package/cli/vite.mjs
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import react from "@vitejs/plugin-react";
|
|
2
|
+
import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js";
|
|
3
|
+
import postcss from "postcss";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
6
|
+
import { basename, extname, resolve } from "node:path";
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const HOST_PROVIDED_EXTERNALS = [
|
|
10
|
+
/^react(\/.*)?$/,
|
|
11
|
+
/^react-dom(\/.*)?$/,
|
|
12
|
+
/^@rainbow-robotics\/plugin-ui(\/.*)?$/,
|
|
13
|
+
/^@repo\/rb-components(\/.*)?$/,
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const UI_ENTRY_PREFIX = "muscat-ui-entry:";
|
|
17
|
+
const RESOLVED_UI_ENTRY_PREFIX = "\0" + UI_ENTRY_PREFIX;
|
|
18
|
+
const SHARED_RUNTIME_PREFIX = "muscat-shared-runtime:";
|
|
19
|
+
const RESOLVED_SHARED_RUNTIME_PREFIX = "\0" + SHARED_RUNTIME_PREFIX;
|
|
20
|
+
const STYLE_EXTENSIONS = [".css", ".scss", ".sass", ".less"];
|
|
21
|
+
// `@rainbow-robotics/plugin-ui/react` ships transpiled-only (see
|
|
22
|
+
// build-dist.mjs: `bundle: false, // consumers resolve deps themselves") — its
|
|
23
|
+
// `export * from "@repo/rb-components/new_components"` is a monorepo-private
|
|
24
|
+
// package no external plugin can npm-install. So a "dev" plugin can't use its
|
|
25
|
+
// own local copy of plugin-ui/react (or /sdk, whose RbContext must stay one
|
|
26
|
+
// singleton with host.tsx's Provider) — these, plus react/react-dom itself
|
|
27
|
+
// (so elements created by rb-components match the instance rendering them)
|
|
28
|
+
// and host-ui (the plain-function toast/alert/confirm/prompt channel), all
|
|
29
|
+
// redirect to the host's already-loaded instances instead.
|
|
30
|
+
const SHARED_RUNTIME_FILES = {
|
|
31
|
+
react: "react",
|
|
32
|
+
"react/jsx-runtime": "react_jsx-runtime",
|
|
33
|
+
"react/jsx-dev-runtime": "react_jsx-dev-runtime",
|
|
34
|
+
"react-dom": "react-dom",
|
|
35
|
+
"react-dom/client": "react-dom_client",
|
|
36
|
+
"@rainbow-robotics/plugin-ui/react": "plugin-ui_react",
|
|
37
|
+
"@rainbow-robotics/plugin-ui/sdk": "plugin-ui_sdk",
|
|
38
|
+
"@rainbow-robotics/plugin-ui/host-ui": "plugin-ui_host-ui",
|
|
39
|
+
"@rainbow-robotics/plugin-ui/ws": "plugin-ui_ws",
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function cssString(value) {
|
|
43
|
+
return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\a ");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function readPluginId(root) {
|
|
47
|
+
try {
|
|
48
|
+
const manifest = JSON.parse(readFileSync(resolve(root, "manifest.json"), "utf8"));
|
|
49
|
+
return typeof manifest.id === "string" && manifest.id ? manifest.id : null;
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function pluginScopeSelector(pluginId) {
|
|
56
|
+
if (!pluginId) return ":where([data-muscat-plugin-root])";
|
|
57
|
+
return `:where([data-muscat-plugin-id="${cssString(pluginId)}"])`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function discoverUiEntries(uiDir) {
|
|
61
|
+
return Object.fromEntries(
|
|
62
|
+
readdirSync(uiDir)
|
|
63
|
+
.filter((f) => /\.(tsx?|jsx?)$/.test(f))
|
|
64
|
+
.map((f) => [basename(f, extname(f)), resolve(uiDir, f)]),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function discoverUiStyles(uiDir, entryName) {
|
|
69
|
+
return STYLE_EXTENSIONS.flatMap((ext) => [
|
|
70
|
+
resolve(uiDir, `style${ext}`),
|
|
71
|
+
resolve(uiDir, `styles${ext}`),
|
|
72
|
+
resolve(uiDir, `${entryName}${ext}`),
|
|
73
|
+
]).filter((file, index, files) => existsSync(file) && files.indexOf(file) === index);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isKeyframesRule(rule) {
|
|
77
|
+
for (let node = rule.parent; node; node = node.parent) {
|
|
78
|
+
if (node.type === "atrule" && /keyframes$/i.test(node.name)) return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function scopeSelector(selector, rootSelector) {
|
|
84
|
+
const trimmed = selector.trim();
|
|
85
|
+
if (
|
|
86
|
+
!trimmed ||
|
|
87
|
+
trimmed.includes("[data-muscat-plugin-root]") ||
|
|
88
|
+
trimmed.includes("[data-muscat-plugin-id")
|
|
89
|
+
) {
|
|
90
|
+
return selector;
|
|
91
|
+
}
|
|
92
|
+
if (/^(:root|:host)\b/.test(trimmed)) {
|
|
93
|
+
return trimmed.replace(/^(:root|:host)\b/, rootSelector);
|
|
94
|
+
}
|
|
95
|
+
if (/^(html|body)\b/.test(trimmed)) {
|
|
96
|
+
return trimmed.replace(/^(html|body)\b/, rootSelector);
|
|
97
|
+
}
|
|
98
|
+
return `${rootSelector} ${trimmed}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function scopePluginCss(css, rootSelector) {
|
|
102
|
+
if (!css.trim()) return css;
|
|
103
|
+
const root = postcss.parse(css);
|
|
104
|
+
root.walkRules((rule) => {
|
|
105
|
+
if (isKeyframesRule(rule)) return;
|
|
106
|
+
rule.selectors = rule.selectors.map((selector) => scopeSelector(selector, rootSelector));
|
|
107
|
+
});
|
|
108
|
+
return root.toString();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function createUiEntryPlugin(uiDir, entries) {
|
|
112
|
+
return {
|
|
113
|
+
name: "muscat-ui-entry",
|
|
114
|
+
enforce: "pre",
|
|
115
|
+
resolveId(id) {
|
|
116
|
+
if (id.startsWith(UI_ENTRY_PREFIX)) return "\0" + id;
|
|
117
|
+
},
|
|
118
|
+
load(id) {
|
|
119
|
+
if (!id.startsWith(RESOLVED_UI_ENTRY_PREFIX)) return;
|
|
120
|
+
const entryName = id.slice(RESOLVED_UI_ENTRY_PREFIX.length);
|
|
121
|
+
const entry = entries[entryName];
|
|
122
|
+
if (!entry) throw new Error(`Unknown Muscat UI entry: ${entryName}`);
|
|
123
|
+
|
|
124
|
+
const styleImports = discoverUiStyles(uiDir, entryName)
|
|
125
|
+
.map((file) => {
|
|
126
|
+
this.addWatchFile(file);
|
|
127
|
+
return `import ${JSON.stringify(file)};`;
|
|
128
|
+
})
|
|
129
|
+
.join("\n");
|
|
130
|
+
|
|
131
|
+
return `${styleImports}\nexport { default } from ${JSON.stringify(entry)};\n`;
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function resolveFromPlugin(root, specifier) {
|
|
137
|
+
try {
|
|
138
|
+
return createRequire(resolve(root, "package.json")).resolve(specifier);
|
|
139
|
+
} catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function exactSpecifier(specifier) {
|
|
145
|
+
return new RegExp(`^${specifier.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function reactAliases(root) {
|
|
149
|
+
return [
|
|
150
|
+
"react",
|
|
151
|
+
"react/jsx-runtime",
|
|
152
|
+
"react/jsx-dev-runtime",
|
|
153
|
+
"react-dom",
|
|
154
|
+
"react-dom/client",
|
|
155
|
+
].flatMap((specifier) => {
|
|
156
|
+
const resolved = resolveFromPlugin(root, specifier);
|
|
157
|
+
return resolved ? [{ find: exactSpecifier(specifier), replacement: resolved }] : [];
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function createSharedRuntimePlugin(baseUrl) {
|
|
162
|
+
const base = baseUrl.replace(/\/$/, "");
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
name: "muscat-shared-runtime",
|
|
166
|
+
enforce: "pre",
|
|
167
|
+
resolveId(id) {
|
|
168
|
+
if (id in SHARED_RUNTIME_FILES) return "\0" + SHARED_RUNTIME_PREFIX + id;
|
|
169
|
+
},
|
|
170
|
+
load(id) {
|
|
171
|
+
if (!id.startsWith(RESOLVED_SHARED_RUNTIME_PREFIX)) return;
|
|
172
|
+
const specifier = id.slice(RESOLVED_SHARED_RUNTIME_PREFIX.length);
|
|
173
|
+
const file = SHARED_RUNTIME_FILES[specifier];
|
|
174
|
+
if (!file) throw new Error(`Unknown Muscat shared runtime module: ${specifier}`);
|
|
175
|
+
|
|
176
|
+
const url = JSON.stringify(`${base}/${file}.js`);
|
|
177
|
+
if (specifier === "react" || specifier === "react-dom") {
|
|
178
|
+
return `export * from ${url};\nimport sharedDefault from ${url};\nexport default sharedDefault;\n`;
|
|
179
|
+
}
|
|
180
|
+
return `export * from ${url};\n`;
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const REACT_REFRESH_ACCEPT_MARKER =
|
|
186
|
+
"\nif (import.meta.hot && !inWebWorker) {\n RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {";
|
|
187
|
+
|
|
188
|
+
function createManualHmrBoundaryPlugin(uiDir) {
|
|
189
|
+
const normalizedUiDir = uiDir.replace(/\/$/, "");
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
name: "muscat-manual-hmr-boundary",
|
|
193
|
+
apply: "serve",
|
|
194
|
+
enforce: "post",
|
|
195
|
+
transform(code, id) {
|
|
196
|
+
const [file] = id.split("?");
|
|
197
|
+
if (!file.startsWith(`${normalizedUiDir}/`) || !/\.[jt]sx?$/.test(file)) return null;
|
|
198
|
+
|
|
199
|
+
const markerIndex = code.lastIndexOf(REACT_REFRESH_ACCEPT_MARKER);
|
|
200
|
+
if (markerIndex === -1) return null;
|
|
201
|
+
|
|
202
|
+
// preview-host provides the same production ReactDOM as Nexus. Vite's
|
|
203
|
+
// React Fast Refresh receives updates but cannot drive that renderer, so
|
|
204
|
+
// let the bootstrap module handle HMR by re-rendering the updated entry.
|
|
205
|
+
return { code: code.slice(0, markerIndex), map: null };
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function muscat(options = {}) {
|
|
211
|
+
const pluginRoot = process.cwd();
|
|
212
|
+
const uiDir = resolve(pluginRoot, "ui");
|
|
213
|
+
const entries = discoverUiEntries(uiDir);
|
|
214
|
+
const rootSelector = pluginScopeSelector(readPluginId(pluginRoot));
|
|
215
|
+
const sharedRuntimeBase = process.env.MUSCAT_PLUGIN_SHARED_RUNTIME_BASE;
|
|
216
|
+
const wrappedEntries = Object.fromEntries(
|
|
217
|
+
Object.keys(entries).map((name) => [name, `${UI_ENTRY_PREFIX}${name}`]),
|
|
218
|
+
);
|
|
219
|
+
const reactPlugins = options.react === false ? [] : [react(options.react)];
|
|
220
|
+
|
|
221
|
+
return [
|
|
222
|
+
...reactPlugins,
|
|
223
|
+
createUiEntryPlugin(uiDir, entries),
|
|
224
|
+
...(sharedRuntimeBase ? [createSharedRuntimePlugin(sharedRuntimeBase)] : []),
|
|
225
|
+
...(sharedRuntimeBase ? [createManualHmrBoundaryPlugin(uiDir)] : []),
|
|
226
|
+
cssInjectedByJsPlugin({
|
|
227
|
+
relativeCSSInjection: true,
|
|
228
|
+
preRenderCSSCode: (css) => scopePluginCss(css, rootSelector),
|
|
229
|
+
}),
|
|
230
|
+
{
|
|
231
|
+
name: "muscat-plugin-build",
|
|
232
|
+
apply: "build",
|
|
233
|
+
config: () => ({
|
|
234
|
+
build: {
|
|
235
|
+
target: "esnext",
|
|
236
|
+
outDir: "dist",
|
|
237
|
+
emptyOutDir: false,
|
|
238
|
+
rollupOptions: {
|
|
239
|
+
input: wrappedEntries,
|
|
240
|
+
external: HOST_PROVIDED_EXTERNALS,
|
|
241
|
+
// Entries only `export default App` (the host mounts it). Without
|
|
242
|
+
// this, Vite treats entries as self-executing apps and tree-shakes
|
|
243
|
+
// the unused default export away.
|
|
244
|
+
preserveEntrySignatures: "strict",
|
|
245
|
+
output: {
|
|
246
|
+
format: "es",
|
|
247
|
+
entryFileNames: "[name].js",
|
|
248
|
+
chunkFileNames: "chunks/[name]-[hash].js",
|
|
249
|
+
assetFileNames: "assets/[name]-[hash][extname]",
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
}),
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
name: "muscat-plugin-dev",
|
|
257
|
+
apply: "serve",
|
|
258
|
+
config: () => {
|
|
259
|
+
return {
|
|
260
|
+
resolve: {
|
|
261
|
+
alias: sharedRuntimeBase ? [] : reactAliases(pluginRoot),
|
|
262
|
+
dedupe: ["react", "react-dom"],
|
|
263
|
+
},
|
|
264
|
+
optimizeDeps: sharedRuntimeBase
|
|
265
|
+
? { noDiscovery: true, include: [] }
|
|
266
|
+
: {
|
|
267
|
+
include: [
|
|
268
|
+
"react",
|
|
269
|
+
"react-dom",
|
|
270
|
+
"react-dom/client",
|
|
271
|
+
"@rainbow-robotics/plugin-ui/react",
|
|
272
|
+
"@rainbow-robotics/plugin-ui/sdk",
|
|
273
|
+
"@rainbow-robotics/plugin-ui/host-ui",
|
|
274
|
+
"@rainbow-robotics/plugin-ui/ws",
|
|
275
|
+
],
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
];
|
|
281
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rainbow-robotics/muscat-plugin-kit",
|
|
3
|
-
"version": "0.1.2-dev.
|
|
3
|
+
"version": "0.1.2-dev.50",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20"
|
|
@@ -13,6 +13,25 @@
|
|
|
13
13
|
"create-muscat-plugin": "./cli/bin/create-muscat-plugin.mjs",
|
|
14
14
|
"muscat-pk": "./cli/bin/muscat-pk.mjs"
|
|
15
15
|
},
|
|
16
|
+
"exports": {
|
|
17
|
+
"./vite": {
|
|
18
|
+
"types": "./cli/vite.d.mts",
|
|
19
|
+
"default": "./cli/vite.mjs"
|
|
20
|
+
},
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@vitejs/plugin-react": ">=4",
|
|
25
|
+
"vite": ">=5"
|
|
26
|
+
},
|
|
27
|
+
"peerDependenciesMeta": {
|
|
28
|
+
"@vitejs/plugin-react": {
|
|
29
|
+
"optional": true
|
|
30
|
+
},
|
|
31
|
+
"vite": {
|
|
32
|
+
"optional": true
|
|
33
|
+
}
|
|
34
|
+
},
|
|
16
35
|
"files": [
|
|
17
36
|
"cli",
|
|
18
37
|
"package.json"
|
|
@@ -20,7 +39,9 @@
|
|
|
20
39
|
"scripts": {
|
|
21
40
|
"lint": "node cli/src/check-package.mjs",
|
|
22
41
|
"check": "node cli/src/check-package.mjs",
|
|
23
|
-
"check-types": "node cli/src/check-package.mjs"
|
|
42
|
+
"check-types": "node cli/src/check-package.mjs",
|
|
43
|
+
"storybook:build": "node cli/prepack.mjs",
|
|
44
|
+
"prepack": "node cli/prepack.mjs"
|
|
24
45
|
},
|
|
25
46
|
"devDependencies": {
|
|
26
47
|
"@eslint/js": "^9.22.0",
|
|
@@ -31,10 +52,16 @@
|
|
|
31
52
|
"@types/react-dom": "^19.0.4"
|
|
32
53
|
},
|
|
33
54
|
"dependencies": {
|
|
34
|
-
"@
|
|
35
|
-
"
|
|
55
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
56
|
+
"@rainbow-robotics/plugin-ui": "0.1.2-dev.50",
|
|
57
|
+
"@rainbow-robotics/preview-host": "0.1.2-dev.50",
|
|
58
|
+
"postcss": "^8.5.8",
|
|
59
|
+
"socket.io": "^4.8.1",
|
|
60
|
+
"typescript": "^5.8.0",
|
|
61
|
+
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
62
|
+
"zod": "^3.25.0"
|
|
36
63
|
},
|
|
37
64
|
"optionalDependencies": {
|
|
38
65
|
"esbuild-wasm": "^0.25.0"
|
|
39
66
|
}
|
|
40
|
-
}
|
|
67
|
+
}
|
package/cli/src/pack.mjs
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// muscat-pk pack — build, then create a distributable ZIP with a size report.
|
|
2
|
-
import { execSync } from "node:child_process";
|
|
3
|
-
import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
|
|
4
|
-
import { basename, resolve } from "node:path";
|
|
5
|
-
import { buildPlugin, exportRos2Build, pinRequirements } from "./build.mjs";
|
|
6
|
-
import { findPluginRoot, humanSize, log } from "./util.mjs";
|
|
7
|
-
|
|
8
|
-
function dirSize(dir) {
|
|
9
|
-
let total = 0;
|
|
10
|
-
for (const entry of readdirSync(dir)) {
|
|
11
|
-
const full = resolve(dir, entry);
|
|
12
|
-
const st = statSync(full);
|
|
13
|
-
total += st.isDirectory() ? dirSize(full) : st.size;
|
|
14
|
-
}
|
|
15
|
-
return total;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export async function runPack() {
|
|
19
|
-
const pluginRoot = findPluginRoot();
|
|
20
|
-
log.step("pinning requirements.txt to latest PyPI versions");
|
|
21
|
-
await pinRequirements(pluginRoot);
|
|
22
|
-
await buildPlugin({ root: pluginRoot, minify: true });
|
|
23
|
-
await exportRos2Build(pluginRoot);
|
|
24
|
-
|
|
25
|
-
const manifest = JSON.parse(
|
|
26
|
-
readFileSync(resolve(pluginRoot, "manifest.json"), "utf8"),
|
|
27
|
-
);
|
|
28
|
-
const zipName = `${basename(pluginRoot)}-${manifest.version || "0.0.0"}.zip`;
|
|
29
|
-
const zipPath = resolve(pluginRoot, zipName);
|
|
30
|
-
rmSync(zipPath, { force: true });
|
|
31
|
-
|
|
32
|
-
// Contents: dist/ + back-end files if present.
|
|
33
|
-
const entries = ["dist"];
|
|
34
|
-
for (const f of ["main.py", "requirements.txt"]) {
|
|
35
|
-
if (existsSync(resolve(pluginRoot, f))) entries.push(f);
|
|
36
|
-
}
|
|
37
|
-
if (existsSync(resolve(pluginRoot, "ros2_ws/install"))) {
|
|
38
|
-
entries.push("ros2_ws/install");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
log.step(`packing ${entries.join(", ")} → ${zipName}`);
|
|
42
|
-
try {
|
|
43
|
-
execSync(`zip -r -q "${zipPath}" ${entries.map((e) => `"${e}"`).join(" ")}`, {
|
|
44
|
-
cwd: pluginRoot,
|
|
45
|
-
stdio: "inherit",
|
|
46
|
-
});
|
|
47
|
-
} catch {
|
|
48
|
-
throw new Error("`zip` not found. Install zip or pack manually.");
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const zipBytes = statSync(zipPath).size;
|
|
52
|
-
log.ok(`${zipName} ${humanSize(zipBytes)}`);
|
|
53
|
-
for (const e of entries) {
|
|
54
|
-
const full = resolve(pluginRoot, e);
|
|
55
|
-
const size = statSync(full).isDirectory() ? dirSize(full) : statSync(full).size;
|
|
56
|
-
log.info(` ├─ ${e} ${humanSize(size)}`);
|
|
57
|
-
}
|
|
58
|
-
log.warn(
|
|
59
|
-
"robot install checks free space via GET /plugin/capacity (507 if low).",
|
|
60
|
-
);
|
|
61
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
|
|
3
|
-
from rb_sdk import RBManipulateSDK # PyPI: rainbow-rb-sdk
|
|
4
|
-
|
|
5
|
-
sdk = RBManipulateSDK()
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
async def on_action(payload: dict):
|
|
9
|
-
# Matches manifest.actions[].topic — handle the "grip" action here.
|
|
10
|
-
width = payload.get("width")
|
|
11
|
-
print(f"[__PLUGIN_NAME__] grip width={width}")
|
|
12
|
-
# TODO: drive the robot via the SDK.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
async def main():
|
|
16
|
-
await sdk.subscribe("rby2/plugin/__PLUGIN_ID__/grip", on_action)
|
|
17
|
-
await sdk.spin()
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if __name__ == "__main__":
|
|
21
|
-
asyncio.run(main())
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import { connect } from "@rainbow-robotics/plugin-ui/connect";
|
|
3
|
-
import { Slider, Button, Text, Switch, useRb } from "@rainbow-robotics/plugin-ui/react";
|
|
4
|
-
|
|
5
|
-
function App() {
|
|
6
|
-
const rb = useRb();
|
|
7
|
-
const [width, setWidth] = useState(20);
|
|
8
|
-
const [open, setOpen] = useState(false);
|
|
9
|
-
|
|
10
|
-
return (
|
|
11
|
-
<>
|
|
12
|
-
<Text>__PLUGIN_NAME__ width: {width}</Text>
|
|
13
|
-
<Slider
|
|
14
|
-
value={width}
|
|
15
|
-
min={0}
|
|
16
|
-
max={100}
|
|
17
|
-
onChange={(event: { detail?: number }) => setWidth(event.detail ?? 0)}
|
|
18
|
-
/>
|
|
19
|
-
<Button label="Grip" onPress={() => rb.action("grip", { width })} />
|
|
20
|
-
<Switch
|
|
21
|
-
checked={open}
|
|
22
|
-
onChange={(event: { detail?: boolean }) => {
|
|
23
|
-
const next = event.detail ?? false;
|
|
24
|
-
setOpen(next);
|
|
25
|
-
rb.notify(next ? "opened" : "closed", "info");
|
|
26
|
-
}}
|
|
27
|
-
/>
|
|
28
|
-
</>
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
connect(App);
|