@torpor/ui 0.2.0 → 0.3.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 (312) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/Accordion/Accordion.torp +44 -25
  3. package/dist/Accordion/AccordionContent.torp +18 -12
  4. package/dist/Accordion/AccordionHeader.torp +15 -8
  5. package/dist/Accordion/AccordionItem.torp +34 -17
  6. package/dist/Accordion/AccordionTrigger.torp +17 -10
  7. package/dist/Accordion/AccordionTypes.ts +6 -3
  8. package/dist/Accordion/index.d.ts +100 -35
  9. package/dist/Breadcrumb/Breadcrumb.torp +18 -10
  10. package/dist/Breadcrumb/BreadcrumbItem.torp +14 -7
  11. package/dist/Breadcrumb/BreadcrumbSeparator.torp +10 -3
  12. package/dist/Breadcrumb/index.d.ts +50 -21
  13. package/dist/Calendar/Calendar.torp +21 -14
  14. package/dist/Calendar/CalendarDay.torp +12 -4
  15. package/dist/Calendar/index.d.ts +16 -18
  16. package/dist/Contextual/Contextual.torp +125 -0
  17. package/dist/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +21 -12
  18. package/dist/Contextual/ContextualTrigger.torp +66 -0
  19. package/dist/Contextual/ContextualTypes.ts +30 -0
  20. package/dist/Contextual/index.d.ts +90 -0
  21. package/dist/Contextual/index.js +14 -0
  22. package/dist/Contextual/index.js.map +1 -0
  23. package/dist/Dialog/Dialog.torp +49 -73
  24. package/dist/Dialog/DialogBody.torp +15 -9
  25. package/dist/Dialog/DialogButton.torp +27 -13
  26. package/dist/Dialog/DialogFooter.torp +11 -3
  27. package/dist/Dialog/DialogHeader.torp +15 -8
  28. package/dist/Dialog/DialogTypes.ts +3 -2
  29. package/dist/Dialog/index.d.ts +83 -35
  30. package/dist/Disclosure/Disclosure.torp +34 -25
  31. package/dist/Disclosure/DisclosureContent.torp +18 -12
  32. package/dist/Disclosure/DisclosureHeader.torp +16 -9
  33. package/dist/Disclosure/DisclosureTrigger.torp +15 -8
  34. package/dist/Disclosure/DisclosureTypes.ts +0 -1
  35. package/dist/Disclosure/index.d.ts +67 -28
  36. package/dist/Drawer/Drawer.torp +109 -68
  37. package/dist/Drawer/DrawerContent.torp +80 -0
  38. package/dist/Drawer/DrawerOverlay.torp +38 -0
  39. package/dist/Drawer/DrawerTrigger.torp +35 -0
  40. package/dist/Drawer/DrawerTypes.ts +24 -0
  41. package/dist/Drawer/index.d.ts +96 -8
  42. package/dist/Drawer/index.js +13 -1
  43. package/dist/Form/Field.torp +91 -0
  44. package/dist/Form/Form.torp +129 -0
  45. package/dist/Form/FormTypes.ts +30 -0
  46. package/dist/Form/Input.torp +97 -0
  47. package/dist/Form/Label.torp +31 -0
  48. package/dist/Form/Message.torp +35 -0
  49. package/dist/Form/StandardSchemaV1.ts +70 -0
  50. package/dist/Form/index.d.ts +131 -0
  51. package/dist/Form/index.js +22 -0
  52. package/dist/Form/index.js.map +1 -0
  53. package/dist/Menu/Menu.torp +25 -15
  54. package/dist/Menu/MenuButton.torp +30 -13
  55. package/dist/Menu/MenuCheck.torp +29 -14
  56. package/dist/Menu/MenuGroup.torp +14 -6
  57. package/dist/Menu/MenuIndicator.torp +14 -7
  58. package/dist/Menu/MenuPopout.torp +23 -15
  59. package/dist/Menu/MenuPopoutContent.torp +17 -10
  60. package/dist/Menu/MenuPopoutTrigger.torp +23 -16
  61. package/dist/Menu/MenuRadio.torp +27 -16
  62. package/dist/Menu/MenuRadioGroup.torp +34 -15
  63. package/dist/Menu/MenuSeparator.torp +11 -3
  64. package/dist/Menu/MenuTypes.ts +7 -5
  65. package/dist/Menu/index.d.ts +176 -77
  66. package/dist/MenuBar/MenuBar.torp +24 -16
  67. package/dist/MenuBar/MenuBarItem.torp +24 -16
  68. package/dist/MenuBar/MenuBarItemContent.torp +18 -11
  69. package/dist/MenuBar/MenuBarItemTrigger.torp +15 -9
  70. package/dist/MenuBar/index.d.ts +79 -28
  71. package/dist/Modal/Modal.torp +118 -0
  72. package/dist/Modal/ModalContent.torp +77 -0
  73. package/dist/Modal/ModalOverlay.torp +38 -0
  74. package/dist/Modal/ModalTrigger.torp +50 -0
  75. package/dist/Modal/ModalTypes.ts +22 -0
  76. package/dist/Modal/index.d.ts +108 -0
  77. package/dist/Modal/index.js +33 -0
  78. package/dist/Modal/index.js.map +1 -0
  79. package/dist/Modal/showModal.ts +19 -0
  80. package/dist/Modal/showPrompt.ts +23 -0
  81. package/dist/NavMenu/NavMenu.torp +18 -10
  82. package/dist/NavMenu/NavMenuButton.torp +15 -10
  83. package/dist/NavMenu/NavMenuElement.torp +19 -11
  84. package/dist/NavMenu/NavMenuGroup.torp +13 -6
  85. package/dist/NavMenu/NavMenuGroupHeader.torp +15 -8
  86. package/dist/NavMenu/NavMenuLink.torp +21 -16
  87. package/dist/NavMenu/NavMenuPopout.torp +34 -18
  88. package/dist/NavMenu/NavMenuPopoutButton.torp +23 -18
  89. package/dist/NavMenu/NavMenuPopoutContent.torp +23 -13
  90. package/dist/NavMenu/NavMenuSeparator.torp +10 -3
  91. package/dist/NavMenu/index.d.ts +153 -70
  92. package/dist/Notification/Notification.torp +35 -16
  93. package/dist/Notification/NotificationClose.torp +10 -3
  94. package/dist/Notification/NotificationContainer.torp +11 -3
  95. package/dist/Notification/NotificationContent.torp +11 -3
  96. package/dist/Notification/index.d.ts +46 -28
  97. package/dist/Popover/Popover.torp +48 -28
  98. package/dist/Popover/PopoverContent.torp +42 -8
  99. package/dist/Popover/PopoverTrigger.torp +32 -3
  100. package/dist/Popover/PopoverTypes.ts +1 -1
  101. package/dist/Popover/index.d.ts +48 -111
  102. package/dist/Popover/index.js +1 -163
  103. package/dist/Popover/index.js.map +1 -1
  104. package/dist/TabGroup/TabContent.torp +20 -11
  105. package/dist/TabGroup/TabGroup.torp +58 -40
  106. package/dist/TabGroup/TabGroupTypes.ts +10 -5
  107. package/dist/TabGroup/TabHeader.torp +26 -10
  108. package/dist/TabGroup/TabList.torp +14 -7
  109. package/dist/TabGroup/TabTrigger.torp +17 -10
  110. package/dist/TabGroup/index.d.ts +101 -35
  111. package/dist/icons/ArrowDown.torp +5 -3
  112. package/dist/icons/ArrowLeft.torp +5 -3
  113. package/dist/icons/ArrowRight.torp +5 -3
  114. package/dist/icons/ArrowUp.torp +5 -3
  115. package/dist/icons/Bars.torp +5 -3
  116. package/dist/icons/Check.torp +5 -3
  117. package/dist/icons/ChevronDown.torp +5 -3
  118. package/dist/icons/ChevronLeft.torp +5 -3
  119. package/dist/icons/ChevronRight.torp +5 -3
  120. package/dist/icons/ChevronUp.torp +5 -3
  121. package/dist/icons/Cross.torp +5 -3
  122. package/dist/icons/IconTypes.ts +6 -0
  123. package/dist/icons/Loading.torp +5 -3
  124. package/dist/icons/Minus.torp +5 -3
  125. package/dist/icons/Plus.torp +5 -3
  126. package/dist/icons/index.d.ts +271 -126
  127. package/dist/index.d.ts +17 -4
  128. package/dist/metafile-esm.json +1 -1
  129. package/dist/motion/fade.ts +15 -6
  130. package/dist/motion/grow.ts +23 -0
  131. package/dist/motion/index.d.ts +19 -2
  132. package/dist/motion/index.js +93 -3
  133. package/dist/motion/index.js.map +1 -1
  134. package/dist/motion/measure.ts +28 -0
  135. package/dist/motion/slide.ts +45 -0
  136. package/dist/mount/clickPopover.ts +51 -0
  137. package/dist/mount/contextPopover.ts +51 -0
  138. package/dist/mount/hoverPopover.ts +58 -0
  139. package/package.json +28 -12
  140. package/scripts/postbuild.ts +11 -1
  141. package/src/Accordion/Accordion.torp +44 -25
  142. package/src/Accordion/AccordionContent.torp +18 -12
  143. package/src/Accordion/AccordionHeader.torp +15 -8
  144. package/src/Accordion/AccordionItem.torp +34 -17
  145. package/src/Accordion/AccordionTrigger.torp +17 -10
  146. package/src/Accordion/AccordionTypes.ts +6 -3
  147. package/src/Breadcrumb/Breadcrumb.torp +18 -10
  148. package/src/Breadcrumb/BreadcrumbItem.torp +14 -7
  149. package/src/Breadcrumb/BreadcrumbSeparator.torp +10 -3
  150. package/src/Calendar/Calendar.torp +21 -14
  151. package/src/Calendar/CalendarDay.torp +12 -4
  152. package/src/Contextual/Contextual.torp +125 -0
  153. package/src/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +21 -12
  154. package/src/Contextual/ContextualTrigger.torp +66 -0
  155. package/src/Contextual/ContextualTypes.ts +30 -0
  156. package/src/Contextual/index.ts +5 -0
  157. package/src/Dialog/Dialog.torp +49 -73
  158. package/src/Dialog/DialogBody.torp +15 -9
  159. package/src/Dialog/DialogButton.torp +27 -13
  160. package/src/Dialog/DialogFooter.torp +11 -3
  161. package/src/Dialog/DialogHeader.torp +15 -8
  162. package/src/Dialog/DialogTypes.ts +3 -2
  163. package/src/Disclosure/Disclosure.torp +34 -25
  164. package/src/Disclosure/DisclosureContent.torp +18 -12
  165. package/src/Disclosure/DisclosureHeader.torp +16 -9
  166. package/src/Disclosure/DisclosureTrigger.torp +15 -8
  167. package/src/Disclosure/DisclosureTypes.ts +0 -1
  168. package/src/Drawer/Drawer.torp +109 -68
  169. package/src/Drawer/DrawerContent.torp +80 -0
  170. package/src/Drawer/DrawerOverlay.torp +38 -0
  171. package/src/Drawer/DrawerTrigger.torp +35 -0
  172. package/src/Drawer/DrawerTypes.ts +24 -0
  173. package/src/Drawer/index.ts +4 -1
  174. package/src/Form/Field.torp +91 -0
  175. package/src/Form/Form.torp +129 -0
  176. package/src/Form/FormTypes.ts +30 -0
  177. package/src/Form/Input.torp +97 -0
  178. package/src/Form/Label.torp +31 -0
  179. package/src/Form/Message.torp +35 -0
  180. package/src/Form/StandardSchemaV1.ts +70 -0
  181. package/src/Form/index.ts +7 -0
  182. package/src/Menu/Menu.torp +25 -15
  183. package/src/Menu/MenuButton.torp +30 -13
  184. package/src/Menu/MenuCheck.torp +29 -14
  185. package/src/Menu/MenuGroup.torp +14 -6
  186. package/src/Menu/MenuIndicator.torp +14 -7
  187. package/src/Menu/MenuPopout.torp +23 -15
  188. package/src/Menu/MenuPopoutContent.torp +17 -10
  189. package/src/Menu/MenuPopoutTrigger.torp +23 -16
  190. package/src/Menu/MenuRadio.torp +27 -16
  191. package/src/Menu/MenuRadioGroup.torp +34 -15
  192. package/src/Menu/MenuSeparator.torp +11 -3
  193. package/src/Menu/MenuTypes.ts +7 -5
  194. package/src/MenuBar/MenuBar.torp +24 -16
  195. package/src/MenuBar/MenuBarItem.torp +24 -16
  196. package/src/MenuBar/MenuBarItemContent.torp +18 -11
  197. package/src/MenuBar/MenuBarItemTrigger.torp +15 -9
  198. package/src/Modal/Modal.torp +118 -0
  199. package/src/Modal/ModalContent.torp +77 -0
  200. package/src/Modal/ModalOverlay.torp +38 -0
  201. package/src/Modal/ModalTrigger.torp +50 -0
  202. package/src/Modal/ModalTypes.ts +22 -0
  203. package/src/Modal/index.ts +10 -0
  204. package/src/Modal/showModal.ts +19 -0
  205. package/src/Modal/showPrompt.ts +23 -0
  206. package/src/NavMenu/NavMenu.torp +18 -10
  207. package/src/NavMenu/NavMenuButton.torp +15 -10
  208. package/src/NavMenu/NavMenuElement.torp +19 -11
  209. package/src/NavMenu/NavMenuGroup.torp +13 -6
  210. package/src/NavMenu/NavMenuGroupHeader.torp +15 -8
  211. package/src/NavMenu/NavMenuLink.torp +21 -16
  212. package/src/NavMenu/NavMenuPopout.torp +34 -18
  213. package/src/NavMenu/NavMenuPopoutButton.torp +23 -18
  214. package/src/NavMenu/NavMenuPopoutContent.torp +23 -13
  215. package/src/NavMenu/NavMenuSeparator.torp +10 -3
  216. package/src/Notification/Notification.torp +35 -16
  217. package/src/Notification/NotificationClose.torp +10 -3
  218. package/src/Notification/NotificationContainer.torp +11 -3
  219. package/src/Notification/NotificationContent.torp +11 -3
  220. package/src/Popover/Popover.torp +48 -28
  221. package/src/Popover/PopoverContent.torp +42 -8
  222. package/src/Popover/PopoverTrigger.torp +32 -3
  223. package/src/Popover/PopoverTypes.ts +1 -1
  224. package/src/Popover/index.ts +1 -24
  225. package/src/Slider/Slider.torp +3 -3
  226. package/src/TabGroup/TabContent.torp +20 -11
  227. package/src/TabGroup/TabGroup.torp +58 -40
  228. package/src/TabGroup/TabGroupTypes.ts +10 -5
  229. package/src/TabGroup/TabHeader.torp +26 -10
  230. package/src/TabGroup/TabList.torp +14 -7
  231. package/src/TabGroup/TabTrigger.torp +17 -10
  232. package/src/icons/ArrowDown.torp +5 -3
  233. package/src/icons/ArrowLeft.torp +5 -3
  234. package/src/icons/ArrowRight.torp +5 -3
  235. package/src/icons/ArrowUp.torp +5 -3
  236. package/src/icons/Bars.torp +5 -3
  237. package/src/icons/Check.torp +5 -3
  238. package/src/icons/ChevronDown.torp +5 -3
  239. package/src/icons/ChevronLeft.torp +5 -3
  240. package/src/icons/ChevronRight.torp +5 -3
  241. package/src/icons/ChevronUp.torp +5 -3
  242. package/src/icons/Cross.torp +5 -3
  243. package/src/icons/IconTypes.ts +6 -0
  244. package/src/icons/Loading.torp +5 -3
  245. package/src/icons/Minus.torp +5 -3
  246. package/src/icons/Plus.torp +5 -3
  247. package/src/motion/fade.ts +15 -6
  248. package/src/motion/grow.ts +23 -0
  249. package/src/motion/index.ts +4 -1
  250. package/src/motion/measure.ts +28 -0
  251. package/src/motion/slide.ts +45 -0
  252. package/src/mount/clickPopover.ts +51 -0
  253. package/src/mount/contextPopover.ts +51 -0
  254. package/src/mount/hoverPopover.ts +58 -0
  255. package/test/Accordion/components/AccordionAccessibility.torp +1 -1
  256. package/test/Accordion/components/AccordionKeyboard.torp +1 -1
  257. package/test/Accordion/components/AccordionList.torp +1 -1
  258. package/test/Accordion/components/AccordionMultiple.torp +2 -2
  259. package/test/Accordion/components/AccordionSingle.torp +2 -2
  260. package/test/Dialog/accessibility-modal.test.ts +2 -2
  261. package/test/Dialog/components/DialogAccessibility.torp +8 -14
  262. package/test/Dialog/components/DialogFunction.torp +20 -4
  263. package/test/Dialog/components/DialogModal.torp +30 -0
  264. package/test/Dialog/components/DialogVariable.torp +7 -7
  265. package/test/Disclosure/accessibility.test.ts +3 -2
  266. package/test/Disclosure/components/DisclosureTest.torp +1 -1
  267. package/test/Disclosure/toggle.test.ts +3 -2
  268. package/test/Form/components/FieldTest.torp +25 -0
  269. package/test/Form/components/FormTest.torp +31 -0
  270. package/test/Form/components/InputTest.torp +9 -0
  271. package/test/Form/field.test.ts +34 -0
  272. package/test/Form/form.test.ts +34 -0
  273. package/test/Form/input.test.ts +19 -0
  274. package/test/Menu/accessibility.test.ts +3 -2
  275. package/test/Menu/basic.test.ts +11 -10
  276. package/test/Menu/components/MenuAccessibility.torp +5 -5
  277. package/test/Menu/components/MenuBasic.torp +5 -5
  278. package/test/MenuBar/accessibility.test.ts +3 -2
  279. package/test/MenuBar/basic.test.ts +3 -2
  280. package/test/NavMenu/basic.test.ts +1 -1
  281. package/test/NavMenu/components/{NavMenu.torp → NavMenuBasic.torp} +1 -1
  282. package/test/Notification/components/NotificationFunction.torp +0 -3
  283. package/test/Notification/components/NotificationVariable.torp +1 -1
  284. package/test/Popover/components/PopoverFunction.torp +37 -0
  285. package/test/Popover/components/PopoverTrigger.torp +36 -0
  286. package/test/Popover/components/{PromptVariable.torp → PopoverVariable.torp} +5 -3
  287. package/test/Popover/function.test.ts +2 -7
  288. package/test/Popover/trigger.test.ts +27 -0
  289. package/test/Popover/variable.test.ts +2 -2
  290. package/test/TabGroup/components/TabGroupAccessibility.torp +1 -1
  291. package/test/TabGroup/components/TabGroupKeyboard.torp +1 -1
  292. package/test/TabGroup/components/TabGroupList.torp +1 -1
  293. package/test/TabGroup/components/TabGroupTrigger.torp +1 -1
  294. package/tsup.config.ts +3 -1
  295. package/dist/Popover/PopoverContentAnchored.torp +0 -106
  296. package/dist/Popover/PopoverOverlay.torp +0 -30
  297. package/dist/Popover/PopoverTriggerContextual.torp +0 -37
  298. package/dist/Popover/PopoverTriggerHover.torp +0 -38
  299. package/dist/Popover/mountClickPopover.ts +0 -50
  300. package/dist/Popover/mountContextPopover.ts +0 -50
  301. package/dist/Popover/mountHoverPopover.ts +0 -57
  302. package/dist/Popover/showPopoverPrompt.ts +0 -23
  303. package/src/Popover/PopoverContentAnchored.torp +0 -106
  304. package/src/Popover/PopoverOverlay.torp +0 -30
  305. package/src/Popover/PopoverTriggerContextual.torp +0 -37
  306. package/src/Popover/PopoverTriggerHover.torp +0 -38
  307. package/src/Popover/mountClickPopover.ts +0 -50
  308. package/src/Popover/mountContextPopover.ts +0 -50
  309. package/src/Popover/mountHoverPopover.ts +0 -57
  310. package/src/Popover/showPopoverPrompt.ts +0 -23
  311. package/test/Dialog/components/CustomDialog.torp +0 -20
  312. package/test/Popover/components/PromptFunction.torp +0 -19
