@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,27 +1,25 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import SubmenuPopout from "../utils/SubmenuPopout.torp";
2
3
  import {
4
+ type MenuBarContext,
3
5
  MenuBarContextName,
6
+ type MenuBarItemContext,
4
7
  MenuBarItemContextName,
5
- type MenuBarContext,
6
- type MenuBarItemContext
7
8
  } from "./MenuBarTypes";
8
- import { PopoutContextName, type PopoutContext } from "../utils/PopoutTypes";
9
9
 
10
10
  interface MenuBarItemProps {
11
11
  /** An ID for the root element */
12
12
  id?: string;
13
13
  /** Classes for the root element */
14
- class?: ClassValue,
14
+ class?: ClassValue;
15
15
  /** Styles for the root element */
16
- style?: StyleValue,
16
+ style?: StyleValue;
17
17
  /** Whether the item is visible */
18
- visible?: boolean,
19
- /** Raised when the item is opened or closed */
20
- ontoggle?: (visible: boolean) => void,
18
+ visible?: boolean;
21
19
  /** Raised when the item has opened */
22
- onopen?: () => void,
20
+ onopen?: () => void;
23
21
  /** Raised when the item has closed */
24
- onclose?: (result: any) => void,
22
+ onclose?: (result: any) => void;
25
23
  }
26
24
 
27
25
  /**
@@ -38,76 +36,60 @@ interface MenuBarItemProps {
38
36
  */
