@torpor/ui 0.2.1 → 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 (290) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/Accordion/Accordion.torp +29 -22
  3. package/dist/Accordion/AccordionContent.torp +7 -8
  4. package/dist/Accordion/AccordionHeader.torp +4 -6
  5. package/dist/Accordion/AccordionItem.torp +15 -12
  6. package/dist/Accordion/AccordionTrigger.torp +6 -7
  7. package/dist/Accordion/AccordionTypes.ts +4 -3
  8. package/dist/Accordion/index.d.ts +5 -5
  9. package/dist/Breadcrumb/Breadcrumb.torp +9 -10
  10. package/dist/Breadcrumb/BreadcrumbItem.torp +5 -7
  11. package/dist/Breadcrumb/BreadcrumbSeparator.torp +3 -5
  12. package/dist/Breadcrumb/index.d.ts +8 -7
  13. package/dist/Calendar/Calendar.torp +12 -13
  14. package/dist/Calendar/CalendarDay.torp +3 -3
  15. package/dist/Contextual/Contextual.torp +125 -0
  16. package/dist/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +15 -15
  17. package/dist/Contextual/ContextualTrigger.torp +66 -0
  18. package/dist/Contextual/ContextualTypes.ts +30 -0
  19. package/dist/Contextual/index.d.ts +90 -0
  20. package/dist/Contextual/index.js +14 -0
  21. package/dist/Contextual/index.js.map +1 -0
  22. package/dist/Dialog/Dialog.torp +38 -72
  23. package/dist/Dialog/DialogBody.torp +6 -8
  24. package/dist/Dialog/DialogButton.torp +14 -12
  25. package/dist/Dialog/DialogFooter.torp +3 -5
  26. package/dist/Dialog/DialogHeader.torp +6 -8
  27. package/dist/Dialog/DialogTypes.ts +3 -2
  28. package/dist/Dialog/index.d.ts +16 -11
  29. package/dist/Disclosure/Disclosure.torp +22 -23
  30. package/dist/Disclosure/DisclosureContent.torp +7 -8
  31. package/dist/Disclosure/DisclosureHeader.torp +5 -7
  32. package/dist/Disclosure/DisclosureTrigger.torp +7 -8
  33. package/dist/Disclosure/DisclosureTypes.ts +0 -1
  34. package/dist/Disclosure/index.d.ts +12 -12
  35. package/dist/Drawer/Drawer.torp +101 -70
  36. package/dist/Drawer/DrawerContent.torp +80 -0
  37. package/dist/Drawer/DrawerOverlay.torp +38 -0
  38. package/dist/Drawer/DrawerTrigger.torp +35 -0
  39. package/dist/Drawer/DrawerTypes.ts +24 -0
  40. package/dist/Drawer/index.d.ts +90 -3
  41. package/dist/Drawer/index.js +13 -1
  42. package/dist/Form/Field.torp +2 -4
  43. package/dist/Form/Form.torp +7 -9
  44. package/dist/Form/Input.torp +20 -17
  45. package/dist/Form/Label.torp +1 -1
  46. package/dist/Form/Message.torp +1 -1
  47. package/dist/Form/index.d.ts +18 -4
  48. package/dist/Menu/Menu.torp +16 -15
  49. package/dist/Menu/MenuButton.torp +19 -13
  50. package/dist/Menu/MenuCheck.torp +18 -14
  51. package/dist/Menu/MenuGroup.torp +4 -6
  52. package/dist/Menu/MenuIndicator.torp +5 -7
  53. package/dist/Menu/MenuPopout.torp +12 -15
  54. package/dist/Menu/MenuPopoutContent.torp +6 -8
  55. package/dist/Menu/MenuPopoutTrigger.torp +12 -14
  56. package/dist/Menu/MenuRadio.torp +14 -14
  57. package/dist/Menu/MenuRadioGroup.torp +22 -14
  58. package/dist/Menu/MenuSeparator.torp +3 -5
  59. package/dist/Menu/MenuTypes.ts +7 -5
  60. package/dist/Menu/index.d.ts +28 -22
  61. package/dist/MenuBar/MenuBar.torp +13 -14
  62. package/dist/MenuBar/MenuBarItem.torp +13 -16
  63. package/dist/MenuBar/MenuBarItemContent.torp +7 -9
  64. package/dist/MenuBar/MenuBarItemTrigger.torp +6 -9
  65. package/dist/MenuBar/index.d.ts +16 -16
  66. package/dist/Modal/Modal.torp +118 -0
  67. package/dist/Modal/ModalContent.torp +77 -0
  68. package/dist/Modal/ModalOverlay.torp +38 -0
  69. package/dist/Modal/ModalTrigger.torp +50 -0
  70. package/dist/Modal/ModalTypes.ts +22 -0
  71. package/dist/Modal/index.d.ts +108 -0
  72. package/dist/Modal/index.js +33 -0
  73. package/dist/Modal/index.js.map +1 -0
  74. package/dist/Modal/showModal.ts +19 -0
  75. package/dist/Modal/showPrompt.ts +23 -0
  76. package/dist/NavMenu/NavMenu.torp +7 -8
  77. package/dist/NavMenu/NavMenuButton.torp +6 -8
  78. package/dist/NavMenu/NavMenuElement.torp +8 -8
  79. package/dist/NavMenu/NavMenuGroup.torp +4 -6
  80. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -6
  81. package/dist/NavMenu/NavMenuLink.torp +8 -11
  82. package/dist/NavMenu/NavMenuPopout.torp +25 -17
  83. package/dist/NavMenu/NavMenuPopoutButton.torp +12 -13
  84. package/dist/NavMenu/NavMenuPopoutContent.torp +12 -12
  85. package/dist/NavMenu/NavMenuSeparator.torp +3 -5
  86. package/dist/NavMenu/index.d.ts +17 -11
  87. package/dist/Notification/Notification.torp +22 -13
  88. package/dist/Notification/NotificationClose.torp +3 -5
  89. package/dist/Notification/NotificationContainer.torp +3 -5
  90. package/dist/Notification/NotificationContent.torp +3 -5
  91. package/dist/Notification/index.d.ts +4 -4
  92. package/dist/Popover/Popover.torp +31 -25
  93. package/dist/Popover/PopoverContent.torp +35 -10
  94. package/dist/Popover/PopoverTrigger.torp +24 -4
  95. package/dist/Popover/PopoverTypes.ts +1 -1
  96. package/dist/Popover/index.d.ts +16 -124
  97. package/dist/Popover/index.js +1 -163
  98. package/dist/Popover/index.js.map +1 -1
  99. package/dist/TabGroup/TabContent.torp +12 -9
  100. package/dist/TabGroup/TabGroup.torp +41 -35
  101. package/dist/TabGroup/TabGroupTypes.ts +10 -5
  102. package/dist/TabGroup/TabHeader.torp +15 -8
  103. package/dist/TabGroup/TabList.torp +4 -6
  104. package/dist/TabGroup/TabTrigger.torp +8 -9
  105. package/dist/TabGroup/index.d.ts +14 -6
  106. package/dist/icons/ArrowDown.torp +3 -1
  107. package/dist/icons/ArrowLeft.torp +3 -1
  108. package/dist/icons/ArrowRight.torp +3 -1
  109. package/dist/icons/ArrowUp.torp +3 -1
  110. package/dist/icons/Bars.torp +3 -1
  111. package/dist/icons/Check.torp +3 -1
  112. package/dist/icons/ChevronDown.torp +3 -1
  113. package/dist/icons/ChevronLeft.torp +3 -1
  114. package/dist/icons/ChevronRight.torp +3 -1
  115. package/dist/icons/ChevronUp.torp +3 -1
  116. package/dist/icons/Cross.torp +3 -1
  117. package/dist/icons/IconTypes.ts +6 -0
  118. package/dist/icons/Loading.torp +3 -1
  119. package/dist/icons/Minus.torp +3 -1
  120. package/dist/icons/Plus.torp +3 -1
  121. package/dist/icons/index.d.ts +271 -14
  122. package/dist/index.d.ts +17 -4
  123. package/dist/metafile-esm.json +1 -1
  124. package/dist/motion/fade.ts +15 -6
  125. package/dist/motion/grow.ts +23 -0
  126. package/dist/motion/index.d.ts +19 -2
  127. package/dist/motion/index.js +93 -3
  128. package/dist/motion/index.js.map +1 -1
  129. package/dist/motion/measure.ts +28 -0
  130. package/dist/motion/slide.ts +45 -0
  131. package/dist/mount/clickPopover.ts +51 -0
  132. package/dist/mount/contextPopover.ts +51 -0
  133. package/dist/mount/hoverPopover.ts +58 -0
  134. package/package.json +21 -14
  135. package/scripts/postbuild.ts +11 -1
  136. package/src/Accordion/Accordion.torp +29 -22
  137. package/src/Accordion/AccordionContent.torp +7 -8
  138. package/src/Accordion/AccordionHeader.torp +4 -6
  139. package/src/Accordion/AccordionItem.torp +15 -12
  140. package/src/Accordion/AccordionTrigger.torp +6 -7
  141. package/src/Accordion/AccordionTypes.ts +4 -3
  142. package/src/Breadcrumb/Breadcrumb.torp +9 -10
  143. package/src/Breadcrumb/BreadcrumbItem.torp +5 -7
  144. package/src/Breadcrumb/BreadcrumbSeparator.torp +3 -5
  145. package/src/Calendar/Calendar.torp +12 -13
  146. package/src/Calendar/CalendarDay.torp +3 -3
  147. package/src/Contextual/Contextual.torp +125 -0
  148. package/src/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +15 -15
  149. package/src/Contextual/ContextualTrigger.torp +66 -0
  150. package/src/Contextual/ContextualTypes.ts +30 -0
  151. package/src/Contextual/index.ts +5 -0
  152. package/src/Dialog/Dialog.torp +38 -72
  153. package/src/Dialog/DialogBody.torp +6 -8
  154. package/src/Dialog/DialogButton.torp +14 -12
  155. package/src/Dialog/DialogFooter.torp +3 -5
  156. package/src/Dialog/DialogHeader.torp +6 -8
  157. package/src/Dialog/DialogTypes.ts +3 -2
  158. package/src/Disclosure/Disclosure.torp +22 -23
  159. package/src/Disclosure/DisclosureContent.torp +7 -8
  160. package/src/Disclosure/DisclosureHeader.torp +5 -7
  161. package/src/Disclosure/DisclosureTrigger.torp +7 -8
  162. package/src/Disclosure/DisclosureTypes.ts +0 -1
  163. package/src/Drawer/Drawer.torp +101 -70
  164. package/src/Drawer/DrawerContent.torp +80 -0
  165. package/src/Drawer/DrawerOverlay.torp +38 -0
  166. package/src/Drawer/DrawerTrigger.torp +35 -0
  167. package/src/Drawer/DrawerTypes.ts +24 -0
  168. package/src/Drawer/index.ts +4 -1
  169. package/src/Form/Field.torp +2 -4
  170. package/src/Form/Form.torp +7 -9
  171. package/src/Form/Input.torp +20 -17
  172. package/src/Form/Label.torp +1 -1
  173. package/src/Form/Message.torp +1 -1
  174. package/src/Menu/Menu.torp +16 -15
  175. package/src/Menu/MenuButton.torp +19 -13
  176. package/src/Menu/MenuCheck.torp +18 -14
  177. package/src/Menu/MenuGroup.torp +4 -6
  178. package/src/Menu/MenuIndicator.torp +5 -7
  179. package/src/Menu/MenuPopout.torp +12 -15
  180. package/src/Menu/MenuPopoutContent.torp +6 -8
  181. package/src/Menu/MenuPopoutTrigger.torp +12 -14
  182. package/src/Menu/MenuRadio.torp +14 -14
  183. package/src/Menu/MenuRadioGroup.torp +22 -14
  184. package/src/Menu/MenuSeparator.torp +3 -5
  185. package/src/Menu/MenuTypes.ts +7 -5
  186. package/src/MenuBar/MenuBar.torp +13 -14
  187. package/src/MenuBar/MenuBarItem.torp +13 -16
  188. package/src/MenuBar/MenuBarItemContent.torp +7 -9
  189. package/src/MenuBar/MenuBarItemTrigger.torp +6 -9
  190. package/src/Modal/Modal.torp +118 -0
  191. package/src/Modal/ModalContent.torp +77 -0
  192. package/src/Modal/ModalOverlay.torp +38 -0
  193. package/src/Modal/ModalTrigger.torp +50 -0
  194. package/src/Modal/ModalTypes.ts +22 -0
  195. package/src/Modal/index.ts +10 -0
  196. package/src/Modal/showModal.ts +19 -0
  197. package/src/Modal/showPrompt.ts +23 -0
  198. package/src/NavMenu/NavMenu.torp +7 -8
  199. package/src/NavMenu/NavMenuButton.torp +6 -8
  200. package/src/NavMenu/NavMenuElement.torp +8 -8
  201. package/src/NavMenu/NavMenuGroup.torp +4 -6
  202. package/src/NavMenu/NavMenuGroupHeader.torp +5 -6
  203. package/src/NavMenu/NavMenuLink.torp +8 -11
  204. package/src/NavMenu/NavMenuPopout.torp +25 -17
  205. package/src/NavMenu/NavMenuPopoutButton.torp +12 -13
  206. package/src/NavMenu/NavMenuPopoutContent.torp +12 -12
  207. package/src/NavMenu/NavMenuSeparator.torp +3 -5
  208. package/src/Notification/Notification.torp +22 -13
  209. package/src/Notification/NotificationClose.torp +3 -5
  210. package/src/Notification/NotificationContainer.torp +3 -5
  211. package/src/Notification/NotificationContent.torp +3 -5
  212. package/src/Popover/Popover.torp +31 -25
  213. package/src/Popover/PopoverContent.torp +35 -10
  214. package/src/Popover/PopoverTrigger.torp +24 -4
  215. package/src/Popover/PopoverTypes.ts +1 -1
  216. package/src/Popover/index.ts +1 -24
  217. package/src/Slider/Slider.torp +3 -3
  218. package/src/TabGroup/TabContent.torp +12 -9
  219. package/src/TabGroup/TabGroup.torp +41 -35
  220. package/src/TabGroup/TabGroupTypes.ts +10 -5
  221. package/src/TabGroup/TabHeader.torp +15 -8
  222. package/src/TabGroup/TabList.torp +4 -6
  223. package/src/TabGroup/TabTrigger.torp +8 -9
  224. package/src/icons/ArrowDown.torp +3 -1
  225. package/src/icons/ArrowLeft.torp +3 -1
  226. package/src/icons/ArrowRight.torp +3 -1
  227. package/src/icons/ArrowUp.torp +3 -1
  228. package/src/icons/Bars.torp +3 -1
  229. package/src/icons/Check.torp +3 -1
  230. package/src/icons/ChevronDown.torp +3 -1
  231. package/src/icons/ChevronLeft.torp +3 -1
  232. package/src/icons/ChevronRight.torp +3 -1
  233. package/src/icons/ChevronUp.torp +3 -1
  234. package/src/icons/Cross.torp +3 -1
  235. package/src/icons/IconTypes.ts +6 -0
  236. package/src/icons/Loading.torp +3 -1
  237. package/src/icons/Minus.torp +3 -1
  238. package/src/icons/Plus.torp +3 -1
  239. package/src/motion/fade.ts +15 -6
  240. package/src/motion/grow.ts +23 -0
  241. package/src/motion/index.ts +4 -1
  242. package/src/motion/measure.ts +28 -0
  243. package/src/motion/slide.ts +45 -0
  244. package/src/mount/clickPopover.ts +51 -0
  245. package/src/mount/contextPopover.ts +51 -0
  246. package/src/mount/hoverPopover.ts +58 -0
  247. package/test/Accordion/components/AccordionAccessibility.torp +1 -3
  248. package/test/Accordion/components/AccordionKeyboard.torp +1 -3
  249. package/test/Accordion/components/AccordionList.torp +1 -3
  250. package/test/Accordion/components/AccordionMultiple.torp +2 -4
  251. package/test/Accordion/components/AccordionSingle.torp +2 -4
  252. package/test/Dialog/accessibility-modal.test.ts +2 -2
  253. package/test/Dialog/components/DialogAccessibility.torp +8 -14
  254. package/test/Dialog/components/DialogFunction.torp +20 -4
  255. package/test/Dialog/components/DialogModal.torp +30 -0
  256. package/test/Dialog/components/DialogVariable.torp +7 -7
  257. package/test/Disclosure/components/DisclosureTest.torp +1 -3
  258. package/test/Menu/components/MenuAccessibility.torp +5 -5
  259. package/test/Menu/components/MenuBasic.torp +5 -5
  260. package/test/Notification/components/NotificationFunction.torp +0 -3
  261. package/test/Notification/components/NotificationVariable.torp +1 -1
  262. package/test/Popover/components/PopoverFunction.torp +37 -0
  263. package/test/Popover/components/PopoverTrigger.torp +36 -0
  264. package/test/Popover/components/{PromptVariable.torp → PopoverVariable.torp} +5 -3
  265. package/test/Popover/function.test.ts +2 -7
  266. package/test/Popover/trigger.test.ts +27 -0
  267. package/test/Popover/variable.test.ts +2 -2
  268. package/test/TabGroup/components/TabGroupAccessibility.torp +1 -3
  269. package/test/TabGroup/components/TabGroupKeyboard.torp +1 -3
  270. package/test/TabGroup/components/TabGroupList.torp +1 -3
  271. package/test/TabGroup/components/TabGroupTrigger.torp +1 -3
  272. package/tsup.config.ts +2 -0
  273. package/dist/Popover/PopoverContentAnchored.torp +0 -113
  274. package/dist/Popover/PopoverOverlay.torp +0 -39
  275. package/dist/Popover/PopoverTriggerContextual.torp +0 -46
  276. package/dist/Popover/PopoverTriggerHover.torp +0 -47
  277. package/dist/Popover/mountClickPopover.ts +0 -50
  278. package/dist/Popover/mountContextPopover.ts +0 -50
  279. package/dist/Popover/mountHoverPopover.ts +0 -57
  280. package/dist/Popover/showPopoverPrompt.ts +0 -23
  281. package/src/Popover/PopoverContentAnchored.torp +0 -113
  282. package/src/Popover/PopoverOverlay.torp +0 -39
  283. package/src/Popover/PopoverTriggerContextual.torp +0 -46
  284. package/src/Popover/PopoverTriggerHover.torp +0 -47
  285. package/src/Popover/mountClickPopover.ts +0 -50
  286. package/src/Popover/mountContextPopover.ts +0 -50
  287. package/src/Popover/mountHoverPopover.ts +0 -57
  288. package/src/Popover/showPopoverPrompt.ts +0 -23
  289. package/test/Dialog/components/CustomDialog.torp +0 -20
  290. package/test/Popover/components/PromptFunction.torp +0 -19