@@ -0,0 +1,34 @@
1
+ import {
2
+ fireEvent,
3
+ getByPlaceholderText,
4
+ queryByPlaceholderText,
5
+ queryByText,
6
+ } from "@testing-library/dom";
7
+ import "@testing-library/jest-dom/vitest";
8
+ import userEvent from "@testing-library/user-event";
9
+ import { mount } from "@torpor/view";
10
+ import { expect, test } from "vitest";
11
+ import Field from "./components/FieldTest.torp";
12
+
13
+ test("Field", async () => {
14
+ const container = document.createElement("div");
15
+ document.body.appendChild(container);
16
+ mount(container, Field);
17
+
18
+ // Label, input, message
19
+ expect(queryByText(container, "Name:")).not.toBeNull();
20
+ expect(queryByPlaceholderText(container, "Name...")).not.toBeNull();
21
+ expect(queryByText(container, "Name is required!")).toBeNull();
22
+
23
+ // Label `for` should be automatically hooked up
24
+ expect(queryByPlaceholderText(container, "Name...")).toHaveAttribute("id", "name-id");
25
+ expect(queryByText(container, "Name:")).toHaveAttribute("for", "name-id");
26
+
27
+ // Validation should be fired on blur
28
+ fireEvent.blur(queryByPlaceholderText(container, "Name...")!);
29
+ expect(queryByText(container, "Name is required!")).not.toBeNull();
30
+
31
+ // After blur, validation should fire on input
32
+ await userEvent.type(getByPlaceholderText(container, "Name..."), "G");
33
+ expect(queryByText(container, "Name is required!")).toBeNull();
34
+ });
@@ -0,0 +1,34 @@
1
+ import {
2
+ getByPlaceholderText,
3
+ getByText,
4
+ queryByPlaceholderText,
5
+ queryByText,
6
+ } from "@testing-library/dom";
7
+ import "@testing-library/jest-dom/vitest";
8
+ import userEvent from "@testing-library/user-event";
9
+ import { mount } from "@torpor/view";
10
+ import { expect, test } from "vitest";
11
+ import Form from "./components/FormTest.torp";
12
+
13
+ test("Form", async () => {
14
+ const container = document.createElement("div");
15
+ document.body.appendChild(container);
16
+ mount(container, Form);
17
+
18
+ // Label, input, message
19
+ expect(queryByText(container, "Name:")).not.toBeNull();
20
+ expect(queryByPlaceholderText(container, "Name...")).not.toBeNull();
21
+ expect(queryByText(container, "Name is required!")).toBeNull();
22
+
23
+ // Label `for` should be automatically hooked up
24
+ expect(queryByPlaceholderText(container, "Name...")).toHaveAttribute("id", "name-id");
25
+ expect(queryByText(container, "Name:")).toHaveAttribute("for", "name-id");
26
+
27
+ // Validation should be fired on submit
28
+ await userEvent.click(getByText(container, "Submit"));
29
+ expect(queryByText(container, "Name is required!")).not.toBeNull();
30
+
31
+ // After submitting, validation should fire on input
32
+ await userEvent.type(getByPlaceholderText(container, "Name..."), "G");
33
+ expect(queryByText(container, "Name is required!")).toBeNull();
34
+ });
@@ -0,0 +1,19 @@
1
+ import { getByPlaceholderText, queryByPlaceholderText } 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 { expect, test } from "vitest";
6
+ import Input from "./components/InputTest.torp";
7
+
8
+ test("Input", async () => {
9
+ let props = { value: "" };
10
+
11
+ const container = document.createElement("div");
12
+ document.body.appendChild(container);
13
+ mount(container, Input, props);
14
+
15
+ expect(queryByPlaceholderText(container, "Name...")).not.toBeNull();
16
+
17
+ await userEvent.type(getByPlaceholderText(container, "Name..."), "Greg");
18
+ expect(props.value).toBe("Greg");
19
+ });
@@ -1,5 +1,6 @@
1
- import { fireEvent, getByText, queryByText } from "@testing-library/dom";
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
2
  import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
