@torpor/ui 0.1.7 → 0.2.1

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 (313) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/Accordion/Accordion.torp +25 -13
  3. package/dist/Accordion/AccordionContent.torp +15 -8
  4. package/dist/Accordion/AccordionHeader.torp +16 -7
  5. package/dist/Accordion/AccordionItem.torp +24 -10
  6. package/dist/Accordion/AccordionTrigger.torp +16 -8
  7. package/dist/Accordion/AccordionTypes.ts +2 -0
  8. package/dist/Accordion/index.d.ts +157 -0
  9. package/dist/Breadcrumb/Breadcrumb.torp +42 -0
  10. package/dist/Breadcrumb/BreadcrumbItem.torp +28 -0
  11. package/dist/Breadcrumb/BreadcrumbSeparator.torp +25 -0
  12. package/dist/Breadcrumb/index.d.ts +84 -0
  13. package/dist/Breadcrumb/index.js +14 -0
  14. package/dist/Calendar/Calendar.torp +273 -0
  15. package/dist/Calendar/CalendarDay.torp +75 -0
  16. package/dist/Calendar/CalendarTypes.ts +22 -0
  17. package/dist/Calendar/index.d.ts +36 -0
  18. package/dist/Calendar/index.js +10 -0
  19. package/dist/Calendar/index.js.map +1 -0
  20. package/dist/Dialog/Dialog.torp +16 -6
  21. package/dist/Dialog/DialogBody.torp +13 -5
  22. package/dist/Dialog/DialogButton.torp +18 -6
  23. package/dist/Dialog/DialogFooter.torp +13 -3
  24. package/dist/Dialog/DialogHeader.torp +13 -4
  25. package/dist/Dialog/index.d.ts +135 -0
  26. package/dist/Disclosure/Disclosure.torp +79 -0
  27. package/dist/Disclosure/DisclosureContent.torp +43 -0
  28. package/dist/Disclosure/DisclosureHeader.torp +43 -0
  29. package/dist/Disclosure/DisclosureTrigger.torp +44 -0
  30. package/dist/Disclosure/DisclosureTypes.ts +14 -0
  31. package/dist/Disclosure/index.d.ts +113 -0
  32. package/dist/Disclosure/index.js +18 -0
  33. package/dist/Disclosure/index.js.map +1 -0
  34. package/{src/Offscreen/Offscreen.torp → dist/Drawer/Drawer.torp} +20 -19
  35. package/dist/Drawer/index.d.ts +21 -0
  36. package/dist/Drawer/index.js +6 -0
  37. package/dist/Drawer/index.js.map +1 -0
  38. package/dist/Form/Field.torp +93 -0
  39. package/dist/Form/Form.torp +131 -0
  40. package/dist/Form/FormTypes.ts +30 -0
  41. package/dist/Form/Input.torp +94 -0
  42. package/dist/Form/Label.torp +31 -0
  43. package/dist/Form/Message.torp +35 -0
  44. package/dist/Form/StandardSchemaV1.ts +70 -0
  45. package/dist/Form/index.d.ts +117 -0
  46. package/dist/Form/index.js +22 -0
  47. package/dist/Form/index.js.map +1 -0
  48. package/dist/Menu/Menu.torp +169 -0
  49. package/dist/Menu/MenuButton.torp +64 -0
  50. package/dist/Menu/MenuCheck.torp +81 -0
  51. package/dist/Menu/MenuGroup.torp +29 -0
  52. package/dist/Menu/MenuIndicator.torp +38 -0
  53. package/dist/Menu/MenuPopout.torp +82 -0
  54. package/dist/Menu/MenuPopoutContent.torp +83 -0
  55. package/dist/Menu/MenuPopoutTrigger.torp +126 -0
  56. package/dist/Menu/MenuRadio.torp +99 -0
  57. package/dist/Menu/MenuRadioGroup.torp +97 -0
  58. package/dist/Menu/MenuSeparator.torp +24 -0
  59. package/dist/Menu/MenuTypes.ts +58 -0
  60. package/dist/Menu/index.d.ts +293 -0
  61. package/dist/Menu/index.js +46 -0
  62. package/dist/Menu/index.js.map +1 -0
  63. package/dist/MenuBar/MenuBar.torp +159 -0
  64. package/dist/MenuBar/MenuBarItem.torp +115 -0
  65. package/dist/MenuBar/MenuBarItemContent.torp +117 -0
  66. package/dist/MenuBar/MenuBarItemTrigger.torp +98 -0
  67. package/dist/MenuBar/MenuBarTypes.ts +36 -0
  68. package/dist/MenuBar/index.d.ts +125 -0
  69. package/dist/MenuBar/index.js +18 -0
  70. package/dist/MenuBar/index.js.map +1 -0
  71. package/dist/NavMenu/NavMenu.torp +15 -6
  72. package/dist/NavMenu/NavMenuButton.torp +14 -7
  73. package/dist/NavMenu/NavMenuElement.torp +16 -8
  74. package/dist/NavMenu/NavMenuGroup.torp +14 -5
  75. package/dist/NavMenu/NavMenuGroupHeader.torp +14 -6
  76. package/dist/NavMenu/NavMenuLink.torp +18 -10
  77. package/dist/NavMenu/NavMenuPopout.torp +13 -5
  78. package/dist/NavMenu/NavMenuPopoutButton.torp +17 -11
  79. package/dist/NavMenu/NavMenuPopoutContent.torp +42 -30
  80. package/dist/NavMenu/NavMenuSeparator.torp +12 -3
  81. package/dist/NavMenu/index.d.ts +259 -0
  82. package/dist/Notification/Notification.torp +58 -0
  83. package/dist/Notification/NotificationClose.torp +37 -0
  84. package/dist/Notification/NotificationContainer.torp +24 -0
  85. package/dist/Notification/NotificationContent.torp +23 -0
  86. package/dist/Notification/NotificationTypes.ts +5 -0
  87. package/dist/Notification/index.d.ts +92 -0
  88. package/dist/Notification/index.js +36 -0
  89. package/dist/Notification/index.js.map +1 -0
  90. package/dist/Notification/showNotification.ts +30 -0
  91. package/dist/Popover/Popover.torp +22 -8
  92. package/dist/Popover/PopoverContent.torp +41 -29
  93. package/dist/Popover/PopoverContentAnchored.torp +52 -44
  94. package/dist/Popover/PopoverContentContextual.torp +49 -37
  95. package/dist/Popover/PopoverOverlay.torp +13 -4
  96. package/dist/Popover/PopoverTrigger.torp +12 -3
  97. package/dist/Popover/PopoverTriggerContextual.torp +12 -3
  98. package/dist/Popover/PopoverTriggerHover.torp +14 -5
  99. package/dist/Popover/index.d.ts +191 -0
  100. package/dist/TabGroup/TabContent.torp +13 -7
  101. package/dist/TabGroup/TabGroup.torp +23 -11
  102. package/dist/TabGroup/TabHeader.torp +16 -7
  103. package/dist/TabGroup/TabList.torp +15 -6
  104. package/dist/TabGroup/TabTrigger.torp +14 -6
  105. package/dist/TabGroup/index.d.ts +150 -0
  106. package/dist/icons/ArrowDown.torp +15 -0
  107. package/dist/icons/ArrowLeft.torp +15 -0
  108. package/dist/icons/ArrowRight.torp +15 -0
  109. package/dist/icons/ArrowUp.torp +15 -0
  110. package/dist/icons/Bars.torp +17 -0
  111. package/dist/icons/Check.torp +15 -0
  112. package/dist/icons/ChevronDown.torp +15 -0
  113. package/dist/icons/ChevronLeft.torp +15 -0
  114. package/dist/icons/ChevronRight.torp +15 -0
  115. package/dist/icons/ChevronUp.torp +15 -0
  116. package/dist/icons/Cross.torp +16 -0
  117. package/dist/icons/Loading.torp +16 -0
  118. package/dist/icons/Minus.torp +15 -0
  119. package/dist/icons/Plus.torp +16 -0
  120. package/dist/icons/index.d.ts +142 -0
  121. package/dist/icons/index.js +58 -0
  122. package/dist/icons/index.js.map +1 -0
  123. package/dist/{motion.d.cts → index.d.ts} +2 -2
  124. package/dist/metafile-esm.json +1 -1
  125. package/dist/motion/fade.ts +7 -0
  126. package/dist/motion/index.d.ts +2 -0
  127. package/dist/{motion.js → motion/index.js} +1 -1
  128. package/dist/motion/index.js.map +1 -0
  129. package/dist/mount/index.d.ts +2 -0
  130. package/dist/utils/dateUtils.ts +244 -0
  131. package/dist/utils/index.d.ts +2 -0
  132. package/dist/utils/setPopoverPosition.ts +4 -0
  133. package/package.json +60 -35
  134. package/scripts/postbuild.ts +42 -5
  135. package/src/Accordion/Accordion.torp +25 -13
  136. package/src/Accordion/AccordionContent.torp +15 -8
  137. package/src/Accordion/AccordionHeader.torp +16 -7
  138. package/src/Accordion/AccordionItem.torp +24 -10
  139. package/src/Accordion/AccordionTrigger.torp +16 -8
  140. package/src/Accordion/AccordionTypes.ts +2 -0
  141. package/src/Breadcrumb/Breadcrumb.torp +42 -0
  142. package/src/Breadcrumb/BreadcrumbItem.torp +28 -0
  143. package/src/Breadcrumb/BreadcrumbSeparator.torp +25 -0
  144. package/src/Breadcrumb/index.ts +5 -0
  145. package/src/Calendar/Calendar.torp +273 -0
  146. package/src/Calendar/CalendarDay.torp +75 -0
  147. package/src/Calendar/CalendarTypes.ts +22 -0
  148. package/src/Calendar/index.ts +4 -0
  149. package/src/Dialog/Dialog.torp +16 -6
  150. package/src/Dialog/DialogBody.torp +13 -5
  151. package/src/Dialog/DialogButton.torp +18 -6
  152. package/src/Dialog/DialogFooter.torp +13 -3
  153. package/src/Dialog/DialogHeader.torp +13 -4
  154. package/src/Disclosure/Disclosure.torp +79 -0
  155. package/src/Disclosure/DisclosureContent.torp +43 -0
  156. package/src/Disclosure/DisclosureHeader.torp +43 -0
  157. package/src/Disclosure/DisclosureTrigger.torp +44 -0
  158. package/src/Disclosure/DisclosureTypes.ts +14 -0
  159. package/src/Disclosure/index.ts +6 -0
  160. package/{dist/Offscreen/Offscreen.torp → src/Drawer/Drawer.torp} +20 -19
  161. package/src/Drawer/index.ts +3 -0
  162. package/src/Form/Field.torp +93 -0
  163. package/src/Form/Form.torp +131 -0
  164. package/src/Form/FormTypes.ts +30 -0
  165. package/src/Form/Input.torp +94 -0
  166. package/src/Form/Label.torp +31 -0
  167. package/src/Form/Message.torp +35 -0
  168. package/src/Form/StandardSchemaV1.ts +70 -0
  169. package/src/Form/index.ts +7 -0
  170. package/src/Menu/Menu.torp +169 -0
  171. package/src/Menu/MenuButton.torp +64 -0
  172. package/src/Menu/MenuCheck.torp +81 -0
  173. package/src/Menu/MenuGroup.torp +29 -0
  174. package/src/Menu/MenuIndicator.torp +38 -0
  175. package/src/Menu/MenuPopout.torp +82 -0
  176. package/src/Menu/MenuPopoutContent.torp +83 -0
  177. package/src/Menu/MenuPopoutTrigger.torp +126 -0
  178. package/src/Menu/MenuRadio.torp +99 -0
  179. package/src/Menu/MenuRadioGroup.torp +97 -0
  180. package/src/Menu/MenuSeparator.torp +24 -0
  181. package/src/Menu/MenuTypes.ts +58 -0
  182. package/src/Menu/index.ts +25 -0
  183. package/src/MenuBar/MenuBar.torp +159 -0
  184. package/src/MenuBar/MenuBarItem.torp +115 -0
  185. package/src/MenuBar/MenuBarItemContent.torp +117 -0
  186. package/src/MenuBar/MenuBarItemTrigger.torp +98 -0
  187. package/src/MenuBar/MenuBarTypes.ts +36 -0
  188. package/src/MenuBar/index.ts +6 -0
  189. package/src/NavMenu/NavMenu.torp +15 -6
  190. package/src/NavMenu/NavMenuButton.torp +14 -7
  191. package/src/NavMenu/NavMenuElement.torp +16 -8
  192. package/src/NavMenu/NavMenuGroup.torp +14 -5
  193. package/src/NavMenu/NavMenuGroupHeader.torp +14 -6
  194. package/src/NavMenu/NavMenuLink.torp +18 -10
  195. package/src/NavMenu/NavMenuPopout.torp +13 -5
  196. package/src/NavMenu/NavMenuPopoutButton.torp +17 -11
  197. package/src/NavMenu/NavMenuPopoutContent.torp +42 -30
  198. package/src/NavMenu/NavMenuSeparator.torp +12 -3
  199. package/src/Notification/Notification.torp +58 -0
  200. package/src/Notification/NotificationClose.torp +37 -0
  201. package/src/Notification/NotificationContainer.torp +24 -0
  202. package/src/Notification/NotificationContent.torp +23 -0
  203. package/src/Notification/NotificationTypes.ts +5 -0
  204. package/src/Notification/index.ts +13 -0
  205. package/src/Notification/showNotification.ts +30 -0
  206. package/src/Popover/Popover.torp +22 -8
  207. package/src/Popover/PopoverContent.torp +41 -29
  208. package/src/Popover/PopoverContentAnchored.torp +52 -44
  209. package/src/Popover/PopoverContentContextual.torp +49 -37
  210. package/src/Popover/PopoverOverlay.torp +13 -4
  211. package/src/Popover/PopoverTrigger.torp +12 -3
  212. package/src/Popover/PopoverTriggerContextual.torp +12 -3
  213. package/src/Popover/PopoverTriggerHover.torp +14 -5
  214. package/src/Slider/Slider.torp +83 -0
  215. package/src/Slider/index.ts +3 -0
  216. package/src/TabGroup/TabContent.torp +13 -7
  217. package/src/TabGroup/TabGroup.torp +23 -11
  218. package/src/TabGroup/TabHeader.torp +16 -7
  219. package/src/TabGroup/TabList.torp +15 -6
  220. package/src/TabGroup/TabTrigger.torp +14 -6
  221. package/src/icons/ArrowDown.torp +15 -0
  222. package/src/icons/ArrowLeft.torp +15 -0
  223. package/src/icons/ArrowRight.torp +15 -0
  224. package/src/icons/ArrowUp.torp +15 -0
  225. package/src/icons/Bars.torp +17 -0
  226. package/src/icons/Check.torp +15 -0
  227. package/src/icons/ChevronDown.torp +15 -0
  228. package/src/icons/ChevronLeft.torp +15 -0
  229. package/src/icons/ChevronRight.torp +15 -0
  230. package/src/icons/ChevronUp.torp +15 -0
  231. package/src/icons/Cross.torp +16 -0
  232. package/src/icons/Loading.torp +16 -0
  233. package/src/icons/Minus.torp +15 -0
  234. package/src/icons/Plus.torp +16 -0
  235. package/src/icons/index.ts +31 -0
  236. package/src/motion/fade.ts +2 -2
  237. package/src/motion/index.ts +3 -0
  238. package/src/utils/dateUtils.ts +244 -0
  239. package/src/utils/setPopoverPosition.ts +4 -0
  240. package/test/Accordion/components/AccordionAccessibility.torp +2 -0
  241. package/test/Accordion/components/AccordionKeyboard.torp +2 -0
  242. package/test/Accordion/components/AccordionList.torp +2 -0
  243. package/test/Accordion/components/AccordionMultiple.torp +2 -0
  244. package/test/Accordion/components/AccordionSingle.torp +2 -0
  245. package/test/Breadcrumb/accessibility.test.ts +29 -0
  246. package/test/Breadcrumb/basic.test.ts +17 -0
  247. package/test/Breadcrumb/components/BreadcrumbTest.torp +15 -0
  248. package/test/Calendar/components/CalendarTest.torp +9 -0
  249. package/test/Calendar/default.test.ts +18 -0
  250. package/test/Dialog/components/DialogAccessibility.torp +5 -5
  251. package/test/Disclosure/accessibility.test.ts +31 -0
  252. package/test/Disclosure/components/DisclosureTest.torp +19 -0
  253. package/test/Disclosure/default.test.ts +15 -0
  254. package/test/Disclosure/toggle.test.ts +20 -0
  255. package/test/Form/components/FieldTest.torp +25 -0
  256. package/test/Form/components/FormTest.torp +31 -0
  257. package/test/Form/components/InputTest.torp +9 -0
  258. package/test/Form/field.test.ts +34 -0
  259. package/test/Form/form.test.ts +34 -0
  260. package/test/Form/input.test.ts +19 -0
  261. package/test/Menu/accessibility.test.ts +83 -0
  262. package/test/Menu/basic.test.ts +58 -0
  263. package/test/Menu/components/MenuAccessibility.torp +59 -0
  264. package/test/Menu/components/MenuBasic.torp +58 -0
  265. package/test/MenuBar/accessibility.test.ts +87 -0
  266. package/test/MenuBar/basic.test.ts +22 -0
  267. package/test/MenuBar/components/MenuBarAccessibility.torp +34 -0
  268. package/test/MenuBar/components/MenuBarBasic.torp +25 -0
  269. package/test/NavMenu/basic.test.ts +1 -1
  270. package/test/NavMenu/components/{NavMenu.torp → NavMenuBasic.torp} +1 -1
  271. package/test/Notification/accessibility.test.ts +21 -0
  272. package/test/Notification/components/CustomNotification.torp +14 -0
  273. package/test/Notification/components/NotificationAccessibility.torp +14 -0
  274. package/test/Notification/components/NotificationFunction.torp +20 -0
  275. package/test/Notification/components/NotificationVariable.torp +22 -0
  276. package/test/Notification/function.test.ts +25 -0
  277. package/test/Notification/variable.test.ts +25 -0
  278. package/test/Popover/components/CustomDialog.torp +25 -0
  279. package/test/Popover/components/PromptFunction.torp +19 -0
  280. package/test/Popover/components/PromptVariable.torp +38 -0
  281. package/test/Popover/function.test.ts +26 -0
  282. package/test/Popover/variable.test.ts +27 -0
  283. package/test/TabGroup/components/TabGroupAccessibility.torp +2 -0
  284. package/test/TabGroup/components/TabGroupKeyboard.torp +2 -0
  285. package/test/TabGroup/components/TabGroupList.torp +2 -0
  286. package/test/TabGroup/components/TabGroupTrigger.torp +2 -0
  287. package/tsup.config.ts +12 -4
  288. package/dist/Accordion/index.cjs +0 -53
  289. package/dist/Accordion/index.cjs.map +0 -1
  290. package/dist/Dialog/index.cjs +0 -53
  291. package/dist/Dialog/index.cjs.map +0 -1
  292. package/dist/NavMenu/index.cjs +0 -78
  293. package/dist/NavMenu/index.cjs.map +0 -1
  294. package/dist/Offscreen/index.cjs +0 -33
  295. package/dist/Offscreen/index.cjs.map +0 -1
  296. package/dist/Offscreen/index.js +0 -6
  297. package/dist/Popover/index.cjs +0 -222
  298. package/dist/Popover/index.cjs.map +0 -1
  299. package/dist/TabGroup/index.cjs +0 -53
  300. package/dist/TabGroup/index.cjs.map +0 -1
  301. package/dist/metafile-cjs.json +0 -1
  302. package/dist/motion.cjs +0 -34
  303. package/dist/motion.cjs.map +0 -1
  304. package/dist/motion.d.ts +0 -6
  305. package/dist/motion.js.map +0 -1
  306. package/src/Accordion.ts +0 -7
  307. package/src/Dialog.ts +0 -7
  308. package/src/NavMenu.ts +0 -23
  309. package/src/Offscreen/index.ts +0 -3
  310. package/src/Popover.ts +0 -29
  311. package/src/TabGroup.ts +0 -7
  312. package/src/motion.ts +0 -3
  313. /package/dist/{Offscreen → Breadcrumb}/index.js.map +0 -0
