@torpor/ui 0.4.0 → 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 (342) hide show
  1. package/README.md +83 -7
  2. package/dist/Accordion/Accordion.torp +42 -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 +1 -1
  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 +24 -3
  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 +55 -144
  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/Charts/GridLines.torp +4 -4
  46. package/dist/Charts/LineChart.torp +55 -178
  47. package/dist/Charts/PieChart.torp +14 -20
  48. package/dist/Charts/ScatterChart.torp +45 -38
  49. package/dist/Charts/SparkLine.torp +16 -19
  50. package/dist/Charts/XAxis.torp +11 -11
  51. package/dist/Charts/YAxis.torp +8 -8
  52. package/dist/Charts/index.d.ts +328 -79
  53. package/dist/Charts/index.js +17 -34
  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 +32 -50
  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 +4 -17
  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 +24 -17
  91. package/dist/Dialog/DialogBody.torp +5 -9
  92. package/dist/Dialog/DialogButton.torp +12 -12
  93. package/dist/Dialog/DialogFooter.torp +3 -7
  94. package/dist/Dialog/DialogHeader.torp +6 -10
  95. package/dist/Dialog/index.d.ts +27 -27
  96. package/dist/Dialog/index.js +6 -22
  97. package/dist/Disclosure/Disclosure.torp +18 -18
  98. package/dist/Disclosure/DisclosureContent.torp +5 -6
  99. package/dist/Disclosure/DisclosureHeader.torp +7 -11
  100. package/dist/Disclosure/DisclosureTrigger.torp +4 -5
  101. package/dist/Disclosure/index.d.ts +14 -16
  102. package/dist/Disclosure/index.js +5 -18
  103. package/dist/Drawer/Drawer.torp +19 -49
  104. package/dist/Drawer/DrawerContent.torp +67 -13
  105. package/dist/Drawer/DrawerOverlay.torp +4 -4
  106. package/dist/Drawer/DrawerTrigger.torp +16 -4
  107. package/dist/Drawer/DrawerTypes.ts +3 -0
  108. package/dist/Drawer/index.d.ts +16 -20
  109. package/dist/Drawer/index.js +5 -18
  110. package/dist/FocusGroup/FocusGroup.torp +70 -0
  111. package/dist/FocusGroup/FocusGroupButton.torp +59 -0
  112. package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
  113. package/dist/FocusGroup/index.d.ts +44 -0
  114. package/dist/FocusGroup/index.js +3 -0
  115. package/dist/Form/CheckBox.torp +27 -18
  116. package/dist/Form/Field.torp +17 -17
  117. package/dist/Form/File.torp +31 -22
  118. package/dist/Form/FileDrop.torp +187 -0
  119. package/dist/Form/Form.torp +24 -22
  120. package/dist/Form/FormTypes.ts +2 -0
  121. package/dist/Form/FormValues.torp +37 -0
  122. package/dist/Form/Hidden.torp +4 -12
  123. package/dist/Form/Input.torp +38 -32
  124. package/dist/Form/Label.torp +3 -3
  125. package/dist/Form/Message.torp +13 -5
  126. package/dist/Form/MessageSummary.torp +5 -4
  127. package/dist/Form/Option.torp +11 -7
  128. package/dist/Form/Select.torp +32 -28
  129. package/dist/Form/TextArea.torp +35 -31
  130. package/dist/Form/Toggle.torp +109 -0
  131. package/dist/Form/index.d.ts +178 -79
  132. package/dist/Form/index.js +16 -50
  133. package/dist/ListBox/ListBox.torp +253 -150
  134. package/dist/ListBox/ListBoxItem.torp +54 -30
  135. package/dist/ListBox/ListBoxSeparator.torp +5 -2
  136. package/dist/ListBox/ListBoxTypes.ts +23 -5
  137. package/dist/ListBox/LoadedListBoxItems.torp +41 -0
  138. package/dist/ListBox/index.d.ts +56 -17
  139. package/dist/ListBox/index.js +4 -14
  140. package/dist/MaskedInput/MaskedInput.torp +143 -0
  141. package/dist/MaskedInput/index.d.ts +52 -0
  142. package/dist/MaskedInput/index.js +2 -0
  143. package/dist/Menu/Menu.torp +86 -71
  144. package/dist/Menu/MenuButton.torp +17 -10
  145. package/dist/Menu/MenuCheck.torp +22 -18
  146. package/dist/Menu/MenuGroup.torp +4 -4
  147. package/dist/Menu/MenuIndicator.torp +5 -13
  148. package/dist/Menu/MenuPopout.torp +20 -50
  149. package/dist/Menu/MenuPopoutContent.torp +15 -66
  150. package/dist/Menu/MenuPopoutTrigger.torp +19 -100
  151. package/dist/Menu/MenuRadio.torp +25 -26
  152. package/dist/Menu/MenuRadioGroup.torp +25 -68
  153. package/dist/Menu/MenuSeparator.torp +3 -2
  154. package/dist/Menu/MenuTypes.ts +9 -19
  155. package/dist/Menu/index.d.ts +45 -51
  156. package/dist/Menu/index.js +12 -46
  157. package/dist/MenuBar/MenuBar.torp +31 -83
  158. package/dist/MenuBar/MenuBarItem.torp +33 -51
  159. package/dist/MenuBar/MenuBarItemContent.torp +15 -101
  160. package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
  161. package/dist/MenuBar/MenuBarTypes.ts +11 -10
  162. package/dist/MenuBar/index.d.ts +17 -19
  163. package/dist/MenuBar/index.js +5 -18
  164. package/dist/Modal/Modal.torp +22 -47
  165. package/dist/Modal/ModalContent.torp +21 -44
  166. package/dist/Modal/ModalOverlay.torp +4 -4
  167. package/dist/Modal/ModalTrigger.torp +16 -32
  168. package/dist/Modal/ModalTypes.ts +5 -16
  169. package/dist/Modal/index.d.ts +17 -29
  170. package/dist/Modal/index.js +29 -28
  171. package/dist/Modal/index.js.map +1 -1
  172. package/dist/Modal/showPrompt.ts +2 -2
  173. package/dist/NavMenu/NavMenu.torp +22 -111
  174. package/dist/NavMenu/NavMenuButton.torp +7 -8
  175. package/dist/NavMenu/NavMenuElement.torp +6 -7
  176. package/dist/NavMenu/NavMenuGroup.torp +5 -5
  177. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
  178. package/dist/NavMenu/NavMenuLink.torp +7 -10
  179. package/dist/NavMenu/NavMenuPopout.torp +15 -60
  180. package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
  181. package/dist/NavMenu/NavMenuPopoutTrigger.torp +17 -99
  182. package/dist/NavMenu/NavMenuSeparator.torp +3 -7
  183. package/dist/NavMenu/NavMenuTypes.ts +4 -14
  184. package/dist/NavMenu/index.d.ts +40 -44
  185. package/dist/NavMenu/index.js +11 -42
  186. package/dist/Notification/Notification.torp +12 -24
  187. package/dist/Notification/NotificationClose.torp +6 -3
  188. package/dist/Notification/NotificationContainer.torp +3 -7
  189. package/dist/Notification/NotificationContent.torp +3 -7
  190. package/dist/Notification/NotificationTypes.ts +1 -1
  191. package/dist/Notification/index.d.ts +15 -12
  192. package/dist/Notification/index.js +22 -32
  193. package/dist/Notification/index.js.map +1 -1
  194. package/dist/NumberInput/NumberInput.torp +255 -0
  195. package/dist/NumberInput/index.d.ts +44 -0
  196. package/dist/NumberInput/index.js +2 -0
  197. package/dist/Pagination/Pagination.torp +41 -34
  198. package/dist/Pagination/PaginationItem.torp +50 -13
  199. package/dist/Pagination/PaginationTypes.ts +3 -6
  200. package/dist/Pagination/buildPages.ts +9 -5
  201. package/dist/Pagination/index.d.ts +19 -9
  202. package/dist/Pagination/index.js +3 -40
  203. package/dist/Popover/Popover.torp +32 -50
  204. package/dist/Popover/PopoverContent.torp +27 -76
  205. package/dist/Popover/PopoverHover.torp +90 -0
  206. package/dist/Popover/PopoverTrigger.torp +17 -40
  207. package/dist/Popover/PopoverTypes.ts +4 -17
  208. package/dist/Popover/index.d.ts +40 -25
  209. package/dist/Popover/index.js +18 -18
  210. package/dist/Popover/index.js.map +1 -1
  211. package/dist/Progress/Progress.torp +88 -0
  212. package/dist/Progress/index.d.ts +37 -0
  213. package/dist/Progress/index.js +2 -0
  214. package/dist/Rating/Rating.torp +225 -0
  215. package/dist/Rating/index.d.ts +44 -0
  216. package/dist/Rating/index.js +2 -0
  217. package/dist/SegmentedControl/SegmentedControl.torp +233 -0
  218. package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
  219. package/dist/SegmentedControl/SegmentedItem.torp +78 -0
  220. package/dist/SegmentedControl/index.d.ts +74 -0
  221. package/dist/SegmentedControl/index.js +3 -0
  222. package/dist/SelectBox/SelectBox.torp +107 -53
  223. package/dist/SelectBox/SelectBoxContent.torp +45 -19
  224. package/dist/SelectBox/SelectBoxTrigger.torp +108 -8
  225. package/dist/SelectBox/SelectBoxTypes.ts +26 -11
  226. package/dist/SelectBox/index.d.ts +39 -54
  227. package/dist/SelectBox/index.js +5 -18
  228. package/dist/Slider/Slider.torp +248 -0
  229. package/dist/Slider/index.d.ts +45 -0
  230. package/dist/Slider/index.js +2 -0
  231. package/dist/Splitter/Splitter.torp +156 -0
  232. package/dist/Splitter/SplitterHandle.torp +161 -0
  233. package/dist/Splitter/SplitterPane.torp +63 -0
  234. package/dist/Splitter/SplitterTypes.ts +31 -0
  235. package/dist/Splitter/index.d.ts +103 -0
  236. package/dist/Splitter/index.js +4 -0
  237. package/dist/Stepper/Stepper.torp +146 -0
  238. package/dist/Stepper/StepperMarker.torp +24 -0
  239. package/dist/Stepper/StepperNext.torp +44 -0
  240. package/dist/Stepper/StepperPrevious.torp +44 -0
  241. package/dist/Stepper/StepperStep.torp +90 -0
  242. package/dist/Stepper/StepperTypes.ts +30 -0
  243. package/dist/Stepper/index.d.ts +149 -0
  244. package/dist/Stepper/index.js +6 -0
  245. package/dist/TabGroup/TabContent.torp +6 -6
  246. package/dist/TabGroup/TabGroup.torp +97 -113
  247. package/dist/TabGroup/TabGroupTypes.ts +1 -1
  248. package/dist/TabGroup/TabHeader.torp +23 -19
  249. package/dist/TabGroup/TabList.torp +8 -21
  250. package/dist/TabGroup/TabTrigger.torp +6 -7
  251. package/dist/TabGroup/index.d.ts +26 -26
  252. package/dist/TabGroup/index.js +6 -22
  253. package/dist/TagInput/TagInput.torp +378 -0
  254. package/dist/TagInput/index.d.ts +48 -0
  255. package/dist/TagInput/index.js +2 -0
  256. package/dist/TimePicker/TimePicker.torp +462 -0
  257. package/dist/TimePicker/index.d.ts +53 -0
  258. package/dist/TimePicker/index.js +2 -0
  259. package/dist/ToolBar/ToolBar.torp +29 -110
  260. package/dist/ToolBar/ToolBarButton.torp +7 -8
  261. package/dist/ToolBar/ToolBarElement.torp +7 -11
  262. package/dist/ToolBar/ToolBarPopout.torp +16 -68
  263. package/dist/ToolBar/ToolBarPopoutContent.torp +15 -73
  264. package/dist/ToolBar/ToolBarPopoutTrigger.torp +19 -110
  265. package/dist/ToolBar/ToolBarSeparator.torp +3 -7
  266. package/dist/ToolBar/ToolBarTypes.ts +7 -14
  267. package/dist/ToolBar/index.d.ts +30 -32
  268. package/dist/ToolBar/index.js +8 -30
  269. package/dist/Tree/Tree.torp +395 -0
  270. package/dist/Tree/TreeItem.torp +176 -0
  271. package/dist/Tree/TreeItemChildren.torp +60 -0
  272. package/dist/Tree/TreeItemContent.torp +46 -0
  273. package/dist/Tree/TreeItemLabel.torp +94 -0
  274. package/dist/Tree/TreeItemTrigger.torp +78 -0
  275. package/dist/Tree/TreeLoadedChildren.torp +122 -0
  276. package/dist/Tree/TreeTypes.ts +63 -0
  277. package/dist/Tree/index.d.ts +262 -0
  278. package/dist/Tree/index.js +7 -0
  279. package/dist/icons/ChevronDoubleLeft.torp +19 -0
  280. package/dist/icons/ChevronDoubleRight.torp +19 -0
  281. package/dist/icons/index.d.ts +61 -1
  282. package/dist/icons/index.js +17 -58
  283. package/dist/loader-DEeG5vFY.js +44 -0
  284. package/dist/loader-DEeG5vFY.js.map +1 -0
  285. package/dist/motion/index.d.ts +12 -8
  286. package/dist/motion/index.d.ts.map +1 -0
  287. package/dist/motion/index.js +72 -88
  288. package/dist/motion/index.js.map +1 -1
  289. package/dist/mount/draggable.ts +63 -0
  290. package/dist/mount/dropTarget.ts +108 -0
  291. package/dist/mount/hoverTrigger.ts +1 -1
  292. package/dist/utils/$handle.ts +23 -0
  293. package/dist/utils/LoadedItems.torp +47 -0
  294. package/dist/utils/PopoutClickTrigger.torp +99 -0
  295. package/dist/utils/PopoutTypes.ts +59 -12
  296. package/dist/utils/SubmenuPopout.torp +89 -0
  297. package/dist/utils/SubmenuPopoutContent.torp +87 -0
  298. package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
  299. package/dist/utils/chartColors.ts +13 -13
  300. package/dist/utils/chartLayout.ts +143 -0
  301. package/dist/utils/colorUtils.ts +103 -0
  302. package/dist/utils/createItemGroup.ts +152 -0
  303. package/dist/utils/dateUtils.ts +8 -7
  304. package/dist/utils/documentEvents.ts +4 -4
  305. package/dist/utils/dragState.ts +86 -0
  306. package/dist/utils/focusGroup.ts +204 -0
  307. package/dist/utils/focusItem.ts +44 -0
  308. package/dist/utils/formField.ts +70 -0
  309. package/dist/utils/hoverOpen.ts +50 -0
  310. package/dist/utils/hoverReveal.ts +194 -0
  311. package/dist/utils/loader.ts +113 -0
  312. package/dist/utils/maskUtils.ts +98 -0
  313. package/dist/utils/popoutContent.ts +137 -0
  314. package/dist/utils/reorderList.ts +52 -0
  315. package/package.json +97 -22
  316. package/dist/Accordion/index.js.map +0 -1
  317. package/dist/Breadcrumb/index.js.map +0 -1
  318. package/dist/Calendar/index.js.map +0 -1
  319. package/dist/Charts/index.js.map +0 -1
  320. package/dist/Contextual/index.js.map +0 -1
  321. package/dist/Dialog/index.js.map +0 -1
  322. package/dist/Disclosure/index.js.map +0 -1
  323. package/dist/Drawer/index.js.map +0 -1
  324. package/dist/Form/index.js.map +0 -1
  325. package/dist/ListBox/index.js.map +0 -1
  326. package/dist/Menu/index.js.map +0 -1
  327. package/dist/MenuBar/index.js.map +0 -1
  328. package/dist/NavMenu/index.js.map +0 -1
  329. package/dist/Pagination/index.js.map +0 -1
  330. package/dist/SelectBox/SelectBoxInput.torp +0 -95
  331. package/dist/SelectBox/index.js.map +0 -1
  332. package/dist/TabGroup/index.js.map +0 -1
  333. package/dist/ToolBar/index.js.map +0 -1
  334. package/dist/icons/index.js.map +0 -1
  335. package/dist/index.d.ts +0 -19
  336. package/dist/metafile-esm.json +0 -1
  337. package/dist/motion/fade.ts +0 -16
  338. package/dist/motion/grow.ts +0 -23
  339. package/dist/motion/measure.ts +0 -28
  340. package/dist/motion/slide.ts +0 -45
  341. package/dist/mount/index.d.ts +0 -2
  342. package/dist/utils/index.d.ts +0 -2