3
4
  import { mount } from "@torpor/view";
4
5
  import { describe, expect, it } from "vitest";
5
6
  import MenuAccessibility from "./components/MenuAccessibility.torp";
@@ -35,7 +36,7 @@ describe("Menu", () => {
35
36
  // A parent menuitem has aria-expanded set to false when its child menu is not visible and set
36
37
  // to true when the child menu is visible
37
38
  expect(queryByText(container, "Check popout button")).toHaveAttribute("aria-expanded", "false");
38
- fireEvent.click(getByText(container, "Check popout button"));
39
+ await userEvent.click(getByText(container, "Check popout button"));
39
40
  expect(queryByText(container, "Check popout button")).toHaveAttribute("aria-expanded", "true");
40
41
 
41
42
  // One of the following approaches is used to enable scripts to move focus among items in a
@@ -1,5 +1,6 @@
1
- import { fireEvent, getByText, queryByText } from "@testing-library/dom";
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
2
  import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
3
4
  import { mount } from "@torpor/view";
4
5
  import { describe, expect, it } from "vitest";
5
6
  import MenuBasic from "./components/MenuBasic.torp";
@@ -20,37 +21,37 @@ describe("Menu", () => {
20
21
  expect(queryByText(container, "Radio 1")).not.toBeInTheDocument();
21
22
 
22
23
  // Clicking a popout button should show the appropriate menu
23
- fireEvent.click(getByText(container, "Check popout button"));
24
+ await userEvent.click(getByText(container, "Check popout button"));
24
25
  expect(queryByText(container, "Checked 1")).toBeInTheDocument();
25
26
  expect(queryByText(container, "Radio 1")).not.toBeInTheDocument();
26
27
 
27
28
  // Clicking another popout button should show that menu instead
28
- fireEvent.click(getByText(container, "Radio popout button"));
29
+ await userEvent.click(getByText(container, "Radio popout button"));
29
30
  //expect(queryByText(container, 'Checked 1')).not.toBeInTheDocument();
30
31
  expect(queryByText(container, "Radio 1")).toBeInTheDocument();
31
32
 
32
33
  // Checking a box should show or hide the indicator
33
- fireEvent.click(getByText(container, "Check popout button"));
34
+ await userEvent.click(getByText(container, "Check popout button"));
34
35
  expect(queryByText(container, "Tick 1")).not.toBeInTheDocument();
35
36
  expect(queryByText(container, "Tick 2")).not.toBeInTheDocument();
36
- fireEvent.click(getByText(container, "Checked 1"));
37
+ await userEvent.click(getByText(container, "Checked 1"));
37
38
  expect(queryByText(container, "Tick 1")).toBeInTheDocument();
38
39
  expect(queryByText(container, "Tick 2")).not.toBeInTheDocument();
39
- fireEvent.click(getByText(container, "Checked 2"));
40
+ await userEvent.click(getByText(container, "Checked 2"));
40
41
  expect(queryByText(container, "Tick 1")).toBeInTheDocument();
41
42
  expect(queryByText(container, "Tick 2")).toBeInTheDocument();
42
- fireEvent.click(getByText(container, "Checked 1"));
43
+ await userEvent.click(getByText(container, "Checked 1"));
43
44
  expect(queryByText(container, "Tick 1")).not.toBeInTheDocument();
44
45
  expect(queryByText(container, "Tick 2")).toBeInTheDocument();
45
46
 
46
47
  // Checking a radio should show the indicator, and hide another indicator if already selected
47
- fireEvent.click(getByText(container, "Radio popout button"));
48
+ await userEvent.click(getByText(container, "Radio popout button"));
48
49
  expect(queryByText(container, "Circle 1")).not.toBeInTheDocument();
49
50
  expect(queryByText(container, "Circle 2")).not.toBeInTheDocument();
50
- fireEvent.click(getByText(container, "Radio 1"));
51
+ await userEvent.click(getByText(container, "Radio 1"));
51
52
  expect(queryByText(container, "Circle 1")).toBeInTheDocument();
52
53
  expect(queryByText(container, "Circle 2")).not.toBeInTheDocument();
53
- fireEvent.click(getByText(container, "Radio 2"));
54
+ await userEvent.click(getByText(container, "Radio 2"));
54
55
  expect(queryByText(container, "Circle 1")).not.toBeInTheDocument();
55
56
  expect(queryByText(container, "Circle 2")).toBeInTheDocument();
56
57
  });
@@ -1,4 +1,4 @@
1
- import { Popover, PopoverContent } from "../../../src/Popover";
1
+ import { Modal, ModalContent } from "../../../src/Modal";
2
2
  import {
3
3
  Menu,
4
4
  MenuButton,
@@ -14,8 +14,8 @@ import {
14
14
 
15
15
  export default function MenuAccessibility() {
16
16
  @render {
17
- <Popover visible>
18
- <PopoverContent>
17
+ <Modal visible>
18
+ <ModalContent>
19
19
  <Menu ariaLabel="A menu">
20
20
  <MenuButton>Menu button</MenuButton>
21
21
  <MenuButton disabled>Disabled button</MenuButton>
@@ -53,7 +53,7 @@ export default function MenuAccessibility() {
53
53
  </MenuPopoutContent>
54
54
  </MenuPopout>
55
55
  </Menu>
56
- </PopoverContent>
57
- </Popover>
56
+ </ModalContent>
57
+ </Modal>
58
58
  }
59
59
  }
@@ -1,4 +1,4 @@
1
- import { Popover, PopoverContent } from "../../../src/Popover";
1
+ import { Modal, ModalContent } from "../../../src/Modal";
2
2
  import {
3
3
  Menu,
4
4
  MenuButton,
@@ -14,8 +14,8 @@ import {
14
14
 
15
15
  export default function MenuBasic() {
16
16
  @render {
17
- <Popover visible>
18
- <PopoverContent>
17
+ <Modal visible>
18
+ <ModalContent>
19
19
  <Menu ariaLabel="A menu">
20
20
  <MenuButton>Menu button</MenuButton>
21
21
  <MenuSeparator>---</MenuSeparator>
@@ -52,7 +52,7 @@ export default function MenuBasic() {
52
52
  </MenuPopoutContent>
53
53
  </MenuPopout>
54
54
  </Menu>
55
- </PopoverContent>
56
- </Popover>
55
+ </ModalContent>
56
+ </Modal>
57
57
  }
58
58
  }
@@ -1,5 +1,6 @@
1
- import { fireEvent, getByText, queryByText } from "@testing-library/dom";
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
2
  import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
3
4
  import { mount } from "@torpor/view";
4
5
  import { describe, expect, it } from "vitest";
5
6
  import MenuBarAccessibility from "./components/MenuBarAccessibility.torp";
@@ -38,7 +39,7 @@ describe("MenuBar", () => {
38
39
  // A parent menuitem has aria-expanded set to false when its child menu is not visible and set
39
40
  // to true when the child menu is visible
40
41
  expect(queryByText(container, "Top level")).toHaveAttribute("aria-expanded", "false");
41
- fireEvent.click(getByText(container, "Top level"));
42
+ await userEvent.click(getByText(container, "Top level"));
42
43
  expect(queryByText(container, "Top level")).toHaveAttribute("aria-expanded", "true");
43
44
 
44
45
  // One of the following approaches is used to enable scripts to move focus among items in a
@@ -1,5 +1,6 @@
1
- import { fireEvent, getByText, queryByText } from "@testing-library/dom";
1
+ import { getByText, queryByText } from "@testing-library/dom";
2
2
  import "@testing-library/jest-dom/vitest";
3
+ import userEvent from "@testing-library/user-event";
3
4
  import { mount } from "@torpor/view";
4
5
  import { describe, expect, it } from "vitest";
5
6
  import MenuBarBasic from "./components/MenuBarBasic.torp";
@@ -15,7 +16,7 @@ describe("MenuBar", () => {
15
16
  expect(queryByText(container, "Sub item 1")).not.toBeInTheDocument();
16
17
 
17
18
  // Clicking the top level item should show the sub item
18
- fireEvent.click(getByText(container, "Top level"));
19
+ await userEvent.click(getByText(container, "Top level"));
19
20
  expect(queryByText(container, "Sub item 1")).toBeInTheDocument();
20
21
  });
21
22
  });
@@ -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>
@@ -1,8 +1,5 @@
1
1
  import {
2
- Notification,
3
2
  NotificationContainer,
4
- NotificationContent,
5
- NotificationClose,
6
3
  showNotification
7
4
  } from "../../../src/Notification/index";
8
5
  import CustomNotification from "./CustomNotification.torp";
@@ -10,7 +10,7 @@ export default function NotificationVariable() {
10
10
  });
11
11
 
12
12
  @render {
13
- <button type="button" onclick={(e) => ($state.showNotification = !$state.showNotification)}>
13
+ <button type="button" onclick={() => ($state.showNotification = !$state.showNotification)}>
14
14
  Show a notification
15
15
  </button>
16
16
 
@@ -0,0 +1,37 @@
1
+ import { Popover, PopoverContent, showPopover } from "../../../src/Popover/index";
2
+ import {
3
+ Dialog,
4
+ DialogBody,
5
+ DialogFooter,
6
+ DialogButton
7
+ } from "../../../src/Dialog/index";
8
+
9
+ export default function PopoverFunction() {
10
+ let anchor;
11
+
12
+ async function show() {
13
+ showPopover(CustomDialog, anchor);
14
+ }
15
+
16
+ @render {
17
+ <button type="button" &ref={anchor} onclick={show}>Show the prompt</button>
18
+ }
19
+ }
20
+
21
+ function CustomDialog($props) {
22
+ @render {
23
+ <Popover visible {$props.anchor}>
24
+ <PopoverContent>
25
+ <Dialog>
26
+ <DialogBody>
27
+ <p>Which color do you prefer?</p>
28
+ </DialogBody>
29
+ <DialogFooter>
30
+ <DialogButton value="blue">Blue</DialogButton>
31
+ <DialogButton value="red">Red</DialogButton>
32
+ </DialogFooter>
33
+ </Dialog>
34
+ </PopoverContent>
35
+ </Popover>
36
+ }
37
+ }
@@ -0,0 +1,36 @@
1
+ import { Popover, PopoverContent, PopoverTrigger } from "../../../src/Popover/index";
2
+ import {
3
+ Dialog,
4
+ DialogBody,
5
+ DialogFooter,
6
+ DialogButton
7
+ } from "../../../src/Dialog/index";
8
+
9
+ export default function PopoverTriggerTest() {
10
+ let $state = $watch({
11
+ color: "",
12
+ });
13
+
14
+ @render {
15
+ @if ($state.color) {
16
+ <p>Your favorite color is {$state.color}?!</p>
17
+ }
18
+
19
+ <Popover &visible={$state.showPopover}>
20
+ <PopoverTrigger>
21
+ Show the prompt
22
+ </PopoverTrigger>
23
+ <PopoverContent>
24
+ <Dialog>
25
+ <DialogBody>
26
+ <p>Which color do you prefer?</p>
27
+ </DialogBody>
28
+ <DialogFooter>
29
+ <DialogButton value="blue" onclick={() => ($state.color = "blue")}>Blue</DialogButton>
30
+ <DialogButton value="red" onclick={() => ($state.color = "red")}>Red</DialogButton>
31
+ </DialogFooter>
32
+ </Dialog>
33
+ </PopoverContent>
34
+ </Popover>
35
+ }
36
+ }
@@ -6,14 +6,16 @@ import {
6
6
  DialogButton
7
7
  } from "../../../src/Dialog/index";
8
8
 
9
- export default function PromptVariable() {
9
+ export default function PopoverVariable() {
10
10
  let $state = $watch({
11
11
  color: "",
12
12
  showPopover: false
13
13
  });
14
14
 
15
+ let button: HTMLButtonElement;
16
+
15
17
  @render {
16
- <button type="button" onclick={(e) => ($state.showPopover = !$state.showPopover)}>
18
+ <button type="button" onclick={() => ($state.showPopover = !$state.showPopover)} &ref={button}>
17
19
  Show the prompt
18
20
  </button>
19
21
 
@@ -21,7 +23,7 @@ export default function PromptVariable() {
21
23
  <p>Your favorite color is {$state.color}?!</p>
22
24
  }
23
25
 
24
- <Popover &visible={$state.showPopover}>
26
+ <Popover &visible={$state.showPopover} anchor={button}>
25
27
  <PopoverContent>
26
28
  <Dialog>
27
29
  <DialogBody>
@@ -3,13 +3,13 @@ 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 PromptFunction from "./components/PromptFunction.torp";
6
+ import PopoverFunction from "./components/PopoverFunction.torp";
7
7
 
8
8
  describe("Prompt", () => {
9
9
  it("Showing with a function", async () => {
10
10
  const container = document.createElement("div");
11
11
  document.body.appendChild(container);
12
- mount(container, PromptFunction);
12
+ mount(container, PopoverFunction);
13
13
 
14
14
  // By default, the prompt shouldn't be shown
15
15
  expect(queryByText(container, "Which color do you prefer?")).not.toBeInTheDocument();
@@ -17,10 +17,5 @@ describe("Prompt", () => {
17
17
  // Clicking the button should show the prompt
18
18
  await userEvent.click(getByText(container, "Show the prompt"));
19
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
20
  });
26
21
  });
@@ -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 PopoverTrigger from "./components/PopoverTrigger.torp";
7
+
8
+ describe("Prompt", () => {
9
+ it("Showing with a trigger", async () => {
10
+ const container = document.createElement("div");
11
+ document.body.appendChild(container);
12
+ mount(container, PopoverTrigger);
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
+ });
@@ -3,13 +3,13 @@ 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 PromptVariable from "./components/PromptVariable.torp";
6
+ import PopoverVariable from "./components/PopoverVariable.torp";
7
7
 
8
8
  describe("Prompt", () => {
9
9
  it("Showing with a variable", async () => {
10
10
  const container = document.createElement("div");
11
11
  document.body.appendChild(container);
12
- mount(container, PromptVariable);
12
+ mount(container, PopoverVariable);
13
13
 
14
14
  // By default, the prompt shouldn't be shown
15
15
  expect(queryByText(container, "Which color do you prefer?")).not.toBeInTheDocument();
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  export default function TabGroupAccessibility() {
10
10
  @render {
11
- <TabGroup value={$props.value}>
11
+ <TabGroup value={$props?.value}>
12
12
  <TabList ariaLabel="Example tabs">
13
13
  <TabHeader as="h4">
14
14
  <TabTrigger>Header 1</TabTrigger>
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  export default function TabGroupKeyboard() {
10
10
  @render {
11
- <TabGroup value={$props.value}>
11
+ <TabGroup value={$props?.value}>
12
12
  <TabList>
13
13
  <TabHeader as="h4">
14
14
  <TabTrigger>Header 1</TabTrigger>
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  export default function TabGroupList() {
10
10
  @render {
11
- <TabGroup value={$props.value}>
11
+ <TabGroup value={$props?.value}>
12
12
  <TabList>
13
13
  @for (let item of $props.items) {
14
14
  @key = item.id
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  export default function TabGroupTrigger() {
10
10
  @render {
11
- <TabGroup value={$props.value}>
11
+ <TabGroup value={$props?.value}>
12
12
  <TabList>
13
13
  <TabHeader as="h4">
14
14
  <TabTrigger>Header 1</TabTrigger>
package/tsup.config.ts CHANGED
@@ -10,16 +10,18 @@ export default defineConfig({
10
10
  "src/Accordion/index.ts",
11
11
  "src/Breadcrumb/index.ts",
12
12
  "src/Calendar/index.ts",
13
+ "src/Contextual/index.ts",
13
14
  "src/Dialog/index.ts",
14
15
  "src/Disclosure/index.ts",
15
16
  "src/Drawer/index.ts",
17
+ "src/Form/index.ts",
16
18
  "src/Menu/index.ts",
17
19
  "src/MenuBar/index.ts",
20
+ "src/Modal/index.ts",
18
21
  "src/NavMenu/index.ts",
19
22
  "src/Notification/index.ts",
20
23
  "src/Popover/index.ts",
21
24
  "src/TabGroup/index.ts",
22
- "src/form/index.ts",
23
25
  "src/icons/index.ts",
24
26
  "src/motion/index.ts",
25
27
  ],
@@ -1,106 +0,0 @@
1
- import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
2
- import getScrollParent from "../utils/getScrollParent";
3
- import setPopoverPosition from "../utils/setPopoverPosition";
4
- import { PopoverContextName, type PopoverContext } from "./PopoverTypes";
5
-
6
- /**
7
- * The content that is displayed for a Popover when it is open, displayed
8
- * alongside an element.
9
- *
10
- * @prop {"top" | "right" | "bottom" | "left"} site -- Where the popover will be
11
- * shown, relative to the popover button
12
- * @prop {"start" | "center" | "end"} alignment -- How the popover will be
13
- * aligned, relative to the popover button
14
- */
15
- export default function PopoverContentAnchored($props: any) {
16
- $props.side ??= "bottom";
17
- $props.alignment ??= "center";
18
-
19
- let div: HTMLDivElement;
20
- let shown = false;
21
- let closeOnClick = false;
22
-
23
- // Get stuff out of the PopoverContext
24
- const context = $context[PopoverContextName] as PopoverContext;
25
- if (!context) {
26
- throw new Error("PopoverContentAnchored must be contained within a Popover");
27
- }
28
- let $state = context.state;
29
-
30
- $run(() => {
31
- if (!$state.visible) {
32
- hide();
33
- }
34
- });
35
-
36
- function show() {
37
- shown = true;
38
-
39
- // HACK: Because this Popover could be shown with a click, we need to wait for another mousedown
40
- // before we close on click. Otherwise the click immediately bubbles to the document
41
- closeOnClick = false;
42
- addDocumentEvent("mousedown", handleDocumentMouseDown);
43
- addDocumentEvent("click", handleDocumentClick);
44
-
45
- // Set the position and listen for window resize and scroll to reset the position
46
- setPosition();
47
- const scrollParent = getScrollParent(context.anchorElement)
48
- scrollParent.addEventListener("resize", setPosition);
49
- scrollParent.addEventListener("scroll", setPosition);
50
- if (context.focusFirstElement) {
51
- context.focusFirstElement();
52
- }
53
- }
54
-
55
- function hide() {
56
- if (!shown) return;
57
-
58
- removeDocumentEvent("mousedown", handleDocumentMouseDown);
59
- removeDocumentEvent("click", handleDocumentClick);
60
-
61
- // Stop listening for window resize and focus the anchor element per WAI guidelines
62
- const scrollParent = getScrollParent(context.anchorElement)
63
- scrollParent.removeEventListener("resize", setPosition);
64
- scrollParent.removeEventListener("scroll", setPosition);
65
- if (context.anchorElement?.focus) {
66
- context.anchorElement.focus();
67
- }
68
- }
69
-
70
- function handleDocumentMouseDown() {
71
- closeOnClick = true;
72
- }
73
-
74
- function handleDocumentClick(e: MouseEvent) {
75
- if (
76
- closeOnClick &&
77
- div &&
78
- !div.contains(e.target as HTMLElement) &&
79
- (!context.anchorElement || !context.anchorElement.contains(e.target as HTMLElement))
80
- ) {
81
- e.preventDefault();
82
- context.handleClickOutside!(e);
83
- }
84
- }
85
-
86
- function setPosition() {
87
- if (!context.anchorElement) {
88
- throw new Error("PopoverContentAnchored must have an anchor element");
89
- }
90
-
91
- setPopoverPosition(context.anchorElement, div, $props.side, $props.alignment);
92
- }
93
-
94
- @render {
95
- @if ($state.visible) {
96
- <div
97
- {$props.id}
98
- class={`torp-popover-content-anchored ${$props.class ?? ""}`.trim()}
99
- &ref={div}
100
- onmount={show}
101
- >
102
- <slot />
103
- </div>
104
- }
105
- }
106
- }