@torpor/ui 0.3.7 → 1.0.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 (346) hide show
  1. package/README.md +83 -7
  2. package/dist/Accordion/Accordion.torp +43 -165
  3. package/dist/Accordion/AccordionContent.torp +6 -6
  4. package/dist/Accordion/AccordionHeader.torp +7 -11
  5. package/dist/Accordion/AccordionItem.torp +24 -24
  6. package/dist/Accordion/AccordionTrigger.torp +17 -8
  7. package/dist/Accordion/AccordionTypes.ts +6 -6
  8. package/dist/Accordion/index.d.ts +23 -25
  9. package/dist/Accordion/index.js +6 -22
  10. package/dist/Breadcrumb/Breadcrumb.torp +12 -10
  11. package/dist/Breadcrumb/BreadcrumbItem.torp +6 -6
  12. package/dist/Breadcrumb/BreadcrumbList.torp +21 -0
  13. package/dist/Breadcrumb/BreadcrumbSeparator.torp +4 -4
  14. package/dist/Breadcrumb/index.d.ts +39 -15
  15. package/dist/Breadcrumb/index.js +5 -14
  16. package/dist/Calendar/Calendar.torp +163 -156
  17. package/dist/Calendar/CalendarDay.torp +91 -45
  18. package/dist/Calendar/CalendarDayHeader.torp +36 -0
  19. package/dist/Calendar/CalendarGrid.torp +104 -0
  20. package/dist/Calendar/CalendarGridHeader.torp +43 -0
  21. package/dist/Calendar/CalendarHeader.torp +48 -0
  22. package/dist/Calendar/CalendarHeaderTrigger.torp +54 -0
  23. package/dist/Calendar/CalendarTypes.ts +25 -4
  24. package/dist/Calendar/buildDays.ts +54 -0
  25. package/dist/Calendar/index.d.ts +191 -5
  26. package/dist/Calendar/index.js +8 -10
  27. package/dist/Carousel/Carousel.torp +180 -0
  28. package/dist/Carousel/CarouselIndicators.torp +65 -0
  29. package/dist/Carousel/CarouselNext.torp +43 -0
  30. package/dist/Carousel/CarouselPrevious.torp +44 -0
  31. package/dist/Carousel/CarouselSlide.torp +57 -0
  32. package/dist/Carousel/CarouselTypes.ts +28 -0
  33. package/dist/Carousel/index.d.ts +147 -0
  34. package/dist/Carousel/index.js +6 -0
  35. package/dist/Charts/BarChart.torp +70 -0
  36. package/dist/Charts/Chart.torp +120 -0
  37. package/dist/Charts/ChartBars.torp +78 -0
  38. package/dist/Charts/ChartColumns.torp +66 -0
  39. package/dist/Charts/ChartGrid.torp +54 -0
  40. package/dist/Charts/ChartLines.torp +60 -0
  41. package/dist/Charts/ChartTypes.ts +25 -0
  42. package/dist/Charts/ChartXAxis.torp +83 -0
  43. package/dist/Charts/ChartYAxis.torp +105 -0
  44. package/dist/Charts/ColumnChart.torp +70 -0
  45. package/dist/{Chart → Charts}/GridLines.torp +7 -4
  46. package/dist/Charts/LineChart.torp +73 -0
  47. package/dist/{Chart → Charts}/PieChart.torp +14 -20
  48. package/dist/{Chart → Charts}/ScatterChart.torp +45 -38
  49. package/dist/{Chart → Charts}/SparkLine.torp +16 -19
  50. package/dist/{Chart → Charts}/XAxis.torp +18 -12
  51. package/dist/{Chart → Charts}/YAxis.torp +15 -9
  52. package/dist/Charts/index.d.ts +469 -0
  53. package/dist/Charts/index.js +17 -0
  54. package/dist/ColorPicker/ColorPalette.torp +154 -0
  55. package/dist/ColorPicker/ColorPicker.torp +157 -0
  56. package/dist/ColorPicker/index.d.ts +85 -0
  57. package/dist/ColorPicker/index.js +3 -0
  58. package/dist/ComboBox/ComboBox.torp +205 -0
  59. package/dist/ComboBox/ComboBoxContent.torp +112 -0
  60. package/dist/ComboBox/ComboBoxInput.torp +145 -0
  61. package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
  62. package/dist/ComboBox/ComboBoxTypes.ts +39 -0
  63. package/dist/ComboBox/index.d.ts +152 -0
  64. package/dist/ComboBox/index.js +6 -0
  65. package/dist/CommandPalette/CommandPalette.torp +220 -0
  66. package/dist/CommandPalette/CommandTypes.ts +14 -0
  67. package/dist/CommandPalette/index.d.ts +45 -0
  68. package/dist/CommandPalette/index.js +2 -0
  69. package/dist/Contextual/Contextual.torp +39 -52
  70. package/dist/Contextual/ContextualContent.torp +29 -73
  71. package/dist/Contextual/ContextualHover.torp +112 -0
  72. package/dist/Contextual/ContextualTrigger.torp +31 -42
  73. package/dist/Contextual/ContextualTypes.ts +5 -18
  74. package/dist/Contextual/index.d.ts +44 -27
  75. package/dist/Contextual/index.js +5 -14
  76. package/dist/DataGrid/DataGrid.torp +496 -0
  77. package/dist/DataGrid/DataGridTypes.ts +25 -0
  78. package/dist/DataGrid/index.d.ts +90 -0
  79. package/dist/DataGrid/index.js +3 -0
  80. package/dist/DataGrid/sortRows.ts +32 -0
  81. package/dist/DatePicker/DatePicker.torp +222 -0
  82. package/dist/DatePicker/DatePickerHeader.torp +20 -0
  83. package/dist/DatePicker/index.d.ts +55 -0
  84. package/dist/DatePicker/index.js +2 -0
  85. package/dist/DateRangePicker/DateRangePicker.torp +311 -0
  86. package/dist/DateRangePicker/DateRangePickerDay.torp +137 -0
  87. package/dist/DateRangePicker/DateRangePickerTypes.ts +21 -0
  88. package/dist/DateRangePicker/index.d.ts +76 -0
  89. package/dist/DateRangePicker/index.js +3 -0
  90. package/dist/Dialog/Dialog.torp +33 -30
  91. package/dist/Dialog/DialogBody.torp +5 -9
  92. package/dist/Dialog/DialogButton.torp +14 -11
  93. package/dist/Dialog/DialogFooter.torp +3 -7
  94. package/dist/Dialog/DialogHeader.torp +6 -10
  95. package/dist/Dialog/DialogTypes.ts +2 -2
  96. package/dist/Dialog/index.d.ts +28 -26
  97. package/dist/Dialog/index.js +6 -22
  98. package/dist/Disclosure/Disclosure.torp +18 -18
  99. package/dist/Disclosure/DisclosureContent.torp +5 -6
  100. package/dist/Disclosure/DisclosureHeader.torp +7 -11
  101. package/dist/Disclosure/DisclosureTrigger.torp +4 -5
  102. package/dist/Disclosure/DisclosureTypes.ts +1 -1
  103. package/dist/Disclosure/index.d.ts +14 -16
  104. package/dist/Disclosure/index.js +5 -18
  105. package/dist/Drawer/Drawer.torp +21 -51
  106. package/dist/Drawer/DrawerContent.torp +67 -13
  107. package/dist/Drawer/DrawerOverlay.torp +4 -4
  108. package/dist/Drawer/DrawerTrigger.torp +16 -4
  109. package/dist/Drawer/DrawerTypes.ts +4 -1
  110. package/dist/Drawer/index.d.ts +16 -20
  111. package/dist/Drawer/index.js +5 -18
  112. package/dist/FocusGroup/FocusGroup.torp +70 -0
  113. package/dist/FocusGroup/FocusGroupButton.torp +59 -0
  114. package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
  115. package/dist/FocusGroup/index.d.ts +44 -0
  116. package/dist/FocusGroup/index.js +3 -0
  117. package/dist/Form/CheckBox.torp +28 -20
  118. package/dist/Form/Field.torp +17 -17
  119. package/dist/Form/File.torp +31 -22
  120. package/dist/Form/FileDrop.torp +187 -0
  121. package/dist/Form/Form.torp +24 -22
  122. package/dist/Form/FormTypes.ts +2 -0
  123. package/dist/Form/FormValues.torp +37 -0
  124. package/dist/Form/Hidden.torp +4 -12
  125. package/dist/Form/Input.torp +38 -32
  126. package/dist/Form/Label.torp +3 -3
  127. package/dist/Form/Message.torp +13 -5
  128. package/dist/Form/MessageSummary.torp +39 -0
  129. package/dist/Form/Option.torp +11 -7
  130. package/dist/Form/Select.torp +32 -28
  131. package/dist/Form/TextArea.torp +35 -31
  132. package/dist/Form/Toggle.torp +109 -0
  133. package/dist/Form/index.d.ts +198 -77
  134. package/dist/Form/index.js +16 -46
  135. package/dist/ListBox/ListBox.torp +374 -0
  136. package/dist/ListBox/ListBoxItem.torp +131 -0
  137. package/dist/ListBox/ListBoxSeparator.torp +29 -0
  138. package/dist/ListBox/ListBoxTypes.ts +41 -0
  139. package/dist/ListBox/LoadedListBoxItems.torp +41 -0
  140. package/dist/ListBox/index.d.ts +136 -0
  141. package/dist/ListBox/index.js +4 -0
  142. package/dist/MaskedInput/MaskedInput.torp +143 -0
  143. package/dist/MaskedInput/index.d.ts +52 -0
  144. package/dist/MaskedInput/index.js +2 -0
  145. package/dist/Menu/Menu.torp +90 -70
  146. package/dist/Menu/MenuButton.torp +17 -10
  147. package/dist/Menu/MenuCheck.torp +22 -18
  148. package/dist/Menu/MenuGroup.torp +4 -4
  149. package/dist/Menu/MenuIndicator.torp +5 -13
  150. package/dist/Menu/MenuPopout.torp +20 -50
  151. package/dist/Menu/MenuPopoutContent.torp +15 -66
  152. package/dist/Menu/MenuPopoutTrigger.torp +19 -100
  153. package/dist/Menu/MenuRadio.torp +25 -26
  154. package/dist/Menu/MenuRadioGroup.torp +25 -68
  155. package/dist/Menu/MenuSeparator.torp +3 -2
  156. package/dist/Menu/MenuTypes.ts +12 -21
  157. package/dist/Menu/index.d.ts +45 -51
  158. package/dist/Menu/index.js +12 -46
  159. package/dist/MenuBar/MenuBar.torp +31 -83
  160. package/dist/MenuBar/MenuBarItem.torp +34 -55
  161. package/dist/MenuBar/MenuBarItemContent.torp +15 -101
  162. package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
  163. package/dist/MenuBar/MenuBarTypes.ts +13 -12
  164. package/dist/MenuBar/index.d.ts +17 -19
  165. package/dist/MenuBar/index.js +5 -18
  166. package/dist/Modal/Modal.torp +28 -48
  167. package/dist/Modal/ModalContent.torp +21 -44
  168. package/dist/Modal/ModalOverlay.torp +4 -4
  169. package/dist/Modal/ModalTrigger.torp +16 -32
  170. package/dist/Modal/ModalTypes.ts +6 -17
  171. package/dist/Modal/index.d.ts +17 -29
  172. package/dist/Modal/index.js +29 -28
  173. package/dist/Modal/index.js.map +1 -1
  174. package/dist/Modal/showPrompt.ts +2 -2
  175. package/dist/NavMenu/NavMenu.torp +22 -104
  176. package/dist/NavMenu/NavMenuButton.torp +10 -8
  177. package/dist/NavMenu/NavMenuElement.torp +6 -7
  178. package/dist/NavMenu/NavMenuGroup.torp +5 -5
  179. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
  180. package/dist/NavMenu/NavMenuLink.torp +7 -10
  181. package/dist/NavMenu/NavMenuPopout.torp +16 -61
  182. package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
  183. package/dist/NavMenu/NavMenuPopoutTrigger.torp +47 -0
  184. package/dist/NavMenu/NavMenuSeparator.torp +3 -6
  185. package/dist/NavMenu/NavMenuTypes.ts +6 -15
  186. package/dist/NavMenu/index.d.ts +55 -55
  187. package/dist/NavMenu/index.js +11 -42
  188. package/dist/Notification/Notification.torp +12 -24
  189. package/dist/Notification/NotificationClose.torp +6 -3
  190. package/dist/Notification/NotificationContainer.torp +3 -7
  191. package/dist/Notification/NotificationContent.torp +3 -7
  192. package/dist/Notification/NotificationTypes.ts +1 -1
  193. package/dist/Notification/index.d.ts +15 -12
  194. package/dist/Notification/index.js +22 -32
  195. package/dist/Notification/index.js.map +1 -1
  196. package/dist/NumberInput/NumberInput.torp +255 -0
  197. package/dist/NumberInput/index.d.ts +44 -0
  198. package/dist/NumberInput/index.js +2 -0
  199. package/dist/Pagination/Pagination.torp +152 -0
  200. package/dist/Pagination/PaginationItem.torp +137 -0
  201. package/dist/Pagination/PaginationTypes.ts +22 -0
  202. package/dist/Pagination/buildPages.ts +61 -0
  203. package/dist/Pagination/index.d.ts +63 -0
  204. package/dist/Pagination/index.js +3 -0
  205. package/dist/Popover/Popover.torp +39 -52
  206. package/dist/Popover/PopoverContent.torp +27 -76
  207. package/dist/Popover/PopoverHover.torp +90 -0
  208. package/dist/Popover/PopoverTrigger.torp +17 -40
  209. package/dist/Popover/PopoverTypes.ts +5 -18
  210. package/dist/Popover/index.d.ts +40 -25
  211. package/dist/Popover/index.js +18 -18
  212. package/dist/Popover/index.js.map +1 -1
  213. package/dist/Progress/Progress.torp +88 -0
  214. package/dist/Progress/index.d.ts +37 -0
  215. package/dist/Progress/index.js +2 -0
  216. package/dist/Rating/Rating.torp +225 -0
  217. package/dist/Rating/index.d.ts +44 -0
  218. package/dist/Rating/index.js +2 -0
  219. package/dist/SegmentedControl/SegmentedControl.torp +233 -0
  220. package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
  221. package/dist/SegmentedControl/SegmentedItem.torp +78 -0
  222. package/dist/SegmentedControl/index.d.ts +74 -0
  223. package/dist/SegmentedControl/index.js +3 -0
  224. package/dist/SelectBox/SelectBox.torp +190 -0
  225. package/dist/SelectBox/SelectBoxContent.torp +107 -0
  226. package/dist/SelectBox/SelectBoxTrigger.torp +141 -0
  227. package/dist/SelectBox/SelectBoxTypes.ts +33 -0
  228. package/dist/SelectBox/index.d.ts +112 -0
  229. package/dist/SelectBox/index.js +5 -0
  230. package/dist/Slider/Slider.torp +248 -0
  231. package/dist/Slider/index.d.ts +45 -0
  232. package/dist/Slider/index.js +2 -0
  233. package/dist/Splitter/Splitter.torp +156 -0
  234. package/dist/Splitter/SplitterHandle.torp +161 -0
  235. package/dist/Splitter/SplitterPane.torp +63 -0
  236. package/dist/Splitter/SplitterTypes.ts +31 -0
  237. package/dist/Splitter/index.d.ts +103 -0
  238. package/dist/Splitter/index.js +4 -0
  239. package/dist/Stepper/Stepper.torp +146 -0
  240. package/dist/Stepper/StepperMarker.torp +24 -0
  241. package/dist/Stepper/StepperNext.torp +44 -0
  242. package/dist/Stepper/StepperPrevious.torp +44 -0
  243. package/dist/Stepper/StepperStep.torp +90 -0
  244. package/dist/Stepper/StepperTypes.ts +30 -0
  245. package/dist/Stepper/index.d.ts +149 -0
  246. package/dist/Stepper/index.js +6 -0
  247. package/dist/TabGroup/TabContent.torp +6 -6
  248. package/dist/TabGroup/TabGroup.torp +97 -113
  249. package/dist/TabGroup/TabGroupTypes.ts +3 -3
  250. package/dist/TabGroup/TabHeader.torp +23 -19
  251. package/dist/TabGroup/TabList.torp +8 -21
  252. package/dist/TabGroup/TabTrigger.torp +6 -7
  253. package/dist/TabGroup/index.d.ts +26 -26
  254. package/dist/TabGroup/index.js +6 -22
  255. package/dist/TagInput/TagInput.torp +378 -0
  256. package/dist/TagInput/index.d.ts +48 -0
  257. package/dist/TagInput/index.js +2 -0
  258. package/dist/TimePicker/TimePicker.torp +462 -0
  259. package/dist/TimePicker/index.d.ts +53 -0
  260. package/dist/TimePicker/index.js +2 -0
  261. package/dist/ToolBar/ToolBar.torp +117 -0
  262. package/dist/ToolBar/ToolBarButton.torp +56 -0
  263. package/dist/ToolBar/ToolBarElement.torp +51 -0
  264. package/dist/ToolBar/ToolBarPopout.torp +45 -0
  265. package/dist/ToolBar/ToolBarPopoutContent.torp +34 -0
  266. package/dist/ToolBar/ToolBarPopoutTrigger.torp +47 -0
  267. package/dist/ToolBar/ToolBarSeparator.torp +21 -0
  268. package/dist/ToolBar/ToolBarTypes.ts +28 -0
  269. package/dist/ToolBar/index.d.ts +210 -0
  270. package/dist/ToolBar/index.js +8 -0
  271. package/dist/Tree/Tree.torp +395 -0
  272. package/dist/Tree/TreeItem.torp +176 -0
  273. package/dist/Tree/TreeItemChildren.torp +60 -0
  274. package/dist/Tree/TreeItemContent.torp +46 -0
  275. package/dist/Tree/TreeItemLabel.torp +94 -0
  276. package/dist/Tree/TreeItemTrigger.torp +78 -0
  277. package/dist/Tree/TreeLoadedChildren.torp +122 -0
  278. package/dist/Tree/TreeTypes.ts +63 -0
  279. package/dist/Tree/index.d.ts +262 -0
  280. package/dist/Tree/index.js +7 -0
  281. package/dist/icons/ChevronDoubleLeft.torp +19 -0
  282. package/dist/icons/ChevronDoubleRight.torp +19 -0
  283. package/dist/icons/index.d.ts +61 -1
  284. package/dist/icons/index.js +17 -58
  285. package/dist/loader-DEeG5vFY.js +44 -0
  286. package/dist/loader-DEeG5vFY.js.map +1 -0
  287. package/dist/motion/index.d.ts +12 -8
  288. package/dist/motion/index.d.ts.map +1 -0
  289. package/dist/motion/index.js +72 -88
  290. package/dist/motion/index.js.map +1 -1
  291. package/dist/mount/draggable.ts +63 -0
  292. package/dist/mount/dropTarget.ts +108 -0
  293. package/dist/mount/hoverTrigger.ts +1 -1
  294. package/dist/utils/$handle.ts +23 -0
  295. package/dist/utils/LoadedItems.torp +47 -0
  296. package/dist/utils/PopoutClickTrigger.torp +99 -0
  297. package/dist/utils/PopoutTypes.ts +82 -0
  298. package/dist/utils/SubmenuPopout.torp +89 -0
  299. package/dist/utils/SubmenuPopoutContent.torp +87 -0
  300. package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
  301. package/dist/utils/chartColors.ts +13 -13
  302. package/dist/utils/chartLayout.ts +143 -0
  303. package/dist/utils/chartUtils.ts +1 -1
  304. package/dist/utils/colorUtils.ts +103 -0
  305. package/dist/utils/createItemGroup.ts +152 -0
  306. package/dist/utils/dateUtils.ts +8 -7
  307. package/dist/utils/documentEvents.ts +4 -4
  308. package/dist/utils/dragState.ts +86 -0
  309. package/dist/utils/focusGroup.ts +204 -0
  310. package/dist/utils/focusItem.ts +44 -0
  311. package/dist/utils/formField.ts +70 -0
  312. package/dist/utils/hoverOpen.ts +50 -0
  313. package/dist/utils/hoverReveal.ts +194 -0
  314. package/dist/utils/loader.ts +113 -0
  315. package/dist/utils/maskUtils.ts +98 -0
  316. package/dist/utils/popoutContent.ts +137 -0
  317. package/dist/utils/reorderList.ts +52 -0
  318. package/package.json +116 -25
  319. package/dist/Accordion/index.js.map +0 -1
  320. package/dist/Breadcrumb/index.js.map +0 -1
  321. package/dist/Calendar/index.js.map +0 -1
  322. package/dist/Chart/BarChart.torp +0 -159
  323. package/dist/Chart/LineChart.torp +0 -196
  324. package/dist/Chart/index.d.ts +0 -220
  325. package/dist/Chart/index.js +0 -34
  326. package/dist/Chart/index.js.map +0 -1
  327. package/dist/Contextual/index.js.map +0 -1
  328. package/dist/Dialog/index.js.map +0 -1
  329. package/dist/Disclosure/index.js.map +0 -1
  330. package/dist/Drawer/index.js.map +0 -1
  331. package/dist/Form/index.js.map +0 -1
  332. package/dist/Menu/index.js.map +0 -1
  333. package/dist/MenuBar/index.js.map +0 -1
  334. package/dist/NavMenu/NavMenuPopoutButton.torp +0 -129
  335. package/dist/NavMenu/index.js.map +0 -1
  336. package/dist/TabGroup/index.js.map +0 -1
  337. package/dist/icons/index.js.map +0 -1
  338. package/dist/index.d.ts +0 -19
  339. package/dist/metafile-esm.json +0 -1
  340. package/dist/motion/fade.ts +0 -16
  341. package/dist/motion/grow.ts +0 -23
  342. package/dist/motion/measure.ts +0 -28
  343. package/dist/motion/slide.ts +0 -45
  344. package/dist/mount/index.d.ts +0 -2
  345. package/dist/utils/index.d.ts +0 -2
  346. /package/dist/{Chart → Charts}/DataSeries.ts +0 -0