@@ -1,21 +1,21 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { MenuContextName, type MenuContext } from "./MenuTypes";
2
+ import { type ItemState, type MenuContext, MenuContextName } from "./MenuTypes";
3
3
 
4
4
  interface MenuButtonProps {
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
  /** The value that should be returned when this button is pressed and the Dialog was invoked by calling showContextual, showPrompt or showPopover */
12
- value?: any,
12
+ value?: any;
13
13
  /** Whether this button is disabled */
14
- disabled?: boolean,
14
+ disabled?: boolean;
15
15
  /** Raised when the button is clicked */
16
- onclick?: (e: MouseEvent) => void,
16
+ onclick?: (e: MouseEvent) => void;
17
17
  /** Raised when a key is pressed down */
18
- onkeydown?: (e: KeyboardEvent) => void,
18
+ onkeydown?: (e: KeyboardEvent) => void;
19
19
  }
20
20
 
21
21
  /**
@@ -33,7 +33,8 @@ export default function MenuButton($props: MenuButtonProps | undefined) {
33
33
  const { registerItem, handleButton, handleItemKey, handleItemFocus } = menuContext;
34
34
 
35
35
  // Register this item with the parent Menu and store the index
36
- const { index } = registerItem(setFocused);
36
+ const item: ItemState = { setFocused, disabled: $props?.disabled };
37
+ const { index } = registerItem(item);
37
38
 
38
39
  function handleKeyDown(e: KeyboardEvent) {
39
40
  handleItemKey(e);
@@ -43,7 +44,7 @@ export default function MenuButton($props: MenuButtonProps | undefined) {
43
44
  }
44
45
 
45
46
  function handleClick(e: MouseEvent) {
46
- handleButton($props?.value);
47
+ handleButton("confirm", $props?.value);
47
48
  if ($props?.onclick) {
48
49
  $props.onclick(e);
49
50
  }
@@ -53,6 +54,11 @@ export default function MenuButton($props: MenuButtonProps | undefined) {
53
54
  button.focus();
54
55
  }
55
56
 
57
+ // Store the item's label for type-ahead
58
+ function handleMount(el: HTMLButtonElement) {
59
+ item.text = el.textContent.trim();
60
+ }
61
+
56
62
  @render {
57
63
  <button
58
64
  {$props?.id}
@@ -61,11 +67,12 @@ export default function MenuButton($props: MenuButtonProps | undefined) {
61
67
  type="button"
62
68
  {$props?.disabled}
63
69
  role="menuitem"
70
+ tabindex="-1"
64
71
  aria-disabled={$props?.disabled ? "true" : undefined}
65
- data-disabled={$props?.disabled ? "true" : undefined}
66
72
  onkeydown={handleKeyDown}
67
73
  onclick={handleClick}
68
74
  onfocus={() => handleItemFocus(index)}
75
+ onmount={handleMount}
69
76
  &ref={button}
70
77
  >
71
78
  <slot />
@@ -1,24 +1,25 @@
1
- import type { ClassValue, StyleValue } from "@torpor/view";
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
2
  import {
3
+ type ItemState,
4
+ type MenuButtonContext,
3
5
  MenuButtonContextName,
6
+ type MenuContext,
4
7
  MenuContextName,
5
- type MenuButtonContext,
6
- type MenuContext
7
8
  } from "./MenuTypes";
8
9
 
9
10
  interface MenuCheckProps {
10
11
  /** An ID for the root element */
