@torpor/ui 0.3.7 → 1.0.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 (346) hide show
  1. package/README.md +83 -7
  2. package/dist/Accordion/Accordion.torp +43 -165
  3. package/dist/Accordion/AccordionContent.torp +6 -6
  4. package/dist/Accordion/AccordionHeader.torp +7 -11
  5. package/dist/Accordion/AccordionItem.torp +24 -24
  6. package/dist/Accordion/AccordionTrigger.torp +17 -8
  7. package/dist/Accordion/AccordionTypes.ts +6 -6
  8. package/dist/Accordion/index.d.ts +23 -25
  9. package/dist/Accordion/index.js +6 -22
  10. package/dist/Breadcrumb/Breadcrumb.torp +12 -10
  11. package/dist/Breadcrumb/BreadcrumbItem.torp +6 -6
  12. package/dist/Breadcrumb/BreadcrumbList.torp +21 -0
  13. package/dist/Breadcrumb/BreadcrumbSeparator.torp +4 -4
  14. package/dist/Breadcrumb/index.d.ts +39 -15
  15. package/dist/Breadcrumb/index.js +5 -14
  16. package/dist/Calendar/Calendar.torp +163 -156
  17. package/dist/Calendar/CalendarDay.torp +91 -45
  18. package/dist/Calendar/CalendarDayHeader.torp +36 -0
  19. package/dist/Calendar/CalendarGrid.torp +104 -0
  20. package/dist/Calendar/CalendarGridHeader.torp +43 -0
  21. package/dist/Calendar/CalendarHeader.torp +48 -0
  22. package/dist/Calendar/CalendarHeaderTrigger.torp +54 -0
  23. package/dist/Calendar/CalendarTypes.ts +25 -4
  24. package/dist/Calendar/buildDays.ts +54 -0
  25. package/dist/Calendar/index.d.ts +191 -5
  26. package/dist/Calendar/index.js +8 -10
  27. package/dist/Carousel/Carousel.torp +180 -0
  28. package/dist/Carousel/CarouselIndicators.torp +65 -0
  29. package/dist/Carousel/CarouselNext.torp +43 -0
  30. package/dist/Carousel/CarouselPrevious.torp +44 -0
  31. package/dist/Carousel/CarouselSlide.torp +57 -0
  32. package/dist/Carousel/CarouselTypes.ts +28 -0
  33. package/dist/Carousel/index.d.ts +147 -0
  34. package/dist/Carousel/index.js +6 -0
  35. package/dist/Charts/BarChart.torp +70 -0
  36. package/dist/Charts/Chart.torp +120 -0
  37. package/dist/Charts/ChartBars.torp +78 -0
  38. package/dist/Charts/ChartColumns.torp +66 -0
  39. package/dist/Charts/ChartGrid.torp +54 -0
  40. package/dist/Charts/ChartLines.torp +60 -0
  41. package/dist/Charts/ChartTypes.ts +25 -0
  42. package/dist/Charts/ChartXAxis.torp +83 -0
  43. package/dist/Charts/ChartYAxis.torp +105 -0
  44. package/dist/Charts/ColumnChart.torp +70 -0
  45. package/dist/{Chart → Charts}/GridLines.torp +7 -4
  46. package/dist/Charts/LineChart.torp +73 -0
  47. package/dist/{Chart → Charts}/PieChart.torp +14 -20
  48. package/dist/{Chart → Charts}/ScatterChart.torp +45 -38
  49. package/dist/{Chart → Charts}/SparkLine.torp +16 -19
  50. package/dist/{Chart → Charts}/XAxis.torp +18 -12
  51. package/dist/{Chart → Charts}/YAxis.torp +15 -9
  52. package/dist/Charts/index.d.ts +469 -0
  53. package/dist/Charts/index.js +17 -0
  54. package/dist/ColorPicker/ColorPalette.torp +154 -0
  55. package/dist/ColorPicker/ColorPicker.torp +157 -0
  56. package/dist/ColorPicker/index.d.ts +85 -0
  57. package/dist/ColorPicker/index.js +3 -0
  58. package/dist/ComboBox/ComboBox.torp +205 -0
  59. package/dist/ComboBox/ComboBoxContent.torp +112 -0
  60. package/dist/ComboBox/ComboBoxInput.torp +145 -0
  61. package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
  62. package/dist/ComboBox/ComboBoxTypes.ts +39 -0
  63. package/dist/ComboBox/index.d.ts +152 -0
  64. package/dist/ComboBox/index.js +6 -0
  65. package/dist/CommandPalette/CommandPalette.torp +220 -0
  66. package/dist/CommandPalette/CommandTypes.ts +14 -0
  67. package/dist/CommandPalette/index.d.ts +45 -0
  68. package/dist/CommandPalette/index.js +2 -0
  69. package/dist/Contextual/Contextual.torp +39 -52
  70. package/dist/Contextual/ContextualContent.torp +29 -73
  71. package/dist/Contextual/ContextualHover.torp +112 -0
  72. package/dist/Contextual/ContextualTrigger.torp +31 -42
  73. package/dist/Contextual/ContextualTypes.ts +5 -18
  74. package/dist/Contextual/index.d.ts +44 -27
  75. package/dist/Contextual/index.js +5 -14
  76. package/dist/DataGrid/DataGrid.torp +496 -0
  77. package/dist/DataGrid/DataGridTypes.ts +25 -0
  78. package/dist/DataGrid/index.d.ts +90 -0
  79. package/dist/DataGrid/index.js +3 -0
  80. package/dist/DataGrid/sortRows.ts +32 -0
  81. package/dist/DatePicker/DatePicker.torp +222 -0
  82. package/dist/DatePicker/DatePickerHeader.torp +20 -0
  83. package/dist/DatePicker/index.d.ts +55 -0
  84. package/dist/DatePicker/index.js +2 -0
  85. package/dist/DateRangePicker/DateRangePicker.torp +311 -0
  86. package/dist/DateRangePicker/DateRangePickerDay.torp +137 -0
  87. package/dist/DateRangePicker/DateRangePickerTypes.ts +21 -0
  88. package/dist/DateRangePicker/index.d.ts +76 -0
  89. package/dist/DateRangePicker/index.js +3 -0
  90. package/dist/Dialog/Dialog.torp +33 -30
  91. package/dist/Dialog/DialogBody.torp +5 -9
  92. package/dist/Dialog/DialogButton.torp +14 -11
  93. package/dist/Dialog/DialogFooter.torp +3 -7
  94. package/dist/Dialog/DialogHeader.torp +6 -10
  95. package/dist/Dialog/DialogTypes.ts +2 -2
  96. package/dist/Dialog/index.d.ts +28 -26
  97. package/dist/Dialog/index.js +6 -22
  98. package/dist/Disclosure/Disclosure.torp +18 -18
  99. package/dist/Disclosure/DisclosureContent.torp +5 -6
  100. package/dist/Disclosure/DisclosureHeader.torp +7 -11
  101. package/dist/Disclosure/DisclosureTrigger.torp +4 -5
  102. package/dist/Disclosure/DisclosureTypes.ts +1 -1
  103. package/dist/Disclosure/index.d.ts +14 -16
  104. package/dist/Disclosure/index.js +5 -18
  105. package/dist/Drawer/Drawer.torp +21 -51
  106. package/dist/Drawer/DrawerContent.torp +67 -13
  107. package/dist/Drawer/DrawerOverlay.torp +4 -4
  108. package/dist/Drawer/DrawerTrigger.torp +16 -4
  109. package/dist/Drawer/DrawerTypes.ts +4 -1
  110. package/dist/Drawer/index.d.ts +16 -20
  111. package/dist/Drawer/index.js +5 -18
  112. package/dist/FocusGroup/FocusGroup.torp +70 -0
  113. package/dist/FocusGroup/FocusGroupButton.torp +59 -0
  114. package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
  115. package/dist/FocusGroup/index.d.ts +44 -0
  116. package/dist/FocusGroup/index.js +3 -0
  117. package/dist/Form/CheckBox.torp +28 -20
  118. package/dist/Form/Field.torp +17 -17
  119. package/dist/Form/File.torp +31 -22
  120. package/dist/Form/FileDrop.torp +187 -0
  121. package/dist/Form/Form.torp +24 -22
  122. package/dist/Form/FormTypes.ts +2 -0
  123. package/dist/Form/FormValues.torp +37 -0
  124. package/dist/Form/Hidden.torp +4 -12
  125. package/dist/Form/Input.torp +38 -32
  126. package/dist/Form/Label.torp +3 -3
  127. package/dist/Form/Message.torp +13 -5
  128. package/dist/Form/MessageSummary.torp +39 -0
  129. package/dist/Form/Option.torp +11 -7
  130. package/dist/Form/Select.torp +32 -28
  131. package/dist/Form/TextArea.torp +35 -31
  132. package/dist/Form/Toggle.torp +109 -0
  133. package/dist/Form/index.d.ts +198 -77
  134. package/dist/Form/index.js +16 -46
  135. package/dist/ListBox/ListBox.torp +374 -0
  136. package/dist/ListBox/ListBoxItem.torp +131 -0
  137. package/dist/ListBox/ListBoxSeparator.torp +29 -0
  138. package/dist/ListBox/ListBoxTypes.ts +41 -0
  139. package/dist/ListBox/LoadedListBoxItems.torp +41 -0
  140. package/dist/ListBox/index.d.ts +136 -0
  141. package/dist/ListBox/index.js +4 -0
  142. package/dist/MaskedInput/MaskedInput.torp +143 -0
  143. package/dist/MaskedInput/index.d.ts +52 -0
  144. package/dist/MaskedInput/index.js +2 -0
  145. package/dist/Menu/Menu.torp +90 -70
  146. package/dist/Menu/MenuButton.torp +17 -10
  147. package/dist/Menu/MenuCheck.torp +22 -18
  148. package/dist/Menu/MenuGroup.torp +4 -4
  149. package/dist/Menu/MenuIndicator.torp +5 -13
  150. package/dist/Menu/MenuPopout.torp +20 -50
  151. package/dist/Menu/MenuPopoutContent.torp +15 -66
  152. package/dist/Menu/MenuPopoutTrigger.torp +19 -100
  153. package/dist/Menu/MenuRadio.torp +25 -26
  154. package/dist/Menu/MenuRadioGroup.torp +25 -68
  155. package/dist/Menu/MenuSeparator.torp +3 -2
  156. package/dist/Menu/MenuTypes.ts +12 -21
  157. package/dist/Menu/index.d.ts +45 -51
  158. package/dist/Menu/index.js +12 -46
  159. package/dist/MenuBar/MenuBar.torp +31 -83
  160. package/dist/MenuBar/MenuBarItem.torp +34 -55
  161. package/dist/MenuBar/MenuBarItemContent.torp +15 -101
  162. package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
  163. package/dist/MenuBar/MenuBarTypes.ts +13 -12
  164. package/dist/MenuBar/index.d.ts +17 -19
  165. package/dist/MenuBar/index.js +5 -18
  166. package/dist/Modal/Modal.torp +28 -48
  167. package/dist/Modal/ModalContent.torp +21 -44
  168. package/dist/Modal/ModalOverlay.torp +4 -4
  169. package/dist/Modal/ModalTrigger.torp +16 -32
  170. package/dist/Modal/ModalTypes.ts +6 -17
  171. package/dist/Modal/index.d.ts +17 -29
  172. package/dist/Modal/index.js +29 -28
  173. package/dist/Modal/index.js.map +1 -1
  174. package/dist/Modal/showPrompt.ts +2 -2
  175. package/dist/NavMenu/NavMenu.torp +22 -104
  176. package/dist/NavMenu/NavMenuButton.torp +10 -8
  177. package/dist/NavMenu/NavMenuElement.torp +6 -7
  178. package/dist/NavMenu/NavMenuGroup.torp +5 -5
  179. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
  180. package/dist/NavMenu/NavMenuLink.torp +7 -10
  181. package/dist/NavMenu/NavMenuPopout.torp +16 -61
  182. package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
  183. package/dist/NavMenu/NavMenuPopoutTrigger.torp +47 -0
  184. package/dist/NavMenu/NavMenuSeparator.torp +3 -6
  185. package/dist/NavMenu/NavMenuTypes.ts +6 -15
  186. package/dist/NavMenu/index.d.ts +55 -55
  187. package/dist/NavMenu/index.js +11 -42
  188. package/dist/Notification/Notification.torp +12 -24
  189. package/dist/Notification/NotificationClose.torp +6 -3
  190. package/dist/Notification/NotificationContainer.torp +3 -7
  191. package/dist/Notification/NotificationContent.torp +3 -7
  192. package/dist/Notification/NotificationTypes.ts +1 -1
  193. package/dist/Notification/index.d.ts +15 -12
  194. package/dist/Notification/index.js +22 -32
  195. package/dist/Notification/index.js.map +1 -1
  196. package/dist/NumberInput/NumberInput.torp +255 -0
  197. package/dist/NumberInput/index.d.ts +44 -0
  198. package/dist/NumberInput/index.js +2 -0
  199. package/dist/Pagination/Pagination.torp +152 -0
  200. package/dist/Pagination/PaginationItem.torp +137 -0
  201. package/dist/Pagination/PaginationTypes.ts +22 -0
  202. package/dist/Pagination/buildPages.ts +61 -0
  203. package/dist/Pagination/index.d.ts +63 -0
  204. package/dist/Pagination/index.js +3 -0
  205. package/dist/Popover/Popover.torp +39 -52
  206. package/dist/Popover/PopoverContent.torp +27 -76
  207. package/dist/Popover/PopoverHover.torp +90 -0
  208. package/dist/Popover/PopoverTrigger.torp +17 -40
  209. package/dist/Popover/PopoverTypes.ts +5 -18
  210. package/dist/Popover/index.d.ts +40 -25
  211. package/dist/Popover/index.js +18 -18
  212. package/dist/Popover/index.js.map +1 -1
  213. package/dist/Progress/Progress.torp +88 -0
  214. package/dist/Progress/index.d.ts +37 -0
  215. package/dist/Progress/index.js +2 -0
  216. package/dist/Rating/Rating.torp +225 -0
  217. package/dist/Rating/index.d.ts +44 -0
  218. package/dist/Rating/index.js +2 -0
  219. package/dist/SegmentedControl/SegmentedControl.torp +233 -0
  220. package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
  221. package/dist/SegmentedControl/SegmentedItem.torp +78 -0
  222. package/dist/SegmentedControl/index.d.ts +74 -0
  223. package/dist/SegmentedControl/index.js +3 -0
  224. package/dist/SelectBox/SelectBox.torp +190 -0
  225. package/dist/SelectBox/SelectBoxContent.torp +107 -0
  226. package/dist/SelectBox/SelectBoxTrigger.torp +141 -0
  227. package/dist/SelectBox/SelectBoxTypes.ts +33 -0
  228. package/dist/SelectBox/index.d.ts +112 -0
  229. package/dist/SelectBox/index.js +5 -0
  230. package/dist/Slider/Slider.torp +248 -0
  231. package/dist/Slider/index.d.ts +45 -0
  232. package/dist/Slider/index.js +2 -0
  233. package/dist/Splitter/Splitter.torp +156 -0
  234. package/dist/Splitter/SplitterHandle.torp +161 -0
  235. package/dist/Splitter/SplitterPane.torp +63 -0
  236. package/dist/Splitter/SplitterTypes.ts +31 -0
  237. package/dist/Splitter/index.d.ts +103 -0
  238. package/dist/Splitter/index.js +4 -0
  239. package/dist/Stepper/Stepper.torp +146 -0
  240. package/dist/Stepper/StepperMarker.torp +24 -0
  241. package/dist/Stepper/StepperNext.torp +44 -0
  242. package/dist/Stepper/StepperPrevious.torp +44 -0
  243. package/dist/Stepper/StepperStep.torp +90 -0
  244. package/dist/Stepper/StepperTypes.ts +30 -0
  245. package/dist/Stepper/index.d.ts +149 -0
  246. package/dist/Stepper/index.js +6 -0
  247. package/dist/TabGroup/TabContent.torp +6 -6
  248. package/dist/TabGroup/TabGroup.torp +97 -113
  249. package/dist/TabGroup/TabGroupTypes.ts +3 -3
  250. package/dist/TabGroup/TabHeader.torp +23 -19
  251. package/dist/TabGroup/TabList.torp +8 -21
  252. package/dist/TabGroup/TabTrigger.torp +6 -7
  253. package/dist/TabGroup/index.d.ts +26 -26
  254. package/dist/TabGroup/index.js +6 -22
  255. package/dist/TagInput/TagInput.torp +378 -0
  256. package/dist/TagInput/index.d.ts +48 -0
  257. package/dist/TagInput/index.js +2 -0
  258. package/dist/TimePicker/TimePicker.torp +462 -0
  259. package/dist/TimePicker/index.d.ts +53 -0
  260. package/dist/TimePicker/index.js +2 -0
  261. package/dist/ToolBar/ToolBar.torp +117 -0
  262. package/dist/ToolBar/ToolBarButton.torp +56 -0
  263. package/dist/ToolBar/ToolBarElement.torp +51 -0
  264. package/dist/ToolBar/ToolBarPopout.torp +45 -0
  265. package/dist/ToolBar/ToolBarPopoutContent.torp +34 -0
  266. package/dist/ToolBar/ToolBarPopoutTrigger.torp +47 -0
  267. package/dist/ToolBar/ToolBarSeparator.torp +21 -0
  268. package/dist/ToolBar/ToolBarTypes.ts +28 -0
  269. package/dist/ToolBar/index.d.ts +210 -0
  270. package/dist/ToolBar/index.js +8 -0
  271. package/dist/Tree/Tree.torp +395 -0
  272. package/dist/Tree/TreeItem.torp +176 -0
  273. package/dist/Tree/TreeItemChildren.torp +60 -0
  274. package/dist/Tree/TreeItemContent.torp +46 -0
  275. package/dist/Tree/TreeItemLabel.torp +94 -0
  276. package/dist/Tree/TreeItemTrigger.torp +78 -0
  277. package/dist/Tree/TreeLoadedChildren.torp +122 -0
  278. package/dist/Tree/TreeTypes.ts +63 -0
  279. package/dist/Tree/index.d.ts +262 -0
  280. package/dist/Tree/index.js +7 -0
  281. package/dist/icons/ChevronDoubleLeft.torp +19 -0
  282. package/dist/icons/ChevronDoubleRight.torp +19 -0
  283. package/dist/icons/index.d.ts +61 -1
  284. package/dist/icons/index.js +17 -58
  285. package/dist/loader-DEeG5vFY.js +44 -0
  286. package/dist/loader-DEeG5vFY.js.map +1 -0
  287. package/dist/motion/index.d.ts +12 -8
  288. package/dist/motion/index.d.ts.map +1 -0
  289. package/dist/motion/index.js +72 -88
  290. package/dist/motion/index.js.map +1 -1
  291. package/dist/mount/draggable.ts +63 -0
  292. package/dist/mount/dropTarget.ts +108 -0
  293. package/dist/mount/hoverTrigger.ts +1 -1
  294. package/dist/utils/$handle.ts +23 -0
  295. package/dist/utils/LoadedItems.torp +47 -0
  296. package/dist/utils/PopoutClickTrigger.torp +99 -0
  297. package/dist/utils/PopoutTypes.ts +82 -0
  298. package/dist/utils/SubmenuPopout.torp +89 -0
  299. package/dist/utils/SubmenuPopoutContent.torp +87 -0
  300. package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
  301. package/dist/utils/chartColors.ts +13 -13
  302. package/dist/utils/chartLayout.ts +143 -0
  303. package/dist/utils/chartUtils.ts +1 -1
  304. package/dist/utils/colorUtils.ts +103 -0
  305. package/dist/utils/createItemGroup.ts +152 -0
  306. package/dist/utils/dateUtils.ts +8 -7
  307. package/dist/utils/documentEvents.ts +4 -4
  308. package/dist/utils/dragState.ts +86 -0
  309. package/dist/utils/focusGroup.ts +204 -0
  310. package/dist/utils/focusItem.ts +44 -0
  311. package/dist/utils/formField.ts +70 -0
  312. package/dist/utils/hoverOpen.ts +50 -0
  313. package/dist/utils/hoverReveal.ts +194 -0
  314. package/dist/utils/loader.ts +113 -0
  315. package/dist/utils/maskUtils.ts +98 -0
  316. package/dist/utils/popoutContent.ts +137 -0
  317. package/dist/utils/reorderList.ts +52 -0
  318. package/package.json +116 -25
  319. package/dist/Accordion/index.js.map +0 -1
  320. package/dist/Breadcrumb/index.js.map +0 -1
  321. package/dist/Calendar/index.js.map +0 -1
  322. package/dist/Chart/BarChart.torp +0 -159
  323. package/dist/Chart/LineChart.torp +0 -196
  324. package/dist/Chart/index.d.ts +0 -220
  325. package/dist/Chart/index.js +0 -34
  326. package/dist/Chart/index.js.map +0 -1
  327. package/dist/Contextual/index.js.map +0 -1
  328. package/dist/Dialog/index.js.map +0 -1
  329. package/dist/Disclosure/index.js.map +0 -1
  330. package/dist/Drawer/index.js.map +0 -1
  331. package/dist/Form/index.js.map +0 -1
  332. package/dist/Menu/index.js.map +0 -1
  333. package/dist/MenuBar/index.js.map +0 -1
  334. package/dist/NavMenu/NavMenuPopoutButton.torp +0 -129
  335. package/dist/NavMenu/index.js.map +0 -1
  336. package/dist/TabGroup/index.js.map +0 -1
  337. package/dist/icons/index.js.map +0 -1
  338. package/dist/index.d.ts +0 -19
  339. package/dist/metafile-esm.json +0 -1
  340. package/dist/motion/fade.ts +0 -16
  341. package/dist/motion/grow.ts +0 -23
  342. package/dist/motion/measure.ts +0 -28
  343. package/dist/motion/slide.ts +0 -45
  344. package/dist/mount/index.d.ts +0 -2
  345. package/dist/utils/index.d.ts +0 -2
  346. /package/dist/{Chart → Charts}/DataSeries.ts +0 -0