@@ -1,100 +1,57 @@
1
- import type { ClassValue, StyleValue } from "@torpor/view";
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
+ import $handle from "../utils/$handle";
3
+ import { createItemGroup } from "../utils/createItemGroup";
2
4
  import {
3
5
  type MenuRadioGroupContext,
4
6
  MenuRadioGroupContextName,
5
- type RadioGroupItemState
7
+ type RadioGroupItemState,
6
8
  } from "./MenuTypes";
7
9
 
8
10
  interface MenuRadioGroupProps {
9
11
  /** An ID for the root element */
10
12
  id?: string;
11
13
  /** Classes for the root element */
12
- class?: ClassValue,
14
+ class?: ClassValue;
13
15
  /** Styles for the root element */
14
- style?: StyleValue,
16
+ style?: StyleValue;
15
17
  /** An ARIA label for describing the menu to screen readers */
16
- ariaLabel?: string,
18
+ ariaLabel?: string;
17
19
  /** The value of the checked MenuRadio */
18
- value?: string | undefined,
20
+ value: Bindable<string | undefined>;
19
21
  /** Raised when the checked item has changed */
20
- onchange?: (value: any) => void,
22
+ onchange?: (value: any) => void;
21
23
  }
22
24
 
23
25
  /**
24
26
  * A container for a logical group of menu RadioGroup items.
25
27
  */
