@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,86 @@
|
|
|
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 { NumeralSystem } from "../../core";
|
|
9
|
+
|
|
10
|
+
import { LabelProps } from "../Label";
|
|
11
|
+
|
|
12
|
+
import { DigitEntryVariant } from "../DigitEntry";
|
|
13
|
+
|
|
14
|
+
export type NumberEntrySize = 1 | 2 | 3;
|
|
15
|
+
export type NumberEntryValueChangeEventHandler = (value: bigint) => void;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Interface for the properties of the `NumberEntry` component.
|
|
19
|
+
*/
|
|
20
|
+
interface NumberEntryProps {
|
|
21
|
+
/**
|
|
22
|
+
* Current value of the number entry
|
|
23
|
+
*/
|
|
24
|
+
value: bigint;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Maximum value that can be entered
|
|
28
|
+
*/
|
|
29
|
+
maximumValue: bigint;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Minimum value that can be entered
|
|
33
|
+
*/
|
|
34
|
+
minimumValue: bigint;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Optional CSS class to apply to the number entry
|
|
38
|
+
*/
|
|
39
|
+
className?: string;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Optional decimal scale for the number entry (Only used when numeral system is NumeralSystem.Decimal)
|
|
43
|
+
*/
|
|
44
|
+
decimalScale?: number;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Optional disable the number entry
|
|
48
|
+
* @default false
|
|
49
|
+
*/
|
|
50
|
+
disabled?: boolean;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Optional label properties for the number entry
|
|
54
|
+
*/
|
|
55
|
+
label?: LabelProps;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Optional numeral system to be used for the number entry, defined in NumeralSystem
|
|
59
|
+
* @default Decimal
|
|
60
|
+
*/
|
|
61
|
+
numeralSystem?: NumeralSystem;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Optional Size of the number entry
|
|
65
|
+
* @default 1
|
|
66
|
+
*/
|
|
67
|
+
size?: NumberEntrySize;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Optional tooltip text to be displayed on hover
|
|
71
|
+
*/
|
|
72
|
+
tooltip?: string;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Optional variant of the digit entry
|
|
76
|
+
* @default standard
|
|
77
|
+
*/
|
|
78
|
+
variant?: DigitEntryVariant;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Optional event handler for the value changed event
|
|
82
|
+
*/
|
|
83
|
+
onValueChange?: NumberEntryValueChangeEventHandler;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export default NumberEntryProps;
|
|
@@ -0,0 +1,129 @@
|
|
|
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 type { Meta, StoryObj } from "@storybook/react";
|
|
11
|
+
|
|
12
|
+
import { useArgs } from "@storybook/preview-api";
|
|
13
|
+
|
|
14
|
+
import withApplication from "../../stories/decorators/Application.decorator";
|
|
15
|
+
|
|
16
|
+
import NumberEntry from "./NumberEntry";
|
|
17
|
+
|
|
18
|
+
import { NumeralSystem } from "../../core";
|
|
19
|
+
|
|
20
|
+
// Configure Story metadata
|
|
21
|
+
const meta = {
|
|
22
|
+
title: "Components/NumberEntry",
|
|
23
|
+
component: NumberEntry,
|
|
24
|
+
parameters: {
|
|
25
|
+
layout: "centered" // Center the component in the Canvas
|
|
26
|
+
},
|
|
27
|
+
tags: ["autodocs"], // Automatically generate documentation
|
|
28
|
+
argTypes: {
|
|
29
|
+
variant: {
|
|
30
|
+
control: "radio",
|
|
31
|
+
options: ["standard", "compact"]
|
|
32
|
+
},
|
|
33
|
+
disabled: { control: "boolean" },
|
|
34
|
+
size: {
|
|
35
|
+
control: { type: "range", min: 1, max: 3, step: 1 }
|
|
36
|
+
},
|
|
37
|
+
numeralSystem: {
|
|
38
|
+
control: "radio",
|
|
39
|
+
options: ["Decimal", "Hexadecimal", "Binary", "Octal"],
|
|
40
|
+
mapping: {
|
|
41
|
+
Decimal: NumeralSystem.Decimal,
|
|
42
|
+
Hexadecimal: NumeralSystem.Hexadecimal,
|
|
43
|
+
Binary: NumeralSystem.Binary,
|
|
44
|
+
Octal: NumeralSystem.Octal
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
valueString: { control: "text" },
|
|
48
|
+
maximumValueString: { control: "text" },
|
|
49
|
+
minimumValueString: { control: "text" },
|
|
50
|
+
// Disable event callback arguments
|
|
51
|
+
onValueChange: {
|
|
52
|
+
control: { disable: true }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} satisfies Meta<typeof NumberEntry>;
|
|
56
|
+
|
|
57
|
+
export default meta;
|
|
58
|
+
|
|
59
|
+
type Story = StoryObj<typeof meta>;
|
|
60
|
+
|
|
61
|
+
const convertToBigInt = (value: string) => {
|
|
62
|
+
return BigInt(value);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// Template for Stories
|
|
66
|
+
const ComponentTemplate: Story = {
|
|
67
|
+
render: (args) => {
|
|
68
|
+
const [{ valueString }, updateArgs] = useArgs();
|
|
69
|
+
|
|
70
|
+
const { maximumValueString, minimumValueString } = args;
|
|
71
|
+
|
|
72
|
+
const value = convertToBigInt(valueString);
|
|
73
|
+
const maximum = convertToBigInt(maximumValueString);
|
|
74
|
+
const minimum = convertToBigInt(minimumValueString);
|
|
75
|
+
|
|
76
|
+
function onValueChange(value: bigint): void {
|
|
77
|
+
updateArgs({ valueString: value.toString() });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<NumberEntry
|
|
82
|
+
{...args}
|
|
83
|
+
value={value}
|
|
84
|
+
maximumValue={maximum}
|
|
85
|
+
minimumValue={minimum}
|
|
86
|
+
onValueChange={onValueChange}
|
|
87
|
+
/>
|
|
88
|
+
);
|
|
89
|
+
},
|
|
90
|
+
decorators: [withApplication],
|
|
91
|
+
args: {
|
|
92
|
+
variant: "standard",
|
|
93
|
+
disabled: false,
|
|
94
|
+
label: {
|
|
95
|
+
text: "Value",
|
|
96
|
+
verticalPosition: "top",
|
|
97
|
+
horizontalPosition: "left"
|
|
98
|
+
},
|
|
99
|
+
size: 1,
|
|
100
|
+
tooltip: "Set the value",
|
|
101
|
+
numeralSystem: NumeralSystem.Decimal,
|
|
102
|
+
decimalScale: 3,
|
|
103
|
+
valueString: "8000",
|
|
104
|
+
maximumValueString: "1000000",
|
|
105
|
+
minimumValueString: "-1000000"
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Primary Story
|
|
110
|
+
export const Decimal: Story = {
|
|
111
|
+
...ComponentTemplate,
|
|
112
|
+
args: {
|
|
113
|
+
valueString: "8000",
|
|
114
|
+
maximumValueString: "1000000",
|
|
115
|
+
minimumValueString: "-1000000",
|
|
116
|
+
// Optional Properties
|
|
117
|
+
disabled: false,
|
|
118
|
+
variant: "standard",
|
|
119
|
+
numeralSystem: NumeralSystem.Decimal,
|
|
120
|
+
decimalScale: 3,
|
|
121
|
+
size: 1,
|
|
122
|
+
label: {
|
|
123
|
+
text: "Decimal Value",
|
|
124
|
+
verticalPosition: "top",
|
|
125
|
+
horizontalPosition: "left"
|
|
126
|
+
},
|
|
127
|
+
tooltip: "Set the decimal value"
|
|
128
|
+
}
|
|
129
|
+
};
|
|
@@ -0,0 +1,249 @@
|
|
|
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 classnames from "classnames";
|
|
11
|
+
|
|
12
|
+
import NumberEntryProps, { NumberEntrySize } from "./NumberEntry.props";
|
|
13
|
+
|
|
14
|
+
import "../../index.css";
|
|
15
|
+
|
|
16
|
+
import "./NumberEntry.css";
|
|
17
|
+
|
|
18
|
+
import NumberEntryDigits from "./NumberEntryDigits";
|
|
19
|
+
|
|
20
|
+
import { DigitEntryState } from "./NumberEntryDigits.props";
|
|
21
|
+
|
|
22
|
+
import { NumeralSystem, NumericDigits } from "../../core";
|
|
23
|
+
|
|
24
|
+
import Label from "../Label";
|
|
25
|
+
import Tooltip from "../Tooltip";
|
|
26
|
+
|
|
27
|
+
type NumberEntryElement = React.ElementRef<"div">;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* `NumberEntry` is a React component that renders a number entry field to allow setting the value of a number
|
|
31
|
+
* represented in binary, octal, decimal, or hexadecimal numeral systems. The values of the individual digits of
|
|
32
|
+
* the number can be entered by key or they can incremented and decremented using the up and down arrow keys and or
|
|
33
|
+
* the mouse wheel. The maximum and minimum values of the number can be specified to limit the range of values that
|
|
34
|
+
* that can be set. Each individual digit shows an indicator to show if the value of that digit can be incremented
|
|
35
|
+
* or decremented based on the maximum and minimum values.
|
|
36
|
+
*
|
|
37
|
+
* @component
|
|
38
|
+
* @param {Object} props - Properties passed to component
|
|
39
|
+
* @param {React.Ref} forwardedRef - Forwarded ref for the number display
|
|
40
|
+
*
|
|
41
|
+
* @returns {React.Node} The rendered NumberEntry component.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```jsx
|
|
45
|
+
* <NumberEntry
|
|
46
|
+
* value={0}
|
|
47
|
+
* maximumValue={65535}
|
|
48
|
+
* minimumValue={0} />
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
const NumberEntry = React.forwardRef<NumberEntryElement, NumberEntryProps>(
|
|
52
|
+
(props, forwardedRef) => {
|
|
53
|
+
const { label, tooltip, ...sliderProps } = props;
|
|
54
|
+
|
|
55
|
+
const showLabel = label != null;
|
|
56
|
+
const showTooltip = tooltip != null;
|
|
57
|
+
|
|
58
|
+
if (showLabel && showTooltip) {
|
|
59
|
+
return (
|
|
60
|
+
<Label {...label}>
|
|
61
|
+
<Tooltip content={tooltip}>
|
|
62
|
+
<div style={{ width: "100%" }}>
|
|
63
|
+
<NumberEntryImpl ref={forwardedRef} {...sliderProps} />
|
|
64
|
+
</div>
|
|
65
|
+
</Tooltip>
|
|
66
|
+
</Label>
|
|
67
|
+
);
|
|
68
|
+
} else if (showLabel) {
|
|
69
|
+
return (
|
|
70
|
+
<Label {...label}>
|
|
71
|
+
<div style={{ width: "100%" }}>
|
|
72
|
+
<NumberEntryImpl ref={forwardedRef} {...sliderProps} />
|
|
73
|
+
</div>
|
|
74
|
+
</Label>
|
|
75
|
+
);
|
|
76
|
+
} else if (showTooltip) {
|
|
77
|
+
return (
|
|
78
|
+
<Tooltip content={tooltip}>
|
|
79
|
+
<div>
|
|
80
|
+
<NumberEntryImpl ref={forwardedRef} {...sliderProps} />
|
|
81
|
+
</div>
|
|
82
|
+
</Tooltip>
|
|
83
|
+
);
|
|
84
|
+
} else {
|
|
85
|
+
return <NumberEntryImpl ref={forwardedRef} {...sliderProps} />;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
NumberEntry.displayName = "NumberEntry";
|
|
91
|
+
|
|
92
|
+
export default NumberEntry;
|
|
93
|
+
|
|
94
|
+
interface NumberEntryImplProps
|
|
95
|
+
extends Omit<React.ComponentPropsWithoutRef<typeof NumberEntry>, "label" | "tooltip"> {}
|
|
96
|
+
|
|
97
|
+
const NumberEntryImpl = React.forwardRef<NumberEntryElement, NumberEntryImplProps>(
|
|
98
|
+
(props, forwardedRef) => {
|
|
99
|
+
const {
|
|
100
|
+
className,
|
|
101
|
+
variant = "standard",
|
|
102
|
+
size = 1,
|
|
103
|
+
disabled = false,
|
|
104
|
+
numeralSystem = NumeralSystem.Decimal,
|
|
105
|
+
decimalScale = 0,
|
|
106
|
+
maximumValue,
|
|
107
|
+
minimumValue,
|
|
108
|
+
value,
|
|
109
|
+
onValueChange
|
|
110
|
+
} = props;
|
|
111
|
+
|
|
112
|
+
const digitCount: number = React.useMemo(() => {
|
|
113
|
+
const maximumValueDigitCount: bigint = NumericDigits.ComputeDigitCountFromValue(
|
|
114
|
+
maximumValue,
|
|
115
|
+
numeralSystem
|
|
116
|
+
);
|
|
117
|
+
const minimumValueDigitCount: bigint = NumericDigits.ComputeDigitCountFromValue(
|
|
118
|
+
minimumValue,
|
|
119
|
+
numeralSystem
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const maximumDigitCount: bigint =
|
|
123
|
+
maximumValueDigitCount > minimumValueDigitCount
|
|
124
|
+
? maximumValueDigitCount
|
|
125
|
+
: minimumValueDigitCount;
|
|
126
|
+
|
|
127
|
+
return Number(maximumDigitCount);
|
|
128
|
+
}, [maximumValue, minimumValue, numeralSystem]);
|
|
129
|
+
|
|
130
|
+
const radix: bigint = BigInt(numeralSystem);
|
|
131
|
+
|
|
132
|
+
const digitStates: DigitEntryState[] = ComputeDigitStatesFromValue(
|
|
133
|
+
value,
|
|
134
|
+
maximumValue,
|
|
135
|
+
minimumValue,
|
|
136
|
+
radix,
|
|
137
|
+
digitCount
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const onDigitStatesChange = (
|
|
141
|
+
newDigitStates: readonly DigitEntryState[],
|
|
142
|
+
_isKeyDown: boolean
|
|
143
|
+
) => {
|
|
144
|
+
let newValue: bigint = ComputeValueFromDigitStates(newDigitStates, radix);
|
|
145
|
+
|
|
146
|
+
const crossedZero: boolean = newValue >= 0n !== value >= 0n && newValue !== 0n;
|
|
147
|
+
|
|
148
|
+
if (crossedZero) {
|
|
149
|
+
newValue += 2n * -value;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//console.log("onDigitStatesChange: Value:" + value + "=>" + newValue);
|
|
153
|
+
|
|
154
|
+
if (newValue <= maximumValue && newValue >= minimumValue) {
|
|
155
|
+
onValueChange?.(newValue);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const NegativeSign = (size: NumberEntrySize): JSX.Element => (
|
|
160
|
+
<span className={classnames("okNumberEntryText", "ok-r-size-" + size)}>-</span>
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<div
|
|
165
|
+
ref={forwardedRef}
|
|
166
|
+
className={classnames("okNumberEntry", className, "ok-r-size-" + size)}
|
|
167
|
+
data-disabled={disabled || undefined}>
|
|
168
|
+
<div className="okNumberEntryContent">
|
|
169
|
+
{value < 0n && NegativeSign(size)}
|
|
170
|
+
<NumberEntryDigits
|
|
171
|
+
variant={variant}
|
|
172
|
+
size={size}
|
|
173
|
+
numeralSystem={numeralSystem}
|
|
174
|
+
decimalScale={decimalScale}
|
|
175
|
+
digitStates={digitStates}
|
|
176
|
+
onDigitStatesChange={onDigitStatesChange}
|
|
177
|
+
/>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
NumberEntryImpl.displayName = "NumberEntryImpl";
|
|
185
|
+
|
|
186
|
+
const ComputeValueFromDigitStates = (
|
|
187
|
+
digitStates: readonly DigitEntryState[],
|
|
188
|
+
radix: bigint
|
|
189
|
+
): bigint => {
|
|
190
|
+
const digitCount: number = digitStates.length;
|
|
191
|
+
|
|
192
|
+
const startDigitIndex: number = digitCount - 1;
|
|
193
|
+
|
|
194
|
+
let numericValue: bigint = BigInt(digitStates[startDigitIndex].value);
|
|
195
|
+
|
|
196
|
+
for (let digitIndex: number = startDigitIndex - 1; digitIndex >= 0; digitIndex--) {
|
|
197
|
+
numericValue = numericValue * radix + BigInt(digitStates[digitIndex].value);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return numericValue;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const ComputeDigitStatesFromValue = (
|
|
204
|
+
value: bigint,
|
|
205
|
+
maximum: bigint,
|
|
206
|
+
minimum: bigint,
|
|
207
|
+
radix: bigint,
|
|
208
|
+
digitCount: number
|
|
209
|
+
): DigitEntryState[] => {
|
|
210
|
+
const retval: DigitEntryState[] = [];
|
|
211
|
+
|
|
212
|
+
let currentValue: bigint = value;
|
|
213
|
+
let currentMaxDifference: bigint = maximum - value;
|
|
214
|
+
let currentMinDifference: bigint = minimum - value;
|
|
215
|
+
|
|
216
|
+
for (let digitIndex: number = 0; digitIndex < digitCount; digitIndex++) {
|
|
217
|
+
const digitValue: number = Number(currentValue % radix);
|
|
218
|
+
const digitMaximum: number = Math.floor(Number(currentMaxDifference + BigInt(digitValue)));
|
|
219
|
+
const digitMinimum: number = Math.ceil(Number(currentMinDifference + BigInt(digitValue)));
|
|
220
|
+
|
|
221
|
+
retval[digitIndex] = {
|
|
222
|
+
id: digitIndex,
|
|
223
|
+
value: digitValue,
|
|
224
|
+
maximum: ComputeDigitLimitValue(digitMaximum, Number(radix)),
|
|
225
|
+
minimum: ComputeDigitLimitValue(digitMinimum, Number(radix))
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
currentValue = currentValue / radix;
|
|
229
|
+
currentMaxDifference = currentMaxDifference / radix;
|
|
230
|
+
currentMinDifference = currentMinDifference / radix;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return retval;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const ComputeDigitLimitValue = (
|
|
237
|
+
digitValueDifference: number,
|
|
238
|
+
radix: number
|
|
239
|
+
): number | undefined => {
|
|
240
|
+
let retval: number | undefined;
|
|
241
|
+
|
|
242
|
+
if (digitValueDifference >= 0) {
|
|
243
|
+
retval = digitValueDifference < radix ? digitValueDifference : undefined;
|
|
244
|
+
} else {
|
|
245
|
+
retval = digitValueDifference > -radix ? digitValueDifference : undefined;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return retval;
|
|
249
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
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 { NumeralSystem } from "../../core";
|
|
9
|
+
|
|
10
|
+
import { DigitEntryVariant } from "../DigitEntry";
|
|
11
|
+
|
|
12
|
+
export type DigitEntrySize = 1 | 2 | 3;
|
|
13
|
+
export type DigitEntryStatesChangeEventHandler = (
|
|
14
|
+
digitStates: readonly DigitEntryState[],
|
|
15
|
+
isKeyDown: boolean
|
|
16
|
+
) => void;
|
|
17
|
+
|
|
18
|
+
export type DigitEntryState = {
|
|
19
|
+
id: number;
|
|
20
|
+
value: number;
|
|
21
|
+
maximum?: number;
|
|
22
|
+
minimum?: number;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
interface NumberEntryDigitsProps {
|
|
26
|
+
/**
|
|
27
|
+
* Variant of the digit entry
|
|
28
|
+
*/
|
|
29
|
+
variant?: DigitEntryVariant;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Size of the digit entry
|
|
33
|
+
*/
|
|
34
|
+
size: DigitEntrySize;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Numeral system to be used for the number entry, defined in NumeralSystem enum
|
|
38
|
+
*/
|
|
39
|
+
numeralSystem: NumeralSystem;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Current value of the number entry
|
|
43
|
+
*/
|
|
44
|
+
digitStates: DigitEntryState[];
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Optional decimal scale for the number entry (Only used when numeral system is NumeralSystem.Decimal)
|
|
48
|
+
*/
|
|
49
|
+
decimalScale?: number;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Event handler for the number entries state change event
|
|
53
|
+
*/
|
|
54
|
+
onDigitStatesChange?: DigitEntryStatesChangeEventHandler;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export default NumberEntryDigitsProps;
|
|
@@ -0,0 +1,117 @@
|
|
|
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 classnames from "classnames";
|
|
11
|
+
|
|
12
|
+
import NumberEntryDigitsProps from "./NumberEntryDigits.props";
|
|
13
|
+
|
|
14
|
+
import "../../index.css";
|
|
15
|
+
|
|
16
|
+
import "./NumberEntry.css";
|
|
17
|
+
|
|
18
|
+
import DigitEntry from "../DigitEntry";
|
|
19
|
+
|
|
20
|
+
import { NumeralSystem } from "../../core";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* `NumberEntryDigits` is a React component that renders a list of `DigitEntry` components.
|
|
24
|
+
* Each `DigitEntry` represents a digit in a number entry field.
|
|
25
|
+
* The digits are displayed in the specified numeral system and can be incremented and decremented.
|
|
26
|
+
*
|
|
27
|
+
* @component
|
|
28
|
+
* @param {Object} props - The properties that define the `NumberEntryDigits` component.
|
|
29
|
+
* @param {number} props.size - The size of the digits in the number entry field. Default is 1.
|
|
30
|
+
* @param {number} props.numeralSystem - The numeral system to use for displaying the digits.
|
|
31
|
+
* @param {number} props.decimalScale - The scale of the decimal part of the number entry field. Default is 0.
|
|
32
|
+
* @param {Array} props.digitStates - An array of objects that represent the state of each digit in the number entry field.
|
|
33
|
+
* @param {function} props.onDigitStatesChange - Function to be called when the state of any digit in the number entry field changes.
|
|
34
|
+
*
|
|
35
|
+
* @returns {React.ReactElement} The `NumberEntryDigits` component.
|
|
36
|
+
*/
|
|
37
|
+
const NumberEntryDigits: React.FC<NumberEntryDigitsProps> = (props) => {
|
|
38
|
+
const {
|
|
39
|
+
variant = "standard",
|
|
40
|
+
size = 1,
|
|
41
|
+
numeralSystem,
|
|
42
|
+
decimalScale = 0,
|
|
43
|
+
digitStates,
|
|
44
|
+
onDigitStatesChange
|
|
45
|
+
} = props;
|
|
46
|
+
|
|
47
|
+
const digitListItems = (): JSX.Element[] => {
|
|
48
|
+
const digitEntries = digitStates.map((digitState, digitIndex) => {
|
|
49
|
+
const onDigitValueChanged = (value: number, isKeyDown: boolean) => {
|
|
50
|
+
//console.log("onDigitValueChanged: " + "[" + digitIndex + "], " + value + ", isKeyDown: " + isKeyDown);
|
|
51
|
+
|
|
52
|
+
//console.log("oldDigitStates: " + JSON.stringify(digitStates));
|
|
53
|
+
|
|
54
|
+
const newDigitStates = [...digitStates];
|
|
55
|
+
newDigitStates[digitIndex] = {
|
|
56
|
+
...digitStates[digitIndex],
|
|
57
|
+
value: value
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
//console.log("newDigitStates: " + JSON.stringify(newDigitStates));
|
|
61
|
+
|
|
62
|
+
onDigitStatesChange?.(newDigitStates, isKeyDown);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<DigitEntry
|
|
67
|
+
key={"digit-" + digitState.id}
|
|
68
|
+
variant={variant}
|
|
69
|
+
size={size}
|
|
70
|
+
numeralSystem={numeralSystem}
|
|
71
|
+
value={digitState.value}
|
|
72
|
+
maximum={digitState.maximum}
|
|
73
|
+
minimum={digitState.minimum}
|
|
74
|
+
onValueChanged={onDigitValueChanged}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (numeralSystem === NumeralSystem.Decimal && decimalScale > 0) {
|
|
80
|
+
const excessDecimalScale: number = decimalScale - digitEntries.length;
|
|
81
|
+
|
|
82
|
+
if (excessDecimalScale < 0) {
|
|
83
|
+
digitEntries.splice(
|
|
84
|
+
decimalScale,
|
|
85
|
+
0,
|
|
86
|
+
<span
|
|
87
|
+
key={"digit-decimal-point"}
|
|
88
|
+
className={classnames("okNumberEntryText", "ok-r-size-" + size)}>
|
|
89
|
+
.
|
|
90
|
+
</span>
|
|
91
|
+
);
|
|
92
|
+
} else {
|
|
93
|
+
const prefixString: string = "0.";
|
|
94
|
+
const paddedPrefixString = prefixString.padEnd(
|
|
95
|
+
prefixString.length + excessDecimalScale,
|
|
96
|
+
"0"
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
digitEntries.push(
|
|
100
|
+
<span
|
|
101
|
+
key={"digit-decimal-prefix"}
|
|
102
|
+
className={classnames("okNumberEntryText", "ok-r-size-" + size)}>
|
|
103
|
+
{paddedPrefixString}
|
|
104
|
+
</span>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return digitEntries.reverse();
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return <>{digitListItems()}</>;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
NumberEntryDigits.displayName = "NumberEntryDigits";
|
|
116
|
+
|
|
117
|
+
export default NumberEntryDigits;
|
|
@@ -0,0 +1,11 @@
|
|
|
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 "./NumberEntry";
|
|
9
|
+
|
|
10
|
+
export { default as NumberEntryProps } from "./NumberEntry.props";
|
|
11
|
+
export { NumberEntrySize, NumberEntryValueChangeEventHandler } from "./NumberEntry.props";
|