@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
@@ -1,72 +1,90 @@
1
1
  import { type SlotRender } from "@torpor/view";
2
2
 
3
3
 
4
+ interface NotificationProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ /** Whether the notification is visible */
10
+ visible?: boolean,
11
+ /** The duration, in milliseconds, to keep the notification visible */
12
+ duration?: number,
13
+ /** Raised when the notification has closed, either after the duration has elapsed, or when the user has pressed the close button */
14
+ onclose?: () => void,
15
+ }
16
+
4
17
  /**
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.
18
+ * An element that displays a brief, important message in a way that attracts
19
+ * the user's attention without interrupting the user's task.
20
+ *
21
+ * See [the WAI ARIA guidelines for Alerts](https://www.w3.org/WAI/ARIA/apg/patterns/alert/).
11
22
  */
12
23
  declare function Notification(
13
24
  $parent: ParentNode,
14
25
  $anchor: Node | null,
15
- $props,
26
+ $props: NotificationProps | undefined,
16
27
  $context?: Record<PropertyKey, any>,
17
28
  $slots?: Record<string, SlotRender>,
18
29
  ): void;
19
30
 
20
31
 
21
32
 
33
+ interface NotificationCloseProps {
34
+ /** An ID for the root element */
35
+ id?: string;
36
+ /** Class name(s) for the root element */
37
+ class?: string,
38
+ }
39
+
22
40
  /**
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.
41
+ * The button that a user can press to close this Notification.
29
42
  */
30
43
  declare function NotificationClose(
31
44
  $parent: ParentNode,
32
45
  $anchor: Node | null,
33
- $props?: Record<PropertyKey, any>,
46
+ $props: NotificationCloseProps | undefined,
34
47
  $context?: Record<PropertyKey, any>,
35
48
  $slots?: Record<string, SlotRender>,
36
49
  ): void;
37
50
 
38
51
 
39
52
 
53
+ interface NotificationContainerProps {
54
+ /** An ID for the root element */
55
+ id?: string;
56
+ /** Class name(s) for the root element */
57
+ class?: string,
58
+ }
59
+
40
60
  /**
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.
61
+ * The container for one or more Notifications, which can be used to position
62
+ * the notifications inside the viewport.
47
63
  */
48
64
  declare function NotificationContainer(
49
65
  $parent: ParentNode,
50
66
  $anchor: Node | null,
51
- $props?: Record<PropertyKey, any>,
67
+ $props: NotificationContainerProps | undefined,
52
68
  $context?: Record<PropertyKey, any>,
53
69
  $slots?: Record<string, SlotRender>,
54
70
  ): void;
55
71
 
56
72
 
57
73
 
74
+ interface NotificationContentProps {
75
+ /** An ID for the root element */
76
+ id?: string;
77
+ /** Class name(s) for the root element */
78
+ class?: string,
79
+ }
80
+
58
81
  /**
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.
82
+ * The content to display within a Notification.
65
83
  */
66
84
  declare function NotificationContent(
67
85
  $parent: ParentNode,
68
86
  $anchor: Node | null,
69
- $props?: Record<PropertyKey, any>,
87
+ $props: NotificationContentProps | undefined,
70
88
  $context?: Record<PropertyKey, any>,
71
89
  $slots?: Record<string, SlotRender>,
72
90
  ): void;
@@ -1,31 +1,57 @@
1
1
  import { PopoverContextName, type Point, type PopoverContext, type PopoverState } from "./PopoverTypes";
2
2
 