26
28
  export default function MenuRadioGroup($props: MenuRadioGroupProps | undefined) {
27
- // A collection containing the state and some functions for each item
28
- let itemStates: RadioGroupItemState[] = [];
29
-
30
29
  let $state = $watch({
31
- value: $props?.value
30
+ value: $props?.value,
31
+ });
32
+
33
+ $bind($state, $props, "value");
34
+
35
+ const group = createItemGroup<RadioGroupItemState>({
36
+ state: $state,
37
+ type: "single",
38
+ selectedProperty: "checked",
39
+ allowDeselect: false,
32
40
  });
33
41
 
34
- $run(() => {
35
- if ($props !== undefined) {
36
- $props.value = $state.value;
37
- }
42
+ // Dispatch the change event when the value changes
43
+ $handle((first) => {
44
+ const value = $state.value;
45
+ if (!first) $props?.onchange?.(value);
38
46
  });
39
47
 
40
48
  // Set the context to pass down to items
41
49
  let context: MenuRadioGroupContext = {
42
- registerItemInGroup,
43
- toggleItem
50
+ registerItemInGroup: group.registerItem,
51
+ toggleItem: group.toggleItem,
44
52
  };
45
53
  $context[MenuRadioGroupContextName] = context;
46
54
 
47
- $mount(() => {
48
- // Set the initial checked item
49
- setValue($props?.value);
50
- });
51
-
52
- function registerItemInGroup(itemValue: string, setChecked: (value: boolean) => void) {
53
- // Add the item's state to the array
54
- const newItemState: RadioGroupItemState = {
55
- value: itemValue,
56
- checked: false,
57
- setChecked
58
- };
59
- itemStates.push(newItemState);
60
- itemStates = itemStates;
61
- }
62
-
63
- function setValue(newValue?: string) {
64
- // No point doing this if there aren't any items yet (e.g. from the initial setValue() call)
65
- if (!itemStates.length) {
66
- return;
67
- }
68
-
69
- // Ensure the value passed in was a string (in case e.g. the user has set values to ints)
70
- newValue = newValue?.toString();
71
- for (let item of itemStates) {
72
- item.checked = item.value === newValue;
73
- item.setChecked(item.checked);
74
- }
75
-
76
- // Set the value
77
- if ($state.value !== newValue) {
78
- $state.value = newValue;
79
-
80
- if ($props?.onchange) {
81
- $props?.onchange($props?.value);
82
- }
83
- }
84
- }
85
-
86
- function toggleItem(toggleValue: string) {
87
- let newValue = "";
88
- for (let item of itemStates) {
89
- const checked = item.value === toggleValue;
90
- item.setChecked(checked);
91
- if (checked) {
92
- newValue = item.value;
93
- }
94
- }
95
- $state.value = newValue;
96
- }
97
-
98
55
  @render {
99
56
  <div
100
57
  {$props?.id}
@@ -4,9 +4,9 @@ interface MenuSeparatorProps {
4
4
  /** An ID for the root element */
5
5
  id?: string;
6
6
  /** Classes for the root element */
7
- class?: ClassValue,
7
+ class?: ClassValue;
8
8
  /** Styles for the root element */
9
- style?: StyleValue,
9
+ style?: StyleValue;
10
10
  }
11
11
 
12
12
  /**
@@ -19,6 +19,7 @@ export default function MenuSeparator($props: MenuSeparatorProps | undefined) {
19
19
  class={["torp-menu-separator", $props?.class]}
20
20
  {$props?.style}
21
21
  role="separator"
22
+ aria-orientation="vertical"
22
23
  >
23
24
  <slot />
24
25
  </div>
@@ -1,11 +1,10 @@
1
- export const MenuContextName = "Menu";
2
- export const MenuButtonContextName = "MenuButton";
3
- export const MenuRadioGroupContextName = "MenuRadioGroup";
4
- export const MenuPopoutContextName = "MenuPopout";
1
+ import type { SubmenuItemState } from "../utils/PopoutTypes";
5
2
 
6
- export interface MenuContext {
7
- setVisible: (value: boolean, result?: any) => void;
3
+ export const MenuContextName: unique symbol = Symbol.for("torp.Menu");
4
+ export const MenuButtonContextName: unique symbol = Symbol.for("torp.MenuButton");
5
+ export const MenuRadioGroupContextName: unique symbol = Symbol.for("torp.MenuRadioGroup");
8
6
 
7
+ export interface MenuContext {
9
8
  /** Called from a MenuButton to close the Menu and return a result */
10
9
  handleButton: (type: "confirm" | "cancel" | undefined, value?: any) => void;
11
10
 
@@ -15,13 +14,16 @@ export interface MenuContext {
15
14
  /** Called from a MenuButton when a key is pressed */
16
15
  handleItemKey: (e: KeyboardEvent) => void;
17
16
 
17
+ /** Called from a MenuButton when a submenu is shown */
18
+ handlePopout: (index: number) => void;
19
+
18
20
  state: MenuState;
19
21
 
20
22
  /** The element that caused this Menu to be shown */
21
23
  anchorElement?: HTMLElement;
22
24
 
23
25
  /** Called from each MenuButton/Check/Radio to register itself with this Menu */
24
- registerItem: (setFocused: () => void) => { index: number };
26
+ registerItem: (item: ItemState) => { index: number };
25
27
  }
26
28
 
27
29
  export interface MenuState {
@@ -36,25 +38,14 @@ export interface MenuButtonContext {
36
38
  }
37
39
 
38
40
  export interface MenuRadioGroupContext {
39
- registerItemInGroup: (value: string, setChecked: (value: boolean) => void) => void;
41
+ registerItemInGroup: (itemState: RadioGroupItemState) => void;
40
42
  toggleItem: (value: string) => void;
41
43
  }
42
44
 
43
- export interface MenuPopoutContext {
44
- setVisible: (value: boolean) => void;
45
- state: {
46
- visible: boolean;
47
- };
48
- anchorElement?: HTMLElement;
49
- focusFirstElement?: () => void;
50
- }
51
-
52
- export interface ItemState {
53
- setFocused: () => void;
54
- }
45
+ export type ItemState = SubmenuItemState;
55
46
 
56
47
  export interface RadioGroupItemState {
48
+ index: number;
57
49
  value: string;
58
50
  checked: boolean;
59
- setChecked: (value: boolean) => void;
60
51
  }
@@ -5,11 +5,11 @@ interface MenuProps {
5
5
  /** An ID for the root element */
6
6
  id?: string;
7
7
  /** Classes for the root element */
8
- class?: ClassValue,
8
+ class?: ClassValue;
9
9
  /** Styles for the root element */
10
- style?: StyleValue,
10
+ style?: StyleValue;
11
11
  /** An ARIA label for describing the menu to screen readers */
12
- ariaLabel?: string,
12
+ ariaLabel?: string;
13
13
  }
14
14
 
15
15
  /**
@@ -44,17 +44,17 @@ interface MenuButtonProps {
44
44
  /** An ID for the root element */
45
45
  id?: string;
46
46
  /** Classes for the root element */
47
- class?: ClassValue,
47
+ class?: ClassValue;
48
48
  /** Styles for the root element */
49
- style?: StyleValue,
49
+ style?: StyleValue;
50
50
  /** The value that should be returned when this button is pressed and the Dialog was invoked by calling showContextual, showPrompt or showPopover */
51
- value?: any,
51
+ value?: any;
52
52
  /** Whether this button is disabled */
53
- disabled?: boolean,
53
+ disabled?: boolean;
54
54
  /** Raised when the button is clicked */
55
- onclick?: (e: MouseEvent) => void,
55
+ onclick?: (e: MouseEvent) => void;
56
56
  /** Raised when a key is pressed down */
57
- onkeydown?: (e: KeyboardEvent) => void,
57
+ onkeydown?: (e: KeyboardEvent) => void;
58
58
  }
59
59
 
60
60
  /**
@@ -75,15 +75,15 @@ interface MenuCheckProps {
75
75
  /** An ID for the root element */
76
76
  id?: string;
77
77
  /** Classes for the root element */
78
- class?: ClassValue,
78
+ class?: ClassValue;
79
79
  /** Styles for the root element */
80
- style?: StyleValue,
80
+ style?: StyleValue;
81
81
  /** Whether this item is checked */
82
- checked?: boolean,
82
+ checked: Bindable<boolean | undefined>;
83
83
  /** Whether this item is disabled */
84
- disabled?: boolean,
84
+ disabled?: boolean;
85
85
  /** Raised when the checkbox is clicked */
86
- onclick?: (e: MouseEvent) => void,
86
+ onclick?: (e: MouseEvent) => void;
87
87
  }
88
88
 
89
89
  /**
@@ -105,11 +105,11 @@ interface MenuGroupProps {
105
105
  /** An ID for the root element */
106
106
  id?: string;
107
107
  /** Classes for the root element */
108
- class?: ClassValue,
108
+ class?: ClassValue;
109
109
  /** Styles for the root element */
110
- style?: StyleValue,
110
+ style?: StyleValue;
111
111
  /** An ARIA label for describing the group to screen readers */
112
- ariaLabel?: string,
112
+ ariaLabel?: string;
113
113
  }
114
114
 
115
115
  /**
@@ -129,11 +129,9 @@ interface MenuIndicatorProps {
129
129
  /** An ID for the root element */
130
130
  id?: string;
131
131
  /** Classes for the root element */
132
- class?: ClassValue,
132
+ class?: ClassValue;
133
133
  /** Styles for the root element */
134
- style?: StyleValue,
135
- /** Whether this item is disabled */
136
- disabled?: boolean,
134
+ style?: StyleValue;
137
135
  }
138
136
 
139
137
  /**
@@ -154,17 +152,15 @@ interface MenuPopoutProps {
154
152
  /** An ID for the root element */
155
153
  id?: string;
156
154
  /** Classes for the root element */
157
- class?: ClassValue,
155
+ class?: ClassValue;
158
156
  /** Styles for the root element */
159
- style?: StyleValue,
157
+ style?: StyleValue;
160
158
  /** Whether the popout is visible */
161
- visible?: boolean,
162
- /** Raised when the popout is opened or closed */
163
- ontoggle?: (open: boolean) => void,
159
+ visible?: boolean;
164
160
  /** Raised when the popout has opened */
165
- onopen?: () => void,
161
+ onopen?: () => void;
166
162
  /** Raised when the popout has closed */
167
- onclose?: (result: any) => void,
163
+ onclose?: (result: any) => void;
168
164
  }