@@ -1,20 +1,19 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
3
- import getScrollParent from "../utils/getScrollParent";
4
- import setPopoverPosition from "../utils/setPopoverPosition";
5
- import { PopoverContextName, type PopoverContext } from "./PopoverTypes";
2
+ import getId from "../utils/getId";
3
+ import { createPopoutContent } from "../utils/popoutContent";
4
+ import { type PopoverContext, PopoverContextName } from "./PopoverTypes";
6
5
 
7
6
  interface PopoverContentProps {
8
7
  /** An ID for the root element */
9
8
  id?: string;
10
9
  /** Classes for the root element */
11
- class?: ClassValue,
10
+ class?: ClassValue;
12
11
  /** Styles for the root element */
13
- style?: StyleValue,
12
+ style?: StyleValue;
14
13
  /** Where the popover will be shown, relative to the popover trigger */
15
- side?: "top" | "right" | "bottom" | "left",
14
+ side?: "top" | "right" | "bottom" | "left";
16
15
  /** How the popover will be aligned, relative to the popover trigger */
17
- alignment?: "start" | "center" | "end",
16
+ alignment?: "start" | "center" | "end";
18
17
  }
19
18
 
20
19
  /**
@@ -22,9 +21,7 @@ interface PopoverContentProps {
22
21
  * alongside an element.
23
22
  */