@@ -0,0 +1,87 @@
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { mount } from "@torpor/view";
5
+ import { describe, expect, it } from "vitest";
6
+ import MenuBarAccessibility from "./components/MenuBarAccessibility.torp";
7
+
8
+ describe("MenuBar", () => {
9
+ it("Accessibility", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, MenuBarAccessibility);
13
+
14
+ // Tests from https://www.w3.org/WAI/ARIA/apg/patterns/menu/
15
+ // NOTE: MenuBar is a menubar
16
+
17
+ // A menu is a container of items that represent choices. The element serving as the menu has
18
+ // a role of either menu or menubar
19
+ expect(queryByText(container, "Top level")?.parentElement?.parentElement).toHaveAttribute(
20
+ "role",
21
+ "menubar",
22
+ );
23
+
24
+ // The items contained in a menu are child elements of the containing menu or menubar and have
25
+ // any of the following roles:
26
+ // * menuitem
27
+ // * menuitemcheckbox
28
+ // * menuitemradio
29
+ expect(queryByText(container, "Top level")).toHaveAttribute("role", "menuitem");
30
+
31
+ // If activating a menuitem opens a submenu, the menuitem is known as a parent menuitem. A submenu's
32
+ // menu element is:
33
+ // * Contained inside the same menu element as its parent menuitem
34
+ // * Is the sibling element immediately following its parent menuitem
35
+
36
+ // A parent menuitem has aria-haspopup set to either menu or true
37
+ expect(queryByText(container, "Top level")).toHaveAttribute("aria-haspopup", "true");
38
+
39
+ // A parent menuitem has aria-expanded set to false when its child menu is not visible and set
40
+ // to true when the child menu is visible
41
+ expect(queryByText(container, "Top level")).toHaveAttribute("aria-expanded", "false");
42
+ await userEvent.click(getByText(container, "Top level"));
43
+ expect(queryByText(container, "Top level")).toHaveAttribute("aria-expanded", "true");
44
+
45
+ // One of the following approaches is used to enable scripts to move focus among items in a
46
+ // menu as described in Keyboard Navigation Inside Components:
47
+ // * The menu container has tabindex set to -1 or 0 and aria-activedescendant set to the ID
48
+ // of the focused item
49
+ // * Each item in the menu has tabindex set to -1, except in a menubar, where the first item
50
+ // has tabindex set to 0
51
+
52
+ // When a menuitemcheckbox or menuitemradio is checked, aria-checked is set to true
53
+ // NOTE: We don't (currently?) have checkboxes or radios in MenuBars
54
+
55
+ // When a menu item is disabled, aria-disabled is set to true
56
+ expect(queryByText(container, "Top level")).not.toHaveAttribute("aria-disabled");
57
+ expect(queryByText(container, "Disabled")).toHaveAttribute("aria-disabled", "true");
58
+
59
+ // Items in a menu may be divided into groups by placing an element with a role of separator
60
+ // between groups. For example, this technique should be used when a menu contains a set of
61
+ // menuitemradio items
62
+ expect(queryByText(container, "---")).toHaveAttribute("role", "separator");
63
+
64
+ // All separators should have aria-orientation consistent with the separator's orientation
65
+ // NOTE: What does this mean? None of the example separators have aria-orientation set
66
+
67
+ // If a menubar has a visible label, the element with role menubar has aria-labelledby set to
68
+ // a value that refers to the labelling element. Otherwise, the menubar element has a label
69
+ // provided by aria-label
70
+ // NOTE: We only support aria-label and it's required
71
+ expect(queryByText(container, "Top level")?.parentElement?.parentElement).toHaveAttribute(
72
+ "aria-label",
73
+ "Window menu",
74
+ );
75
+
76
+ // If a menubar is vertically oriented, it has aria-orientation set to vertical. The default
77
+ // value of aria-orientation for a menubar is horizontal
78
+ expect(queryByText(container, "Top level")?.parentElement?.parentElement).toHaveAttribute(
79
+ "aria-orientation",
80
+ "horizontal",
81
+ );
82
+ expect(queryByText(container, "Sub item 1")?.parentElement).toHaveAttribute(
83
+ "aria-orientation",
84
+ "vertical",
85
+ );
86
+ });
87
+ });
@@ -0,0 +1,22 @@
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { mount } from "@torpor/view";
5
+ import { describe, expect, it } from "vitest";
6
+ import MenuBarBasic from "./components/MenuBarBasic.torp";
7
+
8
+ describe("MenuBar", () => {
9
+ it("Basic operation", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, MenuBarBasic);
13
+
14
+ // The top level item should be displayed
15
+ expect(queryByText(container, "Top level")).toBeInTheDocument();
16
+ expect(queryByText(container, "Sub item 1")).not.toBeInTheDocument();
17
+
18
+ // Clicking the top level item should show the sub item
19
+ await userEvent.click(getByText(container, "Top level"));
20
+ expect(queryByText(container, "Sub item 1")).toBeInTheDocument();
21
+ });
22
+ });
@@ -0,0 +1,34 @@
1
+ import {
2
+ MenuBar,
3
+ MenuBarItem,
4
+ MenuBarItemTrigger,
5
+ MenuBarItemContent
6
+ } from "../../../src/MenuBar";
7
+ import { Menu, MenuButton, MenuSeparator } from "../../../src/Menu";
8
+
9
+ export default function MenuBarAccessibility() {
10
+ @render {
11
+ <MenuBar ariaLabel="Window menu">
12
+ <MenuBarItem>
13
+ <MenuBarItemTrigger>Top level</MenuBarItemTrigger>
14
+ <MenuBarItemContent>
15
+ <Menu ariaLabel="Sub window menu">
16
+ <MenuButton>Sub item 1</MenuButton>
17
+ <MenuButton>Sub item 2</MenuButton>
18
+ <MenuSeparator>---</MenuSeparator>
19
+ <MenuButton>Sub item 3</MenuButton>
20
+ </Menu>
21
+ </MenuBarItemContent>
22
+ </MenuBarItem>
23
+ <MenuBarItem>
24
+ <MenuBarItemTrigger disabled>Disabled</MenuBarItemTrigger>
25
+ <MenuBarItemContent>
26
+ <Menu ariaLabel="Disabled sub window menu">
27
+ <MenuButton>Disabled sub 1</MenuButton>
28
+ <MenuButton>Disabled sub 2</MenuButton>
29
+ </Menu>
30
+ </MenuBarItemContent>
31
+ </MenuBarItem>
32
+ </MenuBar>
33
+ }
34
+ }
@@ -0,0 +1,25 @@
1
+ import {
2
+ MenuBar,
3
+ MenuBarItem,
4
+ MenuBarItemTrigger,
5
+ MenuBarItemContent
6
+ } from "../../../src/MenuBar";
7
+ import { Menu, MenuButton, MenuSeparator } from "../../../src/Menu";
8
+
9
+ export default function MenuBarBasic() {
10
+ @render {
11
+ <MenuBar ariaLabel="Window menu">
12
+ <MenuBarItem>
13
+ <MenuBarItemTrigger>Top level</MenuBarItemTrigger>
14
+ <MenuBarItemContent>
15
+ <Menu ariaLabel="Sub window menu">
16
+ <MenuButton>Sub item 1</MenuButton>
17
+ <MenuButton>Sub item 2</MenuButton>
18
+ <MenuSeparator />
19
+ <MenuButton>Sub item 3</MenuButton>
20
+ </Menu>
21
+ </MenuBarItemContent>
22
+ </MenuBarItem>
23
+ </MenuBar>
24
+ }
25
+ }
@@ -3,7 +3,7 @@ import "@testing-library/jest-dom/vitest";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import { mount } from "@torpor/view";
5
5
  import { describe, expect, it } from "vitest";