169
165
 
170
166
  /**
@@ -193,13 +189,13 @@ interface MenuPopoutContentProps {
193
189
  /** An ID for the root element */
194
190
  id?: string;
195
191
  /** Classes for the root element */
196
- class?: ClassValue,
192
+ class?: ClassValue;
197
193
  /** Styles for the root element */
198
- style?: StyleValue,
194
+ style?: StyleValue;
199
195
  /** Where the popout will be shown, relative to the popout button */
200
- side?: "top" | "right" | "bottom" | "left",
196
+ side?: "top" | "right" | "bottom" | "left";
201
197
  /** How the popout will be aligned, relative to the popout button */
202
- alignment?: "start" | "center" | "end",
198
+ alignment?: "start" | "center" | "end";
203
199
  }
204
200
 
205
201
  /**
@@ -219,13 +215,13 @@ interface MenuPopoutTriggerProps {
219
215
  /** An ID for the root element */
220
216
  id?: string;
221
217
  /** Classes for the root element */
222
- class?: ClassValue,
218
+ class?: ClassValue;
223
219
  /** Styles for the root element */
224
- style?: StyleValue,
220
+ style?: StyleValue;
225
221
  /** The delay before showing the popout, in milliseconds */
226
- hoverDelay?: number,
222
+ hoverDelay?: number;
227
223
  /** Whether this button is disabled */