@@ -0,0 +1,38 @@
1
+ import { disableScroll } from "../mount/disableScroll";
2
+ import { DrawerContextName, type DrawerContext } from "./DrawerTypes";
3
+
4
+ interface DrawerOverlayProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Class name(s) for the root element */
8
+ class?: string,
9
+ }
10
+
11
+ /**
12
+ * The background overlay for a Drawer component.
13
+ * Adding an overlay automatically sets the component's `modal` value to true.
14
+ */
15
+ export default function DrawerOverlay($props: DrawerOverlayProps | undefined) {
16
+ // Get stuff out of the DrawerContext
17
+ const context = $context[DrawerContextName] as DrawerContext;
18
+ if (!context) {
19
+ throw new Error("DrawerOverlay must be contained within a Drawer");
20
+ }
21
+ let $state = context.state;
22
+
23
+ // Any drawer with an overlay is modal
24
+ $state.modal = true;
25
+
26
+ @render {
27
+ @if ($state.visible) {
28
+ <div
29
+ {$props?.id}
30
+ class={`torp-drawer-overlay ${$props?.class ?? ""}`.trim()}
31
+ tabindex="-1"
32
+ onmount={(el) => disableScroll(el)}
33
+ >
34
+ <slot />
35
+ </div>
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,35 @@
1
+ import { DrawerContextName, type DrawerContext } from "./DrawerTypes";
2
+
3
+ interface DrawerTriggerProps {
4
+ /** An ID for the root element */
5
+ id?: string;
6
+ /** Class name(s) for the root element */
7
+ class?: string,
8
+ }
9
+
10
+ /**
11
+ * The button that causes a Drawer to appear or disappear.
12
+ */
13
+ export default function DrawerTrigger($props: DrawerTriggerProps | undefined) {
14
+ // Get stuff out of the DrawerContext
15
+ const context = $context[DrawerContextName] as DrawerContext;
16
+ if (!context) {
17
+ throw new Error("DrawerTrigger must be contained within a Drawer");
18
+ }
19
+ let $state = context.state;
20
+
21
+ function handleClick() {
22
+ $state.visible = !$state.visible;
23
+ }
24
+
25
+ @render {
26
+ <button
27
+ type="button"
28
+ {$props?.id}
29
+ class={`torp-drawer-trigger ${$props?.class ?? ""}`.trim()}
30
+ onclick={handleClick}
31
+ >
32
+ <slot />
33
+ </button>
34
+ }
35
+ }
@@ -0,0 +1,24 @@
1
+ export const DrawerContextName = "Drawer";
2
+
3
+ /** The shared context for drawer components (Contextual, Prompt and Drawer) */
4
+ export interface DrawerContext {
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: DrawerState;
10
+ // HACK: focusFirstElement is necessary because if we focus the first element e.g. in a Dialog's
11
+ // onMount, it will scroll the page to the focused element and mess up our careful positioning
12
+ // We need to be able to manually set the order to
13
+ // 1. set visible (so we have an element with content)
14
+ // 2. set position (so the element is in the right place)
15
+ // 3. set focus (for accessibility)
16
+ // There may be a more elegant way to accomplish this!
17
+ focusFirstElement?: () => void;
18
+ }
19
+
20
+ export interface DrawerState {
21
+ visible: boolean;
22
+ modal: boolean;
23
+ position: "left" | "right" | "top" | "bottom";
24
+ }
@@ -6,16 +6,103 @@ interface DrawerProps {
6
6
  id?: string;
7
7
  /** Class name(s) for the root element */
8
8
  class?: string,
9
+ /** Whether the drawer is modal. If true, an overlay should be supplied to obscure outside content, and only the drawer content will be visible to screen readers */
10
+ modal?: boolean,
11
+ /** Whether the drawer is visible */
9
12
  visible?: boolean,
10
- position?: "left" | "right",
13
+ /** Which side of the window to show the drawer from */
14
+ position?: "left" | "right" | "top" | "bottom",
15
+ /** A function to be called when the user selects a response */
16
+ callback?: ((value: any) => void),
17
+ /** Raised when the drawer is opened or closed */
18
+ ontoggle?: (open: boolean) => void,
19
+ /** Raised when the drawer has opened */
20
+ onopen?: () => void,
21
+ /** Raised when the drawer has closed */
22
+ onclose?: (result: any) => void,
11
23
  }
12
24
 
25
+ /**
26
+ * A drawer that can be used to show rich content or obtain information from a user.
27
+ *
28
+ * See [the WAI ARIA guidelines for Dialogs](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/).
29
+ *
30
+ * The structure of a Drawer is:
31
+ *
32
+ * ```
33
+ * <Drawer>
34
+ * <DrawerTrigger /> (optional)
35
+ * <DrawerContent />
36
+ * </Drawer>
37
+ * ```
38
+ */
13
39
  declare function Drawer(
14
40
  $parent: ParentNode,
15
41
  $anchor: Node | null,
16
- $props: DrawerProps,
42
+ $props: DrawerProps | undefined,
17
43
  $context?: Record<PropertyKey, any>,
18
44
  $slots?: Record<string, SlotRender>,
19
45
  ): void;
20
46
 
21
- export { Drawer };
47
+
48
+
49
+ interface DrawerContentProps {
50
+ /** An ID for the root element */
51
+ id?: string;
52
+ /** Class name(s) for the root element */
53
+ class?: string,
54
+ }
55
+
56
+ /**
57
+ * The content that is displayed for a Drawer when it is open.
58
+ */
59
+ declare function DrawerContent(
60
+ $parent: ParentNode,
61
+ $anchor: Node | null,
62
+ $props: DrawerContentProps | undefined,
63
+ $context?: Record<PropertyKey, any>,
64
+ $slots?: Record<string, SlotRender>,
65
+ ): void;
66
+
67
+
68
+
69
+ interface DrawerOverlayProps {
70
+ /** An ID for the root element */
71
+ id?: string;
72
+ /** Class name(s) for the root element */
73
+ class?: string,
74
+ }
75
+
76
+ /**
77
+ * The background overlay for a Drawer component.
78
+ * Adding an overlay automatically sets the component's `modal` value to true.
79
+ */
80
+ declare function DrawerOverlay(
81
+ $parent: ParentNode,
82
+ $anchor: Node | null,
83
+ $props: DrawerOverlayProps | undefined,
84
+ $context?: Record<PropertyKey, any>,
85
+ $slots?: Record<string, SlotRender>,
86
+ ): void;
87
+
88
+
89
+
90
+ interface DrawerTriggerProps {
91
+ /** An ID for the root element */
92
+ id?: string;
93
+ /** Class name(s) for the root element */
94
+ class?: string,
95
+ }
96
+
97
+ /**
98
+ * The button that causes a Drawer to appear or disappear.
99
+ */
100
+ declare function DrawerTrigger(
101
+ $parent: ParentNode,
102
+ $anchor: Node | null,
103
+ $props: DrawerTriggerProps | undefined,
104
+ $context?: Record<PropertyKey, any>,
105
+ $slots?: Record<string, SlotRender>,
106
+ ): void;
107
+
108
+ export { Drawer, DrawerContent, DrawerOverlay, DrawerTrigger };
@@ -1,6 +1,18 @@
1
1
  // src/Drawer/Drawer.torp
2
2
  import Drawer_default from "./Drawer.torp";
3
+
4
+ // src/Drawer/DrawerContent.torp
5
+ import DrawerContent_default from "./DrawerContent.torp";
6
+
7
+ // src/Drawer/DrawerOverlay.torp
8
+ import DrawerOverlay_default from "./DrawerOverlay.torp";
9
+
10
+ // src/Drawer/DrawerTrigger.torp
11
+ import DrawerTrigger_default from "./DrawerTrigger.torp";
3
12
  export {
4
- Drawer_default as Drawer
13
+ Drawer_default as Drawer,
14
+ DrawerContent_default as DrawerContent,
15
+ DrawerOverlay_default as DrawerOverlay,
16
+ DrawerTrigger_default as DrawerTrigger
5
17
  };
6
18
  //# sourceMappingURL=index.js.map
@@ -25,8 +25,6 @@ interface FieldProps {
25
25
  * component and/or a Message.
26
26
  */
27
27
  export default function Field($props: FieldProps) {
28
- $props ??= $watch({ name: "" });
29
-
30
28
  let $state = $watch({
31
29
  inputId: "-1",
32
30
  value: $props.value,
@@ -83,8 +81,8 @@ export default function Field($props: FieldProps) {
83
81
 
84
82
  @render {
85
83
  <div
86
- {$props.id}
87
- class={`torp-field ${$props.class ?? ""}`.trim()}
84
+ {$props?.id}
85
+ class={`torp-field ${$props?.class ?? ""}`.trim()}
88
86
  data-valid={$state.valid ? "valid" : "invalid"}
89
87
  >
90
88
  <slot />
@@ -18,11 +18,9 @@ interface FormProps {
18
18
  /**
19
19
  * A form for submitting values.
20
20
  */
21
- export default function Form($props: FormProps) {
22
- $props ??= $watch({});
23
-
21
+ export default function Form($props: FormProps | undefined) {
24
22
  let $state = $watch({
25
- data: $props.data ?? {},
23
+ data: $props?.data ?? {},
26
24
  issues: [] as ValidationIssue[],
27
25
  get valid() {
28
26
  return this.issues.length === 0;
@@ -35,7 +33,7 @@ export default function Form($props: FormProps) {
35
33
 
36
34
  // Set the context to pass down to Fields
37
35
  let context: FormContext = {
38
- schema: $props.schema,
36
+ schema: $props?.schema,
39
37
  state: $state,
40
38
  validate: handleValidate
41
39
  };
@@ -43,7 +41,7 @@ export default function Form($props: FormProps) {
43
41
  $context[FormContextName] = context;
44
42
 
45
43
  async function validate() {
46
- if ($props.schema) {
44
+ if ($props?.schema) {
47
45
  const validator = $props.schema["~standard"];
48
46
  let result = validator.validate($props.data);
49
47
  if (result instanceof Promise) {
@@ -77,7 +75,7 @@ export default function Form($props: FormProps) {
77
75
  }
78
76
 
79
77
  // Dispatch the submit event for the user to handle
80
- if ($props.onsubmit) {
78
+ if ($props?.onsubmit) {
81
79
  let userSubmit = $props.onsubmit(e);
82
80
  if (userSubmit instanceof Promise) {
83
81
  userSubmit = await userSubmit;
@@ -118,8 +116,8 @@ export default function Form($props: FormProps) {
118
116
 
119
117
  @render {
120
118
  <form
121
- {$props.id}
122
- class={`torp-form ${$props.class ?? ""}`.trim()}
119
+ {$props?.id}
120
+ class={`torp-form ${$props?.class ?? ""}`.trim()}
123
121
  method="POST"
124
122
  onsubmit={handleSubmit}
125
123
  @// Set novalidate only if JS is enabled (to override HTML validation)
@@ -25,10 +25,11 @@ interface InputProps {
25
25
  /**
26
26
  * A standard input in a form.
27
27
  */
28
- export default function Input($props: InputProps) {
29
- $props ??= $watch({});
30
- $props.id ??= getId();
31
- $props.type ??= "text";
28
+ export default function Input($props: InputProps | undefined) {
29
+ let defaultId = getId();
30
+
31
+ let type = $props?.type ?? "text";
32
+ let name = $props?.name
32
33
 
33
34
  let blurred = false;
34
35
 
@@ -36,13 +37,13 @@ export default function Input($props: InputProps) {
36
37
  const formContext = $context[FormContextName] as FormContext;
37
38
  const fieldContext = $context[FieldContextName] as FieldContext;
38
39
  if (fieldContext) {
39
- $props.name ??= fieldContext.name;
40
+ name ??= fieldContext.name;
40
41
  }
41
42
 
42
43
  // Use the FieldContext's state, or create a new one
43
44
  let $state = fieldContext?.state ?? $watch({
44
- inputId: $props.id,
45
- value: $props.value,
45
+ inputId: $props?.id ?? defaultId,
46
+ value: $props?.value,
46
47
  errors: {} as Record<string, string>,
47
48
  valid: false,
48
49
  message: "",
@@ -50,11 +51,13 @@ export default function Input($props: InputProps) {
50
51
 
51
52
  // Binding
52
53
  $run(() => {
53
- $props.value = $state.value;
54
+ if ($props !== undefined) {
55
+ $props.value = $state.value;
56
+ }
54
57
  });
55
58
 
56
59
  // Set the input ID now that we know it and it will get linked with the associated label
57
- $state.inputId = $props.id;
60
+ $state.inputId = $props?.id ?? defaultId;
58
61
 
59
62
  // NOTE: Adapted this from https://stackoverflow.com/a/57393751,
60
63
  // not sure if it's still a good way to do things
@@ -77,15 +80,15 @@ export default function Input($props: InputProps) {
77
80
 
78
81
  @render {
79
82
  <input
80
- {$props.id}
81
- class={`torp-input ${$props.class ?? ""}`.trim()}
82
- {$props.name}
83
+ id={$props?.id ?? defaultId}
84
+ class={`torp-input ${$props?.class ?? ""}`.trim()}
85
+ {type}
86
+ {name}
83
87
  &value={$state.value}
84
- {$props.type}
85
- {$props.placeholder}
86
- {$props.readonly}
87
- {$props.maxlength}
88
- aria-label={$props.ariaLabel}
88
+ {$props?.placeholder}
89
+ {$props?.readonly}
90
+ {$props?.maxlength}
91
+ aria-label={$props?.ariaLabel}
89
92
  data-valid={$state.valid ? "valid" : "invalid"}
90
93
  oninput={handleInput}
91
94
  onblur={handleBlur}
@@ -10,7 +10,7 @@ interface LabelProps {
10
10
  /**
11
11
  * A label to describe the contents of an input in a form.
12
12
  */
13
- export default function Label($props?: LabelProps) {
13
+ export default function Label($props: LabelProps | undefined) {
14
14
  // Get stuff out of the FieldContext
15
15
  const context = $context[FieldContextName] as FieldContext;
16
16
  if (!context) {
@@ -11,7 +11,7 @@ interface MessageProps {
11
11
  * A validation message to show when the contents of an input component have
12
12
  * problems that need to be fixed.
13
13
  */
14
- export default function Message($props?: MessageProps) {
14
+ export default function Message($props: MessageProps | undefined) {
15
15
  // Get stuff out of the FieldContext
16
16
  const context = $context[FieldContextName] as FieldContext;
17
17
  if (!context) {
@@ -48,7 +48,7 @@ interface FormProps {
48
48
  declare function Form(
49
49
  $parent: ParentNode,
50
50
  $anchor: Node | null,
51
- $props: FormProps,
51
+ $props: FormProps | undefined,
52
52
  $context?: Record<PropertyKey, any>,
53
53
  $slots?: Record<string, SlotRender>,
54
54
  ): void;
@@ -82,26 +82,40 @@ interface InputProps {
82
82
  declare function Input(
83
83
  $parent: ParentNode,
84
84
  $anchor: Node | null,
85
- $props: InputProps,
85
+ $props: InputProps | undefined,
86
86
  $context?: Record<PropertyKey, any>,
87
87
  $slots?: Record<string, SlotRender>,
88
88
  ): void;
89
89
 
90
90
 
91
91
 
92
+ interface LabelProps {
93
+ /** An ID for the root element */
94
+ id?: string;
95
+ /** Class name(s) for the root element */
96
+ class?: string,
97
+ }
98
+
92
99
  /**
93
100
  * A label to describe the contents of an input in a form.
94
101
  */
95
102
  declare function Label(
96
103
  $parent: ParentNode,
97
104
  $anchor: Node | null,
98
- $props?: LabelProps,
105
+ $props: LabelProps | undefined,
99
106
  $context?: Record<PropertyKey, any>,
100
107
  $slots?: Record<string, SlotRender>,
101
108
  ): void;
102
109
 
103
110
 
104
111
 
112
+ interface MessageProps {
113
+ /** An ID for the root element */
114
+ id?: string;
115
+ /** Class name(s) for the root element */
116
+ class?: string,
117
+ }
118
+
105
119
  /**
106
120
  * A validation message to show when the contents of an input component have
107
121
  * problems that need to be fixed.
@@ -109,7 +123,7 @@ declare function Label(
109
123
  declare function Message(
110
124
  $parent: ParentNode,
111
125
  $anchor: Node | null,
112
- $props?: MessageProps,
126
+ $props: MessageProps | undefined,
113
127
  $context?: Record<PropertyKey, any>,
114
128
  $slots?: Record<string, SlotRender>,
115
129
  ): void;
@@ -1,3 +1,5 @@
1
+ import { ContextualContextName } from "../Contextual/ContextualTypes";
2
+ import { ModalContextName } from "../Modal/ModalTypes";
1
3
  import { PopoverContextName, type PopoverContext } from "../Popover/PopoverTypes";
2
4
  import {
3
5
  MenuContextName,
@@ -26,27 +28,26 @@ interface MenuProps {
26
28
  *
27
29
  * ```
28
30
  * <Menu>
29
- * <MenuButton />
30
- * <MenuSeparator /> (optional)
31
- * <MenuGroup> (optional)
32
- * <MenuButton />
33
- * </MenuGroup>
31
+ * <MenuButton />
32
+ * <MenuSeparator /> (optional)
33
+ * <MenuGroup> (optional)
34
+ * <MenuButton />
35
+ * </MenuGroup>
34
36
  * </Menu>
35
37
  * ```
36
38
  */
37
- export default function Menu($props: MenuProps) {
38
- $props ??= $watch({});
39
-
39
+ export default function Menu($props: MenuProps | undefined) {
40
40
  // A collection containing the state and some functions for each item
41
41
  let itemStates: ItemState[] = [];
42
42
  let focusIndex = -1;
43
43
 
44
44
  // Get stuff out of the PopoverContext
45
- const popoverContext = $context[PopoverContextName] as PopoverContext;
45
+ // HACK: share state in PopupState and extend in context/modal/popover
46
+ const popoverContext = $context[ContextualContextName] ?? $context[ModalContextName] ?? $context[PopoverContextName] as PopoverContext;
46
47
  if (!popoverContext) {
47
- throw new Error("Menu must be contained within a Contextual, Prompt or Popover");
48
+ throw new Error("Menu must be contained within a Context, Modal or Popover");
48
49
  }
49
- const { setVisible, handleButton, modal, visible } = popoverContext;
50
+ const { setVisible, handleButton, visible } = popoverContext;
50
51
 
51
52
  // Check whether this is a menu in a popout
52
53
  const popoutContext = $context[MenuPopoutContextName] as MenuPopoutContext;
@@ -77,7 +78,7 @@ export default function Menu($props: MenuProps) {
77
78
  }
78
79
 
79
80
  function registerItem(setFocused: () => void) {
80
- // Add the item"s state to the array and return its index
81
+ // Add the item's state to the array and return its index
81
82
  const newItemState: ItemState = {
82
83
  setFocused
83
84
  };
@@ -156,11 +157,11 @@ export default function Menu($props: MenuProps) {
156
157
 
157
158
  @render {
158
159
  <div
159
- {$props.id}
160
- class={`torp-menu ${$props.class ?? ""}`.trim()}
160
+ {$props?.id}
161
+ class={`torp-menu ${$props?.class ?? ""}`.trim()}
161
162
  tabindex="-1"
162
163
  role="menu"
163
- aria-label={$props.ariaLabel}
164
+ aria-label={$props?.ariaLabel}
164
165
  aria-orientation="vertical"
165
166
  >
166
167
  <slot />
@@ -9,15 +9,17 @@ interface MenuButtonProps {
9
9
  value?: any,
10
10
  /** Whether this button is disabled */
11
11
  disabled?: boolean,
12
+ /** Raised when the button is clicked */
13
+ onclick?: (e: MouseEvent) => void,
14
+ /** Raised when a key is pressed down */
15
+ onkeydown?: (e: KeyboardEvent) => void,
12
16
  }
13
17
 
14
18
  /**
15
19
  * A button that is placed in a Menu or MenuGroup and signals a response by a user.
16
20
  *
17
21
  */
18
- export default function MenuButton($props: MenuButtonProps) {
19
- $props ??= $watch({});
20
-
22
+ export default function MenuButton($props: MenuButtonProps | undefined) {
21
23
  let button: HTMLButtonElement;
22
24
 
23
25
  // Get stuff out of the MenuContext
@@ -30,14 +32,18 @@ export default function MenuButton($props: MenuButtonProps) {
30
32
  // Register this item with the parent Menu and store the index
31
33
  const { index } = registerItem(setFocused);
32
34
 
33
- function handleKeyDown(e) {
35
+ function handleKeyDown(e: KeyboardEvent) {
34
36
  handleItemKey(e);
35
- if ($props.onkeydown) $props.onkeydown(e);
37
+ if ($props?.onkeydown) {
38
+ $props.onkeydown(e);
39
+ }
36
40
  }
37
41
 
38
- function handleClick(e) {
39
- handleButton($props.value);
40
- if ($props.onclick) $props.onclick(e);
42
+ function handleClick(e: MouseEvent) {
43
+ handleButton($props?.value);
44
+ if ($props?.onclick) {
45
+ $props.onclick(e);
46
+ }
41
47
  }
42
48
 
43
49
  function setFocused() {
@@ -46,13 +52,13 @@ export default function MenuButton($props: MenuButtonProps) {
46
52
 
47
53
  @render {
48
54
  <button
49
- {$props.id}
50
- class={`torp-menu-button ${$props.class ?? ""}`.trim()}
55
+ {$props?.id}
56
+ class={`torp-menu-button ${$props?.class ?? ""}`.trim()}
51
57
  type="button"
52
- {$props.disabled}
58
+ {$props?.disabled}
53
59
  role="menuitem"
54
- aria-disabled={$props.disabled ? "true" : undefined}
55
- data-disabled={$props.disabled ? "true" : undefined}
60
+ aria-disabled={$props?.disabled ? "true" : undefined}
61
+ data-disabled={$props?.disabled ? "true" : undefined}
56
62
  onkeydown={handleKeyDown}
57
63
  onclick={handleClick}
58
64
  onfocus={() => handleItemFocus(index)}
@@ -14,6 +14,8 @@ interface MenuCheckProps {
14
14
  checked?: boolean,
15
15
  /** Whether this item is disabled */
16
16
  disabled?: boolean,
17
+ /** Raised when the checkbox is clicked */
18
+ onclick?: (e: MouseEvent) => void,
17
19
  }
18
20
 
19
21
  /**
@@ -21,15 +23,15 @@ interface MenuCheckProps {
21
23
  * option on or off.
22
24
  *
23
25
  */
24
- export default function MenuCheck($props: MenuCheckProps) {
25
- $props ??= $watch({});
26
-
26
+ export default function MenuCheck($props: MenuCheckProps | undefined) {
27
27
  let $state = $watch({
28
- checked: $props.checked
28
+ checked: $props?.checked ?? false
29
29
  });
30
30
 
31
31
  $run(() => {
32
- $props.checked = $state.checked;
32
+ if ($props !== undefined) {
33
+ $props.checked = $state.checked;
34
+ }
33
35
  });
34
36
 
35
37
  let button: HTMLButtonElement;
@@ -54,22 +56,24 @@ export default function MenuCheck($props: MenuCheckProps) {
54
56
  button.focus();
55
57
  }
56
58
 
57
- function handleClick() {
59
+ function handleClick(e: MouseEvent) {
58
60
  $state.checked = !$state.checked;
59
- if ($props.onclick) $props.onclick();
61
+ if ($props?.onclick) {
62
+ $props.onclick(e);
63
+ }
60
64
  }
61
65
 
62
66
  @render {
63
67
  <button
64
- {$props.id}
65
- class={`torp-menu-check ${$props.class ?? ""}`.trim()}
68
+ {$props?.id}
69
+ class={`torp-menu-check ${$props?.class ?? ""}`.trim()}
66
70
  type="button"
67
- {$props.disabled}
71
+ {$props?.disabled}
68
72
  role="menuitemcheckbox"
69
- aria-checked={$props.checked ? "true" : "false"}
70
- aria-disabled={$props.disabled ? "true" : undefined}
71
- data-state={$props.checked ? "checked" : "unchecked"}
72
- data-disabled={$props.disabled ? "true" : undefined}
73
+ aria-checked={$props?.checked ? "true" : "false"}
74
+ aria-disabled={$props?.disabled ? "true" : undefined}
75
+ data-state={$props?.checked ? "checked" : "unchecked"}
76
+ data-disabled={$props?.disabled ? "true" : undefined}
73
77
  onkeydown={handleItemKey}
74
78
  onclick={handleClick}
75
79
  onfocus={() => handleItemFocus(index)}
@@ -11,17 +11,15 @@ interface MenuGroupProps {
11
11
  /**
12
12
  * A container for a logical group of menu items.
13
13
  */
14
- export default function MenuGroup($props: MenuGroupProps) {
15
- $props ??= $watch({});
16
-
14
+ export default function MenuGroup($props: MenuGroupProps | undefined) {
17
15
  // TODO: Intercept the context to steal toggleItem??
18
16
 
19
17
  @render {
20
18
  <div
21
- {$props.id}
22
- class={`torp-menu-group ${$props.class ?? ""}`.trim()}
19
+ {$props?.id}
20
+ class={`torp-menu-group ${$props?.class ?? ""}`.trim()}
23
21
  role="group"
24
- aria-label={$props.ariaLabel}
22
+ aria-label={$props?.ariaLabel}
25
23
  >
26
24
  <slot />
27
25
  </div>