@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,4 +1,13 @@
1
1
 
2
+ interface BreadcrumbProps {
3
+ /** An ID for the root element */
4
+ id?: string;
5
+ /** Class name(s) for the root element */
6
+ class?: string,
7
+ /** An ARIA label for describing the popover to screen readers */
8
+ ariaLabel?: string | undefined,
9
+ }
10
+
2
11
  /**
3
12
  *
4
13
  * A list of links to the parent pages of the current page in hierarchical order.
@@ -9,23 +18,22 @@
9
18
  *
10
19
  * ```
11
20
  * <Breadcrumb>
12
- * <BreadcrumbItem />
13
- * <BreadcrumbSeparator /> (optional)
14
- * <BreadcrumbItem />
15
- * ...
21
+ * <BreadcrumbItem />
22
+ * <BreadcrumbSeparator /> (optional)
23
+ * <BreadcrumbItem>
24
+ * ...
25
+ * </BreadcrumbItem>
16
26
  * </Breadcrumb>
17
27
  * ```
18
28
  *
19
29
  * You can separate BreadcrumbItems using BreadcrumbSeparators or by using CSS.
20
- *
21
- * @prop {string | undefined} ariaLabel -- An ARIA label for describing the popover to screen readers
22
30
  */
23
- export default function Breadcrumb($props: any) {
31
+ export default function Breadcrumb($props: BreadcrumbProps | undefined) {
24
32
  @render {
25
33
  <nav
26
- {$props.id}
27
- class={`torp-breadcrumb ${$props.class ?? ""}`.trim()}
28
- aria-label={$props.ariaLabel}
34
+ {$props?.id}
35
+ class={`torp-breadcrumb ${$props?.class ?? ""}`.trim()}
36
+ aria-label={$props?.ariaLabel}
29
37
  >
30
38
  <slot />
31
39
  </nav>
@@ -1,17 +1,24 @@
1
1
 
2
+ interface BreadcrumbItemProps {
3
+ /** An ID for the root element */
4
+ id?: string;
5
+ /** Class name(s) for the root element */
6
+ class?: string,
7
+ /** Whether this is the current page */
8
+ current?: boolean,
9
+ }
10
+
2
11
  /**
3
12
  * An item in a breadcrumb, containing a link to one of the parent pages of the
4
13
  * current page (or the current page).
5
- *
6
- * @prop {boolean | undefined} current -- Whether this is the current page
7
14
  */
8
- export default function BreadcrumbItem($props: any) {
15
+ export default function BreadcrumbItem($props: BreadcrumbItemProps | undefined) {
9
16
  @render {
10
17
  <div
11
- {$props.id}
12
- class={`torp-breadcrumb ${$props.class ?? ""}`.trim()}
13
- aria-current={$props.current ? "page" : undefined}
14
- data-current={$props.current ? "current" : undefined}
18
+ {$props?.id}
19
+ class={`torp-breadcrumb ${$props?.class ?? ""}`.trim()}
20
+ aria-current={$props?.current ? "page" : undefined}
21
+ data-current={$props?.current ? "current" : undefined}
15
22
  >
16
23
  <slot />
17
24
  </div>
@@ -1,13 +1,20 @@
1
1
 
2
+ interface BreadcrumbSeparatorProps {
3
+ /** An ID for the root element */
4
+ id?: string;
5
+ /** Class name(s) for the root element */
6
+ class?: string,
7
+ }
8
+
2
9
  /**
3
10
  * A separator between links in a Breadcrumb component. It is hidden from
4
11
  * screen readers.
5
12
  */
6
- export default function BreadcrumbSeparator($props: any) {
13
+ export default function BreadcrumbSeparator($props: BreadcrumbSeparatorProps | undefined) {
7
14
  @render {
8
15
  <div
9
- {$props.id}
10
- class={`torp-breadcrumb-separator ${$props.class ?? ""}`.trim()}
16
+ {$props?.id}
17
+ class={`torp-breadcrumb-separator ${$props?.class ?? ""}`.trim()}
11
18
  aria-hidden="true"
12
19
  >
13
20
  <slot />
@@ -1,54 +1,83 @@
1
1
  import { type SlotRender } from "@torpor/view";
2
2
 
3
3
 
4
+ interface BreadcrumbProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ /** An ARIA label for describing the popover to screen readers */
10
+ ariaLabel?: string | undefined,
11
+ }
12
+
4
13
  /**
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.
14
+ *
15
+ * A list of links to the parent pages of the current page in hierarchical order.
16
+ *
17
+ * See [the WAI ARIA guidelines for Breadcrumbs](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/).
18
+ *
19
+ * The structure of a Breadcrumb is:
20
+ *
21
+ * ```
22
+ * <Breadcrumb>
23
+ * <BreadcrumbItem />
24
+ * <BreadcrumbSeparator /> (optional)
25
+ * <BreadcrumbItem>
26
+ * ...
27
+ * </BreadcrumbItem>
28
+ * </Breadcrumb>
29
+ * ```
30
+ *
31
+ * You can separate BreadcrumbItems using BreadcrumbSeparators or by using CSS.
11
32
  */
12
33
  declare function Breadcrumb(
13
34
  $parent: ParentNode,
14
35
  $anchor: Node | null,
15
- $props: any,
36
+ $props: BreadcrumbProps | undefined,
16
37
  $context?: Record<PropertyKey, any>,
17
38
  $slots?: Record<string, SlotRender>,
18
39
  ): void;
19
40
 
20
41
 
21
42
 
43
+ interface BreadcrumbItemProps {
44
+ /** An ID for the root element */
45
+ id?: string;
46
+ /** Class name(s) for the root element */
47
+ class?: string,
48
+ /** Whether this is the current page */
49
+ current?: boolean,
50
+ }
51
+
22
52
  /**
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.
53
+ * An item in a breadcrumb, containing a link to one of the parent pages of the
54
+ * current page (or the current page).
29
55
  */
30
56
  declare function BreadcrumbItem(
31
57
  $parent: ParentNode,
32
58
  $anchor: Node | null,
33
- $props: any,
59
+ $props: BreadcrumbItemProps | undefined,
34
60
  $context?: Record<PropertyKey, any>,
35
61
  $slots?: Record<string, SlotRender>,
36
62
  ): void;
37
63
 
38
64
 
39
65
 
66
+ interface BreadcrumbSeparatorProps {
67
+ /** An ID for the root element */
68
+ id?: string;
69
+ /** Class name(s) for the root element */
70
+ class?: string,
71
+ }
72
+
40
73
  /**
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.
74
+ * A separator between links in a Breadcrumb component. It is hidden from
75
+ * screen readers.
47
76
  */
48
77
  declare function BreadcrumbSeparator(
49
78
  $parent: ParentNode,
50
79
  $anchor: Node | null,
51
- $props: any,
80
+ $props: BreadcrumbSeparatorProps | undefined,
52
81
  $context?: Record<PropertyKey, any>,
53
82
  $slots?: Record<string, SlotRender>,
54
83
  ): void;
@@ -7,7 +7,15 @@ import ChevronRight from "../icons/ChevronRight.torp";
7
7
 
8
8
  // TODO: Split this out into Calendar, CalendarHeader, CalendarPreviousTrigger, CalendarGrid etc
9
9
 
10
- export default function Calendar() {
10
+ interface CalendarProps {
11
+ /** An ID for the root element */
12
+ id?: string;
13
+ /** Class name(s) for the root element */
14
+ class?: string,
15
+ }
16
+
17
+ export default function Calendar($props: CalendarProps) {
18
+ $props ??= $watch({});
11
19
  $props.startOfWeek ??= 1;
12
20
  $props.selectable ??= false;
13
21
  $props.value ??= new Date();
@@ -24,10 +32,11 @@ export default function Calendar() {
24
32
  let $state = $watch({
25
33
  activeDate: $props.value,
26
34
  visibleDate: $props.value,
27
- //get days() {
28
- // // TODO: $cache
29
- // return buildDays($state.visibleDate, $props.startOfWeek)
30
- //},
35
+ get days() {
36
+ return $cache(() => {
37
+ return buildDays($state.visibleDate, $props.startOfWeek)
38
+ });
39
+ },
31
40
  });
32
41
 
33
42
  let visibleStartDate = $props.value;
@@ -41,8 +50,6 @@ export default function Calendar() {
41
50
  $context[CalendarContextName] = context;
42
51
 
43
52
  $run(() => {
44
- $state.days = buildDays($state.visibleDate, $props.startOfWeek)
45
-
46
53
  // HACK: Shouldn't need this
47
54
  if (refocus) {
48
55
  refocus = false;
@@ -211,27 +218,27 @@ export default function Calendar() {
211
218
 
212
219
  @render {
213
220
  <div
214
- {$props.id}
215
- class={`torp-calendar ${$props.class ?? ""}`.trim()}
221
+ {$props?.id}
222
+ class={`torp-calendar ${$props?.class ?? ""}`.trim()}
216
223
  &ref={container}
217
224
  >
218
- <div class={`torp-calendar-header ${$props.class ?? ""}`.trim()}>
219
- <button class={`torp-calendar-previous-trigger ${$props.class ?? ""}`.trim()} onclick={handlePrevMonth}>
225
+ <div class={`torp-calendar-header ${$props?.class ?? ""}`.trim()}>
226
+ <button class={`torp-calendar-previous-trigger ${$props?.class ?? ""}`.trim()} onclick={handlePrevMonth}>
220
227
  <slot name="prev-button">
221
228
  <ChevronLeft />
222
229
  </slot>
223
230
  </button>
224
- <span class={`torp-calendar-month-name ${$props.class ?? ""}`.trim()}>
231
+ <span class={`torp-calendar-month-name ${$props?.class ?? ""}`.trim()}>
225
232
  {monthNames[$state.visibleDate.getMonth()] + " " + $state.visibleDate.getFullYear()}
226
233
  </span>
227
- <button class={`torp-calendar-next-trigger ${$props.class ?? ""}`.trim()} onclick={handleNextMonth}>
234
+ <button class={`torp-calendar-next-trigger ${$props?.class ?? ""}`.trim()} onclick={handleNextMonth}>
228
235
  <slot name="next-button">
229
236
  <ChevronRight />
230
237
  </slot>
231
238
  </button>
232
239
  </div>
233
240
  <div
234
- class={`torp-calendar-grid ${$props.class ?? ""}`.trim()}
241
+ class={`torp-calendar-grid ${$props?.class ?? ""}`.trim()}
235
242
  tabindex={$props.selectable ? 0 : -1}
236
243
  onfocus={handleFocus}
237
244
  onkeydown={handleKey}
@@ -1,7 +1,15 @@
1
1
  import { areDatesEqual } from "../utils/dateUtils";
2
2
  import { type CalendarContext, type CalendarEvent, CalendarContextName } from "./CalendarTypes";
3
3
 
4
- export default function CalendarDay() {
4
+ interface CalendarDayProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ }
10
+
11
+ export default function CalendarDay($props: CalendarDayProps) {
12
+ $props ??= $watch({});
5
13
  $props.date ??= new Date();
6
14
  $props.selectable ??= false;
7
15
  $props.muted ??= false;
@@ -40,9 +48,9 @@ export default function CalendarDay() {
40
48
 
41
49
  @render {
42
50
  <div
43
- {$props.id}
51
+ {$props?.id}
44
52
  class={[
45
- `torp-calendar-day ${$props.class ?? ""}`.trim(),
53
+ `torp-calendar-day ${$props?.class ?? ""}`.trim(),
46
54
  {
47
55
  muted: $props.muted,
48
56
  today: isToday(),
@@ -57,7 +65,7 @@ export default function CalendarDay() {
57
65
  } else {
58
66
  <span>{date.getDate()}</span>
59
67
  }
60
- <ul class={`torp-calendar-day-events ${$props.class ?? ""}`.trim()}>
68
+ <ul class={`torp-calendar-day-events ${$props?.class ?? ""}`.trim()}>
61
69
  @for (ev of $props.events) {
62
70
  <li title={ev.content} />
63
71
  }
@@ -1,36 +1,34 @@
1
1
  import { type SlotRender } from "@torpor/view";
2
2
 
3
3
 
4
- /**
5
- * Mounts or hydrates the component into the supplied parent node.
6
- * @param $parent -- The parent node.
7
- * @param $anchor -- The node to mount the component before.
8
- * @param $props -- The values that have been passed into the component as properties.
9
- * @param $context -- Values that have been passed into the component from its ancestors.
10
- * @param $slots -- Functions for rendering children into slot nodes within the component.
11
- */
4
+ interface CalendarProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ }
10
+
12
11
  declare function Calendar(
13
12
  $parent: ParentNode,
14
13
  $anchor: Node | null,
15
- $props?: Record<PropertyKey, any>,
14
+ $props: CalendarProps,
16
15
  $context?: Record<PropertyKey, any>,
17
16
  $slots?: Record<string, SlotRender>,
18
17
  ): void;
19
18
 
20
19
 
21
20
 
22
- /**
23
- * Mounts or hydrates the component into the supplied parent node.
24
- * @param $parent -- The parent node.
25
- * @param $anchor -- The node to mount the component before.
26
- * @param $props -- The values that have been passed into the component as properties.
27
- * @param $context -- Values that have been passed into the component from its ancestors.
28
- * @param $slots -- Functions for rendering children into slot nodes within the component.
29
- */
21
+ interface CalendarDayProps {
22
+ /** An ID for the root element */
23
+ id?: string;
24
+ /** Class name(s) for the root element */
25
+ class?: string,
26
+ }
27
+
30
28
  declare function CalendarDay(
31
29
  $parent: ParentNode,
32
30
  $anchor: Node | null,
33
- $props?: Record<PropertyKey, any>,
31
+ $props: CalendarDayProps,
34
32
  $context?: Record<PropertyKey, any>,
35
33
  $slots?: Record<string, SlotRender>,
36
34
  ): void;
@@ -0,0 +1,125 @@
1
+ import { ContextualContextName, type Point, type ContextualContext, type ContextualState } from "./ContextualTypes";
2
+
3
+ interface ContextualProps {
4
+ /** An ID for the root element */
5
+ id?: string;
6
+ /** Class name(s) for the root element */
7
+ class?: string,
8
+ /** Whether the contextual is modal. If true, an overlay should be supplied to obscure outside content, and only the context content will be visible to screen readers */
9
+ modal?: boolean,
10
+ /** Whether the contextual is visible */
11
+ visible?: boolean,
12
+ /** The element to anchor this contextual to, as an alternative to supplying a ContextualTrigger */
13
+ anchor?: HTMLElement,
14
+ /** The position to display this contextual at */
15
+ position?: Point,
16
+ /** A function to be called when the user selects a response */
17
+ callback?: ((value: any) => void),
18
+ /** Raised when this contextual is opened or closed */
19
+ ontoggle?: (open: boolean) => void,
20
+ /** Raised when the contextual has opened */
21
+ onopen?: () => void,
22
+ /** Raised when the contextual has closed */
23
+ onclose?: (result: any) => void,
24
+ }
25
+
26
+ /**
27
+ * A contextual window that is shown to the user at the cursor's location.
28
+ *
29
+ * The structure of a Contextual is:
30
+ *
31
+ * ```
32
+ * <Contextual>
33
+ * <ContextualTrigger /> (optional)
34
+ * <ContextualContent />
35
+ * </Contextual>
36
+ * ```
37
+ */
38
+ export default function Contextual($props: ContextualProps | undefined) {
39
+ let $state: ContextualState = $watch({
40
+ visible: false,
41
+ position: { x: 0, y: 0 }
42
+ })
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
+
55
+ let result: any;
56
+
57
+ // Set the context to pass down to items
58
+ let context: ContextualContext = {
59
+ handleButton,
60
+ handleClickOutside,
61
+ state: $state,
62
+ modal: $props?.modal,
63
+ anchorElement: $props?.anchor ? $unwrap($props.anchor) : undefined,
64
+ };
65
+ $context[ContextualContextName] = context;
66
+
67
+ // Dispatch the toggle event when the contextual is opened or closed
68
+ let firstToggle = true;
69
+ $run(() => {
70
+ const ontoggle = $props?.ontoggle;
71
+ const onopen = $props?.onopen;
72
+ const onclose = $props?.onclose;
73
+ const visible = $state.visible;
74
+ if (firstToggle) {
75
+ firstToggle = false;
76
+ } else {
77
+ if (ontoggle) ontoggle(visible);
78
+ if (visible) {
79
+ if (onopen) onopen()
80
+ } else {
81
+ if (onclose) onclose(result);
82
+ }
83
+ }
84
+ });
85
+
86
+ function handleButton(type: "confirm" | "cancel" | undefined, value?: any) {
87
+ // Get the button's result
88
+ switch (type) {
89
+ case "confirm": {
90
+ result = value || true;
91
+ break;
92
+ }
93
+ case "cancel": {
94
+ result = value || false;
95
+ break;
96
+ }
97
+ default: {
98
+ result = value;
99
+ break;
100
+ }
101
+ }
102
+
103
+ // Hide the contextual
104
+ $state.visible = false;
105
+
106
+ // Call the callback
107
+ if ($props?.callback) {
108
+ $props.callback(result);
109
+ }
110
+ }
111
+
112
+ function handleClickOutside(e: MouseEvent) {
113
+ e.preventDefault();
114
+ $state.visible = false;
115
+ }
116
+
117
+ @render {
118
+ <div
119
+ {$props?.id}
120
+ class={`torp-context ${$props?.class ?? ""}`.trim()}
121
+ >
122
+ <slot />
123
+ </div>
124
+ }
125
+ }
@@ -2,21 +2,28 @@
2
2
  import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
3
3
  import getScrollParent from "../utils/getScrollParent";
4
4
  import setContextPosition from "../utils/setContextPosition";
5
- import { PopoverContextName, type PopoverContext } from "./PopoverTypes";
5
+ import { ContextualContextName, type ContextualContext } from "./ContextualTypes";
6
+
7
+ interface ContextualContentProps {
8
+ /** An ID for the root element */
9
+ id?: string;
10
+ /** Class name(s) for the root element */
11
+ class?: string,
12
+ }
6
13
 
7
14
  /**
8
- * The content that is displayed for a Popover when it is open, displayed at the
15
+ * The content that is displayed for a Contextual when it is open, displayed at the
9
16
  * position that the user right-clicked.
10
17
  */
11
- export default function PopoverContentContextual($props: any) {
18
+ export default function ContextualContent($props: ContextualContentProps | undefined) {
12
19
  let div: HTMLDivElement;
13
20
  let shown = false;
14
21
  let closeOnClick = false;
15
22
 
16
- // Get stuff out of the PopoverContext
17
- const context = $context[PopoverContextName] as PopoverContext;
23
+ // Get stuff out of the ContextualContext
24
+ const context = $context[ContextualContextName] as ContextualContext;
18
25
  if (!context) {
19
- throw new Error("PopoverContentContextual must be contained within a Popover");
26
+ throw new Error("ContextualContent must be contained within a Contextual");
20
27
  }
21
28
  let $state = context.state;
22
29
 
@@ -37,7 +44,8 @@ export default function PopoverContentContextual($props: any) {
37
44
 
38
45
  // Set the position and listen for window resize and scroll to reset the position
39
46
  setPosition();
40
- const scrollParent = getScrollParent(context.anchorElement)
47
+ const anchorElement = context.anchorElement!;
48
+ const scrollParent = getScrollParent(anchorElement)
41
49
  scrollParent.addEventListener("resize", setPosition);
42
50
  scrollParent.addEventListener("scroll", setPosition);
43
51
  if (context.focusFirstElement) {
@@ -52,11 +60,12 @@ export default function PopoverContentContextual($props: any) {
52
60
  removeDocumentEvent("click", handleDocumentClick);
53
61
 
54
62
  // Stop listening for window resize and focus the anchor element per WAI guidelines
55
- const scrollParent = getScrollParent(context.anchorElement)
63
+ const anchorElement = context.anchorElement!;
64
+ const scrollParent = getScrollParent(anchorElement)
56
65
  scrollParent.removeEventListener("resize", setPosition);
57
66
  scrollParent.removeEventListener("scroll", setPosition);
58
- if (context.anchorElement?.focus) {
59
- context.anchorElement.focus();
67
+ if (anchorElement.focus) {
68
+ anchorElement.focus();
60
69
  }
61
70
  }
62
71
 
@@ -88,8 +97,8 @@ export default function PopoverContentContextual($props: any) {
88
97
  @render {
89
98
  @if ($state.visible) {
90
99
  <div
91
- {$props.id}
92
- class={`torp-popover-content-contextual ${$props.class ?? ""}`.trim()}
100
+ {$props?.id}
101
+ class={`torp-popover-content-contextual ${$props?.class ?? ""}`.trim()}
93
102
  &ref={div}
94
103
  onmount={show}
95
104
  >
@@ -0,0 +1,66 @@
1
+ import { ContextualContextName, type ContextualContext } from "./ContextualTypes";
2
+ import hoverTrigger from "../mount/hoverTrigger";
3
+
4
+ interface ContextualTriggerProps {
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
+ }
12
+
13
+ /**
14
+ * The element that causes a Contextual to appear or disappear when right-clicked.
15
+ */
16
+ export default function ContextualTrigger($props: ContextualTriggerProps | undefined) {
17
+ let activation = $props?.activation ?? "press";
18
+
19
+ // Get stuff out of the ContextualContext
20
+ const context = $context[ContextualContextName] as ContextualContext;
21
+ if (!context) {
22
+ throw new Error("ContextualTrigger must be contained within a Contextual");
23
+ }
24
+ let $state = context.state;
25
+
26
+ function handleContextualMenu(e: MouseEvent & { currentTarget: EventTarget & HTMLDivElement }) {
27
+ if (activation !== "press") return;
28
+
29
+ e.preventDefault();
30
+ if ($state.position) {
31
+ // Get the position relative to the element, so we can reposition on scroll
32
+ const rect = e.currentTarget.getBoundingClientRect();
33
+ const x = e.clientX - rect.left;
34
+ const y = e.clientY - rect.top;
35
+ $state.position = { x, y };
36
+ //$state.position = { x: window.scrollX + e.clientX, y: window.scrollY + e.clientY };
37
+ }
38
+ $state.visible = !$state.visible;
39
+ }
40
+
41
+ function handleHover(node: HTMLElement, e: MouseEvent) {
42
+ if (activation !== "hover") return;
43
+
44
+ if ($state.position) {
45
+ // Get the position relative to the element, so we can reposition on scroll
46
+ const rect = node.getBoundingClientRect();
47
+ const x = e.clientX - rect.left;
48
+ const y = e.clientY - rect.top;
49
+ $state.position = { x, y };
50
+ //$state.position = { x: window.scrollX + e.clientX, y: window.scrollY + e.clientY };
51
+ }
52
+ $state.visible = !$state.visible
53
+ }
54
+
55
+ @render {
56
+ <div
57
+ {$props?.id}
58
+ class={`torp-popover-trigger-contextual ${$props?.class ?? ""}`.trim()}
59
+ oncontextmenu={handleContextualMenu}
60
+ onmount={(el) => hoverTrigger(el, { onHover: handleHover, onExit: handleHover })}
61
+ &ref={context.anchorElement}
62
+ >
63
+ <slot />
64
+ </div>
65
+ }
66
+ }
@@ -0,0 +1,30 @@
1
+ export const ContextualContextName = "Contextual";
2
+
3
+ /** The shared context for popover components (Contextual, Prompt and Contextual) */
4
+ export interface ContextualContext {
5
+ handleButton: (type: "confirm" | "cancel" | undefined, value?: any) => void;
6
+ // HACK: We need to be able to let children (i.e. Dialogs) override the click outside functionality
7
+ // There may be a more elegant way to accomplish this too
8
+ handleClickOutside?: (e: MouseEvent) => void;
9
+ state: ContextualState;
10
+ //modal: boolean;
11
+ anchorElement?: HTMLElement;
12
+ // HACK: focusFirstElement is necessary because if we focus the first element e.g. in a Dialog's
13
+ // onMount, it will scroll the page to the focused element and mess up our careful positioning
14
+ // We need to be able to manually set the order to
15
+ // 1. set visible (so we have an element with content)
16
+ // 2. set position (so the element is in the right place)
17
+ // 3. set focus (for accessibility)
18
+ // There may be a more elegant way to accomplish this!
19
+ focusFirstElement?: () => void;
20
+ }
21
+
22
+ export interface ContextualState {
23
+ visible: boolean;
24
+ position: Point;
25
+ }
26
+
27
+ export interface Point {
28
+ x: number;
29
+ y: number;
30
+ }