39
37
  export default function MenuBarItem($props: MenuBarItemProps | undefined) {
40
38
  let $state = $watch({
41
- visible: $props?.visible ?? false
39
+ visible: false,
40
+ contentId: undefined,
41
+ triggerId: undefined,
42
+ contentRole: undefined,
42
43
  });
43
44
 
44
- let result: any;
45
-
46
45
  // Get stuff out of the MenuBarContext
47
46
  const menubarContext = $context[MenuBarContextName] as MenuBarContext;
48
47
  if (!menubarContext) {
49
48
  throw new Error("MenuBarItem must be contained within a MenuBar");
50
49
  }
51
- const { handleItemShow } = menubarContext;
50
+ const { handleItemShow, handleAdjacentItem } = menubarContext;
52
51
 
53
- // Set the context to pass down to items
54
- let context: MenuBarItemContext = {
52
+ // Set the context to pass down to the trigger and content
53
+ let itemContext: MenuBarItemContext = {
55
54
  setVisible,
56
55
  state: $state,
57
- index: -1
56
+ index: -1,
58
57
  };
59
- $context[MenuBarItemContextName] = context;
58
+ $context[MenuBarItemContextName] = itemContext;
60
59
 
61
- // Set the context to pass down to items
62
- let popoutContext: PopoutContext = {
63
- handleButton,
64
- state: $state,
65
- };
66
- $context[PopoutContextName] = popoutContext;
67
-
68
- $mount(() => {
69
- setVisible(false);
70
- });
60
+ function handleNavigateMenuBar(target: "previous" | "next") {
61
+ // Called from a contained Menu when focus should move to an adjacent
62
+ // menubar item; the MenuBar moves focus and opens that item's menu
63
+ handleAdjacentItem(itemContext.index, target);
64
+ }
71
65
 
72
66
  function setVisible(value: boolean) {
73
67
  if (!value || menubarContext.state.active) {
74
68
  $state.visible = value;
75
69
  if (value) {
76
- handleItemShow(context.index);
70
+ handleItemShow(itemContext.index);
77
71
  }
78
72
  }
79
73
  }
80
74
 
81
- let firstToggle = true;
82
- $run(() => {
83
- const ontoggle = $props?.ontoggle;
84
- const onopen = $props?.onopen;
85
- const onclose = $props?.onclose;
86
- const visible = $state.visible;
87
- if (firstToggle) {
88
- firstToggle = false;
89
- } else {
90
- if (ontoggle) ontoggle(visible);
91
- if (visible) {
92
- if (onopen) onopen()
93
- } else {
94
- if (onclose) onclose(result);
95
- }
96
- }
97
- });
98
-
99
75
  function handleButton(_type: "confirm" | "cancel" | undefined, _value?: any) {
100
76
  menubarContext.state.active = false;
101
77
  setVisible(false);
102
78
  }
103
79
 
104
80
  @render {
105
- <div
106
- {$props?.id}
81
+ <SubmenuPopout
82
+ id={$props?.id}
107
83
  class={["torp-menu-bar-item", $props?.class]}
108
- {$props?.style}
84
+ style={$props?.style}
85
+ visible={$props?.visible}
86
+ onopen={$props?.onopen}
87
+ onclose={$props?.onclose}
88
+ state={$state}
89
+ context={{ handleButton, navigateMenuBar: handleNavigateMenuBar }}
90
+ closeOnMouseLeave={false}
109
91
  >
110
92
  <slot />
111
- </div>
93
+ </SubmenuPopout>
112
94
  }
113
95
  }
@@ -1,119 +1,33 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
3
- import setPopoverPosition from "../utils/setPopoverPosition";
4
- import {
5
- MenuBarContextName,
6
- MenuBarItemContextName,
7
- type MenuBarContext,
8
- type MenuBarItemContext
9
- } from "./MenuBarTypes";
2
+ import SubmenuPopoutContent from "../utils/SubmenuPopoutContent.torp";
10
3
 
11
4
  interface MenuBarItemContentProps {
12
5
  /** An ID for the root element */
13
6
  id?: string;
14
7
  /** Classes for the root element */
15
- class?: ClassValue,
8
+ class?: ClassValue;
16
9
  /** Styles for the root element */
17
- style?: StyleValue,
10
+ style?: StyleValue;
18
11
  /** Where the popout will be shown, relative to the popout button */
19
- side?: "top" | "right" | "bottom" | "left",
12
+ side?: "top" | "right" | "bottom" | "left";
20
13
  /** How the popout will be aligned, relative to the popout button */
21
- alignment?: "start" | "center" | "end",
14
+ alignment?: "start" | "center" | "end";
22
15
  }
23
16
 
24
17
  /**
25
18
  * The content that is displayed for a MenuBarItem when it is open.
26
19
  */
27
20
  export default function MenuBarItemContent($props: MenuBarItemContentProps | undefined) {
28
- let div: HTMLDivElement;
29
- let closeOnClick = false;
30
- let shown = false;
31
-
32
- // Get stuff out of the MenuBarContext
33
- const context = $context[MenuBarContextName] as MenuBarContext;
34
- if (!context) {
35
- throw new Error("MenuBarItemContent must be contained within a MenuBar");
36
- }
37
-
38
- // Get stuff out of the MenuBarItemContext
39
- const itemContext = $context[MenuBarItemContextName] as MenuBarItemContext;
40
- if (!itemContext) {
41
- throw new Error("MenuBarItemContent must be contained within a MenuBarItem");
42
- }
43
- const { state: $state, setVisible } = itemContext;
44
-
45
- $run(() => {
46
- if (!$state.visible) {
47
- hide();
48
- }
49
- });
50
-
51
- function show() {
52
- shown = true;
53
-
54
- // HACK: Because this Contextual could be shown with a click, we need to wait for another mousedown
55
- // before we close on click. Otherwise the click immediately bubbles to the document. I guess
56
- // we could require the user to preventDefault after calling showContextual, but that seems very
57
- // error-prone?
58
- closeOnClick = false;
59
- addDocumentEvent("mousedown", handleDocumentMouseDown);
60
- addDocumentEvent("click", handleDocumentClick);
61
-
62
- // Set the position and listen for window resize and scroll to reset the position
63
- setPosition();
64
- addEventListener("resize", setPosition);
65
- addEventListener("scroll", setPosition);
66
- if (itemContext.focusFirstElement) {
67
- itemContext.focusFirstElement();
68
- }
69
- }
70
-
71
- function hide() {
72
- if (!shown) return;
73
-
74
- removeDocumentEvent("mousedown", handleDocumentMouseDown);
75
- removeDocumentEvent("click", handleDocumentClick);
76
-
77
- // Stop listening for window resize and focus the anchor element per WAI guidelines
78
- removeEventListener("resize", setPosition);
79
- removeEventListener("scroll", setPosition);
80
- if (itemContext.anchorElement?.focus) {
81
- itemContext.anchorElement.focus();
82
- }
83
- }
84
-
85
- function handleDocumentMouseDown() {
86
- closeOnClick = true;
87
- }
88
-
89
- function handleDocumentClick(e: MouseEvent) {
90
- if (closeOnClick && !div.contains(e.target as HTMLElement)) {
91
- //context.active = false;
92
- setVisible(false);
93
- }
94
- }
95
-
96
- function setPosition() {
97
- if (!itemContext.anchorElement) {
98
- throw new Error("MenuBarItemContent must have an anchor element");
99
- }
100
-
101
- let side = $props?.side ?? "bottom";
102
- let alignment = $props?.alignment ?? "start";
103
- setPopoverPosition(itemContext.anchorElement, div, side, alignment);
104
- }
105
-
106
21
  @render {
107
- @if ($state.visible) {
108
- <div
109
- {$props?.id}
110
- class={["torp-menu-bar-item-content", $props?.class]}
111
- {$props?.style}
112
- &ref={div}
113
- onmount={show}
114
- >
115
- <slot />
116
- </div>
117
- }
22
+ <SubmenuPopoutContent
23
+ id={$props?.id}
24
+ class={["torp-menu-bar-item-content", $props?.class]}
25
+ style={$props?.style}
26
+ side={$props?.side}
27
+ alignment={$props?.alignment}
28
+ closeOnEscape={false}
29
+ >
30
+ <slot />
31
+ </SubmenuPopoutContent>
118
32
  }
119
33
  }
@@ -1,20 +1,21 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import SubmenuPopoutTrigger from "../utils/SubmenuPopoutTrigger.torp";
2
3
  import {
4
+ type MenuBarContext,
3
5
  MenuBarContextName,
6
+ type MenuBarItemContext,
4
7
  MenuBarItemContextName,
5
- type MenuBarContext,
6
- type MenuBarItemContext
7
8
  } from "./MenuBarTypes";
8
9
 
9
10
  interface MenuBarItemTriggerProps {
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 button is disabled */
17
- disabled?: boolean,
18
+ disabled?: boolean;
18
19
  }
19
20
 
20
21
  /**
@@ -22,8 +23,6 @@ interface MenuBarItemTriggerProps {
22
23
  *
23
24
  */
24
25
  export default function MenuBarItemTrigger($props: MenuBarItemTriggerProps | undefined) {
25
- let button: HTMLButtonElement;
26
-
27
26
  // Get stuff out of the MenuBarContext
28
27
  const menubarContext = $context[MenuBarContextName] as MenuBarContext;
29
28
  if (!menubarContext) {
@@ -36,64 +35,30 @@ export default function MenuBarItemTrigger($props: MenuBarItemTriggerProps | und
36
35
  if (!itemContext) {
37
36
  throw new Error("MenuBarItemTrigger must be contained within a MenuBarItem");
38
37
  }
39
- const { state: $state, setVisible } = itemContext;
40
-
41
- // Register this item with the parent MenuBar and store the index
42
- const { index } = registerItem(setVisible, setFocused);
43
-
44
- $mount(() => {
45
- // Set the anchor element to the button when it exists
46
- //itemContext.anchorElement = button;
47
- itemContext.index = index;
48
- });
49
-
50
- function setFocused() {
51
- button.focus();
52
- }
53
38
 
54
39
  function handleClick() {
55
40
  menubarContext.state.active = !menubarContext.state.active;
56
- setVisible(menubarContext.state.active);
57
- }
58
-
59
- function handleKey(e: KeyboardEvent) {
60
- switch (e.key) {
61
- case "Down":
62
- case "ArrowDown":
63
- // TODO: This should be based on what side the menu shows on
64
- e.preventDefault();
65
- menubarContext.state.active = true;
66
- setVisible(true);
67
- break;
68
- default:
69
- handleButtonKey(e);
70
- }
71
- }
72
-
73
- function handleMouseEnter() {
74
- setVisible(true);
41
+ itemContext.setVisible(menubarContext.state.active);
75
42
  }
76
43
 
77
44
  @render {
78
- <button
79
- {$props?.id}
45
+ <SubmenuPopoutTrigger
46
+ id={$props?.id}
80
47
  class={["torp-menu-bar-item-button", $props?.class]}
81
- {$props?.style}
82
- type="button"
83
- {$props?.disabled}
48
+ style={$props?.style}
49
+ disabled={$props?.disabled}
84
50
  role="menuitem"
85
- aria-haspopup="true"
86
- aria-expanded={($state.visible ?? false).toString()}
87
- aria-disabled={$props?.disabled ? "true" : undefined}
88
- data-disabled={$props?.disabled ? "true" : undefined}
89
- onkeydown={handleKey}
51
+ openKey="ArrowDown"
52
+ hoverDelay={0}
53
+ registerItem={registerItem}
54
+ handleItemKey={handleButtonKey}
55
+ handleItemFocus={handleButtonFocus}
56
+ setVisible={itemContext.setVisible}
57
+ onRegister={(index: number) => (itemContext.index = index)}
58
+ onActivate={() => (menubarContext.state.active = true)}
90
59
  onclick={handleClick}
91
- onfocus={() => handleButtonFocus(index)}
92
- onmouseenter={handleMouseEnter}
93
- &ref={button}
94
- onmount={(el) => itemContext.anchorElement = el}
95
60
  >
96
61
  <slot />
97
- </button>
62
+ </SubmenuPopoutTrigger>
98
63
  }
99
64
  }
@@ -1,3 +1,5 @@
1
+ import { type PopoutState, type SubmenuItemState } from "../utils/PopoutTypes";
2
+
1
3
  export const MenuBarContextName: unique symbol = Symbol.for("torp.MenuBar");
2
4
  export const MenuBarItemContextName: unique symbol = Symbol.for("torp.MenuBarItem");
3
5
 
@@ -11,8 +13,14 @@ export interface MenuBarContext {
11
13
  /** Called from a MenuBarButton when a key is pressed */
12
14
  handleButtonKey: (e: KeyboardEvent) => void;
13
15
 
16
+ /**
17
+ * Called from a MenuBarItem when a contained menu signals that focus should
18
+ * move to an adjacent item, opening its menu
19
+ */
20
+ handleAdjacentItem: (index: number, target: "previous" | "next") => void;
21
+
14
22
  /** Called from each MenuBarButton to register itself with this MenuBar */
15
- registerItem: (setVisible: (value: boolean) => void, setFocused: () => void) => { index: number };
23
+ registerItem: (item: ItemState) => { index: number };
16
24
 
17
25
  state: {
18
26
  /** Whether a menubar item is showing its content. If so, changing to another item should show its content */
@@ -22,15 +30,8 @@ export interface MenuBarContext {
22
30
 
23
31
  export interface MenuBarItemContext {
24
32
  setVisible: (value: boolean) => void;
25
- state: {
26
- visible: boolean;
27
- };
33
+ state: PopoutState;
28
34
  index: number;
29
- anchorElement?: HTMLElement;
30
- focusFirstElement?: () => void;
31
35
  }
32
36
 
33
- export interface ItemState {
34
- setVisible: (value: boolean) => void;
35
- setFocused: () => void;
36
- }
37
+ export type ItemState = SubmenuItemState;
@@ -5,13 +5,13 @@ interface MenuBarProps {
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
  /** The orientation of the menu, which affects keyboard navigation */
14
- orientation?: "horizontal" | "vertical",
14
+ orientation?: "horizontal" | "vertical";
15
15
  }
16
16
 
17
17
  /**
@@ -46,17 +46,15 @@ interface MenuBarItemProps {
46
46
  /** An ID for the root element */
47
47
  id?: string;
48
48
  /** Classes for the root element */
49
- class?: ClassValue,
49
+ class?: ClassValue;
50
50
  /** Styles for the root element */
51
- style?: StyleValue,
51
+ style?: StyleValue;
52
52
  /** Whether the item is visible */
53
- visible?: boolean,
54
- /** Raised when the item is opened or closed */
55
- ontoggle?: (visible: boolean) => void,
53
+ visible?: boolean;
56
54
  /** Raised when the item has opened */
57
- onopen?: () => void,
55
+ onopen?: () => void;
58
56
  /** Raised when the item has closed */
59
- onclose?: (result: any) => void,
57
+ onclose?: (result: any) => void;
60
58
  }
61
59
 
62
60
  /**
@@ -85,13 +83,13 @@ interface MenuBarItemContentProps {
85
83
  /** An ID for the root element */
86
84
  id?: string;
87
85
  /** Classes for the root element */
88
- class?: ClassValue,
86
+ class?: ClassValue;
89
87
  /** Styles for the root element */
90
- style?: StyleValue,
88
+ style?: StyleValue;
91
89
  /** Where the popout will be shown, relative to the popout button */
92
- side?: "top" | "right" | "bottom" | "left",
90
+ side?: "top" | "right" | "bottom" | "left";
93
91
  /** How the popout will be aligned, relative to the popout button */
94
- alignment?: "start" | "center" | "end",
92
+ alignment?: "start" | "center" | "end";
95
93
  }
96
94
 
97
95
  /**
@@ -111,11 +109,11 @@ interface MenuBarItemTriggerProps {
111
109
  /** An ID for the root element */
112
110
  id?: string;
113
111
  /** Classes for the root element */
114
- class?: ClassValue,
112
+ class?: ClassValue;
115
113
  /** Styles for the root element */
116
- style?: StyleValue,
114
+ style?: StyleValue;
117
115
  /** Whether this button is disabled */
118
- disabled?: boolean,
116
+ disabled?: boolean;
119
117
  }
120
118
 
121
119
  /**
@@ -130,4 +128,4 @@ declare function MenuBarItemTrigger(
130
128
  $slots?: Record<string, SlotRender>,
131
129
  ): void;
132
130
 
133
- export { MenuBar, MenuBarItem, MenuBarItemContent, MenuBarItemTrigger };
131
+ export { MenuBar, MenuBarItem, MenuBarItemContent, MenuBarItemTrigger };
@@ -1,18 +1,5 @@
1
- // src/MenuBar/MenuBar.torp
2
- import MenuBar_default from "./MenuBar.torp";
3
-
4
- // src/MenuBar/MenuBarItem.torp
5
- import MenuBarItem_default from "./MenuBarItem.torp";
6
-
7
- // src/MenuBar/MenuBarItemContent.torp
8
- import MenuBarItemContent_default from "./MenuBarItemContent.torp";
9
-
10
- // src/MenuBar/MenuBarItemTrigger.torp
11
- import MenuBarItemTrigger_default from "./MenuBarItemTrigger.torp";
12
- export {
13
- MenuBar_default as MenuBar,
14
- MenuBarItem_default as MenuBarItem,
15
- MenuBarItemContent_default as MenuBarItemContent,
16
- MenuBarItemTrigger_default as MenuBarItemTrigger
17
- };
18
- //# sourceMappingURL=index.js.map
1
+ import MenuBar from "./MenuBar.torp";
2
+ import MenuBarItem from "./MenuBarItem.torp";
3
+ import MenuBarItemContent from "./MenuBarItemContent.torp";
4
+ import MenuBarItemTrigger from "./MenuBarItemTrigger.torp";
5
+ export { MenuBar, MenuBarItem, MenuBarItemContent, MenuBarItemTrigger };
@@ -1,24 +1,21 @@
1
- import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { ModalContextName, type ModalContext, type ModalState } from "./ModalTypes";
3
- import { PopoutContextName, type PopoutContext } from "../utils/PopoutTypes";
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
+ import $handle from "../utils/$handle";
3
+ import { type PopoutContext, PopoutContextName } from "../utils/PopoutTypes";
4
+ import { type ModalContext, ModalContextName, type ModalState } from "./ModalTypes";
4
5
 
5
6
  interface ModalProps {
6
7
  /** An ID for the root element */
7
8
  id?: string;
8
9
  /** Classes for the root element */
9
- class?: ClassValue,
10
+ class?: ClassValue;
10
11
  /** Styles for the root element */
11
- style?: StyleValue,
12
+ style?: StyleValue;
12
13
  /** Whether the modal is visible */
13
- visible?: boolean,
14
- /** A function to be called when the user selects a response */
15
- callback?: ((value: any) => void),
16
- /** Raised when the modal is opened or closed */
17
- ontoggle?: (open: boolean) => void,
14
+ visible: Bindable<boolean | undefined>;
18
15
  /** Raised when the modal has opened */
19
- onopen?: () => void,
16
+ onopen?: () => void;
20
17
  /** Raised when the modal has closed */
21
- onclose?: (result: any) => void,
18
+ onclose?: (result: any) => void;
22
19
  }
23
20
 
24
21
  /**
@@ -39,18 +36,13 @@ interface ModalProps {
39
36
  export default function Modal($props: ModalProps | undefined) {
40
37
  let $state: ModalState = $watch({
41
38
  visible: false,
42
- })
43
-
44
- // Sync props and state
45
- $run(() => {
46
- $state.visible = $props?.visible ?? false;
47
- });
48
- $run(() => {
49
- if ($props !== undefined) {
50
- $props.visible = $state.visible;
51
- }
39
+ contentId: undefined,
40
+ triggerId: undefined,
41
+ contentRole: undefined,
52
42
  });
53
43
 
44
+ $bind($state, $props, "visible");
45
+
54
46
  let result: any;
55
47
 
56
48
  // Set the context to pass down to items
@@ -65,22 +57,14 @@ export default function Modal($props: ModalProps | undefined) {
65
57
  let popoutContext: PopoutContext = context;
66
58
  $context[PopoutContextName] = popoutContext;
67
59
 
68
- // Dispatch the toggle event when the modal is opened or closed
69
- let firstToggle = true;
70
- $run(() => {
71
- const ontoggle = $props?.ontoggle;
72
- const onopen = $props?.onopen;
73
- const onclose = $props?.onclose;
60
+ // Dispatch the open/close events when the modal is opened or closed
61
+ $handle((first) => {
74
62
  const visible = $state.visible;
75
- if (firstToggle) {
76
- firstToggle = false;
63
+ if (first) return;
64
+ if (visible) {
65
+ $props?.onopen?.();
77
66
  } else {
78
- if (ontoggle) ontoggle(visible);
79
- if (visible) {
80
- if (onopen) onopen()
81
- } else {
82
- if (onclose) onclose(result);
83
- }
67
+ $props?.onclose?.(result);
84
68
  }
85
69
  });
86
70
 
@@ -103,24 +87,15 @@ export default function Modal($props: ModalProps | undefined) {
103
87
 
104
88
  // Hide the modal
105
89
  $state.visible = false;
106
-
107
- // Call the callback
108
- if ($props?.callback) {
109
- $props?.callback(result);
110
- }
111
90
  }
112
91
 
113
- function handleClickOutside(e: MouseEvent) {
92
+ function handleClickOutside(e: MouseEvent | KeyboardEvent) {
114
93
  e.preventDefault();
115
94
  $state.visible = false;
116
95
  }
117
96
 
118
97
  @render {
119
- <div
120
- {$props?.id}
121
- class={["torp-modal", $props?.class]}
122
- {$props?.style}
123
- >
98
+ <div {$props?.id} class={["torp-modal", $props?.class]} {$props?.style}>
124
99
  <slot />
125
100
  </div>
126
101
  }