24
23
  export default function PopoverContent($props?: PopoverContentProps | undefined) {
25
- let div: HTMLDivElement;
26
- let shown = false;
27
- let closeOnClick = false;
24
+ let defaultId = getId();
28
25
 
29
26
  // Get stuff out of the PopoverContext
30
27
  const context = $context[PopoverContextName] as PopoverContext;
@@ -33,82 +30,36 @@ export default function PopoverContent($props?: PopoverContentProps | undefined)
33
30
  }
34
31
  let $state = context.state;
35
32
 
36
- $run(() => {
37
- if (!$state.visible) {
38
- hide();
39
- }
40
- });
41
-
42
- function show() {
43
- shown = true;
44
-
45
- // HACK: Because this Popover could be shown with a click, we need to wait for another mousedown
46
- // before we close on click. Otherwise the click immediately bubbles to the document
47
- closeOnClick = false;
48
- addDocumentEvent("mousedown", handleDocumentMouseDown);
49
- addDocumentEvent("click", handleDocumentClick);
33
+ // Set the content ID so that the trigger can use it with aria-controls
34
+ $state.contentId = $props?.id ?? defaultId;
50
35
 
51
- // Set the position and listen for window resize and scroll to reset the position
52
- setPosition();
53
- const anchorElement = context.anchorElement!
54
- const scrollParent = getScrollParent(anchorElement)
55
- scrollParent.addEventListener("resize", setPosition);
56
- scrollParent.addEventListener("scroll", setPosition);
57
- if (context.focusFirstElement) {
58
- context.focusFirstElement();
59
- }
60
- }
61
-
62
- function hide() {
63
- if (!shown) return;
64
-
65
- removeDocumentEvent("mousedown", handleDocumentMouseDown);
66
- removeDocumentEvent("click", handleDocumentClick);
67
-
68
- // Stop listening for window resize and focus the anchor element per WAI guidelines
69
- const anchorElement = context.anchorElement!
70
- const scrollParent = getScrollParent(anchorElement)
71
- scrollParent.removeEventListener("resize", setPosition);
72
- scrollParent.removeEventListener("scroll", setPosition);
73
- if (anchorElement.focus) {
74
- anchorElement.focus();
75
- }
76
- }
77
-
78
- function handleDocumentMouseDown() {
79
- closeOnClick = true;
80
- }
36
+ const popout = createPopoutContent({
37
+ getAnchor: () => context.anchorElement,
38
+ getContent: () => div,
39
+ close: (e) => context.handleClickOutside?.(e),
40
+ side: $props?.side ?? "bottom",
41
+ alignment: $props?.alignment ?? "center",
42
+ ignoreAnchorClicks: true,
43
+ focusFirstElement: () => context.focusFirstElement?.(),
44
+ refocusAnchorOnHide: true,
45
+ });
81
46
 