228
- disabled?: boolean,
224
+ disabled?: boolean;
229
225
  }
230
226
 
231
227
  /**
@@ -245,15 +241,13 @@ interface MenuRadioProps {
245
241
  /** An ID for the root element */
246
242
  id?: string;
247
243
  /** Classes for the root element */
248
- class?: ClassValue,
244
+ class?: ClassValue;
249
245
  /** Styles for the root element */
250
- style?: StyleValue,
246
+ style?: StyleValue;
251
247
  /** The value of the item */
252
- value?: string,
253
- /** Whether this item is checked */
254
- checked?: boolean,
248
+ value: string;
255
249
  /** Whether this item is disabled */
256
- disabled?: boolean,
250
+ disabled?: boolean;
257
251
  }
258
252
 
259
253
  /**
@@ -263,7 +257,7 @@ interface MenuRadioProps {
263
257
  declare function MenuRadio(
264
258
  $parent: ParentNode,
265
259
  $anchor: Node | null,
266
- $props: MenuRadioProps | undefined,
260
+ $props: MenuRadioProps,
267
261
  $context?: Record<PropertyKey, any>,
268
262
  $slots?: Record<string, SlotRender>,
269
263
  ): void;
@@ -274,15 +268,15 @@ interface MenuRadioGroupProps {
274
268
  /** An ID for the root element */
