@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,108 @@
|
|
|
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 { RangeSlider } from "../../primitives";
|
|
11
|
+
|
|
12
|
+
import FrontPanelRangeSliderProps from "./FrontPanelRangeSlider.props";
|
|
13
|
+
|
|
14
|
+
import { FrontPanelContext } from "../../contexts";
|
|
15
|
+
|
|
16
|
+
import { CalculateBitLength } from "../../core";
|
|
17
|
+
|
|
18
|
+
import { IFrontPanel } from "@opalkelly/frontpanel-alloy-core";
|
|
19
|
+
|
|
20
|
+
type FrontPanelRangeSliderElement = React.ElementRef<typeof RangeSlider>;
|
|
21
|
+
|
|
22
|
+
interface FrontPanelRangeSliderCombinedProps
|
|
23
|
+
extends Omit<
|
|
24
|
+
React.ComponentPropsWithoutRef<typeof RangeSlider>,
|
|
25
|
+
"defaultValue" | "value" | "maximumValue" | "onValueChange" | "onValueCommit"
|
|
26
|
+
>,
|
|
27
|
+
FrontPanelRangeSliderProps {}
|
|
28
|
+
|
|
29
|
+
export type { FrontPanelRangeSliderCombinedProps };
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `FrontPanelRangeSlider` is a React component that renders a range slider to allow setting the value of a WireIn endpoint
|
|
33
|
+
* within a specified range of values by clicking and dragging the slider thumb or by using the arrow keys.
|
|
34
|
+
*
|
|
35
|
+
* @component
|
|
36
|
+
* @param {object} props - Properties passed to component
|
|
37
|
+
* @param {React.Ref} forwardedRef - Forwarded ref for the range slider
|
|
38
|
+
*
|
|
39
|
+
* @returns {React.Node} The rendered FrontPanelRangeSlider component
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```jsx
|
|
43
|
+
* <FrontPanelRangeSlider
|
|
44
|
+
* fpEndpoint={{epAddress: 0x00, bitOffset: 1}}
|
|
45
|
+
* maximumValue=0xff />
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
const FrontPanelRangeSlider = React.forwardRef<
|
|
49
|
+
FrontPanelRangeSliderElement,
|
|
50
|
+
FrontPanelRangeSliderCombinedProps
|
|
51
|
+
>((props, forwardedRef) => {
|
|
52
|
+
const [value, setValue] = React.useState<bigint>(0n);
|
|
53
|
+
|
|
54
|
+
const { device, workQueue } = React.useContext(FrontPanelContext);
|
|
55
|
+
|
|
56
|
+
const { fpEndpoint, maximumValue, ...rootProps } = props;
|
|
57
|
+
|
|
58
|
+
const targetBitLength: number = React.useMemo(() => {
|
|
59
|
+
return CalculateBitLength(BigInt(maximumValue));
|
|
60
|
+
}, [maximumValue]);
|
|
61
|
+
|
|
62
|
+
const targetWireBitMask =
|
|
63
|
+
((1n << BigInt(targetBitLength)) - 1n) << BigInt(fpEndpoint.bitOffset);
|
|
64
|
+
|
|
65
|
+
const onUpdateWireValue = React.useCallback(
|
|
66
|
+
async (sender: IFrontPanel): Promise<void> => {
|
|
67
|
+
await workQueue.Post(async () => {
|
|
68
|
+
const sourceWireValue = await sender.getWireInValue(fpEndpoint.epAddress);
|
|
69
|
+
const sourceValue =
|
|
70
|
+
(BigInt(sourceWireValue) & targetWireBitMask) >> BigInt(fpEndpoint.bitOffset);
|
|
71
|
+
setValue(sourceValue);
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
[fpEndpoint, targetWireBitMask]
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const onSelectedValueChangeHandler = React.useCallback(
|
|
78
|
+
(value: number) => {
|
|
79
|
+
workQueue.Post(async () => {
|
|
80
|
+
await device.setWireInValue(
|
|
81
|
+
fpEndpoint.epAddress,
|
|
82
|
+
value << fpEndpoint.bitOffset,
|
|
83
|
+
Number(targetWireBitMask)
|
|
84
|
+
);
|
|
85
|
+
await device.updateWireIns();
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
[device, fpEndpoint, workQueue, targetWireBitMask]
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
React.useEffect(() => {
|
|
92
|
+
onUpdateWireValue(device);
|
|
93
|
+
}, [device, onUpdateWireValue]);
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<RangeSlider
|
|
97
|
+
{...rootProps}
|
|
98
|
+
ref={forwardedRef}
|
|
99
|
+
defaultValue={Number(value)}
|
|
100
|
+
maximumValue={maximumValue}
|
|
101
|
+
onValueChange={onSelectedValueChangeHandler}
|
|
102
|
+
/>
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
FrontPanelRangeSlider.displayName = "FrontPanelRangeSlider";
|
|
107
|
+
|
|
108
|
+
export default FrontPanelRangeSlider;
|
|
@@ -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 "./FrontPanelRangeSlider";
|
|
9
|
+
|
|
10
|
+
export { default as FrontPanelRangeSliderProps } from "./FrontPanelRangeSlider.props";
|
|
File without changes
|
|
@@ -0,0 +1,107 @@
|
|
|
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 FrontPanelSelectEntry from "./FrontPanelSelectEntry";
|
|
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/FrontPanelSelectEntry",
|
|
24
|
+
component: FrontPanelSelectEntry.Root,
|
|
25
|
+
parameters: {
|
|
26
|
+
layout: "centered" // Center the component in the Canvas
|
|
27
|
+
},
|
|
28
|
+
tags: ["autodocs"], // Automatically generate documentation
|
|
29
|
+
argTypes: {
|
|
30
|
+
size: {
|
|
31
|
+
control: { type: "range", min: 1, max: 3, step: 1 }
|
|
32
|
+
},
|
|
33
|
+
disabled: { control: "boolean" }
|
|
34
|
+
}
|
|
35
|
+
} satisfies Meta<typeof FrontPanelSelectEntry.Root>;
|
|
36
|
+
|
|
37
|
+
export default meta;
|
|
38
|
+
|
|
39
|
+
type Story = StoryObj<typeof meta>;
|
|
40
|
+
|
|
41
|
+
// Primary Story
|
|
42
|
+
export const Primary: Story = {
|
|
43
|
+
render: ({ ...args }) => {
|
|
44
|
+
const { device, workQueue } = useContext(FrontPanelContext);
|
|
45
|
+
|
|
46
|
+
const setWireInPromises: Promise<void>[] = [];
|
|
47
|
+
|
|
48
|
+
// Initialize the WireIns with unique values.
|
|
49
|
+
workQueue.Post(async (): Promise<void> => {
|
|
50
|
+
let byteId = 0;
|
|
51
|
+
|
|
52
|
+
for (let address = 0x0; address < 0x20; address++) {
|
|
53
|
+
let wireValue: WireValue = byteId++;
|
|
54
|
+
for (let byteIndex = 1; byteIndex < 4; byteIndex++) {
|
|
55
|
+
wireValue |= byteId++ << (8 * byteIndex);
|
|
56
|
+
}
|
|
57
|
+
setWireInPromises.push(device.setWireInValue(address, wireValue, 0xffffffff));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
await Promise.all(setWireInPromises);
|
|
61
|
+
await device.updateWireIns();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const { maximumValue, ...props } = args;
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<FrontPanelSelectEntry.Root maximumValue={0xffffffffn} {...props}>
|
|
68
|
+
<FrontPanelSelectEntry.Trigger />
|
|
69
|
+
<FrontPanelSelectEntry.Content>
|
|
70
|
+
<FrontPanelSelectEntry.Group>
|
|
71
|
+
<FrontPanelSelectEntry.Label>Fruit Group</FrontPanelSelectEntry.Label>
|
|
72
|
+
<FrontPanelSelectEntry.Item value="0">Apple</FrontPanelSelectEntry.Item>
|
|
73
|
+
<FrontPanelSelectEntry.Item value="4294967295">
|
|
74
|
+
Orange
|
|
75
|
+
</FrontPanelSelectEntry.Item>
|
|
76
|
+
<FrontPanelSelectEntry.Item value="3740249613" disabled>
|
|
77
|
+
Grape
|
|
78
|
+
</FrontPanelSelectEntry.Item>
|
|
79
|
+
</FrontPanelSelectEntry.Group>
|
|
80
|
+
<FrontPanelSelectEntry.Separator />
|
|
81
|
+
<FrontPanelSelectEntry.Group>
|
|
82
|
+
<FrontPanelSelectEntry.Label>Vegetable Group</FrontPanelSelectEntry.Label>
|
|
83
|
+
<FrontPanelSelectEntry.Item value="3735928559">
|
|
84
|
+
Carrot
|
|
85
|
+
</FrontPanelSelectEntry.Item>
|
|
86
|
+
<FrontPanelSelectEntry.Item value="4272750592">
|
|
87
|
+
Potato
|
|
88
|
+
</FrontPanelSelectEntry.Item>
|
|
89
|
+
</FrontPanelSelectEntry.Group>
|
|
90
|
+
</FrontPanelSelectEntry.Content>
|
|
91
|
+
</FrontPanelSelectEntry.Root>
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
decorators: [withApplication, withFrontPanel],
|
|
95
|
+
args: {
|
|
96
|
+
fpEndpoint: { epAddress: 0x00, bitOffset: 1 },
|
|
97
|
+
// Optional Properties
|
|
98
|
+
disabled: false,
|
|
99
|
+
label: {
|
|
100
|
+
text: "Select Item",
|
|
101
|
+
verticalPosition: "top",
|
|
102
|
+
horizontalPosition: "left"
|
|
103
|
+
},
|
|
104
|
+
size: 1,
|
|
105
|
+
tooltip: "Select an item from the list"
|
|
106
|
+
}
|
|
107
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
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 FrontPanelSelectEntryRoot from "./FrontPanelSelectEntryRoot";
|
|
9
|
+
|
|
10
|
+
import SelectEntryContent from "../../primitives/SelectEntry/SelectEntryContent";
|
|
11
|
+
import SelectEntryGroup from "../../primitives/SelectEntry/SelectEntryGroup";
|
|
12
|
+
import SelectEntryItem from "../../primitives/SelectEntry/SelectEntryItem";
|
|
13
|
+
import SelectEntryLabel from "../../primitives/SelectEntry/SelectEntryLabel";
|
|
14
|
+
import SelectEntrySeparator from "../../primitives/SelectEntry/SelectEntrySeparator";
|
|
15
|
+
import SelectEntryTrigger from "../../primitives/SelectEntry/SelectEntryTrigger";
|
|
16
|
+
|
|
17
|
+
const FrontPanelSelectEntry = Object.assign(
|
|
18
|
+
{},
|
|
19
|
+
{
|
|
20
|
+
Root: FrontPanelSelectEntryRoot,
|
|
21
|
+
Trigger: SelectEntryTrigger,
|
|
22
|
+
Content: SelectEntryContent,
|
|
23
|
+
Item: SelectEntryItem,
|
|
24
|
+
Group: SelectEntryGroup,
|
|
25
|
+
Label: SelectEntryLabel,
|
|
26
|
+
Separator: SelectEntrySeparator
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
export default FrontPanelSelectEntry;
|
|
@@ -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 `FrontPanelSelectEntryRoot` component.
|
|
12
|
+
*/
|
|
13
|
+
interface FrontPanelSelectEntryRootProps {
|
|
14
|
+
/**
|
|
15
|
+
* Address of the frontpanel endpoint
|
|
16
|
+
*/
|
|
17
|
+
fpEndpoint: EndpointAddressProps;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Maximum value that the select entry will allow
|
|
21
|
+
*/
|
|
22
|
+
maximumValue: bigint;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default FrontPanelSelectEntryRootProps;
|
|
@@ -0,0 +1,175 @@
|
|
|
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 { SelectEntry } from "../../primitives";
|
|
11
|
+
|
|
12
|
+
import FrontPanelSelectEntryRootProps from "./FrontPanelSelectEntryRoot.props";
|
|
13
|
+
|
|
14
|
+
import { FrontPanelContext } from "../../contexts";
|
|
15
|
+
|
|
16
|
+
import { CalculateBitLength } from "../../core";
|
|
17
|
+
|
|
18
|
+
import { IFrontPanel, WIREIN_ADDRESS_RANGE } from "@opalkelly/frontpanel-alloy-core";
|
|
19
|
+
|
|
20
|
+
interface FrontPanelSelectEntryRootCombinedProps
|
|
21
|
+
extends React.ComponentPropsWithoutRef<typeof SelectEntry.Root>,
|
|
22
|
+
FrontPanelSelectEntryRootProps {}
|
|
23
|
+
|
|
24
|
+
export type { FrontPanelSelectEntryRootCombinedProps };
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* `FrontPanelSelectEntryRoot` is a React component that is the root component of a select entry that
|
|
28
|
+
* allows setting a WireIn endpoint. The children of this component are used to specify the component
|
|
29
|
+
* parts. The parts include the trigger that can be clicked on to show a list of options to select from,
|
|
30
|
+
* and the content that is the list of options.
|
|
31
|
+
*
|
|
32
|
+
* @component
|
|
33
|
+
* @param {object} props - Properties passed to component
|
|
34
|
+
* @param {object} rootProps - Any additional properties to pass to the root component
|
|
35
|
+
*
|
|
36
|
+
* @returns {React.Node} The rendered FrontPanelSelectEntryRoot component
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```jsx
|
|
40
|
+
* <FrontPanelSelectEntryRoot
|
|
41
|
+
* fpEndpoint={{epAddress: 0x00, bitOffset: 1}}
|
|
42
|
+
* maximumValue=2 />
|
|
43
|
+
* <FrontPanelSelectEntry.Trigger />
|
|
44
|
+
* <FrontPanelSelectEntry.Content>
|
|
45
|
+
* <FrontPanelSelectEntry.Group>
|
|
46
|
+
* <FrontPanelSelectEntry.Label>Options</FrontPanelSelectEntry.Label>
|
|
47
|
+
* <FrontPanelSelectEntry.Item value="0">Option 0</FrontPanelSelectEntry.Option>
|
|
48
|
+
* <FrontPanelSelectEntry.Item value="1">Option 1</FrontPanelSelectEntry.Option>
|
|
49
|
+
* <FrontPanelSelectEntry.Item value="2">Option 2</FrontPanelSelectEntry.Option>
|
|
50
|
+
* </FrontPanelSelectEntry.Group>
|
|
51
|
+
* </FrontPanelSelectEntry.Content>
|
|
52
|
+
* </FrontPanelSelectEntryRoot>
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
const FrontPanelSelectEntryRoot: React.FC<FrontPanelSelectEntryRootCombinedProps> = (props) => {
|
|
56
|
+
const [value, setValue] = React.useState<bigint>(0n);
|
|
57
|
+
|
|
58
|
+
const { device, workQueue } = React.useContext(FrontPanelContext);
|
|
59
|
+
|
|
60
|
+
const { fpEndpoint, maximumValue, ...rootProps } = props;
|
|
61
|
+
|
|
62
|
+
const targetBitLength: number = React.useMemo(() => {
|
|
63
|
+
return CalculateBitLength(maximumValue);
|
|
64
|
+
}, [maximumValue]);
|
|
65
|
+
|
|
66
|
+
const targetWireSpanBitMask =
|
|
67
|
+
((1n << BigInt(targetBitLength)) - 1n) << BigInt(fpEndpoint.bitOffset);
|
|
68
|
+
|
|
69
|
+
const onUpdateWireValue = React.useCallback(
|
|
70
|
+
async (sender: IFrontPanel): Promise<void> => {
|
|
71
|
+
await workQueue.Post(async () => {
|
|
72
|
+
// Get the wire value for the endpoint
|
|
73
|
+
let sourceWireValue = await sender.getWireInValue(fpEndpoint.epAddress);
|
|
74
|
+
let targetWireBitMask = targetWireSpanBitMask & 0xffffffffn;
|
|
75
|
+
let sourceSpanValue =
|
|
76
|
+
(BigInt(sourceWireValue) & targetWireBitMask) >> BigInt(fpEndpoint.bitOffset);
|
|
77
|
+
|
|
78
|
+
if (targetWireSpanBitMask > 0xffffffffn) {
|
|
79
|
+
// The operations spans multiple endpoints
|
|
80
|
+
let currentWireSpanBitOffset = 32n - BigInt(fpEndpoint.bitOffset);
|
|
81
|
+
let currentWireSpanBitMask = targetWireSpanBitMask >> 32n;
|
|
82
|
+
|
|
83
|
+
for (
|
|
84
|
+
let sourceWireAddress = fpEndpoint.epAddress + 1;
|
|
85
|
+
sourceWireAddress <= WIREIN_ADDRESS_RANGE.Maximum &&
|
|
86
|
+
currentWireSpanBitMask > 0n;
|
|
87
|
+
sourceWireAddress++
|
|
88
|
+
) {
|
|
89
|
+
// Get the wire value for the next endpoint
|
|
90
|
+
sourceWireValue = await sender.getWireInValue(sourceWireAddress);
|
|
91
|
+
targetWireBitMask = currentWireSpanBitMask & 0xffffffffn;
|
|
92
|
+
sourceSpanValue |=
|
|
93
|
+
(BigInt(sourceWireValue) & targetWireBitMask) <<
|
|
94
|
+
currentWireSpanBitOffset;
|
|
95
|
+
|
|
96
|
+
currentWireSpanBitOffset += 32n;
|
|
97
|
+
currentWireSpanBitMask >>= 32n;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
setValue(sourceSpanValue);
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
[fpEndpoint, targetWireSpanBitMask]
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const onSelectedValueChangeHandler = React.useCallback(
|
|
108
|
+
(value: string) => {
|
|
109
|
+
const targetWireSpanValue = BigInt(value);
|
|
110
|
+
workQueue.Post(async () => {
|
|
111
|
+
let targetWireBitMask = targetWireSpanBitMask & 0xffffffffn;
|
|
112
|
+
let targetWireValue = Number(
|
|
113
|
+
(targetWireSpanValue << BigInt(fpEndpoint.bitOffset)) & targetWireBitMask
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
// Set the wire value for the endpoint
|
|
117
|
+
await device.setWireInValue(
|
|
118
|
+
fpEndpoint.epAddress,
|
|
119
|
+
targetWireValue,
|
|
120
|
+
Number(targetWireBitMask)
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
if (targetWireSpanBitMask > 0xffffffffn) {
|
|
124
|
+
// The operations spans multiple endpoints
|
|
125
|
+
let currentWireSpanBitOffset = 32n - BigInt(fpEndpoint.bitOffset);
|
|
126
|
+
let currentWireSpanBitMask = targetWireSpanBitMask >> 32n;
|
|
127
|
+
|
|
128
|
+
const maxWireCount = 0x20 - fpEndpoint.epAddress;
|
|
129
|
+
|
|
130
|
+
for (
|
|
131
|
+
let wireIndex = 1;
|
|
132
|
+
wireIndex < maxWireCount && currentWireSpanBitMask > 0n;
|
|
133
|
+
wireIndex++
|
|
134
|
+
) {
|
|
135
|
+
targetWireBitMask = currentWireSpanBitMask & 0xffffffffn;
|
|
136
|
+
targetWireValue = Number(
|
|
137
|
+
(targetWireSpanValue >> currentWireSpanBitOffset) & targetWireBitMask
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Set the wire value for the next endpoint
|
|
141
|
+
await device.setWireInValue(
|
|
142
|
+
fpEndpoint.epAddress + wireIndex,
|
|
143
|
+
targetWireValue,
|
|
144
|
+
Number(targetWireBitMask)
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
currentWireSpanBitOffset += 32n;
|
|
148
|
+
currentWireSpanBitMask >>= 32n;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
await device.updateWireIns();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
onUpdateWireValue(device);
|
|
156
|
+
},
|
|
157
|
+
[device, fpEndpoint, workQueue, onUpdateWireValue]
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
React.useEffect(() => {
|
|
161
|
+
onUpdateWireValue(device);
|
|
162
|
+
}, [device, onUpdateWireValue]);
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<SelectEntry.Root
|
|
166
|
+
{...rootProps}
|
|
167
|
+
value={value.toString()}
|
|
168
|
+
onValueChange={onSelectedValueChangeHandler}
|
|
169
|
+
/>
|
|
170
|
+
);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
FrontPanelSelectEntryRoot.displayName = "FrontPanelSelectEntryRoot";
|
|
174
|
+
|
|
175
|
+
export default FrontPanelSelectEntryRoot;
|
|
@@ -0,0 +1,17 @@
|
|
|
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 as FrontPanelSelectEntry } from "./FrontPanelSelectEntry";
|
|
9
|
+
export { default as FrontPanelSelectEntryRoot } from "./FrontPanelSelectEntryRoot";
|
|
10
|
+
export { default as FrontPanelSelectEntryTrigger } from "../../primitives/SelectEntry/SelectEntryTrigger";
|
|
11
|
+
export { default as FrontPanelSelectEntryContent } from "../../primitives/SelectEntry/SelectEntryContent";
|
|
12
|
+
export { default as FrontPanelSelectEntryItem } from "../../primitives/SelectEntry/SelectEntryItem";
|
|
13
|
+
export { default as FrontPanelSelectEntryGroup } from "../../primitives/SelectEntry/SelectEntryGroup";
|
|
14
|
+
export { default as FrontPanelSelectEntryLabel } from "../../primitives/SelectEntry/SelectEntryLabel";
|
|
15
|
+
export { default as FrontPanelSelectEntrySeparator } from "../../primitives/SelectEntry/SelectEntrySeparator";
|
|
16
|
+
|
|
17
|
+
export { default as FrontPanelSelectEntryRootProps } from "./FrontPanelSelectEntryRoot.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 `FrontPanelToggleSwitch` component.
|
|
12
|
+
*/
|
|
13
|
+
interface FrontPanelToggleSwitchProps {
|
|
14
|
+
/**
|
|
15
|
+
* Address of the frontpanel endpoint
|
|
16
|
+
*/
|
|
17
|
+
fpEndpoint: EndpointAddressProps;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default FrontPanelToggleSwitchProps;
|
|
@@ -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 FrontPanelToggleSwitch from "./FrontPanelToggleSwitch";
|
|
14
|
+
|
|
15
|
+
// Configure Story metadata
|
|
16
|
+
const meta = {
|
|
17
|
+
title: "Components/FrontPanel/FrontPanelToggleSwitch",
|
|
18
|
+
component: FrontPanelToggleSwitch,
|
|
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 FrontPanelToggleSwitch>;
|
|
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: "Toggle Wire",
|
|
40
|
+
fpEndpoint: { epAddress: 0x00, bitOffset: 1 },
|
|
41
|
+
// Optional Properties
|
|
42
|
+
disabled: false,
|
|
43
|
+
size: 1,
|
|
44
|
+
tooltip: "Wire endpoint toggle switch"
|
|
45
|
+
}
|
|
46
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
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 { IFrontPanel, WireValue } from "@opalkelly/frontpanel-alloy-core";
|
|
11
|
+
|
|
12
|
+
import { ToggleState } from "../../core";
|
|
13
|
+
|
|
14
|
+
import { ToggleSwitch } from "../../primitives";
|
|
15
|
+
|
|
16
|
+
import { FrontPanelContext } from "../../contexts";
|
|
17
|
+
|
|
18
|
+
import FrontPanelToggleSwitchProps from "./FrontPanelToggleSwitch.props";
|
|
19
|
+
|
|
20
|
+
type FrontPanelToggleSwitchElement = React.ElementRef<typeof ToggleSwitch>;
|
|
21
|
+
|
|
22
|
+
interface FrontPanelToggleSwitchCombinedProps
|
|
23
|
+
extends Omit<
|
|
24
|
+
React.ComponentPropsWithoutRef<typeof ToggleSwitch>,
|
|
25
|
+
"state" | "onToggleStateChanged"
|
|
26
|
+
>,
|
|
27
|
+
FrontPanelToggleSwitchProps {}
|
|
28
|
+
|
|
29
|
+
export type { FrontPanelToggleSwitchCombinedProps };
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `FrontPanelToggleSwitch` is a React component that renders a toggle switch with an optional label and or tooltip
|
|
33
|
+
* to toggle the state of a WireIn endpoint.
|
|
34
|
+
*
|
|
35
|
+
* @component
|
|
36
|
+
* @param {Object} props - The properties that define the `FrontPanelToggleSwitch` component.
|
|
37
|
+
* @param {React.Ref<FrontPanelToggleSwitchElement>} forwardedRef - A ref that is forwarded to the `FrontPanelToggleSwitch` component.
|
|
38
|
+
*
|
|
39
|
+
* @returns {React.ReactElement} The `FrontPanelToggleSwitch` component.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```jsx
|
|
43
|
+
* <FrontPanelToggleSwitch
|
|
44
|
+
* label="Toggle"
|
|
45
|
+
* fpEndpoint={{epAddress: 0x00, bitOffset: 1}} />
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
const FrontPanelToggleSwitch = React.forwardRef<
|
|
49
|
+
FrontPanelToggleSwitchElement,
|
|
50
|
+
FrontPanelToggleSwitchCombinedProps
|
|
51
|
+
>((props, forwardedRef) => {
|
|
52
|
+
const [state, setState] = React.useState<ToggleState>(ToggleState.Off);
|
|
53
|
+
|
|
54
|
+
const { device, workQueue } = React.useContext(FrontPanelContext);
|
|
55
|
+
|
|
56
|
+
const { fpEndpoint, ...buttonProps } = props;
|
|
57
|
+
|
|
58
|
+
const targetWireBitMask = 1 << fpEndpoint.bitOffset;
|
|
59
|
+
|
|
60
|
+
const onUpdateWireValue = React.useCallback(
|
|
61
|
+
async (sender: IFrontPanel): Promise<void> => {
|
|
62
|
+
await workQueue.Post(async () => {
|
|
63
|
+
// Set the toggle state based on the value of the target bit of the Wire endpoint
|
|
64
|
+
const sourceWireValue = await sender.getWireInValue(fpEndpoint.epAddress);
|
|
65
|
+
const sourceBitValue = (sourceWireValue & targetWireBitMask) === targetWireBitMask;
|
|
66
|
+
const newToggleState = sourceBitValue ? ToggleState.On : ToggleState.Off;
|
|
67
|
+
setState(newToggleState);
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
[fpEndpoint, targetWireBitMask]
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const onToggleStateChanged = React.useCallback(
|
|
74
|
+
async (state: ToggleState): Promise<void> => {
|
|
75
|
+
await workQueue.Post(async () => {
|
|
76
|
+
// Set the value of the target bit of the Wire endpoint based on the toggle state
|
|
77
|
+
const targetWireValue: WireValue = state === ToggleState.On ? 0xffffffff : 0;
|
|
78
|
+
|
|
79
|
+
await device.setWireInValue(
|
|
80
|
+
fpEndpoint.epAddress,
|
|
81
|
+
targetWireValue,
|
|
82
|
+
targetWireBitMask
|
|
83
|
+
);
|
|
84
|
+
await device.updateWireIns();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
onUpdateWireValue(device);
|
|
88
|
+
},
|
|
89
|
+
[device, fpEndpoint, targetWireBitMask, workQueue]
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
React.useEffect(() => {
|
|
93
|
+
onUpdateWireValue(device);
|
|
94
|
+
}, [device, onUpdateWireValue]);
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<ToggleSwitch
|
|
98
|
+
ref={forwardedRef}
|
|
99
|
+
{...buttonProps}
|
|
100
|
+
state={state}
|
|
101
|
+
onToggleStateChanged={onToggleStateChanged}
|
|
102
|
+
/>
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
FrontPanelToggleSwitch.displayName = "FrontPanelToggleSwitch";
|
|
107
|
+
|
|
108
|
+
export default FrontPanelToggleSwitch;
|
|
@@ -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 "./FrontPanelToggleSwitch";
|
|
9
|
+
|
|
10
|
+
export { default as FrontPanelToggleSwitchProps } from "./FrontPanelToggleSwitch.props";
|
|
File without changes
|