@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.
Files changed (334) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +26 -0
  3. package/dist/cjs/index.js +2 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/cjs/types/components/FrontPanel/FrontPanel.d.ts +10 -0
  6. package/dist/cjs/types/components/FrontPanel/FrontPanel.props.d.ts +23 -0
  7. package/dist/cjs/types/components/FrontPanel/index.d.ts +7 -0
  8. package/dist/cjs/types/components/FrontPanelIndicator/FrontPanelIndicator.d.ts +30 -0
  9. package/dist/cjs/types/components/FrontPanelIndicator/FrontPanelIndicator.props.d.ts +17 -0
  10. package/dist/cjs/types/components/FrontPanelIndicator/index.d.ts +8 -0
  11. package/dist/cjs/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.d.ts +33 -0
  12. package/dist/cjs/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.props.d.ts +23 -0
  13. package/dist/cjs/types/components/FrontPanelNumberDisplay/index.d.ts +8 -0
  14. package/dist/cjs/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.d.ts +33 -0
  15. package/dist/cjs/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.props.d.ts +27 -0
  16. package/dist/cjs/types/components/FrontPanelNumberEntry/index.d.ts +8 -0
  17. package/dist/cjs/types/components/FrontPanelPushButton/FrontPanelPushButton.d.ts +31 -0
  18. package/dist/cjs/types/components/FrontPanelPushButton/FrontPanelPushButton.props.d.ts +17 -0
  19. package/dist/cjs/types/components/FrontPanelPushButton/index.d.ts +8 -0
  20. package/dist/cjs/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.d.ts +31 -0
  21. package/dist/cjs/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.props.d.ts +21 -0
  22. package/dist/cjs/types/components/FrontPanelRangeSlider/index.d.ts +8 -0
  23. package/dist/cjs/types/components/FrontPanelSelectEntry/FrontPanelSelectEntry.d.ts +17 -0
  24. package/dist/cjs/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.d.ts +43 -0
  25. package/dist/cjs/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.props.d.ts +21 -0
  26. package/dist/cjs/types/components/FrontPanelSelectEntry/index.d.ts +15 -0
  27. package/dist/cjs/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.d.ts +31 -0
  28. package/dist/cjs/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.props.d.ts +17 -0
  29. package/dist/cjs/types/components/FrontPanelToggleSwitch/index.d.ts +8 -0
  30. package/dist/cjs/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.d.ts +32 -0
  31. package/dist/cjs/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.props.d.ts +18 -0
  32. package/dist/cjs/types/components/FrontPanelTriggerButton/index.d.ts +8 -0
  33. package/dist/cjs/types/components/Icons/ChevronIcon.d.ts +17 -0
  34. package/dist/cjs/types/components/Icons/IndicatorArrowIcon.d.ts +17 -0
  35. package/dist/cjs/types/components/Icons/IndicatorBarIcon.d.ts +10 -0
  36. package/dist/cjs/types/components/Icons/IndicatorStateIcon.d.ts +14 -0
  37. package/dist/cjs/types/components/Icons/RadioToggleStateIcon.d.ts +14 -0
  38. package/dist/cjs/types/components/Icons/SwitchToggleStateIcon.d.ts +14 -0
  39. package/dist/cjs/types/components/Icons/index.d.ts +12 -0
  40. package/dist/cjs/types/components/Icons/types.d.ts +17 -0
  41. package/dist/cjs/types/components/index.d.ts +16 -0
  42. package/dist/cjs/types/components/types.d.ts +11 -0
  43. package/dist/cjs/types/contexts/FrontPanelContext.d.ts +15 -0
  44. package/dist/cjs/types/contexts/index.d.ts +8 -0
  45. package/dist/cjs/types/core/Binary.d.ts +7 -0
  46. package/dist/cjs/types/core/Numeric.d.ts +80 -0
  47. package/dist/cjs/types/core/Types.d.ts +34 -0
  48. package/dist/cjs/types/core/index.d.ts +9 -0
  49. package/dist/cjs/types/index.d.ts +10 -0
  50. package/dist/cjs/types/primitives/Application/Application.d.ts +10 -0
  51. package/dist/cjs/types/primitives/Application/Application.props.d.ts +10 -0
  52. package/dist/cjs/types/primitives/Application/index.d.ts +1 -0
  53. package/dist/cjs/types/primitives/Button/Button.d.ts +33 -0
  54. package/dist/cjs/types/primitives/Button/Button.props.d.ts +44 -0
  55. package/dist/cjs/types/primitives/Button/index.d.ts +3 -0
  56. package/dist/cjs/types/primitives/DigitEntry/DigitEntry.d.ts +33 -0
  57. package/dist/cjs/types/primitives/DigitEntry/DigitEntry.props.d.ts +51 -0
  58. package/dist/cjs/types/primitives/DigitEntry/index.d.ts +9 -0
  59. package/dist/cjs/types/primitives/Indicator/Indicator.d.ts +29 -0
  60. package/dist/cjs/types/primitives/Indicator/Indicator.props.d.ts +35 -0
  61. package/dist/cjs/types/primitives/Indicator/index.d.ts +9 -0
  62. package/dist/cjs/types/primitives/Label/Label.d.ts +31 -0
  63. package/dist/cjs/types/primitives/Label/Label.props.d.ts +33 -0
  64. package/dist/cjs/types/primitives/Label/index.d.ts +9 -0
  65. package/dist/cjs/types/primitives/NumberDisplay/NumberDisplay.d.ts +31 -0
  66. package/dist/cjs/types/primitives/NumberDisplay/NumberDisplay.props.d.ts +52 -0
  67. package/dist/cjs/types/primitives/NumberDisplay/index.d.ts +9 -0
  68. package/dist/cjs/types/primitives/NumberEntry/NumberEntry.d.ts +34 -0
  69. package/dist/cjs/types/primitives/NumberEntry/NumberEntry.props.d.ts +69 -0
  70. package/dist/cjs/types/primitives/NumberEntry/NumberEntryDigits.d.ts +27 -0
  71. package/dist/cjs/types/primitives/NumberEntry/NumberEntryDigits.props.d.ts +43 -0
  72. package/dist/cjs/types/primitives/NumberEntry/index.d.ts +9 -0
  73. package/dist/cjs/types/primitives/RangeSlider/RangeSlider.d.ts +33 -0
  74. package/dist/cjs/types/primitives/RangeSlider/RangeSlider.props.d.ts +77 -0
  75. package/dist/cjs/types/primitives/RangeSlider/index.d.ts +9 -0
  76. package/dist/cjs/types/primitives/SelectEntry/SelectEntry.d.ts +17 -0
  77. package/dist/cjs/types/primitives/SelectEntry/SelectEntryContent.d.ts +16 -0
  78. package/dist/cjs/types/primitives/SelectEntry/SelectEntryGroup.d.ts +15 -0
  79. package/dist/cjs/types/primitives/SelectEntry/SelectEntryItem.d.ts +15 -0
  80. package/dist/cjs/types/primitives/SelectEntry/SelectEntryLabel.d.ts +15 -0
  81. package/dist/cjs/types/primitives/SelectEntry/SelectEntryRoot.d.ts +39 -0
  82. package/dist/cjs/types/primitives/SelectEntry/SelectEntryRoot.props.d.ts +31 -0
  83. package/dist/cjs/types/primitives/SelectEntry/SelectEntrySeparator.d.ts +15 -0
  84. package/dist/cjs/types/primitives/SelectEntry/SelectEntryTrigger.d.ts +16 -0
  85. package/dist/cjs/types/primitives/SelectEntry/SelectEntryTrigger.props.d.ts +16 -0
  86. package/dist/cjs/types/primitives/SelectEntry/index.d.ts +17 -0
  87. package/dist/cjs/types/primitives/Toggle/Toggle.d.ts +35 -0
  88. package/dist/cjs/types/primitives/Toggle/Toggle.props.d.ts +37 -0
  89. package/dist/cjs/types/primitives/Toggle/index.d.ts +9 -0
  90. package/dist/cjs/types/primitives/ToggleSwitch/ToggleSwitch.d.ts +32 -0
  91. package/dist/cjs/types/primitives/ToggleSwitch/ToggleSwitch.props.d.ts +22 -0
  92. package/dist/cjs/types/primitives/ToggleSwitch/index.d.ts +8 -0
  93. package/dist/cjs/types/primitives/Tooltip/Tooltip.d.ts +35 -0
  94. package/dist/cjs/types/primitives/Tooltip/Tooltip.props.d.ts +17 -0
  95. package/dist/cjs/types/primitives/Tooltip/index.d.ts +8 -0
  96. package/dist/cjs/types/primitives/TooltipUtility.d.ts +12 -0
  97. package/dist/cjs/types/primitives/index.d.ts +24 -0
  98. package/dist/esm/index.js +2 -0
  99. package/dist/esm/index.js.map +1 -0
  100. package/dist/esm/types/components/FrontPanel/FrontPanel.d.ts +10 -0
  101. package/dist/esm/types/components/FrontPanel/FrontPanel.props.d.ts +23 -0
  102. package/dist/esm/types/components/FrontPanel/index.d.ts +7 -0
  103. package/dist/esm/types/components/FrontPanelIndicator/FrontPanelIndicator.d.ts +30 -0
  104. package/dist/esm/types/components/FrontPanelIndicator/FrontPanelIndicator.props.d.ts +17 -0
  105. package/dist/esm/types/components/FrontPanelIndicator/index.d.ts +8 -0
  106. package/dist/esm/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.d.ts +33 -0
  107. package/dist/esm/types/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.props.d.ts +23 -0
  108. package/dist/esm/types/components/FrontPanelNumberDisplay/index.d.ts +8 -0
  109. package/dist/esm/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.d.ts +33 -0
  110. package/dist/esm/types/components/FrontPanelNumberEntry/FrontPanelNumberEntry.props.d.ts +27 -0
  111. package/dist/esm/types/components/FrontPanelNumberEntry/index.d.ts +8 -0
  112. package/dist/esm/types/components/FrontPanelPushButton/FrontPanelPushButton.d.ts +31 -0
  113. package/dist/esm/types/components/FrontPanelPushButton/FrontPanelPushButton.props.d.ts +17 -0
  114. package/dist/esm/types/components/FrontPanelPushButton/index.d.ts +8 -0
  115. package/dist/esm/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.d.ts +31 -0
  116. package/dist/esm/types/components/FrontPanelRangeSlider/FrontPanelRangeSlider.props.d.ts +21 -0
  117. package/dist/esm/types/components/FrontPanelRangeSlider/index.d.ts +8 -0
  118. package/dist/esm/types/components/FrontPanelSelectEntry/FrontPanelSelectEntry.d.ts +17 -0
  119. package/dist/esm/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.d.ts +43 -0
  120. package/dist/esm/types/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.props.d.ts +21 -0
  121. package/dist/esm/types/components/FrontPanelSelectEntry/index.d.ts +15 -0
  122. package/dist/esm/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.d.ts +31 -0
  123. package/dist/esm/types/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.props.d.ts +17 -0
  124. package/dist/esm/types/components/FrontPanelToggleSwitch/index.d.ts +8 -0
  125. package/dist/esm/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.d.ts +32 -0
  126. package/dist/esm/types/components/FrontPanelTriggerButton/FrontPanelTriggerButton.props.d.ts +18 -0
  127. package/dist/esm/types/components/FrontPanelTriggerButton/index.d.ts +8 -0
  128. package/dist/esm/types/components/Icons/ChevronIcon.d.ts +17 -0
  129. package/dist/esm/types/components/Icons/IndicatorArrowIcon.d.ts +17 -0
  130. package/dist/esm/types/components/Icons/IndicatorBarIcon.d.ts +10 -0
  131. package/dist/esm/types/components/Icons/IndicatorStateIcon.d.ts +14 -0
  132. package/dist/esm/types/components/Icons/RadioToggleStateIcon.d.ts +14 -0
  133. package/dist/esm/types/components/Icons/SwitchToggleStateIcon.d.ts +14 -0
  134. package/dist/esm/types/components/Icons/index.d.ts +12 -0
  135. package/dist/esm/types/components/Icons/types.d.ts +17 -0
  136. package/dist/esm/types/components/index.d.ts +16 -0
  137. package/dist/esm/types/components/types.d.ts +11 -0
  138. package/dist/esm/types/contexts/FrontPanelContext.d.ts +15 -0
  139. package/dist/esm/types/contexts/index.d.ts +8 -0
  140. package/dist/esm/types/core/Binary.d.ts +7 -0
  141. package/dist/esm/types/core/Numeric.d.ts +80 -0
  142. package/dist/esm/types/core/Types.d.ts +34 -0
  143. package/dist/esm/types/core/index.d.ts +9 -0
  144. package/dist/esm/types/index.d.ts +10 -0
  145. package/dist/esm/types/primitives/Application/Application.d.ts +10 -0
  146. package/dist/esm/types/primitives/Application/Application.props.d.ts +10 -0
  147. package/dist/esm/types/primitives/Application/index.d.ts +1 -0
  148. package/dist/esm/types/primitives/Button/Button.d.ts +33 -0
  149. package/dist/esm/types/primitives/Button/Button.props.d.ts +44 -0
  150. package/dist/esm/types/primitives/Button/index.d.ts +3 -0
  151. package/dist/esm/types/primitives/DigitEntry/DigitEntry.d.ts +33 -0
  152. package/dist/esm/types/primitives/DigitEntry/DigitEntry.props.d.ts +51 -0
  153. package/dist/esm/types/primitives/DigitEntry/index.d.ts +9 -0
  154. package/dist/esm/types/primitives/Indicator/Indicator.d.ts +29 -0
  155. package/dist/esm/types/primitives/Indicator/Indicator.props.d.ts +35 -0
  156. package/dist/esm/types/primitives/Indicator/index.d.ts +9 -0
  157. package/dist/esm/types/primitives/Label/Label.d.ts +31 -0
  158. package/dist/esm/types/primitives/Label/Label.props.d.ts +33 -0
  159. package/dist/esm/types/primitives/Label/index.d.ts +9 -0
  160. package/dist/esm/types/primitives/NumberDisplay/NumberDisplay.d.ts +31 -0
  161. package/dist/esm/types/primitives/NumberDisplay/NumberDisplay.props.d.ts +52 -0
  162. package/dist/esm/types/primitives/NumberDisplay/index.d.ts +9 -0
  163. package/dist/esm/types/primitives/NumberEntry/NumberEntry.d.ts +34 -0
  164. package/dist/esm/types/primitives/NumberEntry/NumberEntry.props.d.ts +69 -0
  165. package/dist/esm/types/primitives/NumberEntry/NumberEntryDigits.d.ts +27 -0
  166. package/dist/esm/types/primitives/NumberEntry/NumberEntryDigits.props.d.ts +43 -0
  167. package/dist/esm/types/primitives/NumberEntry/index.d.ts +9 -0
  168. package/dist/esm/types/primitives/RangeSlider/RangeSlider.d.ts +33 -0
  169. package/dist/esm/types/primitives/RangeSlider/RangeSlider.props.d.ts +77 -0
  170. package/dist/esm/types/primitives/RangeSlider/index.d.ts +9 -0
  171. package/dist/esm/types/primitives/SelectEntry/SelectEntry.d.ts +17 -0
  172. package/dist/esm/types/primitives/SelectEntry/SelectEntryContent.d.ts +16 -0
  173. package/dist/esm/types/primitives/SelectEntry/SelectEntryGroup.d.ts +15 -0
  174. package/dist/esm/types/primitives/SelectEntry/SelectEntryItem.d.ts +15 -0
  175. package/dist/esm/types/primitives/SelectEntry/SelectEntryLabel.d.ts +15 -0
  176. package/dist/esm/types/primitives/SelectEntry/SelectEntryRoot.d.ts +39 -0
  177. package/dist/esm/types/primitives/SelectEntry/SelectEntryRoot.props.d.ts +31 -0
  178. package/dist/esm/types/primitives/SelectEntry/SelectEntrySeparator.d.ts +15 -0
  179. package/dist/esm/types/primitives/SelectEntry/SelectEntryTrigger.d.ts +16 -0
  180. package/dist/esm/types/primitives/SelectEntry/SelectEntryTrigger.props.d.ts +16 -0
  181. package/dist/esm/types/primitives/SelectEntry/index.d.ts +17 -0
  182. package/dist/esm/types/primitives/Toggle/Toggle.d.ts +35 -0
  183. package/dist/esm/types/primitives/Toggle/Toggle.props.d.ts +37 -0
  184. package/dist/esm/types/primitives/Toggle/index.d.ts +9 -0
  185. package/dist/esm/types/primitives/ToggleSwitch/ToggleSwitch.d.ts +32 -0
  186. package/dist/esm/types/primitives/ToggleSwitch/ToggleSwitch.props.d.ts +22 -0
  187. package/dist/esm/types/primitives/ToggleSwitch/index.d.ts +8 -0
  188. package/dist/esm/types/primitives/Tooltip/Tooltip.d.ts +35 -0
  189. package/dist/esm/types/primitives/Tooltip/Tooltip.props.d.ts +17 -0
  190. package/dist/esm/types/primitives/Tooltip/index.d.ts +8 -0
  191. package/dist/esm/types/primitives/TooltipUtility.d.ts +12 -0
  192. package/dist/esm/types/primitives/index.d.ts +24 -0
  193. package/dist/index.d.ts +1456 -0
  194. package/package.json +81 -0
  195. package/src/components/FrontPanel/FrontPanel.props.ts +25 -0
  196. package/src/components/FrontPanel/FrontPanel.tsx +33 -0
  197. package/src/components/FrontPanel/index.ts +8 -0
  198. package/src/components/FrontPanelIndicator/FrontPanelIndicator.css +0 -0
  199. package/src/components/FrontPanelIndicator/FrontPanelIndicator.props.ts +20 -0
  200. package/src/components/FrontPanelIndicator/FrontPanelIndicator.stories.tsx +44 -0
  201. package/src/components/FrontPanelIndicator/FrontPanelIndicator.tsx +81 -0
  202. package/src/components/FrontPanelIndicator/index.ts +10 -0
  203. package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.css +0 -0
  204. package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.props.ts +27 -0
  205. package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.stories.tsx +67 -0
  206. package/src/components/FrontPanelNumberDisplay/FrontPanelNumberDisplay.tsx +130 -0
  207. package/src/components/FrontPanelNumberDisplay/index.ts +10 -0
  208. package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.css +0 -0
  209. package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.props.ts +32 -0
  210. package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.stories.tsx +104 -0
  211. package/src/components/FrontPanelNumberEntry/FrontPanelNumberEntry.tsx +195 -0
  212. package/src/components/FrontPanelNumberEntry/index.ts +10 -0
  213. package/src/components/FrontPanelPushButton/FrontPanelPushButton.css +0 -0
  214. package/src/components/FrontPanelPushButton/FrontPanelPushButton.props.ts +20 -0
  215. package/src/components/FrontPanelPushButton/FrontPanelPushButton.stories.tsx +46 -0
  216. package/src/components/FrontPanelPushButton/FrontPanelPushButton.tsx +80 -0
  217. package/src/components/FrontPanelPushButton/index.ts +10 -0
  218. package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.css +0 -0
  219. package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.props.ts +25 -0
  220. package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.stories.tsx +92 -0
  221. package/src/components/FrontPanelRangeSlider/FrontPanelRangeSlider.tsx +108 -0
  222. package/src/components/FrontPanelRangeSlider/index.ts +10 -0
  223. package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntry.css +0 -0
  224. package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntry.stories.tsx +107 -0
  225. package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntry.tsx +30 -0
  226. package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.props.ts +25 -0
  227. package/src/components/FrontPanelSelectEntry/FrontPanelSelectEntryRoot.tsx +175 -0
  228. package/src/components/FrontPanelSelectEntry/index.ts +17 -0
  229. package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.css +0 -0
  230. package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.props.ts +20 -0
  231. package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.stories.tsx +46 -0
  232. package/src/components/FrontPanelToggleSwitch/FrontPanelToggleSwitch.tsx +108 -0
  233. package/src/components/FrontPanelToggleSwitch/index.ts +10 -0
  234. package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.css +0 -0
  235. package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.props.ts +21 -0
  236. package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.stories.tsx +46 -0
  237. package/src/components/FrontPanelTriggerButton/FrontPanelTriggerButton.tsx +65 -0
  238. package/src/components/FrontPanelTriggerButton/index.ts +10 -0
  239. package/src/components/Icons/ChevronIcon.tsx +69 -0
  240. package/src/components/Icons/IndicatorArrowIcon.tsx +59 -0
  241. package/src/components/Icons/IndicatorBarIcon.tsx +34 -0
  242. package/src/components/Icons/IndicatorStateIcon.tsx +82 -0
  243. package/src/components/Icons/RadioToggleStateIcon.tsx +62 -0
  244. package/src/components/Icons/SwitchToggleStateIcon.tsx +68 -0
  245. package/src/components/Icons/index.ts +15 -0
  246. package/src/components/Icons/types.ts +20 -0
  247. package/src/components/index.ts +31 -0
  248. package/src/components/types.ts +13 -0
  249. package/src/contexts/FrontPanelContext.ts +23 -0
  250. package/src/contexts/index.ts +10 -0
  251. package/src/core/Binary.ts +23 -0
  252. package/src/core/Numeric.ts +168 -0
  253. package/src/core/Types.ts +39 -0
  254. package/src/core/index.ts +11 -0
  255. package/src/fonts/Inter-VariableFont_slnt,wght.ttf +0 -0
  256. package/src/index.css +11 -0
  257. package/src/index.ts +11 -0
  258. package/src/primitives/Application/Application.props.ts +10 -0
  259. package/src/primitives/Application/Application.tsx +24 -0
  260. package/src/primitives/Application/index.ts +1 -0
  261. package/src/primitives/Button/Button.css +60 -0
  262. package/src/primitives/Button/Button.props.ts +53 -0
  263. package/src/primitives/Button/Button.stories.tsx +54 -0
  264. package/src/primitives/Button/Button.tsx +75 -0
  265. package/src/primitives/Button/index.ts +4 -0
  266. package/src/primitives/DigitEntry/DigitEntry.css +120 -0
  267. package/src/primitives/DigitEntry/DigitEntry.props.ts +62 -0
  268. package/src/primitives/DigitEntry/DigitEntry.stories.tsx +84 -0
  269. package/src/primitives/DigitEntry/DigitEntry.tsx +226 -0
  270. package/src/primitives/DigitEntry/index.ts +15 -0
  271. package/src/primitives/Indicator/Indicator.css +66 -0
  272. package/src/primitives/Indicator/Indicator.props.ts +42 -0
  273. package/src/primitives/Indicator/Indicator.stories.tsx +44 -0
  274. package/src/primitives/Indicator/Indicator.tsx +64 -0
  275. package/src/primitives/Indicator/index.ts +11 -0
  276. package/src/primitives/Label/Label.css +49 -0
  277. package/src/primitives/Label/Label.props.ts +38 -0
  278. package/src/primitives/Label/Label.stories.tsx +53 -0
  279. package/src/primitives/Label/Label.tsx +66 -0
  280. package/src/primitives/Label/index.ts +11 -0
  281. package/src/primitives/NumberDisplay/NumberDisplay.css +63 -0
  282. package/src/primitives/NumberDisplay/NumberDisplay.props.ts +65 -0
  283. package/src/primitives/NumberDisplay/NumberDisplay.stories.tsx +83 -0
  284. package/src/primitives/NumberDisplay/NumberDisplay.tsx +155 -0
  285. package/src/primitives/NumberDisplay/index.ts +11 -0
  286. package/src/primitives/NumberEntry/NumberEntry.css +71 -0
  287. package/src/primitives/NumberEntry/NumberEntry.props.ts +86 -0
  288. package/src/primitives/NumberEntry/NumberEntry.stories.tsx +129 -0
  289. package/src/primitives/NumberEntry/NumberEntry.tsx +249 -0
  290. package/src/primitives/NumberEntry/NumberEntryDigits.props.ts +57 -0
  291. package/src/primitives/NumberEntry/NumberEntryDigits.tsx +117 -0
  292. package/src/primitives/NumberEntry/index.ts +11 -0
  293. package/src/primitives/RangeSlider/RangeSlider.css +110 -0
  294. package/src/primitives/RangeSlider/RangeSlider.props.ts +93 -0
  295. package/src/primitives/RangeSlider/RangeSlider.stories.tsx +76 -0
  296. package/src/primitives/RangeSlider/RangeSlider.tsx +168 -0
  297. package/src/primitives/RangeSlider/index.ts +14 -0
  298. package/src/primitives/SelectEntry/SelectEntry.stories.tsx +86 -0
  299. package/src/primitives/SelectEntry/SelectEntry.tsx +29 -0
  300. package/src/primitives/SelectEntry/SelectEntryContent.css +94 -0
  301. package/src/primitives/SelectEntry/SelectEntryContent.tsx +63 -0
  302. package/src/primitives/SelectEntry/SelectEntryGroup.css +17 -0
  303. package/src/primitives/SelectEntry/SelectEntryGroup.tsx +37 -0
  304. package/src/primitives/SelectEntry/SelectEntryItem.css +35 -0
  305. package/src/primitives/SelectEntry/SelectEntryItem.tsx +51 -0
  306. package/src/primitives/SelectEntry/SelectEntryLabel.css +16 -0
  307. package/src/primitives/SelectEntry/SelectEntryLabel.tsx +43 -0
  308. package/src/primitives/SelectEntry/SelectEntryRoot.css +10 -0
  309. package/src/primitives/SelectEntry/SelectEntryRoot.props.ts +38 -0
  310. package/src/primitives/SelectEntry/SelectEntryRoot.tsx +69 -0
  311. package/src/primitives/SelectEntry/SelectEntrySeparator.css +12 -0
  312. package/src/primitives/SelectEntry/SelectEntrySeparator.tsx +38 -0
  313. package/src/primitives/SelectEntry/SelectEntryTrigger.css +49 -0
  314. package/src/primitives/SelectEntry/SelectEntryTrigger.props.ts +18 -0
  315. package/src/primitives/SelectEntry/SelectEntryTrigger.tsx +111 -0
  316. package/src/primitives/SelectEntry/index.ts +20 -0
  317. package/src/primitives/Toggle/Toggle.css +67 -0
  318. package/src/primitives/Toggle/Toggle.props.ts +44 -0
  319. package/src/primitives/Toggle/Toggle.stories.tsx +61 -0
  320. package/src/primitives/Toggle/Toggle.tsx +90 -0
  321. package/src/primitives/Toggle/index.ts +11 -0
  322. package/src/primitives/ToggleSwitch/ToggleSwitch.css +118 -0
  323. package/src/primitives/ToggleSwitch/ToggleSwitch.props.ts +26 -0
  324. package/src/primitives/ToggleSwitch/ToggleSwitch.stories.tsx +85 -0
  325. package/src/primitives/ToggleSwitch/ToggleSwitch.tsx +73 -0
  326. package/src/primitives/ToggleSwitch/index.ts +10 -0
  327. package/src/primitives/Tooltip/Tooltip.css +93 -0
  328. package/src/primitives/Tooltip/Tooltip.props.ts +20 -0
  329. package/src/primitives/Tooltip/Tooltip.tsx +91 -0
  330. package/src/primitives/Tooltip/index.ts +10 -0
  331. package/src/primitives/TooltipUtility.tsx +24 -0
  332. package/src/primitives/index.ts +44 -0
  333. package/src/stories/decorators/Application.decorator.tsx +20 -0
  334. 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";
@@ -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";
@@ -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";