@opalkelly/frontpanel-react-components 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +45 -0
- package/README.md +26 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/components/FrontPanel/FrontPanel.d.ts +10 -0
- package/dist/cjs/types/components/FrontPanel/FrontPanel.props.d.ts +23 -0
- package/dist/cjs/types/components/FrontPanel/index.d.ts +7 -0
- package/dist/cjs/types/components/FrontPanelIndicator/FrontPanelIndicator.d.ts +30 -0
- package/dist/cjs/types/components/FrontPanelIndicator/FrontPanelIndicator.props.d.ts +17 -0
- package/dist/cjs/types/components/FrontPanelIndicator/index.d.ts +8 -0
- package/dist/cjs/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.d.ts +33 -0
- package/dist/cjs/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.props.d.ts +23 -0
- package/dist/cjs/types/components/FrontPanelNumberDisplay/index.d.ts +8 -0
- package/dist/cjs/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.d.ts +33 -0
- package/dist/cjs/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.props.d.ts +27 -0
- package/dist/cjs/types/components/FrontPanelNumberEntry/index.d.ts +8 -0
- package/dist/cjs/types/components/FrontPanelPushButton/FrontPanelPushButton.d.ts +31 -0
- package/dist/cjs/types/components/FrontPanelPushButton/FrontPanelPushButton.props.d.ts +17 -0
- package/dist/cjs/types/components/FrontPanelPushButton/index.d.ts +8 -0
- package/dist/cjs/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.d.ts +31 -0
- package/dist/cjs/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.props.d.ts +21 -0
- package/dist/cjs/types/components/FrontPanelRangeSlider/index.d.ts +8 -0
- package/dist/cjs/types/components/FrontPanelSelectEntry/FrontPanelSelectEntry.d.ts +17 -0
- package/dist/cjs/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.d.ts +43 -0
- package/dist/cjs/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.props.d.ts +21 -0
- package/dist/cjs/types/components/FrontPanelSelectEntry/index.d.ts +15 -0
- package/dist/cjs/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.d.ts +31 -0
- package/dist/cjs/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.props.d.ts +17 -0
- package/dist/cjs/types/components/FrontPanelToggleSwitch/index.d.ts +8 -0
- package/dist/cjs/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.d.ts +32 -0
- package/dist/cjs/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.props.d.ts +18 -0
- package/dist/cjs/types/components/FrontPanelTriggerButton/index.d.ts +8 -0
- package/dist/cjs/types/components/Icons/ChevronIcon.d.ts +17 -0
- package/dist/cjs/types/components/Icons/IndicatorArrowIcon.d.ts +17 -0
- package/dist/cjs/types/components/Icons/IndicatorBarIcon.d.ts +10 -0
- package/dist/cjs/types/components/Icons/IndicatorStateIcon.d.ts +14 -0
- package/dist/cjs/types/components/Icons/RadioToggleStateIcon.d.ts +14 -0
- package/dist/cjs/types/components/Icons/SwitchToggleStateIcon.d.ts +14 -0
- package/dist/cjs/types/components/Icons/index.d.ts +12 -0
- package/dist/cjs/types/components/Icons/types.d.ts +17 -0
- package/dist/cjs/types/components/index.d.ts +16 -0
- package/dist/cjs/types/components/types.d.ts +11 -0
- package/dist/cjs/types/contexts/FrontPanelContext.d.ts +15 -0
- package/dist/cjs/types/contexts/index.d.ts +8 -0
- package/dist/cjs/types/core/Binary.d.ts +7 -0
- package/dist/cjs/types/core/Numeric.d.ts +80 -0
- package/dist/cjs/types/core/Types.d.ts +34 -0
- package/dist/cjs/types/core/index.d.ts +9 -0
- package/dist/cjs/types/index.d.ts +10 -0
- package/dist/cjs/types/primitives/Application/Application.d.ts +10 -0
- package/dist/cjs/types/primitives/Application/Application.props.d.ts +10 -0
- package/dist/cjs/types/primitives/Application/index.d.ts +1 -0
- package/dist/cjs/types/primitives/Button/Button.d.ts +33 -0
- package/dist/cjs/types/primitives/Button/Button.props.d.ts +44 -0
- package/dist/cjs/types/primitives/Button/index.d.ts +3 -0
- package/dist/cjs/types/primitives/DigitEntry/DigitEntry.d.ts +33 -0
- package/dist/cjs/types/primitives/DigitEntry/DigitEntry.props.d.ts +51 -0
- package/dist/cjs/types/primitives/DigitEntry/index.d.ts +9 -0
- package/dist/cjs/types/primitives/Indicator/Indicator.d.ts +29 -0
- package/dist/cjs/types/primitives/Indicator/Indicator.props.d.ts +35 -0
- package/dist/cjs/types/primitives/Indicator/index.d.ts +9 -0
- package/dist/cjs/types/primitives/Label/Label.d.ts +31 -0
- package/dist/cjs/types/primitives/Label/Label.props.d.ts +33 -0
- package/dist/cjs/types/primitives/Label/index.d.ts +9 -0
- package/dist/cjs/types/primitives/NumberDisplay/NumberDisplay.d.ts +31 -0
- package/dist/cjs/types/primitives/NumberDisplay/NumberDisplay.props.d.ts +52 -0
- package/dist/cjs/types/primitives/NumberDisplay/index.d.ts +9 -0
- package/dist/cjs/types/primitives/NumberEntry/NumberEntry.d.ts +34 -0
- package/dist/cjs/types/primitives/NumberEntry/NumberEntry.props.d.ts +69 -0
- package/dist/cjs/types/primitives/NumberEntry/NumberEntryDigits.d.ts +27 -0
- package/dist/cjs/types/primitives/NumberEntry/NumberEntryDigits.props.d.ts +43 -0
- package/dist/cjs/types/primitives/NumberEntry/index.d.ts +9 -0
- package/dist/cjs/types/primitives/RangeSlider/RangeSlider.d.ts +33 -0
- package/dist/cjs/types/primitives/RangeSlider/RangeSlider.props.d.ts +77 -0
- package/dist/cjs/types/primitives/RangeSlider/index.d.ts +9 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntry.d.ts +17 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryContent.d.ts +16 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryGroup.d.ts +15 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryItem.d.ts +15 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryLabel.d.ts +15 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryRoot.d.ts +39 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryRoot.props.d.ts +31 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntrySeparator.d.ts +15 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryTrigger.d.ts +16 -0
- package/dist/cjs/types/primitives/SelectEntry/SelectEntryTrigger.props.d.ts +16 -0
- package/dist/cjs/types/primitives/SelectEntry/index.d.ts +17 -0
- package/dist/cjs/types/primitives/Toggle/Toggle.d.ts +35 -0
- package/dist/cjs/types/primitives/Toggle/Toggle.props.d.ts +37 -0
- package/dist/cjs/types/primitives/Toggle/index.d.ts +9 -0
- package/dist/cjs/types/primitives/ToggleSwitch/ToggleSwitch.d.ts +32 -0
- package/dist/cjs/types/primitives/ToggleSwitch/ToggleSwitch.props.d.ts +22 -0
- package/dist/cjs/types/primitives/ToggleSwitch/index.d.ts +8 -0
- package/dist/cjs/types/primitives/Tooltip/Tooltip.d.ts +35 -0
- package/dist/cjs/types/primitives/Tooltip/Tooltip.props.d.ts +17 -0
- package/dist/cjs/types/primitives/Tooltip/index.d.ts +8 -0
- package/dist/cjs/types/primitives/TooltipUtility.d.ts +12 -0
- package/dist/cjs/types/primitives/index.d.ts +24 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/components/FrontPanel/FrontPanel.d.ts +10 -0
- package/dist/esm/types/components/FrontPanel/FrontPanel.props.d.ts +23 -0
- package/dist/esm/types/components/FrontPanel/index.d.ts +7 -0
- package/dist/esm/types/components/FrontPanelIndicator/FrontPanelIndicator.d.ts +30 -0
- package/dist/esm/types/components/FrontPanelIndicator/FrontPanelIndicator.props.d.ts +17 -0
- package/dist/esm/types/components/FrontPanelIndicator/index.d.ts +8 -0
- package/dist/esm/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.d.ts +33 -0
- package/dist/esm/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.props.d.ts +23 -0
- package/dist/esm/types/components/FrontPanelNumberDisplay/index.d.ts +8 -0
- package/dist/esm/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.d.ts +33 -0
- package/dist/esm/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.props.d.ts +27 -0
- package/dist/esm/types/components/FrontPanelNumberEntry/index.d.ts +8 -0
- package/dist/esm/types/components/FrontPanelPushButton/FrontPanelPushButton.d.ts +31 -0
- package/dist/esm/types/components/FrontPanelPushButton/FrontPanelPushButton.props.d.ts +17 -0
- package/dist/esm/types/components/FrontPanelPushButton/index.d.ts +8 -0
- package/dist/esm/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.d.ts +31 -0
- package/dist/esm/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.props.d.ts +21 -0
- package/dist/esm/types/components/FrontPanelRangeSlider/index.d.ts +8 -0
- package/dist/esm/types/components/FrontPanelSelectEntry/FrontPanelSelectEntry.d.ts +17 -0
- package/dist/esm/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.d.ts +43 -0
- package/dist/esm/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.props.d.ts +21 -0
- package/dist/esm/types/components/FrontPanelSelectEntry/index.d.ts +15 -0
- package/dist/esm/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.d.ts +31 -0
- package/dist/esm/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.props.d.ts +17 -0
- package/dist/esm/types/components/FrontPanelToggleSwitch/index.d.ts +8 -0
- package/dist/esm/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.d.ts +32 -0
- package/dist/esm/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.props.d.ts +18 -0
- package/dist/esm/types/components/FrontPanelTriggerButton/index.d.ts +8 -0
- package/dist/esm/types/components/Icons/ChevronIcon.d.ts +17 -0
- package/dist/esm/types/components/Icons/IndicatorArrowIcon.d.ts +17 -0
- package/dist/esm/types/components/Icons/IndicatorBarIcon.d.ts +10 -0
- package/dist/esm/types/components/Icons/IndicatorStateIcon.d.ts +14 -0
- package/dist/esm/types/components/Icons/RadioToggleStateIcon.d.ts +14 -0
- package/dist/esm/types/components/Icons/SwitchToggleStateIcon.d.ts +14 -0
- package/dist/esm/types/components/Icons/index.d.ts +12 -0
- package/dist/esm/types/components/Icons/types.d.ts +17 -0
- package/dist/esm/types/components/index.d.ts +16 -0
- package/dist/esm/types/components/types.d.ts +11 -0
- package/dist/esm/types/contexts/FrontPanelContext.d.ts +15 -0
- package/dist/esm/types/contexts/index.d.ts +8 -0
- package/dist/esm/types/core/Binary.d.ts +7 -0
- package/dist/esm/types/core/Numeric.d.ts +80 -0
- package/dist/esm/types/core/Types.d.ts +34 -0
- package/dist/esm/types/core/index.d.ts +9 -0
- package/dist/esm/types/index.d.ts +10 -0
- package/dist/esm/types/primitives/Application/Application.d.ts +10 -0
- package/dist/esm/types/primitives/Application/Application.props.d.ts +10 -0
- package/dist/esm/types/primitives/Application/index.d.ts +1 -0
- package/dist/esm/types/primitives/Button/Button.d.ts +33 -0
- package/dist/esm/types/primitives/Button/Button.props.d.ts +44 -0
- package/dist/esm/types/primitives/Button/index.d.ts +3 -0
- package/dist/esm/types/primitives/DigitEntry/DigitEntry.d.ts +33 -0
- package/dist/esm/types/primitives/DigitEntry/DigitEntry.props.d.ts +51 -0
- package/dist/esm/types/primitives/DigitEntry/index.d.ts +9 -0
- package/dist/esm/types/primitives/Indicator/Indicator.d.ts +29 -0
- package/dist/esm/types/primitives/Indicator/Indicator.props.d.ts +35 -0
- package/dist/esm/types/primitives/Indicator/index.d.ts +9 -0
- package/dist/esm/types/primitives/Label/Label.d.ts +31 -0
- package/dist/esm/types/primitives/Label/Label.props.d.ts +33 -0
- package/dist/esm/types/primitives/Label/index.d.ts +9 -0
- package/dist/esm/types/primitives/NumberDisplay/NumberDisplay.d.ts +31 -0
- package/dist/esm/types/primitives/NumberDisplay/NumberDisplay.props.d.ts +52 -0
- package/dist/esm/types/primitives/NumberDisplay/index.d.ts +9 -0
- package/dist/esm/types/primitives/NumberEntry/NumberEntry.d.ts +34 -0
- package/dist/esm/types/primitives/NumberEntry/NumberEntry.props.d.ts +69 -0
- package/dist/esm/types/primitives/NumberEntry/NumberEntryDigits.d.ts +27 -0
- package/dist/esm/types/primitives/NumberEntry/NumberEntryDigits.props.d.ts +43 -0
- package/dist/esm/types/primitives/NumberEntry/index.d.ts +9 -0
- package/dist/esm/types/primitives/RangeSlider/RangeSlider.d.ts +33 -0
- package/dist/esm/types/primitives/RangeSlider/RangeSlider.props.d.ts +77 -0
- package/dist/esm/types/primitives/RangeSlider/index.d.ts +9 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntry.d.ts +17 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryContent.d.ts +16 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryGroup.d.ts +15 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryItem.d.ts +15 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryLabel.d.ts +15 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryRoot.d.ts +39 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryRoot.props.d.ts +31 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntrySeparator.d.ts +15 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryTrigger.d.ts +16 -0
- package/dist/esm/types/primitives/SelectEntry/SelectEntryTrigger.props.d.ts +16 -0
- package/dist/esm/types/primitives/SelectEntry/index.d.ts +17 -0
- package/dist/esm/types/primitives/Toggle/Toggle.d.ts +35 -0
- package/dist/esm/types/primitives/Toggle/Toggle.props.d.ts +37 -0
- package/dist/esm/types/primitives/Toggle/index.d.ts +9 -0
- package/dist/esm/types/primitives/ToggleSwitch/ToggleSwitch.d.ts +32 -0
- package/dist/esm/types/primitives/ToggleSwitch/ToggleSwitch.props.d.ts +22 -0
- package/dist/esm/types/primitives/ToggleSwitch/index.d.ts +8 -0
- package/dist/esm/types/primitives/Tooltip/Tooltip.d.ts +35 -0
- package/dist/esm/types/primitives/Tooltip/Tooltip.props.d.ts +17 -0
- package/dist/esm/types/primitives/Tooltip/index.d.ts +8 -0
- package/dist/esm/types/primitives/TooltipUtility.d.ts +12 -0
- package/dist/esm/types/primitives/index.d.ts +24 -0
- package/dist/index.d.ts +1456 -0
- package/package.json +81 -0
- package/src/components/FrontPanel/FrontPanel.props.ts +25 -0
- package/src/components/FrontPanel/FrontPanel.tsx +33 -0
- package/src/components/FrontPanel/index.ts +8 -0
- package/src/components/FrontPanelIndicator/FrontPanelIndicator.css +0 -0
- package/src/components/FrontPanelIndicator/FrontPanelIndicator.props.ts +20 -0
- package/src/components/FrontPanelIndicator/FrontPanelIndicator.stories.tsx +44 -0
- package/src/components/FrontPanelIndicator/FrontPanelIndicator.tsx +81 -0
- package/src/components/FrontPanelIndicator/index.ts +10 -0
- package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.css +0 -0
- package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.props.ts +27 -0
- package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.stories.tsx +67 -0
- package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.tsx +130 -0
- package/src/components/FrontPanelNumberDisplay/index.ts +10 -0
- package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.css +0 -0
- package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.props.ts +32 -0
- package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.stories.tsx +104 -0
- package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.tsx +195 -0
- package/src/components/FrontPanelNumberEntry/index.ts +10 -0
- package/src/components/FrontPanelPushButton/FrontPanelPushButton.css +0 -0
- package/src/components/FrontPanelPushButton/FrontPanelPushButton.props.ts +20 -0
- package/src/components/FrontPanelPushButton/FrontPanelPushButton.stories.tsx +46 -0
- package/src/components/FrontPanelPushButton/FrontPanelPushButton.tsx +80 -0
- package/src/components/FrontPanelPushButton/index.ts +10 -0
- package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.css +0 -0
- package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.props.ts +25 -0
- package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.stories.tsx +92 -0
- package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.tsx +108 -0
- package/src/components/FrontPanelRangeSlider/index.ts +10 -0
- package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntry.css +0 -0
- package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntry.stories.tsx +107 -0
- package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntry.tsx +30 -0
- package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.props.ts +25 -0
- package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.tsx +175 -0
- package/src/components/FrontPanelSelectEntry/index.ts +17 -0
- package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.css +0 -0
- package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.props.ts +20 -0
- package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.stories.tsx +46 -0
- package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.tsx +108 -0
- package/src/components/FrontPanelToggleSwitch/index.ts +10 -0
- package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.css +0 -0
- package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.props.ts +21 -0
- package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.stories.tsx +46 -0
- package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.tsx +65 -0
- package/src/components/FrontPanelTriggerButton/index.ts +10 -0
- package/src/components/Icons/ChevronIcon.tsx +69 -0
- package/src/components/Icons/IndicatorArrowIcon.tsx +59 -0
- package/src/components/Icons/IndicatorBarIcon.tsx +34 -0
- package/src/components/Icons/IndicatorStateIcon.tsx +82 -0
- package/src/components/Icons/RadioToggleStateIcon.tsx +62 -0
- package/src/components/Icons/SwitchToggleStateIcon.tsx +68 -0
- package/src/components/Icons/index.ts +15 -0
- package/src/components/Icons/types.ts +20 -0
- package/src/components/index.ts +31 -0
- package/src/components/types.ts +13 -0
- package/src/contexts/FrontPanelContext.ts +23 -0
- package/src/contexts/index.ts +10 -0
- package/src/core/Binary.ts +23 -0
- package/src/core/Numeric.ts +168 -0
- package/src/core/Types.ts +39 -0
- package/src/core/index.ts +11 -0
- package/src/fonts/Inter-VariableFont_slnt,wght.ttf +0 -0
- package/src/index.css +11 -0
- package/src/index.ts +11 -0
- package/src/primitives/Application/Application.props.ts +10 -0
- package/src/primitives/Application/Application.tsx +24 -0
- package/src/primitives/Application/index.ts +1 -0
- package/src/primitives/Button/Button.css +60 -0
- package/src/primitives/Button/Button.props.ts +53 -0
- package/src/primitives/Button/Button.stories.tsx +54 -0
- package/src/primitives/Button/Button.tsx +75 -0
- package/src/primitives/Button/index.ts +4 -0
- package/src/primitives/DigitEntry/DigitEntry.css +120 -0
- package/src/primitives/DigitEntry/DigitEntry.props.ts +62 -0
- package/src/primitives/DigitEntry/DigitEntry.stories.tsx +84 -0
- package/src/primitives/DigitEntry/DigitEntry.tsx +226 -0
- package/src/primitives/DigitEntry/index.ts +15 -0
- package/src/primitives/Indicator/Indicator.css +66 -0
- package/src/primitives/Indicator/Indicator.props.ts +42 -0
- package/src/primitives/Indicator/Indicator.stories.tsx +44 -0
- package/src/primitives/Indicator/Indicator.tsx +64 -0
- package/src/primitives/Indicator/index.ts +11 -0
- package/src/primitives/Label/Label.css +49 -0
- package/src/primitives/Label/Label.props.ts +38 -0
- package/src/primitives/Label/Label.stories.tsx +53 -0
- package/src/primitives/Label/Label.tsx +66 -0
- package/src/primitives/Label/index.ts +11 -0
- package/src/primitives/NumberDisplay/NumberDisplay.css +63 -0
- package/src/primitives/NumberDisplay/NumberDisplay.props.ts +65 -0
- package/src/primitives/NumberDisplay/NumberDisplay.stories.tsx +83 -0
- package/src/primitives/NumberDisplay/NumberDisplay.tsx +155 -0
- package/src/primitives/NumberDisplay/index.ts +11 -0
- package/src/primitives/NumberEntry/NumberEntry.css +71 -0
- package/src/primitives/NumberEntry/NumberEntry.props.ts +86 -0
- package/src/primitives/NumberEntry/NumberEntry.stories.tsx +129 -0
- package/src/primitives/NumberEntry/NumberEntry.tsx +249 -0
- package/src/primitives/NumberEntry/NumberEntryDigits.props.ts +57 -0
- package/src/primitives/NumberEntry/NumberEntryDigits.tsx +117 -0
- package/src/primitives/NumberEntry/index.ts +11 -0
- package/src/primitives/RangeSlider/RangeSlider.css +110 -0
- package/src/primitives/RangeSlider/RangeSlider.props.ts +93 -0
- package/src/primitives/RangeSlider/RangeSlider.stories.tsx +76 -0
- package/src/primitives/RangeSlider/RangeSlider.tsx +168 -0
- package/src/primitives/RangeSlider/index.ts +14 -0
- package/src/primitives/SelectEntry/SelectEntry.stories.tsx +86 -0
- package/src/primitives/SelectEntry/SelectEntry.tsx +29 -0
- package/src/primitives/SelectEntry/SelectEntryContent.css +94 -0
- package/src/primitives/SelectEntry/SelectEntryContent.tsx +63 -0
- package/src/primitives/SelectEntry/SelectEntryGroup.css +17 -0
- package/src/primitives/SelectEntry/SelectEntryGroup.tsx +37 -0
- package/src/primitives/SelectEntry/SelectEntryItem.css +35 -0
- package/src/primitives/SelectEntry/SelectEntryItem.tsx +51 -0
- package/src/primitives/SelectEntry/SelectEntryLabel.css +16 -0
- package/src/primitives/SelectEntry/SelectEntryLabel.tsx +43 -0
- package/src/primitives/SelectEntry/SelectEntryRoot.css +10 -0
- package/src/primitives/SelectEntry/SelectEntryRoot.props.ts +38 -0
- package/src/primitives/SelectEntry/SelectEntryRoot.tsx +69 -0
- package/src/primitives/SelectEntry/SelectEntrySeparator.css +12 -0
- package/src/primitives/SelectEntry/SelectEntrySeparator.tsx +38 -0
- package/src/primitives/SelectEntry/SelectEntryTrigger.css +49 -0
- package/src/primitives/SelectEntry/SelectEntryTrigger.props.ts +18 -0
- package/src/primitives/SelectEntry/SelectEntryTrigger.tsx +111 -0
- package/src/primitives/SelectEntry/index.ts +20 -0
- package/src/primitives/Toggle/Toggle.css +67 -0
- package/src/primitives/Toggle/Toggle.props.ts +44 -0
- package/src/primitives/Toggle/Toggle.stories.tsx +61 -0
- package/src/primitives/Toggle/Toggle.tsx +90 -0
- package/src/primitives/Toggle/index.ts +11 -0
- package/src/primitives/ToggleSwitch/ToggleSwitch.css +118 -0
- package/src/primitives/ToggleSwitch/ToggleSwitch.props.ts +26 -0
- package/src/primitives/ToggleSwitch/ToggleSwitch.stories.tsx +85 -0
- package/src/primitives/ToggleSwitch/ToggleSwitch.tsx +73 -0
- package/src/primitives/ToggleSwitch/index.ts +10 -0
- package/src/primitives/Tooltip/Tooltip.css +93 -0
- package/src/primitives/Tooltip/Tooltip.props.ts +20 -0
- package/src/primitives/Tooltip/Tooltip.tsx +91 -0
- package/src/primitives/Tooltip/index.ts +10 -0
- package/src/primitives/TooltipUtility.tsx +24 -0
- package/src/primitives/index.ts +44 -0
- package/src/stories/decorators/Application.decorator.tsx +20 -0
- package/src/stories/decorators/FrontPanel.decorator.tsx +47 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React, { useContext } from "react";
|
|
9
|
+
|
|
10
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
11
|
+
|
|
12
|
+
import withApplication from "../../stories/decorators/Application.decorator";
|
|
13
|
+
import withFrontPanel from "../../stories/decorators/FrontPanel.decorator";
|
|
14
|
+
|
|
15
|
+
import FrontPanelNumberEntry from "./FrontPanelNumberEntry";
|
|
16
|
+
|
|
17
|
+
import { FrontPanelContext } from "../../contexts";
|
|
18
|
+
|
|
19
|
+
import { NumeralSystem } from "../../core";
|
|
20
|
+
|
|
21
|
+
import { WireValue } from "@opalkelly/frontpanel-alloy-core";
|
|
22
|
+
|
|
23
|
+
// Configure Story metadata
|
|
24
|
+
const meta = {
|
|
25
|
+
title: "Components/FrontPanel/FrontPanelNumberEntry",
|
|
26
|
+
component: FrontPanelNumberEntry,
|
|
27
|
+
parameters: {
|
|
28
|
+
layout: "centered" // Center the component in the Canvas
|
|
29
|
+
},
|
|
30
|
+
tags: ["autodocs"], // Automatically generate documentation
|
|
31
|
+
argTypes: {
|
|
32
|
+
variant: {
|
|
33
|
+
control: "radio",
|
|
34
|
+
options: ["standard", "compact"]
|
|
35
|
+
},
|
|
36
|
+
disabled: { control: "boolean" },
|
|
37
|
+
size: {
|
|
38
|
+
control: { type: "range", min: 1, max: 3, step: 1 }
|
|
39
|
+
},
|
|
40
|
+
decimalScale: {
|
|
41
|
+
control: { type: "range", min: 0, max: 20, step: 1 }
|
|
42
|
+
},
|
|
43
|
+
numeralSystem: {
|
|
44
|
+
control: "radio",
|
|
45
|
+
options: ["Decimal", "Hexadecimal", "Binary", "Octal"],
|
|
46
|
+
mapping: {
|
|
47
|
+
Decimal: NumeralSystem.Decimal,
|
|
48
|
+
Hexadecimal: NumeralSystem.Hexadecimal,
|
|
49
|
+
Binary: NumeralSystem.Binary,
|
|
50
|
+
Octal: NumeralSystem.Octal
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
maximumValue: { control: "text" },
|
|
54
|
+
minimumValue: { control: "text" }
|
|
55
|
+
}
|
|
56
|
+
} satisfies Meta<typeof FrontPanelNumberEntry>;
|
|
57
|
+
|
|
58
|
+
export default meta;
|
|
59
|
+
|
|
60
|
+
type Story = StoryObj<typeof meta>;
|
|
61
|
+
|
|
62
|
+
// Primary Story
|
|
63
|
+
export const Primary: Story = {
|
|
64
|
+
render: (props) => {
|
|
65
|
+
const { device, workQueue } = useContext(FrontPanelContext);
|
|
66
|
+
|
|
67
|
+
const setWireInPromises: Promise<void>[] = [];
|
|
68
|
+
|
|
69
|
+
// Initialize the WireIns with unique values.
|
|
70
|
+
workQueue.Post(async (): Promise<void> => {
|
|
71
|
+
let byteId = 0;
|
|
72
|
+
|
|
73
|
+
for (let address = 0x0; address < 0x20; address++) {
|
|
74
|
+
let wireValue: WireValue = byteId++;
|
|
75
|
+
for (let byteIndex = 1; byteIndex < 4; byteIndex++) {
|
|
76
|
+
wireValue |= byteId++ << (8 * byteIndex);
|
|
77
|
+
}
|
|
78
|
+
setWireInPromises.push(device.setWireInValue(address, wireValue, 0xffffffff));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
await Promise.all(setWireInPromises);
|
|
82
|
+
await device.updateWireIns();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return <FrontPanelNumberEntry {...props} />;
|
|
86
|
+
},
|
|
87
|
+
decorators: [withApplication, withFrontPanel],
|
|
88
|
+
args: {
|
|
89
|
+
fpEndpoint: { epAddress: 0x00, bitOffset: 1 },
|
|
90
|
+
maximumValue: 0xffffffffn,
|
|
91
|
+
// Optional Properties
|
|
92
|
+
disabled: false,
|
|
93
|
+
variant: "standard",
|
|
94
|
+
numeralSystem: NumeralSystem.Decimal,
|
|
95
|
+
decimalScale: 0,
|
|
96
|
+
label: {
|
|
97
|
+
text: "Wire Value",
|
|
98
|
+
verticalPosition: "top",
|
|
99
|
+
horizontalPosition: "left"
|
|
100
|
+
},
|
|
101
|
+
size: 1,
|
|
102
|
+
tooltip: "Set the wire endpoint value"
|
|
103
|
+
}
|
|
104
|
+
};
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React from "react";
|
|
9
|
+
|
|
10
|
+
import "./FrontPanelNumberEntry.css";
|
|
11
|
+
|
|
12
|
+
import { NumberEntry } from "../../primitives";
|
|
13
|
+
|
|
14
|
+
import FrontPanelNumberEntryProps from "./FrontPanelNumberEntry.props";
|
|
15
|
+
|
|
16
|
+
import { FrontPanelContext } from "../../contexts";
|
|
17
|
+
|
|
18
|
+
import { CalculateBitLength } from "../../core";
|
|
19
|
+
|
|
20
|
+
import { IFrontPanel, WIREIN_ADDRESS_RANGE } from "@opalkelly/frontpanel-alloy-core";
|
|
21
|
+
|
|
22
|
+
type FrontPanelNumberEntryElement = React.ElementRef<typeof NumberEntry>;
|
|
23
|
+
|
|
24
|
+
interface FrontPanelNumberEntryCombinedProps
|
|
25
|
+
extends Omit<
|
|
26
|
+
React.ComponentPropsWithoutRef<typeof NumberEntry>,
|
|
27
|
+
"value" | "maximumValue" | "minimumValue" | "onValueChange"
|
|
28
|
+
>,
|
|
29
|
+
FrontPanelNumberEntryProps {}
|
|
30
|
+
|
|
31
|
+
export type { FrontPanelNumberEntryCombinedProps };
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* `FrontPanelNumberEntry` is a React component that renders a number entry field to allow setting the value of a WireIn endpoint
|
|
35
|
+
* represented in binary, octal, decimal, or hexadecimal numeral systems. The values of the individual digits of the number can
|
|
36
|
+
* be entered by key or they can be incremented and decremented using the up and down arrow keys and or the mouse wheel.
|
|
37
|
+
*
|
|
38
|
+
* @component
|
|
39
|
+
* @param {Object} props - Properties passed to component
|
|
40
|
+
* @param {React.Ref} forwardedRef - Forwarded ref for the number display
|
|
41
|
+
*
|
|
42
|
+
* @returns {React.Node} The rendered FrontPanelNumberDisplay component
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```jsx
|
|
46
|
+
* <FrontPanelNumberEntry
|
|
47
|
+
* fpEndpoint={{epAddress: 0x00, bitOffset: 1}}
|
|
48
|
+
* maximumValue=0xffffffff />
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
const FrontPanelNumberEntry = React.forwardRef<
|
|
52
|
+
FrontPanelNumberEntryElement,
|
|
53
|
+
FrontPanelNumberEntryCombinedProps
|
|
54
|
+
>((props, forwardedRef) => {
|
|
55
|
+
const [value, setValue] = React.useState<bigint>(props.minimumValue ?? 0n);
|
|
56
|
+
|
|
57
|
+
const { device, workQueue } = React.useContext(FrontPanelContext);
|
|
58
|
+
|
|
59
|
+
const { maximumValue, minimumValue, fpEndpoint, ...rootProps } = props;
|
|
60
|
+
|
|
61
|
+
const clampedMinimumValue = React.useMemo(() => {
|
|
62
|
+
return typeof minimumValue !== "undefined"
|
|
63
|
+
? ClampValue(minimumValue, maximumValue, 0n)
|
|
64
|
+
: 0n;
|
|
65
|
+
}, [minimumValue, maximumValue]);
|
|
66
|
+
|
|
67
|
+
const targetBitLength: number = React.useMemo(() => {
|
|
68
|
+
return CalculateBitLength(maximumValue);
|
|
69
|
+
}, [maximumValue]);
|
|
70
|
+
|
|
71
|
+
const targetWireSpanBitMask =
|
|
72
|
+
((1n << BigInt(targetBitLength)) - 1n) << BigInt(fpEndpoint.bitOffset);
|
|
73
|
+
|
|
74
|
+
const onUpdateWireValue = React.useCallback(
|
|
75
|
+
async (sender: IFrontPanel): Promise<void> => {
|
|
76
|
+
await workQueue.Post(async () => {
|
|
77
|
+
// Get the wire value for the endpoint
|
|
78
|
+
let sourceWireValue = await sender.getWireInValue(fpEndpoint.epAddress);
|
|
79
|
+
let targetWireBitMask = targetWireSpanBitMask & 0xffffffffn;
|
|
80
|
+
let sourceSpanValue =
|
|
81
|
+
(BigInt(sourceWireValue) & targetWireBitMask) >> BigInt(fpEndpoint.bitOffset);
|
|
82
|
+
|
|
83
|
+
if (targetWireSpanBitMask > 0xffffffffn) {
|
|
84
|
+
// The operations spans multiple endpoints
|
|
85
|
+
let currentWireSpanBitOffset = 32n - BigInt(fpEndpoint.bitOffset);
|
|
86
|
+
let currentWireSpanBitMask = targetWireSpanBitMask >> 32n;
|
|
87
|
+
|
|
88
|
+
for (
|
|
89
|
+
let sourceWireAddress = fpEndpoint.epAddress + 1;
|
|
90
|
+
sourceWireAddress <= WIREIN_ADDRESS_RANGE.Maximum &&
|
|
91
|
+
currentWireSpanBitMask > 0n;
|
|
92
|
+
sourceWireAddress++
|
|
93
|
+
) {
|
|
94
|
+
// Get the wire value for the next endpoint
|
|
95
|
+
sourceWireValue = await sender.getWireInValue(sourceWireAddress);
|
|
96
|
+
targetWireBitMask = currentWireSpanBitMask & 0xffffffffn;
|
|
97
|
+
sourceSpanValue |=
|
|
98
|
+
(BigInt(sourceWireValue) & targetWireBitMask) <<
|
|
99
|
+
currentWireSpanBitOffset;
|
|
100
|
+
|
|
101
|
+
currentWireSpanBitOffset += 32n;
|
|
102
|
+
currentWireSpanBitMask >>= 32n;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
setValue(sourceSpanValue);
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
[fpEndpoint, targetWireSpanBitMask]
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
React.useEffect(() => {
|
|
113
|
+
onUpdateWireValue(device);
|
|
114
|
+
}, [device, onUpdateWireValue]);
|
|
115
|
+
|
|
116
|
+
const onNumberEntryValueChange = React.useCallback(
|
|
117
|
+
async (value: bigint): Promise<void> => {
|
|
118
|
+
await workQueue.Post(async () => {
|
|
119
|
+
let targetWireBitMask = targetWireSpanBitMask & 0xffffffffn;
|
|
120
|
+
let targetWireValue = Number(
|
|
121
|
+
(value << BigInt(fpEndpoint.bitOffset)) & targetWireBitMask
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// Set the wire value for the endpoint
|
|
125
|
+
await device.setWireInValue(
|
|
126
|
+
fpEndpoint.epAddress,
|
|
127
|
+
targetWireValue,
|
|
128
|
+
Number(targetWireBitMask)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (targetWireSpanBitMask > 0xffffffffn) {
|
|
132
|
+
// The operations spans multiple endpoints
|
|
133
|
+
let currentWireSpanBitOffset = 32n - BigInt(fpEndpoint.bitOffset);
|
|
134
|
+
let currentWireSpanBitMask = targetWireSpanBitMask >> 32n;
|
|
135
|
+
|
|
136
|
+
for (
|
|
137
|
+
let targetWireAddress = fpEndpoint.epAddress + 1;
|
|
138
|
+
targetWireAddress <= WIREIN_ADDRESS_RANGE.Maximum &&
|
|
139
|
+
currentWireSpanBitMask > 0n;
|
|
140
|
+
targetWireAddress++
|
|
141
|
+
) {
|
|
142
|
+
targetWireBitMask = currentWireSpanBitMask & 0xffffffffn;
|
|
143
|
+
targetWireValue = Number(
|
|
144
|
+
(value >> currentWireSpanBitOffset) & targetWireBitMask
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// Set the wire value for the next endpoint
|
|
148
|
+
await device.setWireInValue(
|
|
149
|
+
targetWireAddress,
|
|
150
|
+
targetWireValue,
|
|
151
|
+
Number(targetWireBitMask)
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
currentWireSpanBitOffset += 32n;
|
|
155
|
+
currentWireSpanBitMask >>= 32n;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
await device.updateWireIns();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
onUpdateWireValue(device);
|
|
163
|
+
},
|
|
164
|
+
[device, workQueue, fpEndpoint, targetWireSpanBitMask, onUpdateWireValue]
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<NumberEntry
|
|
169
|
+
{...rootProps}
|
|
170
|
+
ref={forwardedRef}
|
|
171
|
+
maximumValue={maximumValue}
|
|
172
|
+
minimumValue={clampedMinimumValue}
|
|
173
|
+
value={value}
|
|
174
|
+
onValueChange={onNumberEntryValueChange}
|
|
175
|
+
/>
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
FrontPanelNumberEntry.displayName = "FrontPanelNumberEntry";
|
|
180
|
+
|
|
181
|
+
export default FrontPanelNumberEntry;
|
|
182
|
+
|
|
183
|
+
function ClampValue(value: bigint, maximumLimit: bigint, minimumLimit: bigint): bigint {
|
|
184
|
+
let retval: bigint;
|
|
185
|
+
|
|
186
|
+
if (value < minimumLimit) {
|
|
187
|
+
retval = minimumLimit;
|
|
188
|
+
} else if (value > maximumLimit) {
|
|
189
|
+
retval = maximumLimit;
|
|
190
|
+
} else {
|
|
191
|
+
retval = value;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return retval;
|
|
195
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { default } from "./FrontPanelNumberEntry";
|
|
9
|
+
|
|
10
|
+
export { default as FrontPanelNumberEntryProps } from "./FrontPanelNumberEntry.props";
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { EndpointAddressProps } from "../types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Interface for the properties of the `FrontPanelToggleButton` component.
|
|
12
|
+
*/
|
|
13
|
+
interface FrontPanelPushButtonProps {
|
|
14
|
+
/**
|
|
15
|
+
* Address of the frontpanel endpoint
|
|
16
|
+
*/
|
|
17
|
+
fpEndpoint: EndpointAddressProps;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default FrontPanelPushButtonProps;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
9
|
+
|
|
10
|
+
import withApplication from "../../stories/decorators/Application.decorator";
|
|
11
|
+
import withFrontPanel from "../../stories/decorators/FrontPanel.decorator";
|
|
12
|
+
|
|
13
|
+
import FrontPanelPushButton from "./FrontPanelPushButton";
|
|
14
|
+
|
|
15
|
+
// Configure Story metadata
|
|
16
|
+
const meta = {
|
|
17
|
+
title: "Components/FrontPanel/FrontPanelPushButton",
|
|
18
|
+
component: FrontPanelPushButton,
|
|
19
|
+
parameters: {
|
|
20
|
+
layout: "centered" // Center the component in the Canvas
|
|
21
|
+
},
|
|
22
|
+
tags: ["autodocs"], // Automatically generate documentation
|
|
23
|
+
argTypes: {
|
|
24
|
+
size: {
|
|
25
|
+
control: { type: "range", min: 1, max: 3, step: 1 }
|
|
26
|
+
},
|
|
27
|
+
disabled: { control: "boolean" }
|
|
28
|
+
}
|
|
29
|
+
} satisfies Meta<typeof FrontPanelPushButton>;
|
|
30
|
+
|
|
31
|
+
export default meta;
|
|
32
|
+
|
|
33
|
+
type Story = StoryObj<typeof meta>;
|
|
34
|
+
|
|
35
|
+
// Primary Story
|
|
36
|
+
export const Primary: Story = {
|
|
37
|
+
decorators: [withApplication, withFrontPanel],
|
|
38
|
+
args: {
|
|
39
|
+
label: "Pushbutton",
|
|
40
|
+
fpEndpoint: { epAddress: 0x00, bitOffset: 1 },
|
|
41
|
+
// Optional Properties
|
|
42
|
+
disabled: false,
|
|
43
|
+
size: 1,
|
|
44
|
+
tooltip: "Wire endpoint assert button"
|
|
45
|
+
}
|
|
46
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React from "react";
|
|
9
|
+
|
|
10
|
+
import { Button } from "../../primitives";
|
|
11
|
+
|
|
12
|
+
import FrontPanelPushButtonProps from "./FrontPanelPushButton.props";
|
|
13
|
+
|
|
14
|
+
import { FrontPanelContext } from "../../contexts";
|
|
15
|
+
|
|
16
|
+
type FrontPanelPushButtonElement = React.ElementRef<typeof Button>;
|
|
17
|
+
|
|
18
|
+
interface FrontPanelPushButtonCombinedProps
|
|
19
|
+
extends Omit<
|
|
20
|
+
React.ComponentPropsWithoutRef<typeof Button>,
|
|
21
|
+
"asChild" | "onButtonClick" | "onButtonDown" | "onButtonUp"
|
|
22
|
+
>,
|
|
23
|
+
FrontPanelPushButtonProps {}
|
|
24
|
+
|
|
25
|
+
export type { FrontPanelPushButtonCombinedProps };
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* `FrontPanelPushButton` is a React component that renders a push button that asserts a WireIn endpoint
|
|
29
|
+
* when pressed and deasserts it when released.
|
|
30
|
+
*
|
|
31
|
+
* @component
|
|
32
|
+
* @param {object} props - Properties passed to component
|
|
33
|
+
* @param {React.Ref} forwardedRef - Forwarded ref for the button
|
|
34
|
+
*
|
|
35
|
+
* @returns {React.Node} The rendered FrontPanelPushButton component
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```jsx
|
|
39
|
+
* <FrontPanelPushButton
|
|
40
|
+
* label="Pushbutton"
|
|
41
|
+
* fpEndpoint={{epAddress: 0x00, bitOffset: 1}} />
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
const FrontPanelPushButton = React.forwardRef<
|
|
45
|
+
FrontPanelPushButtonElement,
|
|
46
|
+
FrontPanelPushButtonCombinedProps
|
|
47
|
+
>((props, forwardedRef) => {
|
|
48
|
+
const { device, workQueue } = React.useContext(FrontPanelContext);
|
|
49
|
+
|
|
50
|
+
const { fpEndpoint, ...buttonProps } = props;
|
|
51
|
+
|
|
52
|
+
const targetWireBitMask = 1 << fpEndpoint.bitOffset;
|
|
53
|
+
|
|
54
|
+
const onButtonUp = React.useCallback(async (): Promise<void> => {
|
|
55
|
+
await workQueue.Post(async () => {
|
|
56
|
+
await device.setWireInValue(fpEndpoint.epAddress, 0, targetWireBitMask);
|
|
57
|
+
await device.updateWireIns();
|
|
58
|
+
});
|
|
59
|
+
}, [device, fpEndpoint, targetWireBitMask, workQueue]);
|
|
60
|
+
|
|
61
|
+
const onButtonDown = React.useCallback(async (): Promise<void> => {
|
|
62
|
+
await workQueue.Post(async () => {
|
|
63
|
+
await device.setWireInValue(fpEndpoint.epAddress, 0xffffffff, targetWireBitMask);
|
|
64
|
+
await device.updateWireIns();
|
|
65
|
+
});
|
|
66
|
+
}, [device, fpEndpoint, targetWireBitMask, workQueue]);
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<Button
|
|
70
|
+
{...buttonProps}
|
|
71
|
+
ref={forwardedRef}
|
|
72
|
+
onButtonUp={onButtonUp}
|
|
73
|
+
onButtonDown={onButtonDown}
|
|
74
|
+
/>
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
FrontPanelPushButton.displayName = "FrontPanelPushButton";
|
|
79
|
+
|
|
80
|
+
export default FrontPanelPushButton;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { default } from "./FrontPanelPushButton";
|
|
9
|
+
|
|
10
|
+
export { default as FrontPanelPushButtonProps } from "./FrontPanelPushButton.props";
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { EndpointAddressProps } from "../types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Interface for the properties of the `FrontPanelRangeSlider` component.
|
|
12
|
+
*/
|
|
13
|
+
interface FrontPanelRangeSliderProps {
|
|
14
|
+
/**
|
|
15
|
+
* Address of the frontpanel endpoint
|
|
16
|
+
*/
|
|
17
|
+
fpEndpoint: EndpointAddressProps;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Maximum value that the range slider will allow
|
|
21
|
+
*/
|
|
22
|
+
maximumValue: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default FrontPanelRangeSliderProps;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2024 Opal Kelly Incorporated
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the FrontPanel license.
|
|
5
|
+
* See the LICENSE file found in the root directory of this project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React, { useContext } from "react";
|
|
9
|
+
|
|
10
|
+
import type { Meta, StoryObj, Decorator } from "@storybook/react";
|
|
11
|
+
|
|
12
|
+
import withApplication from "../../stories/decorators/Application.decorator";
|
|
13
|
+
import withFrontPanel from "../../stories/decorators/FrontPanel.decorator";
|
|
14
|
+
|
|
15
|
+
import FrontPanelRangeSlider from "./FrontPanelRangeSlider";
|
|
16
|
+
|
|
17
|
+
import { FrontPanelContext } from "../../contexts";
|
|
18
|
+
|
|
19
|
+
import { WireValue } from "@opalkelly/frontpanel-alloy-core";
|
|
20
|
+
|
|
21
|
+
// Configure Story metadata
|
|
22
|
+
const meta = {
|
|
23
|
+
title: "Components/FrontPanel/FrontPanelRangeSlider",
|
|
24
|
+
component: FrontPanelRangeSlider,
|
|
25
|
+
parameters: {
|
|
26
|
+
layout: "centered" // Center the component in the Canvas
|
|
27
|
+
},
|
|
28
|
+
tags: ["autodocs"], // Automatically generate documentation
|
|
29
|
+
argTypes: {
|
|
30
|
+
maximumValue: {
|
|
31
|
+
control: { type: "number", step: 1 }
|
|
32
|
+
},
|
|
33
|
+
minimumValue: {
|
|
34
|
+
control: { type: "number", step: 1 }
|
|
35
|
+
},
|
|
36
|
+
valueStep: {
|
|
37
|
+
control: { type: "number", step: 1 }
|
|
38
|
+
},
|
|
39
|
+
disabled: { control: "boolean" },
|
|
40
|
+
showThumbLabel: { type: "boolean" },
|
|
41
|
+
showTrackLabels: { type: "boolean" }
|
|
42
|
+
}
|
|
43
|
+
} satisfies Meta<typeof FrontPanelRangeSlider>;
|
|
44
|
+
|
|
45
|
+
export default meta;
|
|
46
|
+
|
|
47
|
+
type Story = StoryObj<typeof meta>;
|
|
48
|
+
|
|
49
|
+
const withContainer: Decorator = (Story) => (
|
|
50
|
+
<div style={{ width: "200px" }}>
|
|
51
|
+
<Story />
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// Primary Story
|
|
56
|
+
export const Primary: Story = {
|
|
57
|
+
render: (props) => {
|
|
58
|
+
const { device, workQueue } = useContext(FrontPanelContext);
|
|
59
|
+
|
|
60
|
+
const setWireInPromises: Promise<void>[] = [];
|
|
61
|
+
|
|
62
|
+
workQueue.Post(async (): Promise<void> => {
|
|
63
|
+
let byteId = 0;
|
|
64
|
+
|
|
65
|
+
for (let address = 0x0; address < 0x20; address++) {
|
|
66
|
+
let wireValue: WireValue = byteId++;
|
|
67
|
+
for (let byteIndex = 1; byteIndex < 4; byteIndex++) {
|
|
68
|
+
wireValue |= byteId++ << (8 * byteIndex);
|
|
69
|
+
}
|
|
70
|
+
setWireInPromises.push(device.setWireInValue(address, wireValue, 0xffffffff));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
await Promise.all(setWireInPromises);
|
|
74
|
+
await device.updateWireIns();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
return <FrontPanelRangeSlider {...props} />;
|
|
78
|
+
},
|
|
79
|
+
decorators: [withApplication, withFrontPanel, withContainer],
|
|
80
|
+
args: {
|
|
81
|
+
fpEndpoint: { epAddress: 0x00, bitOffset: 1 },
|
|
82
|
+
// Optional Properties
|
|
83
|
+
maximumValue: 100,
|
|
84
|
+
minimumValue: 0,
|
|
85
|
+
valueStep: 1,
|
|
86
|
+
showTrackLabels: true,
|
|
87
|
+
showThumbLabel: true,
|
|
88
|
+
disabled: false,
|
|
89
|
+
label: { text: "RangeSlider" },
|
|
90
|
+
tooltip: "Wire endpoint Range slider tooltip"
|
|
91
|
+
}
|
|
92
|
+
};
|