3
+ interface PopoverProps {
4
+ /** An ID for the root element */
5
+ id?: string;
6
+ /** Class name(s) for the root element */
7
+ class?: string,
8
+ /** Whether the popover is modal. If true, an overlay should be supplied to obscure outside content, and only the popover content will be visible to screen readers */
9
+ modal?: boolean,
10
+ /** Whether the popover is visible */
11
+ visible?: boolean,
12
+ /** The element to anchor this popover to, as an alternative to supplying a PopoverTrigger */
13
+ anchor?: HTMLElement,
14
+ /** The position to display this popover at if it's contextual, as an alternative to supplying a PopoverTriggerContextual */
15
+ position?: Point,
16
+ /** A function to be called when the user selects a response */
17
+ callback?: ((value: any) => void),
18
+ /** Raised when the popover is opened or closed */
19
+ ontoggle?: (open: boolean) => void,
20
+ /** Raised when the popover has opened */
21
+ onopen?: () => void,
22
+ /** Raised when the popover has closed */
23
+ onclose?: (result: any) => void,
24
+ }
25
+
3
26
  /**
4
- * A popover that can be used to show rich content or obtain information from a user.
5
- *
6
- * See [the WAI ARIA guidelines for Dialogs](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/).
27
+ * A popover window that is shown to the user relative to an anchor element.
7
28
  *
8
29
  * The structure of a Popover is:
9
30
  *
10
31
  * ```
11
32
  * <Popover>
12
- * <PopoverOverlay /> (optional, if modal)
13
- * <PopoverTrigger/PopoverTriggerContextual/PopoverTriggerHover /> (optional)
14
- * <PopoverContent/PopoverContentAnchored/PopoverContentContextual />
33
+ * <PopoverTrigger /> (optional)
34
+ * <PopoverContent />
15
35
  * </Popover>
16
36
  * ```
17
- * @prop {boolean} modal -- Whether the popover is modal. If true, an overlay should be supplied to obscure outside content, and only the popover content will be visible to screen readers
18
- * @prop {boolean} visible -- Whether the popover is visible
19
- * @prop {HTMLElement | undefined} anchor -- The element to anchor this popover to, as an alternative to supplying a PopoverTrigger
20
- * @prop {Point | undefined} position -- The position to display this popover at if it's contextual, as an alternative to supplying a PopoverTriggerContextual
21
- * @prop {((value: any) => void) | undefined} [callback] -- A function to be called when the user selects a response
22
37
  */