11
12
  id?: string;
12
13
  /** Classes for the root element */
13
- class?: ClassValue,
14
+ class?: ClassValue;
14
15
  /** Styles for the root element */
15
- style?: StyleValue,
16
+ style?: StyleValue;
16
17
  /** Whether this item is checked */
17
- checked?: boolean,
18
+ checked: Bindable<boolean | undefined>;
18
19
  /** Whether this item is disabled */
19
- disabled?: boolean,
20
+ disabled?: boolean;
20
21
  /** Raised when the checkbox is clicked */
21
- onclick?: (e: MouseEvent) => void,
22
+ onclick?: (e: MouseEvent) => void;
22
23
  }
23
24
 
24
25
  /**
@@ -28,14 +29,10 @@ interface MenuCheckProps {
28
29
  */
29
30
  export default function MenuCheck($props: MenuCheckProps | undefined) {
30
31
  let $state = $watch({
31
- checked: $props?.checked ?? false
32
+ checked: $props?.checked ?? false,
32
33
  });
33
34
 
34
- $run(() => {
35
- if ($props !== undefined) {
36
- $props.checked = $state.checked;
37
- }
38
- });
35
+ $bind($state, $props, "checked");
39
36
 
40
37
  let button: HTMLButtonElement;
41
38
 
@@ -47,11 +44,12 @@ export default function MenuCheck($props: MenuCheckProps | undefined) {
47
44
  const { registerItem, handleItemKey, handleItemFocus } = menuContext;
48
45
 
49
46
  // Register this item with the parent Menu
50
- const { index } = registerItem(setFocused);
47
+ const item: ItemState = { setFocused, disabled: $props?.disabled };
48
+ const { index } = registerItem(item);
51
49
 
52
50
  // Set the context to pass down to items
53
51
  let context: MenuButtonContext = {
54
- state: $state
52
+ state: $state,
55
53
  };
56
54
  $context[MenuButtonContextName] = context;
57
55
 
@@ -59,6 +57,11 @@ export default function MenuCheck($props: MenuCheckProps | undefined) {
59
57
  button.focus();
60
58
  }
61
59
 
60
+ // Store the item's label for type-ahead
61
+ function handleMount(el: HTMLButtonElement) {
62
+ item.text = el.textContent.trim();
63
+ }
64
+
62
65
  function handleClick(e: MouseEvent) {
63
66
  $state.checked = !$state.checked;
64
67
  if ($props?.onclick) {
@@ -74,13 +77,14 @@ export default function MenuCheck($props: MenuCheckProps | undefined) {
74
77
  type="button"
75
78
  {$props?.disabled}
76
79
  role="menuitemcheckbox"
77
- aria-checked={$props?.checked ? "true" : "false"}
80
+ tabindex="-1"
81
+ aria-checked={$state.checked ? "true" : "false"}
78
82
  aria-disabled={$props?.disabled ? "true" : undefined}
79
83
  data-state={$props?.checked ? "checked" : "unchecked"}
80
- data-disabled={$props?.disabled ? "true" : undefined}
81
84
  onkeydown={handleItemKey}
82
85
  onclick={handleClick}
83
86
  onfocus={() => handleItemFocus(index)}
87
+ onmount={handleMount}
84
88
  &ref={button}
85
89
  >
86
90
  <slot />
@@ -4,11 +4,11 @@ interface MenuGroupProps {
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
  /** An ARIA label for describing the group to screen readers */
11
- ariaLabel?: string,
11
+ ariaLabel?: string;
12
12
  }
13
13
 
14
14
  /**
@@ -28,4 +28,4 @@ export default function MenuGroup($props: MenuGroupProps | undefined) {
28
28
  <slot />
29
29
  </div>
30
30
  }
31
- }
31
+ }
@@ -1,21 +1,19 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { MenuButtonContextName, type MenuButtonContext } from "./MenuTypes";
2
+ import { type MenuButtonContext, MenuButtonContextName } from "./MenuTypes";
3
3
 
4
4
  interface MenuIndicatorProps {
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,
11
- /** Whether this item is disabled */
12
- disabled?: boolean,
10
+ style?: StyleValue;
13
11
  }
14
12
 
15
13
  /**
16
14
  * An indicator for a MenuCheck or MenuRadio component, which is displayed
17
15
  * when the value of checked is true.
18
- */
16
+ */
19
17
  export default function MenuIndicator($props: MenuIndicatorProps | undefined) {
20
18
  // Get stuff out of the MenuButtonContext
21
19
  const context = $context[MenuButtonContextName] as MenuButtonContext;
@@ -26,13 +24,7 @@ export default function MenuIndicator($props: MenuIndicatorProps | undefined) {
26
24
 
27
25
  @render {
28
26
  @if ($state.checked) {
29
- <div
30
- {$props?.id}
31
- class={["torp-menu-indicator", $props?.class]}
32
- {$props?.style}
33
- aria-disabled={$props?.disabled ? "true" : undefined}
34
- data-disabled={$props?.disabled ? "true" : undefined}
35
- >
27
+ <div {$props?.id} class={["torp-menu-indicator", $props?.class]} {$props?.style}>
36
28
  <slot />
37
29
  </div>
38
30
  }
@@ -1,21 +1,20 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { MenuPopoutContextName, type MenuPopoutContext } from "./MenuTypes";
2
+ import SubmenuPopout from "../utils/SubmenuPopout.torp";
3
+ import { type MenuContext, MenuContextName } from "./MenuTypes";
3
4
 
4
5
  interface MenuPopoutProps {
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
  /** Whether the popout is visible */
12
- visible?: boolean,
13
- /** Raised when the popout is opened or closed */
14
- ontoggle?: (open: boolean) => void,
13
+ visible?: boolean;
15
14
  /** Raised when the popout has opened */
16
- onopen?: () => void,
15
+ onopen?: () => void;
17
16
  /** Raised when the popout has closed */
18
- onclose?: (result: any) => void,
17
+ onclose?: (result: any) => void;
19
18
  }
20
19
 
21
20
  /**
@@ -31,53 +30,24 @@ interface MenuPopoutProps {
31
30
  * ```
32
31
  */
33
32
  export default function MenuPopout($props: MenuPopoutProps | undefined) {
34
- let $state = $watch({
35
- visible: $props?.visible ?? false
36
- });
37
-
38
- let result: any;
39
-
40
- // Set the context to pass down to items
41
- let context: MenuPopoutContext = {
42
- setVisible,
43
- state: $state
44
- };
45
- $context[MenuPopoutContextName] = context;
46
-
47
- function setVisible(value: boolean) {
48
- $state.visible = value;
49
- }
50
-
51
- let firstToggle = true;
52
- $run(() => {
53
- const ontoggle = $props?.ontoggle;
54
- const onopen = $props?.onopen;
55
- const onclose = $props?.onclose;
56
- const visible = $state.visible;
57
- if (firstToggle) {
58
- firstToggle = false;
59
- } else {
60
- if (ontoggle) ontoggle(visible);
61
- if (visible) {
62
- if (onopen) onopen()
63
- } else {
64
- if (onclose) onclose(result);
65
- }
66
- }
67
- });
68
-
69
- function handleMouseLeave() {
70
- setVisible(false);
33
+ // Get stuff out of the MenuContext
34
+ const menuContext = $context[MenuContextName] as MenuContext;
35
+ if (!menuContext) {
36
+ throw new Error("MenuPopout must be contained within a Menu");
71
37
  }
72
38
 
73
39
  @render {
74
- <div
75
- {$props?.id}
40
+ <SubmenuPopout
41
+ id={$props?.id}
76
42
  class={["torp-menu-popout", $props?.class]}
77
- {$props?.style}
78
- onmouseleave={handleMouseLeave}
43
+ style={$props?.style}
44
+ visible={$props?.visible}
45
+ onopen={$props?.onopen}
46
+ onclose={$props?.onclose}
47
+ context={{ handleButton: menuContext.handleButton }}
48
+ contentRole="menu"
79
49
  >
80
50
  <slot />
81
- </div>
51
+ </SubmenuPopout>
82
52
  }
83
53
  }
@@ -1,84 +1,33 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import setPopoverPosition from "../utils/setPopoverPosition";
3
- import { MenuPopoutContextName, type MenuPopoutContext } from "./MenuTypes";
2
+ import SubmenuPopoutContent from "../utils/SubmenuPopoutContent.torp";
4
3
 
5
4
  interface MenuPopoutContentProps {
6
5
  /** An ID for the root element */
7
6
  id?: string;
8
7
  /** Classes for the root element */
9
- class?: ClassValue,
8
+ class?: ClassValue;
10
9
  /** Styles for the root element */
11
- style?: StyleValue,
10
+ style?: StyleValue;
12
11
  /** Where the popout will be shown, relative to the popout button */
13
- side?: "top" | "right" | "bottom" | "left",
12
+ side?: "top" | "right" | "bottom" | "left";
14
13
  /** How the popout will be aligned, relative to the popout button */
15
- alignment?: "start" | "center" | "end",
14
+ alignment?: "start" | "center" | "end";
16
15
  }
17
16
 
18
17
  /**
19
18
  * The content that is displayed for a MenuPopout when it is open.
20
19
  */
21
20
  export default function MenuPopoutContent($props: MenuPopoutContentProps | undefined) {
22
- let div: HTMLDivElement;
23
- let shown = false;
24
-
25
- // Get stuff out of the MenuPopoutContext
26
- const popoutContext = $context[MenuPopoutContextName] as MenuPopoutContext;
27
- if (!popoutContext) {
28
- throw new Error("MenuPopoutContent must be contained within a MenuPopout");
29
- }
30
- let $state = popoutContext.state;
31
-
32
- $run(() => {
33
- if (!$state.visible) {
34
- hide();
35
- }
36
- });
37
-
38
- function show() {
39
- shown = true;
40
-
41
- // Set the position and listen for window resize and scroll to reset the position
42
- setPosition();
43
- addEventListener("resize", setPosition);
44
- addEventListener("scroll", setPosition);
45
- if (popoutContext.focusFirstElement) {
46
- popoutContext.focusFirstElement();
47
- }
48
- }
49
-
50
- function hide() {
51
- if (!shown) return;
52
-
53
- // Stop listening for window resize and focus the anchor element per WAI guidelines
54
- removeEventListener("resize", setPosition);
55
- removeEventListener("scroll", setPosition);
56
- if (popoutContext.anchorElement?.focus) {
57
- popoutContext.anchorElement.focus();
58
- }
59
- }
60
-
61
- function setPosition() {
62
- if (!popoutContext.anchorElement) {
63
- throw new Error("MenuPopoutContent must have an anchor element");
64
- }
65
-
66
- let side = $props?.side ?? "right";
67
- let alignment = $props?.alignment ?? "start";
68
- setPopoverPosition(popoutContext.anchorElement, div, side, alignment);
69
- }
70
-
71
21
  @render {
72
- @if ($state.visible) {
73
- <div
74
- {$props?.id}
75
- class={["torp-menu-popout-content", $props?.class]}
76
- {$props?.style}
77
- &ref={div}
78
- onmount={show}
79
- >
80
- <slot />
81
- </div>
82
- }
22
+ <SubmenuPopoutContent
23
+ id={$props?.id}
24
+ class={["torp-menu-popout-content", $props?.class]}
25
+ style={$props?.style}
26
+ side={$props?.side ?? "right"}
27
+ alignment={$props?.alignment}
28
+ escapeOnlyWhenFocused
29
+ >
30
+ <slot />
31
+ </SubmenuPopoutContent>
83
32
  }
84
33
  }
@@ -1,128 +1,47 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import {
3
- MenuContextName,
4
- MenuPopoutContextName,
5
- type MenuContext,
6
- type MenuPopoutContext
7
- } from "./MenuTypes";
2
+ import SubmenuPopoutTrigger from "../utils/SubmenuPopoutTrigger.torp";
3
+ import { type MenuContext, MenuContextName } from "./MenuTypes";
8
4
 
9
5
  interface MenuPopoutTriggerProps {
10
6
  /** An ID for the root element */
11
7
  id?: string;
12
8
  /** Classes for the root element */
13
- class?: ClassValue,
9
+ class?: ClassValue;
14
10
  /** Styles for the root element */
15
- style?: StyleValue,
11
+ style?: StyleValue;
16
12
  /** The delay before showing the popout, in milliseconds */
17
- hoverDelay?: number,
13
+ hoverDelay?: number;
18
14
  /** Whether this button is disabled */
19
- disabled?: boolean,
15
+ disabled?: boolean;
20
16
  }
21
17
 
22
18
  /**
23
19
  * A button that is placed in a Menu or MenuGroup and signals a response by a user.
24
20
  */
25
21
  export default function MenuPopoutTrigger($props: MenuPopoutTriggerProps | undefined) {
26
- let defaultHoverDelay = 500;
27
-
28
- let button: HTMLButtonElement;
29
- let interval: NodeJS.Timeout | undefined;
30
-
31
22
  // Get stuff out of the MenuContext
32
23
  const menuContext = $context[MenuContextName] as MenuContext;
33
24
  if (!menuContext) {
34
25
  throw new Error("MenuPopoutTrigger must be contained within a Menu");
35
26
  }
36
- const { registerItem, handleItemKey, handleItemFocus } = menuContext;
37
-
38
- // Get stuff out of the MenuPopoutContext
39
- const popoutContext = $context[MenuPopoutContextName] as MenuPopoutContext;
40
- if (!popoutContext) {
41
- throw new Error("MenuPopoutTrigger must be contained within a MenuPopout");
42
- }
43
- const { state: $state, setVisible } = popoutContext;
44
-
45
- // Register this item with the parent Menu and store the index
46
- const { index } = registerItem(setFocused);
47
-
48
- // TODO: This is getting called before @render
49
- //$mount(() => {
50
- // // Set the anchor element to the button when it exists
51
- // popoutContext.anchorElement = button;
52
- //});
53
-
54
- function setFocused() {
55
- button.focus();
56
- }
57
-
58
- function handleClick() {
59
- setVisible(true);
60
- }
61
-
62
- function handlePopoutKey(e: KeyboardEvent) {
63
- switch (e.key) {
64
- case "Right":
65
- case "ArrowRight":
66
- // TODO: This should be based on what side the menu shows on
67
- e.preventDefault();
68
- setVisible(true);
69
- break;
70
- default:
71
- handleItemKey(e);
72
- }
73
- }
74
-
75
- function handleMouseEnter() {
76
- if ($props?.disabled) return;
77
-
78
- // Handle the hover after a delay
79
- if (!interval) {
80
- interval = setTimeout(() => setVisible(true), $props?.hoverDelay ?? defaultHoverDelay);
81
- }
82
- }
83
-
84
- function handleMouseLeave() {
85
- if ($props?.disabled) return;
86
-
87
- // Prevent short hovers or touches from firing the event
88
- if (interval) {
89
- clearTimeout(interval);
90
- interval = undefined;
91
- }
92
- }
93
-
94
- function handleMouseMove() {
95
- if ($props?.disabled) return;
96
-
97
- // Reset the interval on mouse move
98
- if (interval) {
99
- clearTimeout(interval);
100
- interval = setTimeout(() => setVisible(true), $props?.hoverDelay ?? defaultHoverDelay);
101
- }
102
- }
27
+ const { registerItem, handleItemKey, handleItemFocus, handlePopout } = menuContext;
103
28
 
104
29
  @render {
105
- <button
106
- {$props?.id}
30
+ <SubmenuPopoutTrigger
31
+ id={$props?.id}
107
32
  class={["torp-menu-popout-trigger", $props?.class]}
108
- {$props?.style}
109
- type="button"
110
- {$props?.disabled}
33
+ style={$props?.style}
34
+ hoverDelay={$props?.hoverDelay}
35
+ disabled={$props?.disabled}
111
36
  role="menuitem"
112
- aria-haspopup="true"
113
- aria-expanded={($state.visible ?? false).toString()}
114
- aria-disabled={$props?.disabled ? "true" : undefined}
115
- data-disabled={$props?.disabled ? "true" : undefined}
116
- onkeydown={handlePopoutKey}
117
- onclick={handleClick}
118
- onfocus={() => handleItemFocus(index)}
119
- onmouseenter={handleMouseEnter}
120
- onmouseleave={handleMouseLeave}
121
- onmousemove={handleMouseMove}
122
- &ref={button}
123
- onmount={(el) => popoutContext.anchorElement = el}
37
+ tabindex="-1"
38
+ openKey="ArrowRight"
39
+ registerItem={registerItem}
40
+ handleItemKey={handleItemKey}
41
+ handleItemFocus={handleItemFocus}
42
+ onActivate={handlePopout}
124
43
  >
125
44
  <slot />
126
- </button>
45
+ </SubmenuPopoutTrigger>
127
46
  }
128
47
  }
@@ -1,41 +1,37 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
2
  import {
3
+ type ItemState,
4
+ type MenuButtonContext,
3
5
  MenuButtonContextName,
6
+ type MenuContext,
4
7
  MenuContextName,
8
+ type MenuRadioGroupContext,
5
9
  MenuRadioGroupContextName,
6
- type MenuButtonContext,
7
- type MenuContext,
8
- type MenuRadioGroupContext
10
+ type RadioGroupItemState,
9
11
  } from "./MenuTypes";
10
12
 
11
13
  interface MenuRadioProps {
12
14
  /** An ID for the root element */
13
15
  id?: string;
14
16
  /** Classes for the root element */
15
- class?: ClassValue,
17
+ class?: ClassValue;
16
18
  /** Styles for the root element */
17
- style?: StyleValue,
19
+ style?: StyleValue;
18
20
  /** The value of the item */
19
- value?: string,
20
- /** Whether this item is checked */
21
- checked?: boolean,
21
+ value: string;
22
22
  /** Whether this item is disabled */
23
- disabled?: boolean,
23
+ disabled?: boolean;
24
24
  }
25
25
 
26
26
  /**
27
27
  * A button that is placed in a Menu or MenuGroup to allow the user to select
28
28
  * from a number of options.
29
29
  */
30
- export default function MenuRadio($props: MenuRadioProps | undefined) {
31
- let $state = $watch({
32
- checked: $props?.checked ?? false,
33
- });
34
-
35
- $run(() => {
36
- if ($props !== undefined) {
37
- $props.checked = $state.checked;
38
- }
30
+ export default function MenuRadio($props: MenuRadioProps) {
31
+ let $state: RadioGroupItemState = $watch({
32
+ index: -1,
33
+ value: $props.value,
34
+ checked: false,
39
35
  });
40
36
 
41
37
  let button: HTMLButtonElement;
@@ -55,14 +51,15 @@ export default function MenuRadio($props: MenuRadioProps | undefined) {
55
51
  const { registerItemInGroup, toggleItem } = groupContext;
56
52
 
57
53
  // Register this item with the parent Menu
58
- const { index } = registerItem(setFocused);
54
+ const item: ItemState = { setFocused, disabled: $props?.disabled };
55
+ const { index } = registerItem(item);
59
56
 
60
57
  // Register this item with the parent MenuRadioGroup
61
- registerItemInGroup($props?.value ?? "", setChecked);
58
+ registerItemInGroup($state);
62
59
 
63
60
  // Set the context to pass down to items
64
61
  let context: MenuButtonContext = {
65
- state: $state
62
+ state: $state,
66
63
  };
67
64
  $context[MenuButtonContextName] = context;
68
65
 
@@ -70,8 +67,9 @@ export default function MenuRadio($props: MenuRadioProps | undefined) {
70
67
  button.focus();
71
68
  }
72
69
 
73
- function setChecked(value: boolean) {
74
- $state.checked = value;
70
+ // Store the item's label for type-ahead
71
+ function handleMount(el: HTMLButtonElement) {
72
+ item.text = el.textContent.trim();
75
73
  }
76
74
 
77
75
  function handleClick() {
@@ -88,13 +86,14 @@ export default function MenuRadio($props: MenuRadioProps | undefined) {
88
86
  type="button"
89
87
  {$props?.disabled}
90
88
  role="menuitemradio"
91
- aria-checked={$props?.checked}
89
+ tabindex="-1"
90
+ aria-checked={$state.checked ? "true" : "false"}
92
91
  aria-disabled={$props?.disabled ? "true" : undefined}
93
- data-state={$props?.checked ? "checked" : "unchecked"}
94
- data-disabled={$props?.disabled ? "true" : undefined}
92
+ data-state={$state.checked ? "checked" : "unchecked"}
95
93
  onkeydown={handleItemKey}
96
94
  onclick={handleClick}
97
95
  onfocus={() => handleItemFocus(index)}
96
+ onmount={handleMount}
98
97
  &ref={button}
99
98
  >
100
99
  <slot />