82
- function handleDocumentClick(e: MouseEvent) {
83
- if (
84
- closeOnClick &&
85
- div &&
86
- !div.contains(e.target as HTMLElement) &&
87
- (!context.anchorElement || !context.anchorElement.contains(e.target as HTMLElement))
88
- ) {
89
- e.preventDefault();
90
- context.handleClickOutside!(e);
91
- }
92
- }
47
+ let div: HTMLDivElement;
93
48
 
94
- function setPosition() {
95
- if (!context.anchorElement) {
96
- throw new Error("Popover must have an anchor element");
49
+ $run(() => {
50
+ if (!$state.visible) {
51
+ popout.hide();
97
52
  }
98
-
99
- let side = $props?.side ?? "bottom";
100
- let alignment = $props?.alignment ?? "center";
101
- setPopoverPosition(context.anchorElement, div, side, alignment);
102
- }
53
+ });
103
54
 
104
55
  @render {
105
56
  @if ($state.visible) {
106
57
  <div
107
- {$props?.id}
58
+ id={$props?.id ?? defaultId}
108
59
  class={["torp-popover-content", $props?.class]}
109
60
  {$props?.style}
110
61
  &ref={div}
111
- onmount={show}
62
+ onmount={(_el) => popout.show()}
112
63
  >
113
64
  <slot />
114
65
  </div>
@@ -0,0 +1,90 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import { createHoverReveal } from "../utils/hoverReveal";
3
+ import getId from "../utils/getId";
4
+ import { type PopoverContext, PopoverContextName } from "./PopoverTypes";
5
+
6
+ interface PopoverHoverProps {
7
+ /** An ID for the root element */
8
+ id?: string;
9
+ /** Classes for the root element */
10
+ class?: ClassValue;
11
+ /** Styles for the root element */
12
+ style?: StyleValue;
13
+ /** Milliseconds to wait before opening (default 500; 0 opens immediately) */
14
+ hoverDelay?: number;
15
+ /** Milliseconds to wait after the pointer or focus leaves before closing (default 300) */
16
+ exitGrace?: number;
17
+ /** Whether hovering and focusing are ignored */
18
+ disabled?: boolean;
19
+ }
20
+
21
+ /**
22
+ * An element that shows a Popover while hovered, with proper hover
23
+ * semantics: an intent delay before opening (so passing over the element
24
+ * doesn't flash a popover), and an exit grace period after leaving (so
25
+ * moving into the popover content doesn't close it).
26
+ *
27
+ * Focusing the element opens it immediately; blurring closes it. Use this
28
+ * in place of PopoverTrigger:
29
+ *
30
+ * ```
31
+ * <Popover>
32
+ * <PopoverHover>Anything can go here</PopoverHover>
33
+ * <PopoverContent />
34
+ * </Popover>
35
+ * ```
36
+ */
37
+ export default function PopoverHover($props?: PopoverHoverProps) {
38
+ let defaultId = getId();
39
+
40
+ // Get stuff out of the PopoverContext
41
+ const context = $context[PopoverContextName] as PopoverContext;
42
+ if (!context) {
43
+ throw new Error("PopoverHover must be contained within a Popover");
44
+ }
45
+ const $state = context.state;
46
+
47
+ // Set the trigger ID so that it can be used with aria-labelledby
48
+ $state.triggerId = $props?.id ?? defaultId;
49
+
50
+ function setVisible(visible: boolean) {
51
+ $state.visible = visible;
52
+ }
53
+
54
+ const hover = createHoverReveal({
55
+ show: () => setVisible(true),
56
+ hide: () => setVisible(false),
57
+ isVisible: () => $state.visible,
58
+ disabled: () => $props?.disabled === true,
59
+ getContent: () => ($state.contentId ? document.getElementById($state.contentId) : undefined),
60
+ hoverDelay: $props?.hoverDelay,
61
+ exitGrace: $props?.exitGrace,
62
+ });
63
+
64
+ $run(() => {
65
+ return () => hover.dispose();
66
+ });
67
+
68
+ function anchor(node: HTMLElement) {
69
+ context.anchorElement = node;
70
+ }
71
+
72
+ @render {
73
+ <div
74
+ id={$props?.id ?? defaultId}
75
+ class={["torp-popover-hover", $props?.class]}
76
+ {$props?.style}
77
+ tabindex="0"
78
+ aria-haspopup={$state.contentRole ?? "true"}
79
+ aria-expanded={$state.visible ? "true" : "false"}
80
+ aria-controls={$state.contentId}
81
+ onmouseenter={() => hover.handleEnter()}
82
+ onmouseleave={(e: MouseEvent) => hover.handleLeave(e)}
83
+ onfocus={() => hover.handleFocus()}
84
+ onblur={(e: FocusEvent) => hover.handleBlur(e)}
85
+ onmount={anchor}
86
+ >
87
+ <slot />
88
+ </div>
89
+ }
90
+ }
@@ -1,62 +1,39 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { PopoverContextName, type PopoverContext } from "./PopoverTypes";
3
- import hoverTrigger from "../mount/hoverTrigger";
2
+ import PopoutClickTrigger from "../utils/PopoutClickTrigger.torp";
3
+ import { type PopoverContext, PopoverContextName } from "./PopoverTypes";
4
4
 
5
5
  interface PopoverTriggerProps {
6
6
  /** An ID for the root element */
7
7
  id?: string;
8
8
  /** Classes for the root element */
9
- class?: ClassValue,
9
+ class?: ClassValue;
10
10
  /** Styles for the root element */
11
- style?: StyleValue,
12
- /** Whether the popover is activated by click/press or by hover **/
13
- activation?: "press" | "hover"
11
+ style?: StyleValue;
14
12
  }
15
13
 
16
14
  /**
17
- * The button that causes a Popover to appear or disappear.
15
+ * The button that causes a Popover to appear or disappear when pressed.
16
+ *
17
+ * For hover activation, use PopoverHover instead -- hover surfaces need an
18
+ * intent delay and an exit grace period that a press button doesn't.
18
19
  */
19
- export default function PopoverTrigger($props: PopoverTriggerProps | undefined) {
20
- let activation = $props?.activation ?? "press";
21
-
20
+ export default function PopoverTrigger($props?: PopoverTriggerProps) {
22
21
  // Get stuff out of the PopoverContext
23
22
  const context = $context[PopoverContextName] as PopoverContext;
24
23
  if (!context) {
25
24
  throw new Error("PopoverTrigger must be contained within a Popover");
26
25
  }
27
- let $state = context.state;
28
-
29
- function handleClick() {
30
- if (activation !== "press") return;
31
-
32
- $state.visible = !$state.visible;
33
- }
34
-
35
- function handleHover(node: HTMLElement, e: MouseEvent) {
36
- if (activation !== "hover") return;
37
-
38
- if ($state.position) {
39
- // Get the position relative to the element, so we can reposition on scroll
40
- const rect = node.getBoundingClientRect();
41
- const x = e.clientX - rect.left;
42
- const y = e.clientY - rect.top;
43
- $state.position = { x, y };
44
- //$state.position = { x: window.scrollX + e.clientX, y: window.scrollY + e.clientY };
45
- }
46
- $state.visible = !$state.visible
47
- }
48
26
 
49
27
  @render {
50
- <button
51
- type="button"
52
- {$props?.id}
53
- class={["torp-popover-trigger", $props?.class]}
54
- {$props?.style}
55
- onclick={handleClick}
56
- onmount={(el) => hoverTrigger(el, { onHover: handleHover, onExit: handleHover })}
57
- &ref={context.anchorElement}
28
+ <PopoutClickTrigger
29
+ id={$props?.id}
30
+ class={$props?.class ?? "torp-popover-trigger"}
31
+ style={$props?.style}
32
+ context={context}
33
+ tag="button"
34
+ event="click"
58
35
  >
59
36
  <slot />
60
- </button>
37
+ </PopoutClickTrigger>
61
38
  }
62
39
  }
@@ -1,26 +1,13 @@
1
- export const PopoverContextName = "Popover";
1
+ import { type PopoutContext, type PopoutState } from "../utils/PopoutTypes";
2
+
3
+ export const PopoverContextName: unique symbol = Symbol.for("torp.Popover");
2
4
 
3
5
  /** The shared context for popover components (Contextual, Prompt and Popover) */
4
- export interface PopoverContext {
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;
6
+ export interface PopoverContext extends PopoutContext {
9
7
  state: PopoverState;
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
8
  }
21
9
 
22
- export interface PopoverState {
23
- visible: boolean;
10
+ export interface PopoverState extends PopoutState {
24
11
  position: Point;
25
12
  }
26
13
 
@@ -5,25 +5,21 @@ interface PopoverProps {
5
5
  /** An ID for the root element */
6
6
  id?: string;
7
7
  /** Classes for the root element */
8
- class?: ClassValue,
8
+ class?: ClassValue;
9
9
  /** Styles for the root element */
10
- style?: StyleValue,
10
+ style?: StyleValue;
11
11
  /** 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 */
12
- modal?: boolean,
12
+ modal?: boolean;
13
13
  /** Whether the popover is visible */
14
- visible?: boolean,
14
+ visible: Bindable<boolean | undefined>;
15
15
  /** The element to anchor this popover to, as an alternative to supplying a PopoverTrigger */
16
- anchor?: HTMLElement,
16
+ anchor?: HTMLElement;
17
17
  /** The position to display this popover at if it's contextual, as an alternative to supplying a PopoverTriggerContextual */
18
- position?: Point,
19
- /** A function to be called when the user selects a response */
20
- callback?: ((value: any) => void),
21
- /** Raised when the popover is opened or closed */
22
- ontoggle?: (open: boolean) => void,
18
+ position?: Point;
23
19
  /** Raised when the popover has opened */
24
- onopen?: () => void,
20
+ onopen?: () => void;
25
21
  /** Raised when the popover has closed */
26
- onclose?: (result: any) => void,
22
+ onclose?: (result: any) => void;
27
23
  }
28
24
 
29
25
  /**
@@ -62,26 +58,45 @@ declare function PopoverContent(
62
58
 
63
59
 
64
60
 
65
- interface PopoverTriggerProps {
66
- /** An ID for the root element */
67
- id?: string;
68
- /** Classes for the root element */
69
- class?: ClassValue,
70
- /** Styles for the root element */
71
- style?: StyleValue,
72
- /** Whether the popover is activated by click/press or by hover **/
73
- activation?: "press" | "hover"
74
- }
61
+ /**
62
+ * An element that shows a Popover while hovered, with proper hover
63
+ * semantics: an intent delay before opening (so passing over the element
64
+ * doesn't flash a popover), and an exit grace period after leaving (so
65
+ * moving into the popover content doesn't close it).
66
+ *
67
+ * Focusing the element opens it immediately; blurring closes it. Use this
68
+ * in place of PopoverTrigger:
69
+ *
70
+ * ```
71
+ * <Popover>
72
+ * <PopoverHover>Anything can go here</PopoverHover>
73
+ * <PopoverContent />
74
+ * </Popover>
75
+ * ```
76
+ */
77
+ declare function PopoverHover(
78
+ $parent: ParentNode,
79
+ $anchor: Node | null,
80
+ $props?: PopoverHoverProps,
81
+ $context?: Record<PropertyKey, any>,
82
+ $slots?: Record<string, SlotRender>,
83
+ ): void;
84
+
85
+
75
86
 
76
87
  /**
77
- * The button that causes a Popover to appear or disappear.
88
+ * The button that causes a Popover to appear or disappear when pressed.
89
+ *
90
+ * For hover activation, use PopoverHover instead -- hover surfaces need an
91
+ * intent delay and an exit grace period that a press button doesn't.
78
92
  */
79
93
  declare function PopoverTrigger(
80
94
  $parent: ParentNode,
81
95
  $anchor: Node | null,
82
- $props: PopoverTriggerProps | undefined,
96
+ $props?: PopoverTriggerProps,
83
97
  $context?: Record<PropertyKey, any>,
84
98
  $slots?: Record<string, SlotRender>,
85
99
  ): void;
86
100
 
87
- export { Popover, PopoverContent, PopoverTrigger };
101
+ export { Popover, PopoverContent, PopoverHover, PopoverTrigger };
102
+ export { default as showPopover } from "./showPopover";
@@ -1,21 +1,21 @@
1
- // src/Popover/Popover.torp
2
- import Popover_default from "./Popover.torp";
3
-
4
- // src/Popover/PopoverContent.torp
5
- import PopoverContent_default from "./PopoverContent.torp";
6
-
7
- // src/Popover/PopoverTrigger.torp
8
- import PopoverTrigger_default from "./PopoverTrigger.torp";
9
-
10
- // src/Popover/showPopover.ts
1
+ import Popover from "./Popover.torp";
2
+ import PopoverContent from "./PopoverContent.torp";
3
+ import PopoverHover from "./PopoverHover.torp";
4
+ import PopoverTrigger from "./PopoverTrigger.torp";
5
+ //#region src/Popover/showPopover.ts
6
+ /**
7
+ * Shows a popover component in code.
8
+ * @param popover The popover component
9
+ * @param anchor The element to use as an anchor for the popover component
10
+ * @param props The properties for the popover component
11
+ * @param target The target element to show the popover in
12
+ * @returns The value selected by the user
13
+ */
11
14
  function showPopover(popover, anchor, props, target) {
12
- const allProps = Object.assign({}, props, { anchor });
13
- popover(target || anchor.parentElement || document.body, null, allProps);
15
+ const allProps = Object.assign({}, props, { anchor });
16
+ popover(target || anchor.parentElement || document.body, null, allProps);
14
17
  }
15
- export {
16
- Popover_default as Popover,
17
- PopoverContent_default as PopoverContent,
18
- PopoverTrigger_default as PopoverTrigger,
19
- showPopover
20
- };
18
+ //#endregion
19
+ export { Popover, PopoverContent, PopoverHover, PopoverTrigger, showPopover };
20
+
21
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Popover/showPopover.ts"],"sourcesContent":["// TODO: Allow passing in a variable -- so that you can show an inline popover\nimport type { Component } from \"@torpor/view\";\n\n/**\n * Shows a popover component in code.\n * @param popover The popover component\n * @param anchor The element to use as an anchor for the popover component\n * @param props The properties for the popover component\n * @param target The target element to show the popover in\n * @returns The value selected by the user\n */\nexport default function showPopover(\n\tpopover: Component,\n\tanchor: HTMLElement,\n\tprops?: Record<PropertyKey, any>,\n\ttarget?: Element,\n): void {\n\t// Add the anchor element to the properties\n\tconst allProps = Object.assign({}, props, { anchor });\n\n\t// Create the popover\n\t// TODO: This needs to clean up after itself, like the mount methods do\n\tpopover(target || anchor.parentElement || document.body, null, allProps);\n}\n"],"mappings":";;;;;;;;;;AAWe,SAAR,YACN,SACA,QACA,OACA,QACO;AAEP,QAAM,WAAW,OAAO,OAAO,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC;AAIpD,UAAQ,UAAU,OAAO,iBAAiB,SAAS,MAAM,MAAM,QAAQ;AACxE;","names":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Popover/showPopover.ts"],"sourcesContent":["// TODO: Allow passing in a variable -- so that you can show an inline popover\nimport type { Component } from \"@torpor/view\";\n\n/**\n * Shows a popover component in code.\n * @param popover The popover component\n * @param anchor The element to use as an anchor for the popover component\n * @param props The properties for the popover component\n * @param target The target element to show the popover in\n * @returns The value selected by the user\n */\nexport default function showPopover(\n\tpopover: Component,\n\tanchor: HTMLElement,\n\tprops?: Record<PropertyKey, any>,\n\ttarget?: Element,\n): void {\n\t// Add the anchor element to the properties\n\tconst allProps = Object.assign({}, props, { anchor });\n\n\t// Create the popover\n\t// TODO: This needs to clean up after itself, like the mount methods do\n\tpopover(target || anchor.parentElement || document.body, null, allProps);\n}\n"],"mappings":";;;;;;;;;;;;;AAWA,SAAwB,YACvB,SACA,QACA,OACA,QACO;CAEP,MAAM,WAAW,OAAO,OAAO,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC;CAIpD,QAAQ,UAAU,OAAO,iBAAiB,SAAS,MAAM,MAAM,QAAQ;AACxE"}
@@ -0,0 +1,88 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+
3
+ interface ProgressProps {
4
+ /** An ID for the root element */
5
+ id?: string;
6
+ /** Classes for the root element */
7
+ class?: ClassValue;
8
+ /** Styles for the root element */
9
+ style?: StyleValue;
10
+ /** The minimum value (default 0) */
11
+ min?: number;
12
+ /** The maximum value (default 100) */
13
+ max?: number;
14
+ /** The current value; omit it for an indeterminate progress bar */
15
+ value?: number;
16
+ /** A human-readable version of the current value, e.g. "3 of 10 files" */
17
+ valuetext?: string;
18
+ /** An accessible name for the progress bar */
19
+ ariaLabel?: string;
20
+ }
21
+
22
+ /**
23
+ * A progress bar that shows how far along an operation is, either with a
24
+ * specific value or as indeterminate when the extent is unknown.
25
+ *
26
+ * See [the WAI ARIA guidelines for Progress Bars](https://www.w3.org/WAI/ARIA/apg/patterns/progressbar/).
27
+ */
28
+ export default function Progress($props: ProgressProps | undefined) {
29
+ function getMin(): number {
30
+ return $props?.min ?? 0;
31
+ }
32
+ function getMax(): number {
33
+ return $props?.max ?? 100;
34
+ }
35
+ function isIndeterminate(): boolean {
36
+ return $props?.value == null;
37
+ }
38
+
39
+ // The clamped value that is reported to assistive tech
40
+ function getValue(): number {
41
+ return Math.min(getMax(), Math.max(getMin(), $props?.value ?? getMin()));
42
+ }
43
+
44
+ // The percentage of the range that the value represents (0..100)
45
+ function getPct(): number {
46
+ const min = getMin();
47
+ const max = getMax();
48
+ if (max <= min) return 0;
49
+ return ((getValue() - min) / (max - min)) * 100;
50
+ }
51
+
52
+ @render {
53
+ <div
54
+ {$props?.id}
55
+ class={["torp-progress", $props?.class]}
56
+ {$props?.style}
57
+ role="progressbar"
58
+ aria-label={$props?.ariaLabel}
59
+ aria-valuemin={isIndeterminate() ? undefined : getMin()}
60
+ aria-valuemax={isIndeterminate() ? undefined : getMax()}
61
+ aria-valuenow={isIndeterminate() ? undefined : getValue()}
62
+ aria-valuetext={$props?.valuetext}
63
+ data-state={isIndeterminate() ? "indeterminate" : "determinate"}
64
+ >
65
+ <div
66
+ class="torp-progress-bar"
67
+ data-state={isIndeterminate() ? "indeterminate" : "determinate"}
68
+ style={isIndeterminate() ? undefined : `width: ${getPct()}%;`}
69
+ />
70
+ </div>
71
+ }
72
+
73
+ @style {
74
+ /* Headless: layout only, so the bar fills the track proportionally.
75
+ All appearance is up to the consuming theme */
76
+ .torp-progress {
77
+ position: relative;
78
+ overflow: hidden;
79
+ }
80
+ .torp-progress-bar {
81
+ position: absolute;
82
+ inset: 0 auto 0 0;
83
+ }
84
+ .torp-progress-bar[data-state="indeterminate"] {
85
+ width: 100%;
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,37 @@
1
+ import { type SlotRender } from "@torpor/view";
2
+
3
+
4
+ interface ProgressProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Classes for the root element */
8
+ class?: ClassValue;
9
+ /** Styles for the root element */
10
+ style?: StyleValue;
11
+ /** The minimum value (default 0) */
12
+ min?: number;
13
+ /** The maximum value (default 100) */
14
+ max?: number;
15
+ /** The current value; omit it for an indeterminate progress bar */
16
+ value?: number;
17
+ /** A human-readable version of the current value, e.g. "3 of 10 files" */
18
+ valuetext?: string;
19
+ /** An accessible name for the progress bar */
20
+ ariaLabel?: string;
21
+ }
22
+
23
+ /**
24
+ * A progress bar that shows how far along an operation is, either with a
25
+ * specific value or as indeterminate when the extent is unknown.
26
+ *
27
+ * See [the WAI ARIA guidelines for Progress Bars](https://www.w3.org/WAI/ARIA/apg/patterns/progressbar/).
28
+ */
29
+ declare function Progress(
30
+ $parent: ParentNode,
31
+ $anchor: Node | null,
32
+ $props: ProgressProps | undefined,
33
+ $context?: Record<PropertyKey, any>,
34
+ $slots?: Record<string, SlotRender>,
35
+ ): void;
36
+
37
+ export { Progress };
@@ -0,0 +1,2 @@
1
+ import Progress from "./Progress.torp";
2
+ export { Progress };