23
- export default function Popover($props: any) {
38
+ export default function Popover($props: PopoverProps | undefined) {
24
39
  let $state: PopoverState = $watch({
25
40
  visible: false,
26
41
  position: { x: 0, y: 0 }
27
42
  })
28
43
 
44
+ // Sync props and state
45
+ $run(() => {
46
+ $state.visible = $props?.visible ?? false;
47
+ $state.position = $props?.position ?? { x: 0, y: 0 };
48
+ });
49
+ $run(() => {
50
+ if ($props !== undefined) {
51
+ $props.visible = $state.visible;
52
+ }
53
+ });
54
+
29
55
  let result: any;
30
56
 
31
57
  // Set the context to pass down to items
@@ -33,23 +59,17 @@ export default function Popover($props: any) {
33
59
  handleButton,
34
60
  handleClickOutside,
35
61
  state: $state,
36
- modal: $props.modal,
37
- anchorElement: $unwrap($props.anchor),
62
+ modal: $props?.modal,
63
+ anchorElement: $props?.anchor ? $unwrap($props.anchor) : undefined,
38
64
  };
39
65
  $context[PopoverContextName] = context;
40
66
 
41
- // Copy props into state whenever they change
42
- $run(() => {
43
- $state.visible = $props.visible ?? false;
44
- $state.position = $props.position ?? { x: 0, y: 0 };
45
- })
46
-
47
- // Dispatch the toggle event when the popout is opened or closed
67
+ // Dispatch the toggle event when the popover is opened or closed
48
68
  let firstToggle = true;
49
69
  $run(() => {
50
- const ontoggle = $props.ontoggle;
51
- const onopen = $props.onopen;
52
- const onclose = $props.onclose;
70
+ const ontoggle = $props?.ontoggle;
71
+ const onopen = $props?.onopen;
72
+ const onclose = $props?.onclose;
53
73
  const visible = $state.visible;
54
74
  if (firstToggle) {
55
75
  firstToggle = false;
@@ -84,8 +104,8 @@ export default function Popover($props: any) {
84
104
  $state.visible = false;
85
105
 
86
106
  // Call the callback
87
- if ($props.callback) {
88
- $props.callback(result);
107
+ if ($props?.callback) {
108
+ $props?.callback(result);
89
109
  }
90
110
  }
91
111
 
@@ -96,8 +116,8 @@ export default function Popover($props: any) {
96
116
 
97
117
  @render {
98
118
  <div
99
- {$props.id}
100
- class={`torp-popover ${$props.class ?? ""}`.trim()}
119
+ {$props?.id}
120
+ class={`torp-popover ${$props?.class ?? ""}`.trim()}
101
121
  >
102
122
  <slot />
103
123
  </div>
@@ -1,11 +1,24 @@
1
1
  import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
2
+ import getScrollParent from "../utils/getScrollParent";
3
+ import setPopoverPosition from "../utils/setPopoverPosition";
2
4
  import { PopoverContextName, type PopoverContext } from "./PopoverTypes";
3
5
 
6
+ interface PopoverContentProps {
7
+ /** An ID for the root element */
8
+ id?: string;
9
+ /** Class name(s) for the root element */
10
+ class?: string,
11
+ /** Where the popover will be shown, relative to the popover trigger */
12
+ side?: "top" | "right" | "bottom" | "left",
13
+ /** How the popover will be aligned, relative to the popover trigger */
14
+ alignment?: "start" | "center" | "end",
15
+ }
16
+
4
17
  /**
5
- * The content that is displayed for a Popover when it is open, such as a Dialog
6
- * in the middle of the screen or a div that slides in from the side.
18
+ * The content that is displayed for a Popover when it is open, displayed
19
+ * alongside an element.
7
20
  */
8
- export default function PopoverContent($props: any) {
21
+ export default function PopoverContent($props?: PopoverContentProps | undefined) {
9
22
  let div: HTMLDivElement;
10
23
  let shown = false;
11
24
  let closeOnClick = false;
@@ -32,6 +45,12 @@ export default function PopoverContent($props: any) {
32
45
  addDocumentEvent("mousedown", handleDocumentMouseDown);
33
46
  addDocumentEvent("click", handleDocumentClick);
34
47
 
48
+ // Set the position and listen for window resize and scroll to reset the position
49
+ setPosition();
50
+ const anchorElement = context.anchorElement!
51
+ const scrollParent = getScrollParent(anchorElement)
52
+ scrollParent.addEventListener("resize", setPosition);
53
+ scrollParent.addEventListener("scroll", setPosition);
35
54
  if (context.focusFirstElement) {
36
55
  context.focusFirstElement();
37
56
  }
@@ -43,9 +62,13 @@ export default function PopoverContent($props: any) {
43
62
  removeDocumentEvent("mousedown", handleDocumentMouseDown);
44
63
  removeDocumentEvent("click", handleDocumentClick);
45
64
 
46
- // Focus the anchor element per WAI guidelines
47
- if (context.anchorElement?.focus) {
48
- context.anchorElement.focus();
65
+ // Stop listening for window resize and focus the anchor element per WAI guidelines
66
+ const anchorElement = context.anchorElement!
67
+ const scrollParent = getScrollParent(anchorElement)
68
+ scrollParent.removeEventListener("resize", setPosition);
69
+ scrollParent.removeEventListener("scroll", setPosition);
70
+ if (anchorElement.focus) {
71
+ anchorElement.focus();
49
72
  }
50
73
  }
51
74
 
@@ -60,15 +83,26 @@ export default function PopoverContent($props: any) {
60
83
  !div.contains(e.target as HTMLElement) &&
61
84
  (!context.anchorElement || !context.anchorElement.contains(e.target as HTMLElement))
62
85
  ) {
86
+ e.preventDefault();
63
87
  context.handleClickOutside!(e);
64
88
  }
65
89
  }
66
90
 
91
+ function setPosition() {
92
+ if (!context.anchorElement) {
93
+ throw new Error("Popover must have an anchor element");
94
+ }
95
+
96
+ let side = $props?.side ?? "bottom";
97
+ let alignment = $props?.alignment ?? "center";
98
+ setPopoverPosition(context.anchorElement, div, side, alignment);
99
+ }
100
+
67
101
  @render {
68
102
  @if ($state.visible) {
69
103
  <div
70
- {$props.id}
71
- class={`torp-popover-content ${$props.class ?? ""}`.trim()}
104
+ {$props?.id}
105
+ class={`torp-popover-content ${$props?.class ?? ""}`.trim()}
72
106
  &ref={div}
73
107
  onmount={show}
74
108
  >
@@ -1,9 +1,21 @@
1
1
  import { PopoverContextName, type PopoverContext } from "./PopoverTypes";
2
+ import hoverTrigger from "../mount/hoverTrigger";
3
+
4
+ interface PopoverTriggerProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ /** Whether the popover is activated by click/press or by hover **/
10
+ activation?: "press" | "hover"
11
+ }
2
12
 
3
13
  /**
4
14
  * The button that causes a Popover to appear or disappear.
5
15
  */
6
- export default function PopoverTrigger($props: any) {
16
+ export default function PopoverTrigger($props: PopoverTriggerProps | undefined) {
17
+ let activation = $props?.activation ?? "press";
18
+
7
19
  // Get stuff out of the PopoverContext
8
20
  const context = $context[PopoverContextName] as PopoverContext;
9
21
  if (!context) {
@@ -12,15 +24,32 @@ export default function PopoverTrigger($props: any) {
12
24
  let $state = context.state;
13
25
 
14
26
  function handleClick() {
27
+ if (activation !== "press") return;
28
+
15
29
  $state.visible = !$state.visible;
16
30
  }
17
31
 
32
+ function handleHover(node: HTMLElement, e: MouseEvent) {
33
+ if (activation !== "hover") return;
34
+
35
+ if ($state.position) {
36
+ // Get the position relative to the element, so we can reposition on scroll
37
+ const rect = node.getBoundingClientRect();
38
+ const x = e.clientX - rect.left;
39
+ const y = e.clientY - rect.top;
40
+ $state.position = { x, y };
41
+ //$state.position = { x: window.scrollX + e.clientX, y: window.scrollY + e.clientY };
42
+ }
43
+ $state.visible = !$state.visible
44
+ }
45
+
18
46
  @render {
19
47
  <button
20
48
  type="button"
21
- {$props.id}
22
- class={`torp-popover-trigger ${$props.class ?? ""}`.trim()}
49
+ {$props?.id}
50
+ class={`torp-popover-trigger ${$props?.class ?? ""}`.trim()}
23
51
  onclick={handleClick}
52
+ onmount={(el) => hoverTrigger(el, { onHover: handleHover, onExit: handleHover })}
24
53
  &ref={context.anchorElement}
25
54
  >
26
55
  <slot />
@@ -7,7 +7,7 @@ export interface PopoverContext {
7
7
  // There may be a more elegant way to accomplish this too
8
8
  handleClickOutside?: (e: MouseEvent) => void;
9
9
  state: PopoverState;
10
- modal: boolean;
10
+ //modal: boolean;
11
11
  anchorElement?: HTMLElement;
12
12
  // HACK: focusFirstElement is necessary because if we focus the first element e.g. in a Dialog's
13
13
  // onMount, it will scroll the page to the focused element and mess up our careful positioning
@@ -1,18 +1,45 @@
1
1
  import { type SlotRender } from "@torpor/view";
2
2
 
3
3
 
4
+ interface PopoverProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ /** Whether the popover is modal. If true, an overlay should be supplied to obscure outside content, and only the popover content will be visible to screen readers */
10
+ modal?: boolean,
11
+ /** Whether the popover is visible */
12
+ visible?: boolean,
13
+ /** The element to anchor this popover to, as an alternative to supplying a PopoverTrigger */
14
+ anchor?: HTMLElement,
15
+ /** The position to display this popover at if it's contextual, as an alternative to supplying a PopoverTriggerContextual */
16
+ position?: Point,
17
+ /** A function to be called when the user selects a response */
18
+ callback?: ((value: any) => void),
19
+ /** Raised when the popover is opened or closed */
20
+ ontoggle?: (open: boolean) => void,
21
+ /** Raised when the popover has opened */
22
+ onopen?: () => void,
23
+ /** Raised when the popover has closed */
24
+ onclose?: (result: any) => void,
25
+ }
26
+
4
27
  /**
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.
28
+ * A popover window that is shown to the user relative to an anchor element.
29
+ *
30
+ * The structure of a Popover is:
31
+ *
32
+ * ```
33
+ * <Popover>
34
+ * <PopoverTrigger /> (optional)
35
+ * <PopoverContent />
36
+ * </Popover>
37
+ * ```
11
38
  */
12
39
  declare function Popover(
13
40
  $parent: ParentNode,
14
41
  $anchor: Node | null,
15
- $props: any,
42
+ $props: PopoverProps | undefined,
16
43
  $context?: Record<PropertyKey, any>,
17
44
  $slots?: Record<string, SlotRender>,
18
45
  ): void;
@@ -20,127 +47,37 @@ declare function Popover(
20
47
 
21
48
 
22
49
  /**
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.
50
+ * The content that is displayed for a Popover when it is open, displayed
51
+ * alongside an element.
29
52
  */
30
53
  declare function PopoverContent(
31
54
  $parent: ParentNode,
32
55
  $anchor: Node | null,
33
- $props: any,
56
+ $props?: PopoverContentProps | undefined,
34
57
  $context?: Record<PropertyKey, any>,
35
58
  $slots?: Record<string, SlotRender>,
36
59
  ): void;
37
60
 
38
61
 
39
62
 
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 PopoverContentAnchored(
49
- $parent: ParentNode,
50
- $anchor: Node | null,
51
- $props: 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 PopoverContentContextual(
67
- $parent: ParentNode,
68
- $anchor: Node | null,
69
- $props: any,
70
- $context?: Record<PropertyKey, any>,
71
- $slots?: Record<string, SlotRender>,
72
- ): void;
73
-
74
-
75
-
76
- /**
77
- * Mounts or hydrates the component into the supplied parent node.
78
- * @param $parent -- The parent node.
79
- * @param $anchor -- The node to mount the component before.
80
- * @param $props -- The values that have been passed into the component as properties.
81
- * @param $context -- Values that have been passed into the component from its ancestors.
82
- * @param $slots -- Functions for rendering children into slot nodes within the component.
83
- */
84
- declare function PopoverOverlay(
85
- $parent: ParentNode,
86
- $anchor: Node | null,
87
- $props: any,
88
- $context?: Record<PropertyKey, any>,
89
- $slots?: Record<string, SlotRender>,
90
- ): void;
91
-
92
-
63
+ interface PopoverTriggerProps {
64
+ /** An ID for the root element */
65
+ id?: string;
66
+ /** Class name(s) for the root element */
67
+ class?: string,
68
+ /** Whether the popover is activated by click/press or by hover **/
69
+ activation?: "press" | "hover"
70
+ }
93
71
 
94
72
  /**
95
- * Mounts or hydrates the component into the supplied parent node.
96
- * @param $parent -- The parent node.
97
- * @param $anchor -- The node to mount the component before.
98
- * @param $props -- The values that have been passed into the component as properties.
99
- * @param $context -- Values that have been passed into the component from its ancestors.
100
- * @param $slots -- Functions for rendering children into slot nodes within the component.
73
+ * The button that causes a Popover to appear or disappear.
101
74
  */
102
75
  declare function PopoverTrigger(
103
76
  $parent: ParentNode,
104
77
  $anchor: Node | null,
105
- $props: any,
106
- $context?: Record<PropertyKey, any>,
107
- $slots?: Record<string, SlotRender>,
108
- ): void;
109
-
110
-
111
-
112
- /**
113
- * Mounts or hydrates the component into the supplied parent node.
114
- * @param $parent -- The parent node.
115
- * @param $anchor -- The node to mount the component before.
116
- * @param $props -- The values that have been passed into the component as properties.
117
- * @param $context -- Values that have been passed into the component from its ancestors.
118
- * @param $slots -- Functions for rendering children into slot nodes within the component.
119
- */
120
- declare function PopoverTriggerContextual(
121
- $parent: ParentNode,
122
- $anchor: Node | null,
123
- $props: any,
124
- $context?: Record<PropertyKey, any>,
125
- $slots?: Record<string, SlotRender>,
126
- ): void;
127
-
128
-
129
-
130
- /**
131
- * Mounts or hydrates the component into the supplied parent node.
132
- * @param $parent -- The parent node.
133
- * @param $anchor -- The node to mount the component before.
134
- * @param $props -- The values that have been passed into the component as properties.
135
- * @param $context -- Values that have been passed into the component from its ancestors.
136
- * @param $slots -- Functions for rendering children into slot nodes within the component.
137
- */
138
- declare function PopoverTriggerHover(
139
- $parent: ParentNode,
140
- $anchor: Node | null,
141
- $props: any,
78
+ $props: PopoverTriggerProps | undefined,
142
79
  $context?: Record<PropertyKey, any>,
143
80
  $slots?: Record<string, SlotRender>,
144
81
  ): void;
145
82
 
146
- export { Popover, PopoverContent, PopoverContentAnchored, PopoverContentContextual, PopoverOverlay, PopoverTrigger, PopoverTriggerContextual, PopoverTriggerHover };
83
+ export { Popover, PopoverContent, PopoverTrigger };