275
269
  id?: string;
276
270
  /** Classes for the root element */
277
- class?: ClassValue,
271
+ class?: ClassValue;
278
272
  /** Styles for the root element */
279
- style?: StyleValue,
273
+ style?: StyleValue;
280
274
  /** An ARIA label for describing the menu to screen readers */
281
- ariaLabel?: string,
275
+ ariaLabel?: string;
282
276
  /** The value of the checked MenuRadio */
283
- value?: string | undefined,
277
+ value: Bindable<string | undefined>;
284
278
  /** Raised when the checked item has changed */
285
- onchange?: (value: any) => void,
279
+ onchange?: (value: any) => void;
286
280
  }
287
281
 
288
282
  /**
@@ -302,9 +296,9 @@ interface MenuSeparatorProps {
302
296
  /** An ID for the root element */
303
297
  id?: string;
304
298
  /** Classes for the root element */
305
- class?: ClassValue,
299
+ class?: ClassValue;
306
300
  /** Styles for the root element */
307
- style?: StyleValue,
301
+ style?: StyleValue;
308
302
  }
309
303
 
310
304
  /**
@@ -318,4 +312,4 @@ declare function MenuSeparator(
318
312
  $slots?: Record<string, SlotRender>,
319
313
  ): void;
320
314
 
321
- export { Menu, MenuButton, MenuCheck, MenuGroup, MenuIndicator, MenuPopout, MenuPopoutContent, MenuPopoutTrigger, MenuRadio, MenuRadioGroup, MenuSeparator };
315
+ export { Menu, MenuButton, MenuCheck, MenuGroup, MenuIndicator, MenuPopout, MenuPopoutContent, MenuPopoutTrigger, MenuRadio, MenuRadioGroup, MenuSeparator };
@@ -1,46 +1,12 @@
1
- // src/Menu/Menu.torp
2
- import Menu_default from "./Menu.torp";
3
-
4
- // src/Menu/MenuButton.torp
5
- import MenuButton_default from "./MenuButton.torp";
6
-
7
- // src/Menu/MenuCheck.torp
8
- import MenuCheck_default from "./MenuCheck.torp";
9
-
10
- // src/Menu/MenuGroup.torp
11
- import MenuGroup_default from "./MenuGroup.torp";
12
-
13
- // src/Menu/MenuIndicator.torp
14
- import MenuIndicator_default from "./MenuIndicator.torp";
15
-
16
- // src/Menu/MenuPopout.torp
17
- import MenuPopout_default from "./MenuPopout.torp";
18
-
19
- // src/Menu/MenuPopoutContent.torp
20
- import MenuPopoutContent_default from "./MenuPopoutContent.torp";
21
-
22
- // src/Menu/MenuPopoutTrigger.torp
23
- import MenuPopoutTrigger_default from "./MenuPopoutTrigger.torp";
24
-
25
- // src/Menu/MenuRadio.torp
26
- import MenuRadio_default from "./MenuRadio.torp";
27
-
28
- // src/Menu/MenuRadioGroup.torp
29
- import MenuRadioGroup_default from "./MenuRadioGroup.torp";
30
-
31
- // src/Menu/MenuSeparator.torp
32
- import MenuSeparator_default from "./MenuSeparator.torp";
33
- export {
34
- Menu_default as Menu,
35
- MenuButton_default as MenuButton,
36
- MenuCheck_default as MenuCheck,
37
- MenuGroup_default as MenuGroup,
38
- MenuIndicator_default as MenuIndicator,
39
- MenuPopout_default as MenuPopout,
40
- MenuPopoutContent_default as MenuPopoutContent,
41
- MenuPopoutTrigger_default as MenuPopoutTrigger,
42
- MenuRadio_default as MenuRadio,
43
- MenuRadioGroup_default as MenuRadioGroup,
44
- MenuSeparator_default as MenuSeparator
45
- };
46
- //# sourceMappingURL=index.js.map
1
+ import Menu from "./Menu.torp";
2
+ import MenuButton from "./MenuButton.torp";
3
+ import MenuCheck from "./MenuCheck.torp";
4
+ import MenuGroup from "./MenuGroup.torp";
5
+ import MenuIndicator from "./MenuIndicator.torp";
6
+ import MenuPopout from "./MenuPopout.torp";
7
+ import MenuPopoutContent from "./MenuPopoutContent.torp";
8
+ import MenuPopoutTrigger from "./MenuPopoutTrigger.torp";
9
+ import MenuRadio from "./MenuRadio.torp";
10
+ import MenuRadioGroup from "./MenuRadioGroup.torp";
11
+ import MenuSeparator from "./MenuSeparator.torp";
12
+ export { Menu, MenuButton, MenuCheck, MenuGroup, MenuIndicator, MenuPopout, MenuPopoutContent, MenuPopoutTrigger, MenuRadio, MenuRadioGroup, MenuSeparator };
@@ -1,17 +1,18 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { MenuBarContextName, type MenuBarContext, type ItemState } from "./MenuBarTypes";
2
+ import { createFocusGroup } from "../utils/focusGroup";
3
+ import { type ItemState, type MenuBarContext, MenuBarContextName } from "./MenuBarTypes";
3
4
 
4
5
  interface MenuBarProps {
5
6
  /** An ID for the root element */
