@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.44 → 0.1.2-dev.46
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 +1 -1
- package/cli/README.md +184 -0
- package/cli/bin/muscat-pk.mjs +13 -0
- package/cli/prepack.mjs +10 -0
- package/cli/src/build.mjs +2 -29
- package/cli/src/dev.mjs +10 -2
- package/cli/src/devBack.mjs +54 -11
- package/cli/src/devUi.mjs +100 -34
- package/cli/src/manifest.mjs +15 -0
- package/cli/src/mcp.mjs +534 -0
- package/cli/src/new.mjs +16 -1
- package/cli/src/pluginDevServer.mjs +113 -0
- package/cli/src/ports.mjs +160 -0
- package/cli/src/sdk.mjs +11 -9
- package/cli/src/storybook.mjs +168 -0
- package/cli/src/templates-embedded.mjs +1 -1
- package/cli/src/util.mjs +29 -0
- 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 +467 -53
- package/cli/templates/common/assets/icon.svg +44 -2
- package/cli/templates/common/package.json +4 -0
- package/cli/templates/common/ui/content.tsx +209 -26
- package/cli/templates/common/ui/style.css +6 -0
- package/cli/templates/common/vite.config.ts +6 -34
- package/cli/templates/cpp/cpp/main.cpp +1 -0
- package/cli/vite.d.mts +25 -0
- package/cli/vite.mjs +271 -0
- package/package.json +31 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Meta, StoryObj, StoryFn } from "@storybook/react";
|
|
2
|
+
import { RBRangeDateInput } from "@repo/rb-components/new_components";
|
|
3
|
+
|
|
4
|
+
type StoryComponent = StoryObj<typeof RBRangeDateInput>;
|
|
5
|
+
type StoryTemplate = StoryFn<typeof RBRangeDateInput>;
|
|
6
|
+
|
|
7
|
+
// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction
|
|
8
|
+
export default {
|
|
9
|
+
component: RBRangeDateInput,
|
|
10
|
+
tags: ["autodocs"],
|
|
11
|
+
argTypes: {
|
|
12
|
+
size: {
|
|
13
|
+
control: { type: "select" },
|
|
14
|
+
options: ["xs2", "sm", "md", "lg"],
|
|
15
|
+
table: { type: { summary: '"xs2" | "sm" | "md" | "lg"' } },
|
|
16
|
+
},
|
|
17
|
+
showPresets: { control: "boolean" },
|
|
18
|
+
showFooter: { control: "boolean" },
|
|
19
|
+
},
|
|
20
|
+
} as Meta<typeof RBRangeDateInput>;
|
|
21
|
+
|
|
22
|
+
const Template: StoryTemplate = (args) => {
|
|
23
|
+
return (
|
|
24
|
+
<div style={{ height: 700 }}>
|
|
25
|
+
<RBRangeDateInput {...args} />
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const Default: StoryComponent = {
|
|
31
|
+
parameters: {
|
|
32
|
+
docs: {
|
|
33
|
+
description: {
|
|
34
|
+
story: "",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
args: {
|
|
39
|
+
size: "md",
|
|
40
|
+
showPresets: true,
|
|
41
|
+
showFooter: true,
|
|
42
|
+
},
|
|
43
|
+
render: Template,
|
|
44
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import type { Meta, StoryObj, StoryFn } from "@storybook/react";
|
|
3
|
+
import { RBAlert, RBLabelButton } from "@repo/rb-components/new_components";
|
|
4
|
+
|
|
5
|
+
type StoryComponent = StoryObj<typeof RBAlert>;
|
|
6
|
+
type StoryTemplate = StoryFn<typeof RBAlert>;
|
|
7
|
+
|
|
8
|
+
// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction
|
|
9
|
+
export default {
|
|
10
|
+
component: RBAlert,
|
|
11
|
+
tags: ["autodocs"],
|
|
12
|
+
} as Meta<typeof RBAlert>;
|
|
13
|
+
|
|
14
|
+
const Template: StoryTemplate = (args) => {
|
|
15
|
+
const [open, setOpen] = useState(true);
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div>
|
|
19
|
+
<RBLabelButton size="sm" variant="solid" onClick={() => setOpen(true)}>
|
|
20
|
+
Open Alert
|
|
21
|
+
</RBLabelButton>
|
|
22
|
+
<RBAlert
|
|
23
|
+
{...args}
|
|
24
|
+
open={open}
|
|
25
|
+
onOpenChange={setOpen}
|
|
26
|
+
resolve={() => setOpen(false)}
|
|
27
|
+
onConfirm={() => setOpen(false)}
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const Default: StoryComponent = {
|
|
34
|
+
parameters: {
|
|
35
|
+
docs: {
|
|
36
|
+
description: {
|
|
37
|
+
story: "",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
args: {
|
|
42
|
+
title: "Alert Modal",
|
|
43
|
+
content: (
|
|
44
|
+
<div className="text-fg-default px-4 py-2 text-sm">
|
|
45
|
+
Alert Modal Body Text
|
|
46
|
+
</div>
|
|
47
|
+
),
|
|
48
|
+
buttonText: "Confirm",
|
|
49
|
+
},
|
|
50
|
+
render: Template,
|
|
51
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import type { Meta, StoryObj, StoryFn } from "@storybook/react";
|
|
3
|
+
import { RBConfirm, RBLabelButton } from "@repo/rb-components/new_components";
|
|
4
|
+
|
|
5
|
+
type StoryComponent = StoryObj<typeof RBConfirm>;
|
|
6
|
+
type StoryTemplate = StoryFn<typeof RBConfirm>;
|
|
7
|
+
|
|
8
|
+
// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction
|
|
9
|
+
export default {
|
|
10
|
+
component: RBConfirm,
|
|
11
|
+
tags: ["autodocs"],
|
|
12
|
+
} as Meta<typeof RBConfirm>;
|
|
13
|
+
|
|
14
|
+
const Template: StoryTemplate = (args) => {
|
|
15
|
+
const [open, setOpen] = useState(true);
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div>
|
|
19
|
+
<RBLabelButton size="sm" variant="solid" onClick={() => setOpen(true)}>
|
|
20
|
+
Open Confirm
|
|
21
|
+
</RBLabelButton>
|
|
22
|
+
<RBConfirm
|
|
23
|
+
{...args}
|
|
24
|
+
open={open}
|
|
25
|
+
onOpenChange={setOpen}
|
|
26
|
+
resolve={() => setOpen(false)}
|
|
27
|
+
onConfirm={() => setOpen(false)}
|
|
28
|
+
onCancel={() => setOpen(false)}
|
|
29
|
+
/>
|
|
30
|
+
</div>
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const Default: StoryComponent = {
|
|
35
|
+
parameters: {
|
|
36
|
+
docs: {
|
|
37
|
+
description: {
|
|
38
|
+
story: "",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
args: {
|
|
43
|
+
title: "Confirm Modal",
|
|
44
|
+
content: (
|
|
45
|
+
<div className="text-fg-default px-4 py-2 text-sm">
|
|
46
|
+
Confirm Modal Body Text
|
|
47
|
+
</div>
|
|
48
|
+
),
|
|
49
|
+
buttonText: {
|
|
50
|
+
yes: "Confirm",
|
|
51
|
+
no: "Cancel",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
render: Template,
|
|
55
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import type { Meta, StoryObj, StoryFn } from "@storybook/react";
|
|
3
|
+
import { RBLabelButton, RBPrompt } from "@repo/rb-components/new_components";
|
|
4
|
+
|
|
5
|
+
type StoryComponent = StoryObj<typeof RBPrompt>;
|
|
6
|
+
type StoryTemplate = StoryFn<typeof RBPrompt>;
|
|
7
|
+
|
|
8
|
+
// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction
|
|
9
|
+
export default {
|
|
10
|
+
component: RBPrompt,
|
|
11
|
+
tags: ["autodocs"],
|
|
12
|
+
} as Meta<typeof RBPrompt>;
|
|
13
|
+
|
|
14
|
+
const Template: StoryTemplate = (args) => {
|
|
15
|
+
const [open, setOpen] = useState(true);
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div>
|
|
19
|
+
<RBLabelButton size="sm" variant="solid" onClick={() => setOpen(true)}>
|
|
20
|
+
Open Prompt
|
|
21
|
+
</RBLabelButton>
|
|
22
|
+
<RBPrompt
|
|
23
|
+
{...args}
|
|
24
|
+
open={open}
|
|
25
|
+
onOpenChange={setOpen}
|
|
26
|
+
resolve={() => setOpen(false)}
|
|
27
|
+
close={() => setOpen(false)}
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const Default: StoryComponent = {
|
|
34
|
+
parameters: {
|
|
35
|
+
docs: {
|
|
36
|
+
description: {
|
|
37
|
+
story: "",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
args: {
|
|
42
|
+
title: "Prompt Modal",
|
|
43
|
+
content: "",
|
|
44
|
+
placeholder: "Placeholder",
|
|
45
|
+
value: "",
|
|
46
|
+
buttonText: {
|
|
47
|
+
yes: "Confirm",
|
|
48
|
+
no: "Cancel",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
render: Template,
|
|
52
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Meta, StoryFn, StoryObj } from "@storybook/react";
|
|
2
|
+
import { RBDivider } from "@repo/rb-components/new_components";
|
|
3
|
+
|
|
4
|
+
type StoryComponent = StoryObj<typeof RBDivider>;
|
|
5
|
+
type StoryTemplate = StoryFn<typeof RBDivider>;
|
|
6
|
+
|
|
7
|
+
const Template: StoryTemplate = (args) => {
|
|
8
|
+
if (args.type === "vertical") {
|
|
9
|
+
return (
|
|
10
|
+
<div className="roundedp-4 flex h-24 items-center gap-3">
|
|
11
|
+
<span className="text-fg-default text-sm">Left</span>
|
|
12
|
+
<RBDivider {...args} />
|
|
13
|
+
<span className="text-fg-default text-sm">Right</span>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div className="w-96 max-w-full rounded p-4">
|
|
20
|
+
<p className="text-fg-default m-0 text-lg">Top</p>
|
|
21
|
+
<RBDivider {...args}>{args.children}</RBDivider>
|
|
22
|
+
<p className="text-fg-default m-0 text-lg">Bottom</p>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default {
|
|
28
|
+
component: RBDivider,
|
|
29
|
+
tags: ["autodocs"],
|
|
30
|
+
render: Template,
|
|
31
|
+
argTypes: {
|
|
32
|
+
type: {
|
|
33
|
+
control: { type: "select" },
|
|
34
|
+
options: ["horizontal", "vertical"],
|
|
35
|
+
table: { type: { summary: '"horizontal" | "vertical"' } },
|
|
36
|
+
},
|
|
37
|
+
variant: {
|
|
38
|
+
control: { type: "select" },
|
|
39
|
+
options: ["solid", "dashed", "dotted", "soft"],
|
|
40
|
+
table: { type: { summary: '"solid" | "dashed" | "dotted" | "soft"' } },
|
|
41
|
+
},
|
|
42
|
+
thickness: {
|
|
43
|
+
control: { type: "select" },
|
|
44
|
+
options: ["thin", "thick"],
|
|
45
|
+
table: { type: { summary: '"thin" | "thick"' } },
|
|
46
|
+
},
|
|
47
|
+
children: {
|
|
48
|
+
control: { type: "text" },
|
|
49
|
+
table: { type: { summary: "ReactNode" } },
|
|
50
|
+
},
|
|
51
|
+
size: {
|
|
52
|
+
control: { type: "number" },
|
|
53
|
+
table: { type: { summary: "number" } },
|
|
54
|
+
},
|
|
55
|
+
color: {
|
|
56
|
+
control: { type: "color" },
|
|
57
|
+
table: { type: { summary: "string" } },
|
|
58
|
+
},
|
|
59
|
+
spaceSize: {
|
|
60
|
+
control: { type: "number" },
|
|
61
|
+
table: { type: { summary: "number" } },
|
|
62
|
+
},
|
|
63
|
+
spaceDirection: {
|
|
64
|
+
control: { type: "select" },
|
|
65
|
+
options: ["top", "bottom", "left", "right", "both"],
|
|
66
|
+
table: {
|
|
67
|
+
type: { summary: '"top" | "bottom" | "left" | "right" | "both"' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
contentAlign: {
|
|
71
|
+
control: { type: "select" },
|
|
72
|
+
options: ["left", "center", "right"],
|
|
73
|
+
table: { type: { summary: '"left" | "center" | "right"' } },
|
|
74
|
+
},
|
|
75
|
+
contentSpace: {
|
|
76
|
+
control: { type: "number" },
|
|
77
|
+
table: { type: { summary: "number" } },
|
|
78
|
+
},
|
|
79
|
+
contentPosition: {
|
|
80
|
+
control: { type: "number" },
|
|
81
|
+
table: { type: { summary: "number" } },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
args: {
|
|
85
|
+
type: "horizontal",
|
|
86
|
+
variant: "solid",
|
|
87
|
+
thickness: "thin",
|
|
88
|
+
spaceDirection: "both",
|
|
89
|
+
children: undefined,
|
|
90
|
+
},
|
|
91
|
+
} as Meta<typeof RBDivider>;
|
|
92
|
+
|
|
93
|
+
export const Default: StoryComponent = {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Meta, StoryFn, StoryObj } from "@storybook/react";
|
|
2
|
+
import { RBEmptyView } from "@repo/rb-components/new_components";
|
|
3
|
+
import { SvgSearchBold } from "@repo/rb-components/new_components/assets/icons";
|
|
4
|
+
|
|
5
|
+
type StoryComponent = StoryObj<typeof RBEmptyView>;
|
|
6
|
+
type StoryTemplate = StoryFn<typeof RBEmptyView>;
|
|
7
|
+
|
|
8
|
+
const Template: StoryTemplate = (args) => <RBEmptyView {...args} />;
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
component: RBEmptyView,
|
|
12
|
+
tags: ["autodocs"],
|
|
13
|
+
render: Template,
|
|
14
|
+
argTypes: {
|
|
15
|
+
type: {
|
|
16
|
+
control: { type: "select" },
|
|
17
|
+
options: ["button", "icon"],
|
|
18
|
+
table: { type: { summary: '"button" | "icon"' } },
|
|
19
|
+
},
|
|
20
|
+
message: {
|
|
21
|
+
control: { type: "text" },
|
|
22
|
+
},
|
|
23
|
+
buttonLabel: {
|
|
24
|
+
control: { type: "text" },
|
|
25
|
+
},
|
|
26
|
+
onButtonClick: { control: false },
|
|
27
|
+
icon: { control: false },
|
|
28
|
+
},
|
|
29
|
+
args: {
|
|
30
|
+
type: "button",
|
|
31
|
+
message: "엠프티뷰의 안내 메세지를 입력해주세요.",
|
|
32
|
+
buttonLabel: "버튼 라벨",
|
|
33
|
+
},
|
|
34
|
+
} as Meta<typeof RBEmptyView>;
|
|
35
|
+
|
|
36
|
+
export const Button: StoryComponent = {
|
|
37
|
+
args: {
|
|
38
|
+
type: "button",
|
|
39
|
+
message: "엠프티뷰의 안내 메세지를 입력해주세요.",
|
|
40
|
+
buttonLabel: "버튼 라벨",
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const Icon: StoryComponent = {
|
|
45
|
+
args: {
|
|
46
|
+
type: "icon",
|
|
47
|
+
icon: <SvgSearchBold />,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
|
|
5
|
+
import { RBTextInput } from "@repo/rb-components/new_components";
|
|
6
|
+
import * as RBColorIcons from "@repo/rb-components/new_components/assets/color-icons";
|
|
7
|
+
import { copyClipboard } from "@repo/rb-utils/browserUtils";
|
|
8
|
+
|
|
9
|
+
type IconExport =
|
|
10
|
+
| string
|
|
11
|
+
| ((props: React.SVGAttributes<SVGSVGElement>) => React.ReactElement);
|
|
12
|
+
|
|
13
|
+
const allIcons = Object.entries(RBColorIcons)
|
|
14
|
+
.filter(
|
|
15
|
+
([, value]) => typeof value === "function" || typeof value === "string",
|
|
16
|
+
)
|
|
17
|
+
.sort(([left], [right]) => left.localeCompare(right)) as Array<
|
|
18
|
+
[string, IconExport]
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
const toIconUsage = (name: string) => `<${name} className="size-5" />`;
|
|
22
|
+
|
|
23
|
+
const handleCopy = (name: string) => {
|
|
24
|
+
void copyClipboard({ text: toIconUsage(name) });
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const ProgramIconGallery = () => {
|
|
28
|
+
const [query, setQuery] = useState("");
|
|
29
|
+
|
|
30
|
+
const filteredIcons = useMemo(() => {
|
|
31
|
+
const keyword = query.trim().toLowerCase();
|
|
32
|
+
|
|
33
|
+
if (!keyword) {
|
|
34
|
+
return allIcons;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return allIcons.filter(([name]) => name.toLowerCase().includes(keyword));
|
|
38
|
+
}, [query]);
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div className="flex flex-col gap-4">
|
|
42
|
+
<div className="flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
|
|
43
|
+
<div>
|
|
44
|
+
<h3 className="text-fg-default text-lg font-semibold">
|
|
45
|
+
RBColorIcons
|
|
46
|
+
</h3>
|
|
47
|
+
<p className="text-fg-subtle text-sm">
|
|
48
|
+
현재 export된 아이콘 {filteredIcons.length} / {allIcons.length}
|
|
49
|
+
</p>
|
|
50
|
+
</div>
|
|
51
|
+
<RBTextInput
|
|
52
|
+
value={query}
|
|
53
|
+
handleChange={(value) => setQuery(String(value ?? ""))}
|
|
54
|
+
placeholder="Search program icons"
|
|
55
|
+
className="w-full md:w-72"
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div className="grid grid-cols-2 gap-3 md:grid-cols-4 xl:grid-cols-6">
|
|
60
|
+
{filteredIcons.map(([name, Icon]) => (
|
|
61
|
+
<button
|
|
62
|
+
key={name}
|
|
63
|
+
type="button"
|
|
64
|
+
onClick={() => handleCopy(name)}
|
|
65
|
+
title={`Copy ${toIconUsage(name)}`}
|
|
66
|
+
className="border-default bg-default flex min-h-32 cursor-copy flex-col items-center justify-center gap-3 rounded-xl border p-4 text-center transition-colors"
|
|
67
|
+
>
|
|
68
|
+
{typeof Icon === "function" ? (
|
|
69
|
+
<Icon className="size-6 shrink-0" />
|
|
70
|
+
) : (
|
|
71
|
+
<img src={Icon} alt={name} className="shrink-0" />
|
|
72
|
+
)}
|
|
73
|
+
<div className="flex flex-col gap-1">
|
|
74
|
+
<span className="text-default text-xs font-medium break-all">
|
|
75
|
+
{name}
|
|
76
|
+
</span>
|
|
77
|
+
<span className="text-fg-subtle text-[11px] break-all">
|
|
78
|
+
{toIconUsage(name)}
|
|
79
|
+
</span>
|
|
80
|
+
</div>
|
|
81
|
+
</button>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const meta = {
|
|
89
|
+
component: ProgramIconGallery,
|
|
90
|
+
tags: ["autodocs"],
|
|
91
|
+
parameters: {
|
|
92
|
+
layout: "padded",
|
|
93
|
+
docs: {
|
|
94
|
+
description: {
|
|
95
|
+
component:
|
|
96
|
+
"`@repo/rb-components/new_components/assets/color-icons` 에서 export되는 프로그램 아이콘을 한 번에 확인하는 스토리입니다. 아이콘 카드를 클릭하면 사용 코드가 복사됩니다.",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
} satisfies Meta<typeof ProgramIconGallery>;
|
|
101
|
+
|
|
102
|
+
export default meta;
|
|
103
|
+
|
|
104
|
+
type Story = StoryObj<typeof meta>;
|
|
105
|
+
|
|
106
|
+
export const Default: Story = {
|
|
107
|
+
render: () => <ProgramIconGallery />,
|
|
108
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
|
|
5
|
+
import { RBTextInput } from "@repo/rb-components/new_components";
|
|
6
|
+
import * as RBIcons from "@repo/rb-components/new_components/assets/icons";
|
|
7
|
+
import { copyClipboard } from "@repo/rb-utils/browserUtils";
|
|
8
|
+
|
|
9
|
+
type IconExport =
|
|
10
|
+
| string
|
|
11
|
+
| ((props: React.SVGAttributes<SVGSVGElement>) => React.ReactElement);
|
|
12
|
+
|
|
13
|
+
const allIcons = Object.entries(RBIcons)
|
|
14
|
+
.filter(
|
|
15
|
+
([, value]) => typeof value === "function" || typeof value === "string",
|
|
16
|
+
)
|
|
17
|
+
.sort(([left], [right]) => left.localeCompare(right)) as Array<
|
|
18
|
+
[string, IconExport]
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
const toIconUsage = (name: string) => `<${name} className="size-5" />`;
|
|
22
|
+
|
|
23
|
+
const handleCopy = (name: string) => {
|
|
24
|
+
void copyClipboard({ text: toIconUsage(name) });
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const ProgramIconGallery = () => {
|
|
28
|
+
const [query, setQuery] = useState("");
|
|
29
|
+
|
|
30
|
+
const filteredIcons = useMemo(() => {
|
|
31
|
+
const keyword = query.trim().toLowerCase();
|
|
32
|
+
|
|
33
|
+
if (!keyword) {
|
|
34
|
+
return allIcons;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return allIcons.filter(([name]) => name.toLowerCase().includes(keyword));
|
|
38
|
+
}, [query]);
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div className="flex flex-col gap-4">
|
|
42
|
+
<div className="flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
|
|
43
|
+
<div>
|
|
44
|
+
<h3 className="text-fg-default text-lg font-semibold">RBIcons</h3>
|
|
45
|
+
<p className="text-fg-subtle text-sm">
|
|
46
|
+
현재 export된 아이콘 {filteredIcons.length} / {allIcons.length}
|
|
47
|
+
</p>
|
|
48
|
+
</div>
|
|
49
|
+
<RBTextInput
|
|
50
|
+
value={query}
|
|
51
|
+
handleChange={(value) => setQuery(String(value ?? ""))}
|
|
52
|
+
placeholder="Search program icons"
|
|
53
|
+
className="w-full md:w-72"
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div className="grid grid-cols-2 gap-3 md:grid-cols-4 xl:grid-cols-6">
|
|
58
|
+
{filteredIcons.map(([name, Icon]) => (
|
|
59
|
+
<button
|
|
60
|
+
key={name}
|
|
61
|
+
type="button"
|
|
62
|
+
onClick={() => handleCopy(name)}
|
|
63
|
+
title={`Copy ${toIconUsage(name)}`}
|
|
64
|
+
className="border-default bg-default flex min-h-32 cursor-copy flex-col items-center justify-center gap-3 rounded-xl border p-4 text-center transition-colors"
|
|
65
|
+
>
|
|
66
|
+
{typeof Icon === "function" ? (
|
|
67
|
+
<Icon className="text-fg-default size-6 shrink-0" />
|
|
68
|
+
) : (
|
|
69
|
+
<img src={Icon} alt={name} className="shrink-0" />
|
|
70
|
+
)}
|
|
71
|
+
<div className="flex flex-col gap-1">
|
|
72
|
+
<span className="text-default text-xs font-medium break-all">
|
|
73
|
+
{name}
|
|
74
|
+
</span>
|
|
75
|
+
<span className="text-fg-subtle text-[11px] break-all">
|
|
76
|
+
{toIconUsage(name)}
|
|
77
|
+
</span>
|
|
78
|
+
</div>
|
|
79
|
+
</button>
|
|
80
|
+
))}
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const meta = {
|
|
87
|
+
component: ProgramIconGallery,
|
|
88
|
+
tags: ["autodocs"],
|
|
89
|
+
parameters: {
|
|
90
|
+
layout: "padded",
|
|
91
|
+
docs: {
|
|
92
|
+
description: {
|
|
93
|
+
component:
|
|
94
|
+
"`@repo/rb-components/new_components/assets/icons` 에서 export되는 프로그램 아이콘을 한 번에 확인하는 스토리입니다. 아이콘 카드를 클릭하면 사용 코드가 복사됩니다.",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
} satisfies Meta<typeof ProgramIconGallery>;
|
|
99
|
+
|
|
100
|
+
export default meta;
|
|
101
|
+
|
|
102
|
+
type Story = StoryObj<typeof meta>;
|
|
103
|
+
|
|
104
|
+
export const Default: Story = {
|
|
105
|
+
render: () => <ProgramIconGallery />,
|
|
106
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
|
|
5
|
+
import { RBTextInput } from "@repo/rb-components/new_components";
|
|
6
|
+
import * as RBMenuTreeIcons from "@repo/rb-components/new_components/assets/menu-tree-icons";
|
|
7
|
+
import { copyClipboard } from "@repo/rb-utils/browserUtils";
|
|
8
|
+
|
|
9
|
+
type IconExport =
|
|
10
|
+
| string
|
|
11
|
+
| ((props: React.SVGAttributes<SVGSVGElement>) => React.ReactElement);
|
|
12
|
+
|
|
13
|
+
const allIcons = Object.entries(RBMenuTreeIcons)
|
|
14
|
+
.filter(
|
|
15
|
+
([, value]) => typeof value === "function" || typeof value === "string",
|
|
16
|
+
)
|
|
17
|
+
.sort(([left], [right]) => left.localeCompare(right)) as Array<
|
|
18
|
+
[string, IconExport]
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
const toIconUsage = (name: string) => `<${name} className="size-5" />`;
|
|
22
|
+
|
|
23
|
+
const handleCopy = (name: string) => {
|
|
24
|
+
void copyClipboard({ text: toIconUsage(name) });
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const ProgramIconGallery = () => {
|
|
28
|
+
const [query, setQuery] = useState("");
|
|
29
|
+
|
|
30
|
+
const filteredIcons = useMemo(() => {
|
|
31
|
+
const keyword = query.trim().toLowerCase();
|
|
32
|
+
|
|
33
|
+
if (!keyword) {
|
|
34
|
+
return allIcons;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return allIcons.filter(([name]) => name.toLowerCase().includes(keyword));
|
|
38
|
+
}, [query]);
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div className="flex flex-col gap-4">
|
|
42
|
+
<div className="flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
|
|
43
|
+
<div>
|
|
44
|
+
<h3 className="text-fg-default text-lg font-semibold">
|
|
45
|
+
RBMenuTreeIcons
|
|
46
|
+
</h3>
|
|
47
|
+
<p className="text-fg-subtle text-sm">
|
|
48
|
+
현재 export된 아이콘 {filteredIcons.length} / {allIcons.length}
|
|
49
|
+
</p>
|
|
50
|
+
</div>
|
|
51
|
+
<RBTextInput
|
|
52
|
+
value={query}
|
|
53
|
+
handleChange={(value) => setQuery(String(value ?? ""))}
|
|
54
|
+
placeholder="Search program icons"
|
|
55
|
+
className="w-full md:w-72"
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div className="grid grid-cols-2 gap-3 md:grid-cols-4 xl:grid-cols-6">
|
|
60
|
+
{filteredIcons.map(([name, Icon]) => (
|
|
61
|
+
<button
|
|
62
|
+
key={name}
|
|
63
|
+
type="button"
|
|
64
|
+
onClick={() => handleCopy(name)}
|
|
65
|
+
title={`Copy ${toIconUsage(name)}`}
|
|
66
|
+
className="border-default bg-default flex min-h-32 cursor-copy flex-col items-center justify-center gap-3 rounded-xl border p-4 text-center transition-colors"
|
|
67
|
+
>
|
|
68
|
+
{typeof Icon === "function" ? (
|
|
69
|
+
<Icon className="size-6 shrink-0" />
|
|
70
|
+
) : (
|
|
71
|
+
<img src={Icon} alt={name} className="shrink-0" />
|
|
72
|
+
)}
|
|
73
|
+
<div className="flex flex-col gap-1">
|
|
74
|
+
<span className="text-default text-xs font-medium break-all">
|
|
75
|
+
{name}
|
|
76
|
+
</span>
|
|
77
|
+
<span className="text-fg-subtle text-[11px] break-all">
|
|
78
|
+
{toIconUsage(name)}
|
|
79
|
+
</span>
|
|
80
|
+
</div>
|
|
81
|
+
</button>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const meta = {
|
|
89
|
+
component: ProgramIconGallery,
|
|
90
|
+
tags: ["autodocs"],
|
|
91
|
+
parameters: {
|
|
92
|
+
layout: "padded",
|
|
93
|
+
docs: {
|
|
94
|
+
description: {
|
|
95
|
+
component:
|
|
96
|
+
"`@repo/rb-components/new_components/assets/menu-tree-icons` 에서 export되는 프로그램 아이콘을 한 번에 확인하는 스토리입니다. 아이콘 카드를 클릭하면 사용 코드가 복사됩니다.",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
} satisfies Meta<typeof ProgramIconGallery>;
|
|
101
|
+
|
|
102
|
+
export default meta;
|
|
103
|
+
|
|
104
|
+
type Story = StoryObj<typeof meta>;
|
|
105
|
+
|
|
106
|
+
export const Default: Story = {
|
|
107
|
+
render: () => <ProgramIconGallery />,
|
|
108
|
+
};
|