6
- import NavMenu from "./components/NavMenu.torp";
6
+ import NavMenu from "./components/NavMenuBasic.torp";
7
7
 
8
8
  describe("NavMenu", () => {
9
9
  it("Basic operation", async () => {
@@ -7,7 +7,7 @@ import {
7
7
  NavMenuSeparator
8
8
  } from "../../../src/NavMenu";
9
9
 
10
- export default function NavMenu($props: any) {
10
+ export default function NavMenuBasic($props: any) {
11
11
  @render {
12
12
  <NavMenu ariaLabel="Site navigation">
13
13
  <NavMenuLink href="/">Home</NavMenuLink>
@@ -0,0 +1,21 @@
1
+ import { queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import { mount } from "@torpor/view";
4
+ import { describe, expect, it } from "vitest";
5
+ import NotificationAccessibility from "./components/NotificationAccessibility.torp";
6
+
7
+ describe("Notification", () => {
8
+ it("Accessibility", async () => {
9
+ const container = document.createElement("div");
10
+ document.body.appendChild(container);
11
+ mount(container, NotificationAccessibility);
12
+
13
+ // Tests from https://www.w3.org/WAI/ARIA/apg/patterns/alert/
14
+
15
+ // The widget has a role of alert
16
+ expect(queryByText(container, "Here's a notification")?.parentElement).toHaveAttribute(
17
+ "role",
18
+ "alert",
19
+ );
20
+ });
21
+ });
@@ -0,0 +1,14 @@
1
+ import {
2
+ Notification,
3
+ NotificationContent,
4
+ NotificationClose
5
+ } from "../../../src/Notification/index";
6
+
7
+ export default function CustomNotification() {
8
+ @render {
9
+ <Notification>
10
+ <NotificationContent>{$props.text}</NotificationContent>
11
+ <NotificationClose>Close me</NotificationClose>
12
+ </Notification>
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ import {
2
+ Notification,
3
+ NotificationContent,
4
+ NotificationClose
5
+ } from "../../../src/Notification/index";
6
+
7
+ export default function NotificationAccessibility() {
8
+ @render {
9
+ <Notification visible>
10
+ <NotificationContent>Here's a notification</NotificationContent>
11
+ <NotificationClose>Close me</NotificationClose>
12
+ </Notification>
13
+ }
14
+ }
@@ -0,0 +1,20 @@
1
+ import {
2
+ Notification,
3
+ NotificationContainer,
4
+ NotificationContent,
5
+ NotificationClose,
6
+ showNotification
7
+ } from "../../../src/Notification/index";
8
+ import CustomNotification from "./CustomNotification.torp";
9
+
10
+ export default function NotificationFunction() {
11
+ function show() {
12
+ showNotification(CustomNotification, { text: "Here's a notification" });
13
+ }
14
+
15
+ @render {
16
+ <button type="button" onclick={show}>Show a notification</button>
17
+
18
+ <NotificationContainer />
19
+ }
20
+ }
@@ -0,0 +1,22 @@
1
+ import {
2
+ Notification,
3
+ NotificationContent,
4
+ NotificationClose
5
+ } from "../../../src/Notification/index";
6
+
7
+ export default function NotificationVariable() {
8
+ let $state = $watch({
9
+ showNotification: false
10
+ });
11
+
12
+ @render {
13
+ <button type="button" onclick={(e) => ($state.showNotification = !$state.showNotification)}>
14
+ Show a notification
15
+ </button>
16
+
17
+ <Notification &visible={$state.showNotification}>
18
+ <NotificationContent>Here's a notification</NotificationContent>
19
+ <NotificationClose>Close me</NotificationClose>
20
+ </Notification>
21
+ }
22
+ }
@@ -0,0 +1,25 @@
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { mount } from "@torpor/view";
5
+ import { describe, expect, it } from "vitest";
6
+ import NotificationFunction from "./components/NotificationFunction.torp";
7
+
8
+ describe("Notification", () => {
9
+ it("Showing with a function", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, NotificationFunction);
13
+
14
+ // By default, the notification shouldn't be shown
15
+ expect(queryByText(container, "Here's a notification")).not.toBeInTheDocument();
16
+
17
+ // Clicking the button should show the notification
18
+ await userEvent.click(getByText(container, "Show a notification"));
19
+ expect(queryByText(container, "Here's a notification")).toBeInTheDocument();
20
+
21
+ // Clicking the close button should hide the notification
22
+ await userEvent.click(getByText(container, "Close me"));
23
+ expect(queryByText(container, "Here's a notification")).not.toBeInTheDocument();
24
+ });
25
+ });
@@ -0,0 +1,25 @@
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { mount } from "@torpor/view";
5
+ import { describe, expect, it } from "vitest";
6
+ import NotificationVariable from "./components/NotificationVariable.torp";
7
+
8
+ describe("Notification", () => {
9
+ it("Showing with a variable", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, NotificationVariable);
13
+
14
+ // By default, the notification shouldn't be shown
15
+ expect(queryByText(container, "Here's a notification")).not.toBeInTheDocument();
16
+
17
+ // Clicking the button should show the notification
18
+ await userEvent.click(getByText(container, "Show a notification"));
19
+ expect(queryByText(container, "Here's a notification")).toBeInTheDocument();
20
+
21
+ // Clicking the close button should hide the notification
22
+ await userEvent.click(getByText(container, "Close me"));
23
+ expect(queryByText(container, "Here's a notification")).not.toBeInTheDocument();
24
+ });
25
+ });
@@ -0,0 +1,25 @@
1
+ import { Popover, PopoverContent } from "../../../src/Popover/index";
2
+ import {
3
+ Dialog,
4
+ DialogBody,
5
+ DialogFooter,
6
+ DialogButton
7
+ } from "../../../src/Dialog/index";
8
+
9
+ export default function CustomDialog() {
10
+ @render {
11
+ <Popover visible {$props.callback}>
12
+ <PopoverContent>
13
+ <Dialog>
14
+ <DialogBody>
15
+ <p>Which color do you prefer?</p>
16
+ </DialogBody>
17
+ <DialogFooter>
18
+ <DialogButton value="blue">Blue</DialogButton>
19
+ <DialogButton value="red">Red</DialogButton>
20
+ </DialogFooter>
21
+ </Dialog>
22
+ </PopoverContent>
23
+ </Popover>
24
+ }
25
+ }
@@ -0,0 +1,19 @@
1
+ import { showPopover } from "../../../src/Popover/index";
2
+ import CustomDialog from "./CustomDialog.torp";
3
+
4
+ export default function PromptFunction() {
5
+ let anchor;
6
+ let $state = $watch({ color: "" });
7
+
8
+ async function show() {
9
+ showPopover(CustomDialog, anchor, { callback: (x) => $state.color = x });
10
+ }
11
+
12
+ @render {
13
+ <button type="button" &ref={anchor} onclick={show}>Show the prompt</button>
14
+
15
+ @if ($state.color) {
16
+ <p>Your favorite color is {$state.color}?!</p>
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,38 @@
1
+ import { Popover, PopoverContent } from "../../../src/Popover/index";
2
+ import {
3
+ Dialog,
4
+ DialogBody,
5
+ DialogFooter,
6
+ DialogButton
7
+ } from "../../../src/Dialog/index";
8
+
9
+ export default function PromptVariable() {
10
+ let $state = $watch({
11
+ color: "",
12
+ showPopover: false
13
+ });
14
+
15
+ @render {
16
+ <button type="button" onclick={(e) => ($state.showPopover = !$state.showPopover)}>
17
+ Show the prompt
18
+ </button>
19
+
20
+ @if ($state.color) {
21
+ <p>Your favorite color is {$state.color}?!</p>
22
+ }
23
+
24
+ <Popover &visible={$state.showPopover}>
25
+ <PopoverContent>
26
+ <Dialog>
27
+ <DialogBody>
28
+ <p>Which color do you prefer?</p>
29
+ </DialogBody>
30
+ <DialogFooter>
31
+ <DialogButton value="blue" onclick={() => ($state.color = "blue")}>Blue</DialogButton>
32
+ <DialogButton value="red" onclick={() => ($state.color = "red")}>Red</DialogButton>
33
+ </DialogFooter>
34
+ </Dialog>
35
+ </PopoverContent>
36
+ </Popover>
37
+ }
38
+ }
@@ -0,0 +1,26 @@
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { mount } from "@torpor/view";
5
+ import { describe, expect, it } from "vitest";
6
+ import PromptFunction from "./components/PromptFunction.torp";
7
+
8
+ describe("Prompt", () => {
9
+ it("Showing with a function", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, PromptFunction);
13
+
14
+ // By default, the prompt shouldn't be shown
15
+ expect(queryByText(container, "Which color do you prefer?")).not.toBeInTheDocument();
16
+
17
+ // Clicking the button should show the prompt
18
+ await userEvent.click(getByText(container, "Show the prompt"));
19
+ expect(queryByText(container, "Which color do you prefer?")).toBeInTheDocument();
20
+
21
+ // Clicking the blue button should hide the prompt and set the value
22
+ await userEvent.click(getByText(container, "Blue"));
23
+ expect(queryByText(container, "Which color do you prefer?")).not.toBeInTheDocument();
24
+ expect(queryByText(container, "Your favorite color is blue?!")).toBeInTheDocument();
25
+ });
26
+ });
@@ -0,0 +1,27 @@
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { mount } from "@torpor/view";
5
+ import { describe, expect, it } from "vitest";
6
+ import PromptVariable from "./components/PromptVariable.torp";
7
+
8
+ describe("Prompt", () => {
9
+ it("Showing with a variable", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, PromptVariable);
13
+
14
+ // By default, the prompt shouldn't be shown
15
+ expect(queryByText(container, "Which color do you prefer?")).not.toBeInTheDocument();
16
+ expect(queryByText(container, "Your favorite color is blue?!")).not.toBeInTheDocument();
17
+
18
+ // Clicking the button should show the prompt
19
+ await userEvent.click(getByText(container, "Show the prompt"));
20
+ expect(queryByText(container, "Which color do you prefer?")).toBeInTheDocument();
21
+
22
+ // Clicking the blue button should hide the prompt and set the value
23
+ await userEvent.click(getByText(container, "Blue"));
24
+ expect(queryByText(container, "Which color do you prefer?")).not.toBeInTheDocument();
25
+ expect(queryByText(container, "Your favorite color is blue?!")).toBeInTheDocument();
26
+ });
27
+ });
@@ -7,6 +7,8 @@ import {
7
7
  } from "../../../src/TabGroup/index";
8
8
 
9
9
  export default function TabGroupAccessibility() {
10
+ $props ??= $watch({});
11
+
10
12
  @render {
11
13
  <TabGroup value={$props.value}>
12
14
  <TabList ariaLabel="Example tabs">
@@ -7,6 +7,8 @@ import {
7
7
  } from "../../../src/TabGroup/index";
8
8
 
9
9
  export default function TabGroupKeyboard() {
10
+ $props ??= $watch({});
11
+
10
12
  @render {
11
13
  <TabGroup value={$props.value}>
12
14
  <TabList>
@@ -7,6 +7,8 @@ import {
7
7
  } from "../../../src/TabGroup/index";
8
8
 
9
9
  export default function TabGroupList() {
10
+ $props ??= $watch({});
11
+
10
12
  @render {
11
13
  <TabGroup value={$props.value}>
12
14
  <TabList>
@@ -7,6 +7,8 @@ import {
7
7
  } from "../../../src/TabGroup/index";
8
8
 
9
9
  export default function TabGroupTrigger() {
10
+ $props ??= $watch({});
11
+
10
12
  @render {
11
13
  <TabGroup value={$props.value}>
12
14
  <TabList>
package/tsup.config.ts CHANGED
@@ -8,15 +8,23 @@ type Config =
8
8
  export default defineConfig({
9
9
  entry: [
10
10
  "src/Accordion/index.ts",
11
+ "src/Breadcrumb/index.ts",
12
+ "src/Calendar/index.ts",
11
13
  "src/Dialog/index.ts",
14
+ "src/Disclosure/index.ts",
15
+ "src/Drawer/index.ts",
16
+ "src/Form/index.ts",
17
+ "src/Menu/index.ts",
18
+ "src/MenuBar/index.ts",
12
19
  "src/NavMenu/index.ts",
13
- "src/Offscreen/index.ts",
20
+ "src/Notification/index.ts",
14
21
  "src/Popover/index.ts",
15
22
  "src/TabGroup/index.ts",
16
- "src/motion.ts",
23
+ "src/icons/index.ts",
24
+ "src/motion/index.ts",
17
25
  ],
18
- format: ["esm", "cjs"],
19
- dts: { entry: ["src/motion.ts"] },
26
+ format: "esm",
27
+ dts: { entry: ["src/motion/index.ts"] },
20
28
  clean: true,
21
29
  metafile: true,
22
30
  sourcemap: true,
@@ -1,53 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/Accordion/index.ts
21
- var Accordion_exports = {};
22
- __export(Accordion_exports, {
23
- Accordion: () => Accordion_default,
24
- AccordionContent: () => AccordionContent_default,
25
- AccordionHeader: () => AccordionHeader_default,
26
- AccordionItem: () => AccordionItem_default,
27
- AccordionTrigger: () => AccordionTrigger_default
28
- });
29
- module.exports = __toCommonJS(Accordion_exports);
30
-
31
- // src/Accordion/Accordion.torp
32
- import Accordion_default from "./Accordion.torp";
33
-
34
- // src/Accordion/AccordionContent.torp
35
- import AccordionContent_default from "./AccordionContent.torp";
36
-
37
- // src/Accordion/AccordionHeader.torp
38
- import AccordionHeader_default from "./AccordionHeader.torp";
39
-
40
- // src/Accordion/AccordionItem.torp
41
- import AccordionItem_default from "./AccordionItem.torp";
42
-
43
- // src/Accordion/AccordionTrigger.torp
44
- import AccordionTrigger_default from "./AccordionTrigger.torp";
45
- // Annotate the CommonJS export names for ESM import in node:
46
- 0 && (module.exports = {
47
- Accordion,
48
- AccordionContent,
49
- AccordionHeader,
50
- AccordionItem,
51
- AccordionTrigger
52
- });
53
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/Accordion/index.ts"],"sourcesContent":["import Accordion from \"./Accordion.torp\";\nimport AccordionContent from \"./AccordionContent.torp\";\nimport AccordionHeader from \"./AccordionHeader.torp\";\nimport AccordionItem from \"./AccordionItem.torp\";\nimport AccordionTrigger from \"./AccordionTrigger.torp\";\n\nexport { Accordion, AccordionItem, AccordionHeader, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A","names":[]}