6
7
  id?: string;
7
8
  /** Classes for the root element */
8
- class?: ClassValue,
9
+ class?: ClassValue;
9
10
  /** Styles for the root element */
10
- style?: StyleValue,
11
+ style?: StyleValue;
11
12
  /** An ARIA label for describing the menu to screen readers */
12
- ariaLabel?: string,
13
+ ariaLabel?: string;
13
14
  /** The orientation of the menu, which affects keyboard navigation */
14
- orientation?: "horizontal" | "vertical",
15
+ orientation?: "horizontal" | "vertical";
15
16
  }
16
17
 
17
18
  /**
@@ -39,111 +40,58 @@ export default function MenuBar($props: MenuBarProps | undefined) {
39
40
  active: false,
40
41
  });
41
42
 
42
- // A collection containing the state and some functions for each item
43
- let itemStates: ItemState[] = [];
44
- let focusIndex = -1;
43
+ // The focus group owns the item ledger and roving-tabindex bookkeeping
44
+ const group = createFocusGroup<ItemState>();
45
+ const { itemStates } = group;
45
46
 
46
47
  // Set the context to pass down to items
47
48
  let context: MenuBarContext = {
48
49
  handleItemShow,
49
50
  handleButtonFocus,
50
51
  handleButtonKey,
52
+ handleAdjacentItem,
51
53
  registerItem,
52
- state: $state
54
+ state: $state,
53
55
  };
54
56
  $context[MenuBarContextName] = context;
55
57
 
56
- function registerItem(setVisible: (value: boolean) => void, setFocused: () => void) {
57
- // Add the item's state to the array and return its index
58
- const newItemState: ItemState = {
59
- setVisible,
60
- setFocused
61
- };
62
- itemStates.push(newItemState);
63
- itemStates = itemStates;
64
- return { index: itemStates.length - 1 };
58
+ function registerItem(item: ItemState) {
59
+ return group.registerItem(item);
65
60
  }
66
61
 
67
62
  function handleItemShow(index: number) {
68
63
  // Make sure other items are hidden
69
64
  itemStates.forEach((item, i) => {
70
65
  if (i !== index) {
71
- item.setVisible(false);
66
+ item.setVisible?.(false);
72
67
  }
73
68
  });
74
69
  }
75
70
 
76
71
  function handleButtonFocus(index: number) {
77
- focusIndex = index;
72
+ group.handleItemFocus(index);
78
73
  }
79
74
 
80
- function handleButtonKey(e: KeyboardEvent) {
81
- switch (e.key) {
82
- case "Right":
83
- case "ArrowRight": {
84
- if (orientation === "horizontal") {
85
- e.preventDefault();
86
- focusItem("next");
87
- }
88
- break;
89
- }
90
- case "Left":
91
- case "ArrowLeft": {
92
- if (orientation === "horizontal") {
93
- e.preventDefault();
94
- focusItem("previous");
95
- }
96
- break;
97
- }
98
- case "Down":
99
- case "ArrowDown": {
100
- if (orientation === "vertical") {
101
- e.preventDefault();
102
- focusItem("next");
103
- }
104
- break;
105
- }
106
- case "Up":
107
- case "ArrowUp": {
108
- if (orientation === "vertical") {
109
- e.preventDefault();
110
- focusItem("previous");
111
- }
112
- break;
113
- }
114
- case "Home": {
115
- e.preventDefault();
116
- focusItem("start");
117
- break;
118
- }
119
- case "End": {
120
- e.preventDefault();
121
- focusItem("end");
122
- break;
123
- }
75
+ function handleAdjacentItem(index: number, target: "previous" | "next") {
76
+ // Move focus to the adjacent item and open its menu; opening it also
77
+ // hides the current item's menu via handleItemShow
78
+ group.handleItemFocus(index);
79
+ focusItem(target);
80
+ const next = group.getFocusIndex();
81
+ if (next !== index) {
82
+ $state.active = true;
83
+ itemStates[next].setVisible?.(true);
124
84
  }
125
85
  }
126
86
 
87
+ function handleButtonKey(e: KeyboardEvent) {
88
+ group.handleGroupKey(group.getFocusIndex(), e, {
89
+ vertical: orientation === "vertical",
90
+ });
91
+ }
92
+
127
93
  function focusItem(target: "start" | "previous" | "next" | "end") {
128
- switch (target) {
129
- case "start": {
130
- focusIndex = 0;
131
- break;
132
- }
133
- case "previous": {
134
- focusIndex = Math.max(0, focusIndex - 1);
135
- break;
136
- }
137
- case "next": {
138
- focusIndex = Math.min(itemStates.length - 1, focusIndex + 1);
139
- break;
140
- }
141
- case "end": {
142
- focusIndex = itemStates.length - 1;
143
- break;
144
- }
145
- }
146
- itemStates[focusIndex]?.setFocused();
94
+ group.moveFocus(group.getFocusIndex(), target);
147
95
  }
148
96
 
149
97
  @render {