@torpor/ui 0.1.7 → 0.2.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 (276) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/Accordion/Accordion.torp +2 -2
  3. package/dist/Accordion/AccordionContent.torp +2 -2
  4. package/dist/Accordion/AccordionHeader.torp +2 -2
  5. package/dist/Accordion/AccordionItem.torp +2 -2
  6. package/dist/Accordion/AccordionTrigger.torp +2 -2
  7. package/dist/Accordion/index.d.ts +92 -0
  8. package/dist/Breadcrumb/Breadcrumb.torp +33 -0
  9. package/dist/Breadcrumb/BreadcrumbItem.torp +19 -0
  10. package/dist/Breadcrumb/BreadcrumbSeparator.torp +16 -0
  11. package/dist/Breadcrumb/index.d.ts +56 -0
  12. package/dist/Breadcrumb/index.js +14 -0
  13. package/dist/Calendar/Calendar.torp +265 -0
  14. package/dist/Calendar/CalendarDay.torp +67 -0
  15. package/dist/Calendar/CalendarTypes.ts +22 -0
  16. package/dist/Calendar/index.d.ts +38 -0
  17. package/dist/Calendar/index.js +10 -0
  18. package/dist/Calendar/index.js.map +1 -0
  19. package/dist/Dialog/Dialog.torp +3 -3
  20. package/dist/Dialog/DialogBody.torp +2 -2
  21. package/dist/Dialog/DialogButton.torp +2 -2
  22. package/dist/Dialog/DialogFooter.torp +2 -2
  23. package/dist/Dialog/DialogHeader.torp +2 -2
  24. package/dist/Dialog/index.d.ts +92 -0
  25. package/dist/Disclosure/Disclosure.torp +69 -0
  26. package/dist/Disclosure/DisclosureContent.torp +36 -0
  27. package/dist/Disclosure/DisclosureHeader.torp +34 -0
  28. package/dist/Disclosure/DisclosureTrigger.torp +36 -0
  29. package/dist/Disclosure/DisclosureTypes.ts +14 -0
  30. package/dist/Disclosure/index.d.ts +74 -0
  31. package/dist/Disclosure/index.js +18 -0
  32. package/dist/Disclosure/index.js.map +1 -0
  33. package/{src/Offscreen/Offscreen.torp → dist/Drawer/Drawer.torp} +10 -19
  34. package/dist/Drawer/index.d.ts +20 -0
  35. package/dist/Drawer/index.js +6 -0
  36. package/dist/Drawer/index.js.map +1 -0
  37. package/dist/Menu/Menu.torp +160 -0
  38. package/dist/Menu/MenuButton.torp +53 -0
  39. package/dist/Menu/MenuCheck.torp +70 -0
  40. package/dist/Menu/MenuGroup.torp +19 -0
  41. package/dist/Menu/MenuIndicator.torp +29 -0
  42. package/dist/Menu/MenuPopout.torp +71 -0
  43. package/dist/Menu/MenuPopoutContent.torp +74 -0
  44. package/dist/Menu/MenuPopoutTrigger.torp +117 -0
  45. package/dist/Menu/MenuRadio.torp +88 -0
  46. package/dist/Menu/MenuRadioGroup.torp +86 -0
  47. package/dist/Menu/MenuSeparator.torp +14 -0
  48. package/dist/Menu/MenuTypes.ts +58 -0
  49. package/dist/Menu/index.d.ts +200 -0
  50. package/dist/Menu/index.js +46 -0
  51. package/dist/Menu/index.js.map +1 -0
  52. package/dist/MenuBar/MenuBar.torp +150 -0
  53. package/dist/MenuBar/MenuBarItem.torp +104 -0
  54. package/dist/MenuBar/MenuBarItemContent.torp +108 -0
  55. package/dist/MenuBar/MenuBarItemTrigger.torp +89 -0
  56. package/dist/MenuBar/MenuBarTypes.ts +36 -0
  57. package/dist/MenuBar/index.d.ts +74 -0
  58. package/dist/MenuBar/index.js +18 -0
  59. package/dist/MenuBar/index.js.map +1 -0
  60. package/dist/NavMenu/NavMenu.torp +2 -2
  61. package/dist/NavMenu/NavMenuButton.torp +2 -2
  62. package/dist/NavMenu/NavMenuElement.torp +2 -2
  63. package/dist/NavMenu/NavMenuGroup.torp +2 -2
  64. package/dist/NavMenu/NavMenuGroupHeader.torp +2 -2
  65. package/dist/NavMenu/NavMenuLink.torp +2 -2
  66. package/dist/NavMenu/NavMenuPopout.torp +2 -2
  67. package/dist/NavMenu/NavMenuPopoutButton.torp +3 -3
  68. package/dist/NavMenu/NavMenuPopoutContent.torp +29 -27
  69. package/dist/NavMenu/NavMenuSeparator.torp +2 -2
  70. package/dist/NavMenu/index.d.ts +182 -0
  71. package/dist/Notification/Notification.torp +48 -0
  72. package/dist/Notification/NotificationClose.torp +28 -0
  73. package/dist/Notification/NotificationContainer.torp +14 -0
  74. package/dist/Notification/NotificationContent.torp +13 -0
  75. package/dist/Notification/NotificationTypes.ts +5 -0
  76. package/dist/Notification/index.d.ts +74 -0
  77. package/dist/Notification/index.js +36 -0
  78. package/dist/Notification/index.js.map +1 -0
  79. package/dist/Notification/showNotification.ts +30 -0
  80. package/dist/Popover/Popover.torp +2 -2
  81. package/dist/Popover/PopoverContent.torp +31 -28
  82. package/dist/Popover/PopoverContentAnchored.torp +39 -38
  83. package/dist/Popover/PopoverContentContextual.torp +39 -36
  84. package/dist/Popover/PopoverOverlay.torp +3 -3
  85. package/dist/Popover/PopoverTrigger.torp +2 -2
  86. package/dist/Popover/PopoverTriggerContextual.torp +2 -2
  87. package/dist/Popover/PopoverTriggerHover.torp +3 -3
  88. package/dist/Popover/index.d.ts +146 -0
  89. package/dist/TabGroup/TabContent.torp +2 -2
  90. package/dist/TabGroup/TabGroup.torp +2 -2
  91. package/dist/TabGroup/TabHeader.torp +2 -2
  92. package/dist/TabGroup/TabList.torp +2 -2
  93. package/dist/TabGroup/TabTrigger.torp +2 -2
  94. package/dist/TabGroup/index.d.ts +92 -0
  95. package/dist/icons/ArrowDown.torp +15 -0
  96. package/dist/icons/ArrowLeft.torp +15 -0
  97. package/dist/icons/ArrowRight.torp +15 -0
  98. package/dist/icons/ArrowUp.torp +15 -0
  99. package/dist/icons/Bars.torp +17 -0
  100. package/dist/icons/Check.torp +15 -0
  101. package/dist/icons/ChevronDown.torp +15 -0
  102. package/dist/icons/ChevronLeft.torp +15 -0
  103. package/dist/icons/ChevronRight.torp +15 -0
  104. package/dist/icons/ChevronUp.torp +15 -0
  105. package/dist/icons/Cross.torp +16 -0
  106. package/dist/icons/Loading.torp +16 -0
  107. package/dist/icons/Minus.torp +15 -0
  108. package/dist/icons/Plus.torp +16 -0
  109. package/dist/icons/index.d.ts +254 -0
  110. package/dist/icons/index.js +58 -0
  111. package/dist/icons/index.js.map +1 -0
  112. package/dist/{motion.d.cts → index.d.ts} +2 -2
  113. package/dist/metafile-esm.json +1 -1
  114. package/dist/motion/fade.ts +7 -0
  115. package/dist/motion/index.d.ts +2 -0
  116. package/dist/{motion.js → motion/index.js} +1 -1
  117. package/dist/motion/index.js.map +1 -0
  118. package/dist/mount/index.d.ts +2 -0
  119. package/dist/utils/dateUtils.ts +244 -0
  120. package/dist/utils/index.d.ts +2 -0
  121. package/dist/utils/setPopoverPosition.ts +4 -0
  122. package/package.json +50 -34
  123. package/scripts/postbuild.ts +42 -5
  124. package/src/Accordion/Accordion.torp +2 -2
  125. package/src/Accordion/AccordionContent.torp +2 -2
  126. package/src/Accordion/AccordionHeader.torp +2 -2
  127. package/src/Accordion/AccordionItem.torp +2 -2
  128. package/src/Accordion/AccordionTrigger.torp +2 -2
  129. package/src/Breadcrumb/Breadcrumb.torp +33 -0
  130. package/src/Breadcrumb/BreadcrumbItem.torp +19 -0
  131. package/src/Breadcrumb/BreadcrumbSeparator.torp +16 -0
  132. package/src/Breadcrumb/index.ts +5 -0
  133. package/src/Calendar/Calendar.torp +265 -0
  134. package/src/Calendar/CalendarDay.torp +67 -0
  135. package/src/Calendar/CalendarTypes.ts +22 -0
  136. package/src/Calendar/index.ts +4 -0
  137. package/src/Dialog/Dialog.torp +3 -3
  138. package/src/Dialog/DialogBody.torp +2 -2
  139. package/src/Dialog/DialogButton.torp +2 -2
  140. package/src/Dialog/DialogFooter.torp +2 -2
  141. package/src/Dialog/DialogHeader.torp +2 -2
  142. package/src/Disclosure/Disclosure.torp +69 -0
  143. package/src/Disclosure/DisclosureContent.torp +36 -0
  144. package/src/Disclosure/DisclosureHeader.torp +34 -0
  145. package/src/Disclosure/DisclosureTrigger.torp +36 -0
  146. package/src/Disclosure/DisclosureTypes.ts +14 -0
  147. package/src/Disclosure/index.ts +6 -0
  148. package/{dist/Offscreen/Offscreen.torp → src/Drawer/Drawer.torp} +10 -19
  149. package/src/Drawer/index.ts +3 -0
  150. package/src/Menu/Menu.torp +160 -0
  151. package/src/Menu/MenuButton.torp +53 -0
  152. package/src/Menu/MenuCheck.torp +70 -0
  153. package/src/Menu/MenuGroup.torp +19 -0
  154. package/src/Menu/MenuIndicator.torp +29 -0
  155. package/src/Menu/MenuPopout.torp +71 -0
  156. package/src/Menu/MenuPopoutContent.torp +74 -0
  157. package/src/Menu/MenuPopoutTrigger.torp +117 -0
  158. package/src/Menu/MenuRadio.torp +88 -0
  159. package/src/Menu/MenuRadioGroup.torp +86 -0
  160. package/src/Menu/MenuSeparator.torp +14 -0
  161. package/src/Menu/MenuTypes.ts +58 -0
  162. package/src/Menu/index.ts +25 -0
  163. package/src/MenuBar/MenuBar.torp +150 -0
  164. package/src/MenuBar/MenuBarItem.torp +104 -0
  165. package/src/MenuBar/MenuBarItemContent.torp +108 -0
  166. package/src/MenuBar/MenuBarItemTrigger.torp +89 -0
  167. package/src/MenuBar/MenuBarTypes.ts +36 -0
  168. package/src/MenuBar/index.ts +6 -0
  169. package/src/NavMenu/NavMenu.torp +2 -2
  170. package/src/NavMenu/NavMenuButton.torp +2 -2
  171. package/src/NavMenu/NavMenuElement.torp +2 -2
  172. package/src/NavMenu/NavMenuGroup.torp +2 -2
  173. package/src/NavMenu/NavMenuGroupHeader.torp +2 -2
  174. package/src/NavMenu/NavMenuLink.torp +2 -2
  175. package/src/NavMenu/NavMenuPopout.torp +2 -2
  176. package/src/NavMenu/NavMenuPopoutButton.torp +3 -3
  177. package/src/NavMenu/NavMenuPopoutContent.torp +29 -27
  178. package/src/NavMenu/NavMenuSeparator.torp +2 -2
  179. package/src/Notification/Notification.torp +48 -0
  180. package/src/Notification/NotificationClose.torp +28 -0
  181. package/src/Notification/NotificationContainer.torp +14 -0
  182. package/src/Notification/NotificationContent.torp +13 -0
  183. package/src/Notification/NotificationTypes.ts +5 -0
  184. package/src/Notification/index.ts +13 -0
  185. package/src/Notification/showNotification.ts +30 -0
  186. package/src/Popover/Popover.torp +2 -2
  187. package/src/Popover/PopoverContent.torp +31 -28
  188. package/src/Popover/PopoverContentAnchored.torp +39 -38
  189. package/src/Popover/PopoverContentContextual.torp +39 -36
  190. package/src/Popover/PopoverOverlay.torp +3 -3
  191. package/src/Popover/PopoverTrigger.torp +2 -2
  192. package/src/Popover/PopoverTriggerContextual.torp +2 -2
  193. package/src/Popover/PopoverTriggerHover.torp +3 -3
  194. package/src/Slider/Slider.torp +83 -0
  195. package/src/Slider/index.ts +3 -0
  196. package/src/TabGroup/TabContent.torp +2 -2
  197. package/src/TabGroup/TabGroup.torp +2 -2
  198. package/src/TabGroup/TabHeader.torp +2 -2
  199. package/src/TabGroup/TabList.torp +2 -2
  200. package/src/TabGroup/TabTrigger.torp +2 -2
  201. package/src/icons/ArrowDown.torp +15 -0
  202. package/src/icons/ArrowLeft.torp +15 -0
  203. package/src/icons/ArrowRight.torp +15 -0
  204. package/src/icons/ArrowUp.torp +15 -0
  205. package/src/icons/Bars.torp +17 -0
  206. package/src/icons/Check.torp +15 -0
  207. package/src/icons/ChevronDown.torp +15 -0
  208. package/src/icons/ChevronLeft.torp +15 -0
  209. package/src/icons/ChevronRight.torp +15 -0
  210. package/src/icons/ChevronUp.torp +15 -0
  211. package/src/icons/Cross.torp +16 -0
  212. package/src/icons/Loading.torp +16 -0
  213. package/src/icons/Minus.torp +15 -0
  214. package/src/icons/Plus.torp +16 -0
  215. package/src/icons/index.ts +31 -0
  216. package/src/motion/fade.ts +2 -2
  217. package/src/motion/index.ts +3 -0
  218. package/src/utils/dateUtils.ts +244 -0
  219. package/src/utils/setPopoverPosition.ts +4 -0
  220. package/test/Breadcrumb/accessibility.test.ts +29 -0
  221. package/test/Breadcrumb/basic.test.ts +17 -0
  222. package/test/Breadcrumb/components/BreadcrumbTest.torp +15 -0
  223. package/test/Calendar/components/CalendarTest.torp +9 -0
  224. package/test/Calendar/default.test.ts +18 -0
  225. package/test/Dialog/components/DialogAccessibility.torp +5 -5
  226. package/test/Disclosure/accessibility.test.ts +30 -0
  227. package/test/Disclosure/components/DisclosureTest.torp +17 -0
  228. package/test/Disclosure/default.test.ts +15 -0
  229. package/test/Disclosure/toggle.test.ts +19 -0
  230. package/test/Menu/accessibility.test.ts +82 -0
  231. package/test/Menu/basic.test.ts +57 -0
  232. package/test/Menu/components/MenuAccessibility.torp +59 -0
  233. package/test/Menu/components/MenuBasic.torp +58 -0
  234. package/test/MenuBar/accessibility.test.ts +86 -0
  235. package/test/MenuBar/basic.test.ts +21 -0
  236. package/test/MenuBar/components/MenuBarAccessibility.torp +34 -0
  237. package/test/MenuBar/components/MenuBarBasic.torp +25 -0
  238. package/test/Notification/accessibility.test.ts +21 -0
  239. package/test/Notification/components/CustomNotification.torp +14 -0
  240. package/test/Notification/components/NotificationAccessibility.torp +14 -0
  241. package/test/Notification/components/NotificationFunction.torp +20 -0
  242. package/test/Notification/components/NotificationVariable.torp +22 -0
  243. package/test/Notification/function.test.ts +25 -0
  244. package/test/Notification/variable.test.ts +25 -0
  245. package/test/Popover/components/CustomDialog.torp +25 -0
  246. package/test/Popover/components/PromptFunction.torp +19 -0
  247. package/test/Popover/components/PromptVariable.torp +38 -0
  248. package/test/Popover/function.test.ts +26 -0
  249. package/test/Popover/variable.test.ts +27 -0
  250. package/tsup.config.ts +12 -4
  251. package/dist/Accordion/index.cjs +0 -53
  252. package/dist/Accordion/index.cjs.map +0 -1
  253. package/dist/Dialog/index.cjs +0 -53
  254. package/dist/Dialog/index.cjs.map +0 -1
  255. package/dist/NavMenu/index.cjs +0 -78
  256. package/dist/NavMenu/index.cjs.map +0 -1
  257. package/dist/Offscreen/index.cjs +0 -33
  258. package/dist/Offscreen/index.cjs.map +0 -1
  259. package/dist/Offscreen/index.js +0 -6
  260. package/dist/Popover/index.cjs +0 -222
  261. package/dist/Popover/index.cjs.map +0 -1
  262. package/dist/TabGroup/index.cjs +0 -53
  263. package/dist/TabGroup/index.cjs.map +0 -1
  264. package/dist/metafile-cjs.json +0 -1
  265. package/dist/motion.cjs +0 -34
  266. package/dist/motion.cjs.map +0 -1
  267. package/dist/motion.d.ts +0 -6
  268. package/dist/motion.js.map +0 -1
  269. package/src/Accordion.ts +0 -7
  270. package/src/Dialog.ts +0 -7
  271. package/src/NavMenu.ts +0 -23
  272. package/src/Offscreen/index.ts +0 -3
  273. package/src/Popover.ts +0 -29
  274. package/src/TabGroup.ts +0 -7
  275. package/src/motion.ts +0 -3
  276. /package/dist/{Offscreen → Breadcrumb}/index.js.map +0 -0
