@opalkelly/frontpanel-react-components 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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";