@@ -0,0 +1,108 @@
1
+ import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
2
+ import setPopoverPosition from "../utils/setPopoverPosition";
3
+ import {
4
+ MenuBarContextName,
5
+ MenuBarItemContextName,
6
+ type MenuBarContext,
7
+ type MenuBarItemContext
8
+ } from "./MenuBarTypes";
9
+
10
+ /**
11
+ * The content that is displayed for a MenuBarItem when it is open.
12
+ *
13
+ * @prop {"top" | "right" | "bottom" | "left"} side -- Where the popout will be shown, relative to the popout button
14
+ * @prop {"start" | "center" | "end"} alignment -- How the popout will be aligned, relative to the popout button
15
+ */
16
+ export default function MenuBarItemContent() {
17
+ $props.side ??= "bottom";
18
+ $props.alignment ??= "start";
19
+
20
+ let div: HTMLDivElement;
21
+ let closeOnClick = false;
22
+ let shown = false;
23
+
24
+ // Get stuff out of the MenuBarContext
25
+ const context = $context[MenuBarContextName] as MenuBarContext;
26
+ if (!context) {
27
+ throw new Error("MenuBarItemContent must be contained within a MenuBar");
28
+ }
29
+
30
+ // Get stuff out of the MenuBarItemContext
31
+ const itemContext = $context[MenuBarItemContextName] as MenuBarItemContext;
32
+ if (!itemContext) {
33
+ throw new Error("MenuBarItemContent must be contained within a MenuBarItem");
34
+ }
35
+ const { state: $state, setVisible } = itemContext;
36
+
37
+ $run(() => {
38
+ if (!$state.visible) {
39
+ hide();
40
+ }
41
+ });
42
+
43
+ function show() {
44
+ shown = true;
45
+
46
+ // HACK: Because this Contextual could be shown with a click, we need to wait for another mousedown
47
+ // before we close on click. Otherwise the click immediately bubbles to the document. I guess
48
+ // we could require the user to preventDefault after calling showContextual, but that seems very
49
+ // error-prone?
50
+ closeOnClick = false;
51
+ addDocumentEvent("mousedown", handleDocumentMouseDown);
52
+ addDocumentEvent("click", handleDocumentClick);
53
+
54
+ // Set the position and listen for window resize and scroll to reset the position
55
+ setPosition();
56
+ addEventListener("resize", setPosition);
57
+ addEventListener("scroll", setPosition);
58
+ if (itemContext.focusFirstElement) {
59
+ itemContext.focusFirstElement();
60
+ }
61
+ }
62
+
63
+ function hide() {
64
+ if (!shown) return;
65
+
66
+ removeDocumentEvent("mousedown", handleDocumentMouseDown);
67
+ removeDocumentEvent("click", handleDocumentClick);
68
+
69
+ // Stop listening for window resize and focus the anchor element per WAI guidelines
70
+ removeEventListener("resize", setPosition);
71
+ removeEventListener("scroll", setPosition);
72
+ if (itemContext.anchorElement?.focus) {
73
+ itemContext.anchorElement.focus();
74
+ }
75
+ }
76
+
77
+ function handleDocumentMouseDown() {
78
+ closeOnClick = true;
79
+ }
80
+
81
+ function handleDocumentClick(e: MouseEvent) {
82
+ if (closeOnClick && !div.contains(e.target as HTMLElement)) {
83
+ context.active = false;
84
+ setVisible(false);
85
+ }
86
+ }
87
+
88
+ function setPosition() {
89
+ if (!itemContext.anchorElement) {
90
+ throw new Error("MenuBarItemContent must have an anchor element");
91
+ }
92
+
93
+ setPopoverPosition(itemContext.anchorElement, div, $props.side, $props.alignment);
94
+ }
95
+
96
+ @render {
97
+ @if ($state.visible) {
98
+ <div
99
+ {$props.id}
100
+ class={`torp-menu-bar-item-content ${$props.class ?? ""}`.trim()}
101
+ &ref={div}
102
+ onmount={show}
103
+ >
104
+ <slot />
105
+ </div>
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,89 @@
1
+ import {
2
+ MenuBarContextName,
3
+ MenuBarItemContextName,
4
+ type MenuBarContext,
5
+ type MenuBarItemContext
6
+ } from "./MenuBarTypes";
7
+
8
+ /**
9
+ * A button that is placed in a MenuBar and opens a submenu.
10
+ *
11
+ * @prop {boolean} disabled -- Whether this button is disabled
12
+ */
13
+ export default function MenuBarItemTrigger() {
14
+ $props.disabled ??= false;
15
+
16
+ let button: HTMLButtonElement;
17
+
18
+ // Get stuff out of the MenuBarContext
19
+ const menubarContext = $context[MenuBarContextName] as MenuBarContext;
20
+ if (!menubarContext) {
21
+ throw new Error("MenuBarItemTrigger must be contained within a MenuBar");
22
+ }
23
+ const { registerItem, handleButtonKey, handleButtonFocus } = menubarContext;
24
+
25
+ // Get stuff out of the MenuBarItemContext
26
+ const itemContext = $context[MenuBarItemContextName] as MenuBarItemContext;
27
+ if (!itemContext) {
28
+ throw new Error("MenuBarItemTrigger must be contained within a MenuBarItem");
29
+ }
30
+ const { state: $state, setVisible } = itemContext;
31
+
32
+ // Register this item with the parent MenuBar and store the index
33
+ const { index } = registerItem(setVisible, setFocused);
34
+
35
+ $mount(() => {
36
+ // Set the anchor element to the button when it exists
37
+ //itemContext.anchorElement = button;
38
+ itemContext.index = index;
39
+ });
40
+
41
+ function setFocused() {
42
+ button.focus();
43
+ }
44
+
45
+ function handleClick() {
46
+ menubarContext.state.active = !menubarContext.state.active;
47
+ setVisible(menubarContext.state.active);
48
+ }
49
+
50
+ function handleKey(e: KeyboardEvent) {
51
+ switch (e.key) {
52
+ case "Down":
53
+ case "ArrowDown":
54
+ // TODO: This should be based on what side the menu shows on
55
+ e.preventDefault();
56
+ menubarContext.state.active = true;
57
+ setVisible(true);
58
+ break;
59
+ default:
60
+ handleButtonKey(e);
61
+ }
62
+ }
63
+
64
+ function handleMouseEnter() {
65
+ setVisible(true);
66
+ }
67
+
68
+ @render {
69
+ <button
70
+ {$props.id}
71
+ class={`torp-menu-bar-item-button ${$props.class ?? ""}`.trim()}
72
+ type="button"
73
+ {$props.disabled}
74
+ role="menuitem"
75
+ aria-haspopup="true"
76
+ aria-expanded={($state.visible ?? false).toString()}
77
+ aria-disabled={$props.disabled ? "true" : undefined}
78
+ data-disabled={$props.disabled ? "true" : undefined}
79
+ onkeydown={handleKey}
80
+ onclick={handleClick}
81
+ onfocus={() => handleButtonFocus(index)}
82
+ onmouseenter={handleMouseEnter}
83
+ &ref={button}
84
+ onmount={(el) => itemContext.anchorElement = el}
85
+ >
86
+ <slot />
87
+ </button>
88
+ }
89
+ }
@@ -0,0 +1,36 @@
1
+ export const MenuBarContextName = "MenuBar";
2
+ export const MenuBarItemContextName = "MenuBarItem";
3
+
4
+ export interface MenuBarContext {
5
+ /** Called from a MenuBarItem when it is shown, to hide others */
6
+ handleItemShow: (index: number) => void;
7
+
8
+ /** Called from a MenuBarButton when its button is focused */
9
+ handleButtonFocus: (index: number) => void;
10
+
11
+ /** Called from a MenuBarButton when a key is pressed */
12
+ handleButtonKey: (e: KeyboardEvent) => void;
13
+
14
+ /** Called from each MenuBarButton to register itself with this MenuBar */
15
+ registerItem: (setVisible: (value: boolean) => void, setFocused: () => void) => { index: number };
16
+
17
+ state: {
18
+ /** Whether a menubar item is showing its content. If so, changing to another item should show its content */
19
+ active: boolean;
20
+ };
21
+ }
22
+
23
+ export interface MenuBarItemContext {
24
+ setVisible: (value: boolean) => void;
25
+ state: {
26
+ visible: boolean;
27
+ };
28
+ index: number;
29
+ anchorElement?: HTMLElement;
30
+ focusFirstElement?: () => void;
31
+ }
32
+
33
+ export interface ItemState {
34
+ setVisible: (value: boolean) => void;
35
+ setFocused: () => void;
36
+ }
@@ -0,0 +1,74 @@
1
+ import { type SlotRender } from "@torpor/view";
2
+
3
+
4
+ /**
5
+ * Mounts or hydrates the component into the supplied parent node.
6
+ * @param $parent -- The parent node.
7
+ * @param $anchor -- The node to mount the component before.
8
+ * @param $props -- The values that have been passed into the component as properties.
9
+ * @param $context -- Values that have been passed into the component from its ancestors.
10
+ * @param $slots -- Functions for rendering children into slot nodes within the component.
11
+ */
12
+ declare function MenuBar(
13
+ $parent: ParentNode,
14
+ $anchor: Node | null,
15
+ $props?: Record<PropertyKey, any>,
16
+ $context?: Record<PropertyKey, any>,
17
+ $slots?: Record<string, SlotRender>,
18
+ ): void;
19
+
20
+
21
+
22
+ /**
23
+ * Mounts or hydrates the component into the supplied parent node.
24
+ * @param $parent -- The parent node.
25
+ * @param $anchor -- The node to mount the component before.
26
+ * @param $props -- The values that have been passed into the component as properties.
27
+ * @param $context -- Values that have been passed into the component from its ancestors.
28
+ * @param $slots -- Functions for rendering children into slot nodes within the component.
29
+ */
30
+ declare function MenuBarItem(
31
+ $parent: ParentNode,
32
+ $anchor: Node | null,
33
+ $props?: Record<PropertyKey, any>,
34
+ $context?: Record<PropertyKey, any>,
35
+ $slots?: Record<string, SlotRender>,
36
+ ): void;
37
+
38
+
39
+
40
+ /**
41
+ * Mounts or hydrates the component into the supplied parent node.
42
+ * @param $parent -- The parent node.
43
+ * @param $anchor -- The node to mount the component before.
44
+ * @param $props -- The values that have been passed into the component as properties.
45
+ * @param $context -- Values that have been passed into the component from its ancestors.
46
+ * @param $slots -- Functions for rendering children into slot nodes within the component.
47
+ */
48
+ declare function MenuBarItemContent(
49
+ $parent: ParentNode,
50
+ $anchor: Node | null,
51
+ $props?: Record<PropertyKey, any>,
52
+ $context?: Record<PropertyKey, any>,
53
+ $slots?: Record<string, SlotRender>,
54
+ ): void;
55
+
56
+
57
+
58
+ /**
59
+ * Mounts or hydrates the component into the supplied parent node.
60
+ * @param $parent -- The parent node.
61
+ * @param $anchor -- The node to mount the component before.
62
+ * @param $props -- The values that have been passed into the component as properties.
63
+ * @param $context -- Values that have been passed into the component from its ancestors.
64
+ * @param $slots -- Functions for rendering children into slot nodes within the component.
65
+ */
66
+ declare function MenuBarItemTrigger(
67
+ $parent: ParentNode,
68
+ $anchor: Node | null,
69
+ $props?: Record<PropertyKey, any>,
70
+ $context?: Record<PropertyKey, any>,
71
+ $slots?: Record<string, SlotRender>,
72
+ ): void;
73
+
74
+ export { MenuBar, MenuBarItem, MenuBarItemContent, MenuBarItemTrigger };
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -164,7 +164,7 @@ export default function NavMenu($props: any) {
164
164
 
165
165
  @render {
166
166
  <nav
167
- id={$props.id}
167
+ {$props.id}
168
168
  class={`torp-nav-menu ${$props.class ?? ""}`.trim()}
169
169
  tabindex="0"
170
170
  role="menubar"
@@ -172,7 +172,7 @@ export default function NavMenu($props: any) {
172
172
  aria-orientation={$props.orientation}
173
173
  onfocus={handleFocus}
174
174
  >
175
- <:slot />
175
+ <slot />
176
176
  </nav>
177
177
  }
178
178
  }
@@ -27,7 +27,7 @@ export default function NavMenuButton($props: any) {
27
27
 
28
28
  @render {
29
29
  <button
30
- id={$props.id}
30
+ {$props.id}
31
31
  class={`torp-nav-menu-button ${$props.class ?? ""}`.trim()}
32
32
  type="button"
33
33
  {$props.disabled}
@@ -40,7 +40,7 @@ export default function NavMenuButton($props: any) {
40
40
  onfocus={() => handleItemFocus(index)}
41
41
  &ref={button}
42
42
  >
43
- <:slot />
43
+ <slot />
44
44
  </button>
45
45
  }
46
46
  }
@@ -26,7 +26,7 @@ export default function NavMenuElement($props: any) {
26
26
 
27
27
  @render {
28
28
  <div
29
- id={$props.id}
29
+ {$props.id}
30
30
  class={`torp-nav-menu-div ${$props.class ?? ""}`.trim()}
31
31
  type="div"
32
32
  role="menuitem"
@@ -37,7 +37,7 @@ export default function NavMenuElement($props: any) {
37
37
  onclick
38
38
  onfocus={() => handleItemFocus(index)}
39
39
  >
40
- <:slot />
40
+ <slot />
41
41
  </div>
42
42
  }
43
43
  }
@@ -18,13 +18,13 @@ export default function NavMenuGroup($props: any) {
18
18
 
19
19
  @render {
20
20
  <div
21
- id={$props.id}
21
+ {$props.id}
22
22
  class={`torp-nav-menu-group ${$props.class ?? ""}`.trim()}
23
23
  role="group"
24
24
  aria-label={$props.ariaLabel}
25
25
  aria-labelledby={$state.headerId}
26
26
  >
27
- <:slot />
27
+ <slot />
28
28
  </div>
29
29
  }
30
30
  }
@@ -21,10 +21,10 @@ export default function NavMenuGroupHeader($props: any) {
21
21
  @render {
22
22
  <h4
23
23
  @// TODO: self={$props.as}
24
- id={$props.id}
24
+ {$props.id}
25
25
  class={`torp-nav-menu-group-header ${$props.class ?? ""}`.trim()}
26
26
  >
27
- <:slot />
27
+ <slot />
28
28
  </h4>
29
29
  }
30
30
  }
@@ -32,7 +32,7 @@ export default function NavMenuLink($props: any) {
32
32
 
33
33
  @render {
34
34
  <a
35
- id={$props.id}
35
+ {$props.id}
36
36
  class={`torp-nav-menu-link ${$props.class ?? ""}`.trim()}
37
37
  href={$props.href}
38
38
  {$props.disabled}
@@ -46,7 +46,7 @@ export default function NavMenuLink($props: any) {
46
46
  onfocus={() => handleItemFocus(index)}
47
47
  &ref={link}
48
48
  >
49
- <:slot />
49
+ <slot />
50
50
  </a>
51
51
  }
52
52
  }
@@ -59,11 +59,11 @@ export default function NavMenuPopout($props: any) {
59
59
 
60
60
  @render {
61
61
  <div
62
- id={$props.id}
62
+ {$props.id}
63
63
  class={`torp-nav-menu-popout ${$props.class ?? ""}`.trim()}
64
64
  onmouseleave={handleMouseLeave}
65
65
  >
66
- <:slot />
66
+ <slot />
67
67
  </div>
68
68
  }
69
69
  }
@@ -96,7 +96,7 @@ export default function NavMenuPopoutButton($props: any) {
96
96
 
97
97
  @render {
98
98
  <button
99
- id={$props.id}
99
+ {$props.id}
100
100
  class={`torp-nav-menu-popout-button ${$props.class ?? ""}`.trim()}
101
101
  type="button"
102
102
  {$props.disabled}
@@ -112,9 +112,9 @@ export default function NavMenuPopoutButton($props: any) {
112
112
  onmouseleave={handleMouseLeave}
113
113
  onmousemove={handleMouseMove}
114
114
  &ref={button}
115
- :onmount={(el) => popoutContext.anchorElement = el }
115
+ onmount={(el) => popoutContext.anchorElement = el }
116
116
  >
117
- <:slot />
117
+ <slot />
118
118
  </button>
119
119
  }
120
120
  }
@@ -14,6 +14,7 @@ export default function NavMenuPopoutContent($props: any) {
14
14
  $props.alignment ??= "start";
15
15
 
16
16
  let div: HTMLDivElement;
17
+ let shown = false;
17
18
 
18
19
  // Get stuff out of the NavMenuPopoutContext
19
20
  const context = $context[NavMenuPopoutContextName] as NavMenuPopoutContext;
@@ -22,35 +23,36 @@ export default function NavMenuPopoutContent($props: any) {
22
23
  }
23
24
  let $state = context.state;
24
25
 
25
- let first = true;
26
26
  $run(() => {
27
- let visible = $state.visible;
27
+ if (!$state.visible) {
28
+ hide();
29
+ }
30
+ });
28
31
 
29
- if (first) {
30
- first = false;
31
- return;
32
+ function show() {
33
+ shown = true;
34
+
35
+ // Set the position and listen for window resize and scroll to reset the position
36
+ setPosition();
37
+ const scrollParent = getScrollParent(context.anchorElement)
38
+ scrollParent.addEventListener("resize", setPosition);
39
+ scrollParent.addEventListener("scroll", setPosition);
40
+ if (context.focusFirstElement) {
41
+ context.focusFirstElement();
32
42
  }
43
+ }
33
44
 
34
- if (visible) {
35
- // Wait for the content div to be shown, set its position, and listen for window resize to re-position
36
- //await tick();
37
- setPosition();
38
- if (context.focusFirstElement) {
39
- context.focusFirstElement();
40
- }
41
- const scrollParent = getScrollParent(context.anchorElement)
42
- scrollParent.addEventListener("resize", setPosition);
43
- scrollParent.addEventListener("scroll", setPosition);
44
- } else {
45
- // Stop listening for window resize and focus the anchor element per WAI guidelines
46
- const scrollParent = getScrollParent(context.anchorElement)
47
- scrollParent.removeEventListener("resize", setPosition);
48
- scrollParent.removeEventListener("scroll", setPosition);
49
- if (context.anchorElement?.focus) {
50
- context.anchorElement.focus();
51
- }
45
+ function hide() {
46
+ if (!shown) return;
47
+
48
+ // Stop listening for window resize and focus the anchor element per WAI guidelines
49
+ const scrollParent = getScrollParent(context.anchorElement)
50
+ scrollParent.removeEventListener("resize", setPosition);
51
+ scrollParent.removeEventListener("scroll", setPosition);
52
+ if (context.anchorElement?.focus) {
53
+ context.anchorElement.focus();
52
54
  }
53
- });
55
+ }
54
56
 
55
57
  function setPosition() {
56
58
  if (!context.anchorElement) {
@@ -65,12 +67,12 @@ export default function NavMenuPopoutContent($props: any) {
65
67
  @render {
66
68
  @if ($state.visible) {
67
69
  <div
68
- id={$props.id}
70
+ {$props.id}
69
71
  class={`torp-nav-menu-popout-content ${$props.class ?? ""}`.trim()}
70
72
  &ref={div}
71
- :onmount={(el) => setPopoverPosition(context.anchorElement, el, $props.side, $props.alignment)}
73
+ onmount={show}
72
74
  >
73
- <:slot />
75
+ <slot />
74
76
  </div>
75
77
  }
76
78
  }
@@ -5,10 +5,10 @@
5
5
  export default function NavMenuSeparator($props: any) {
6
6
  @render {
7
7
  <div
8
- id={$props.id}
8
+ {$props.id}
9
9
  class={`torp-nav-menu-separator ${$props.class ?? ""}`.trim()} role="separator"
10
10
  >
11
- <:slot />
11
+ <slot />
12
12
  </div>
13
13
  }
14
14
  }