@torpor/ui 0.4.0 → 1.0.1

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 (342) hide show
  1. package/README.md +83 -7
  2. package/dist/Accordion/Accordion.torp +42 -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 +1 -1
  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 +24 -3
  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 +55 -144
  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 +85 -0
  43. package/dist/Charts/ChartYAxis.torp +107 -0
  44. package/dist/Charts/ColumnChart.torp +70 -0
  45. package/dist/Charts/GridLines.torp +4 -4
  46. package/dist/Charts/LineChart.torp +55 -178
  47. package/dist/Charts/PieChart.torp +14 -20
  48. package/dist/Charts/ScatterChart.torp +45 -38
  49. package/dist/Charts/SparkLine.torp +16 -19
  50. package/dist/Charts/XAxis.torp +14 -11
  51. package/dist/Charts/YAxis.torp +10 -8
  52. package/dist/Charts/index.d.ts +328 -79
  53. package/dist/Charts/index.js +17 -34
  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 +120 -0
  60. package/dist/ComboBox/ComboBoxInput.torp +161 -0
  61. package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
  62. package/dist/ComboBox/ComboBoxTypes.ts +39 -0
  63. package/dist/ComboBox/index.d.ts +154 -0
  64. package/dist/ComboBox/index.js +6 -0
  65. package/dist/CommandPalette/CommandPalette.torp +223 -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 +32 -50
  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 +4 -17
  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 +315 -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 +24 -17
  91. package/dist/Dialog/DialogBody.torp +5 -9
  92. package/dist/Dialog/DialogButton.torp +12 -12
  93. package/dist/Dialog/DialogFooter.torp +3 -7
  94. package/dist/Dialog/DialogHeader.torp +6 -10
  95. package/dist/Dialog/index.d.ts +27 -27
  96. package/dist/Dialog/index.js +6 -22
  97. package/dist/Disclosure/Disclosure.torp +18 -18
  98. package/dist/Disclosure/DisclosureContent.torp +5 -6
  99. package/dist/Disclosure/DisclosureHeader.torp +7 -11
  100. package/dist/Disclosure/DisclosureTrigger.torp +4 -5
  101. package/dist/Disclosure/index.d.ts +14 -16
  102. package/dist/Disclosure/index.js +5 -18
  103. package/dist/Drawer/Drawer.torp +19 -49
  104. package/dist/Drawer/DrawerContent.torp +70 -13
  105. package/dist/Drawer/DrawerOverlay.torp +4 -4
  106. package/dist/Drawer/DrawerTrigger.torp +16 -4
  107. package/dist/Drawer/DrawerTypes.ts +3 -0
  108. package/dist/Drawer/index.d.ts +16 -20
  109. package/dist/Drawer/index.js +5 -18
  110. package/dist/FocusGroup/FocusGroup.torp +70 -0
  111. package/dist/FocusGroup/FocusGroupButton.torp +59 -0
  112. package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
  113. package/dist/FocusGroup/index.d.ts +44 -0
  114. package/dist/FocusGroup/index.js +3 -0
  115. package/dist/Form/CheckBox.torp +27 -18
  116. package/dist/Form/Field.torp +17 -17
  117. package/dist/Form/File.torp +31 -22
  118. package/dist/Form/FileDrop.torp +187 -0
  119. package/dist/Form/Form.torp +24 -22
  120. package/dist/Form/FormTypes.ts +2 -0
  121. package/dist/Form/FormValues.torp +37 -0
  122. package/dist/Form/Hidden.torp +4 -12
  123. package/dist/Form/Input.torp +38 -32
  124. package/dist/Form/Label.torp +3 -3
  125. package/dist/Form/Message.torp +13 -5
  126. package/dist/Form/MessageSummary.torp +5 -4
  127. package/dist/Form/Option.torp +11 -7
  128. package/dist/Form/Select.torp +32 -28
  129. package/dist/Form/TextArea.torp +35 -31
  130. package/dist/Form/Toggle.torp +109 -0
  131. package/dist/Form/index.d.ts +178 -79
  132. package/dist/Form/index.js +16 -50
  133. package/dist/ListBox/ListBox.torp +253 -150
  134. package/dist/ListBox/ListBoxItem.torp +54 -30
  135. package/dist/ListBox/ListBoxSeparator.torp +5 -2
  136. package/dist/ListBox/ListBoxTypes.ts +23 -5
  137. package/dist/ListBox/LoadedListBoxItems.torp +41 -0
  138. package/dist/ListBox/index.d.ts +56 -17
  139. package/dist/ListBox/index.js +4 -14
  140. package/dist/MaskedInput/MaskedInput.torp +143 -0
  141. package/dist/MaskedInput/index.d.ts +52 -0
  142. package/dist/MaskedInput/index.js +2 -0
  143. package/dist/Menu/Menu.torp +86 -71
  144. package/dist/Menu/MenuButton.torp +17 -10
  145. package/dist/Menu/MenuCheck.torp +22 -18
  146. package/dist/Menu/MenuGroup.torp +4 -4
  147. package/dist/Menu/MenuIndicator.torp +5 -13
  148. package/dist/Menu/MenuPopout.torp +20 -50
  149. package/dist/Menu/MenuPopoutContent.torp +15 -66
  150. package/dist/Menu/MenuPopoutTrigger.torp +19 -100
  151. package/dist/Menu/MenuRadio.torp +25 -26
  152. package/dist/Menu/MenuRadioGroup.torp +25 -68
  153. package/dist/Menu/MenuSeparator.torp +3 -2
  154. package/dist/Menu/MenuTypes.ts +9 -19
  155. package/dist/Menu/index.d.ts +45 -51
  156. package/dist/Menu/index.js +12 -46
  157. package/dist/MenuBar/MenuBar.torp +31 -83
  158. package/dist/MenuBar/MenuBarItem.torp +33 -51
  159. package/dist/MenuBar/MenuBarItemContent.torp +15 -101
  160. package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
  161. package/dist/MenuBar/MenuBarTypes.ts +11 -10
  162. package/dist/MenuBar/index.d.ts +17 -19
  163. package/dist/MenuBar/index.js +5 -18
  164. package/dist/Modal/Modal.torp +22 -47
  165. package/dist/Modal/ModalContent.torp +21 -44
  166. package/dist/Modal/ModalOverlay.torp +4 -4
  167. package/dist/Modal/ModalTrigger.torp +16 -32
  168. package/dist/Modal/ModalTypes.ts +5 -16
  169. package/dist/Modal/index.d.ts +17 -29
  170. package/dist/Modal/index.js +29 -28
  171. package/dist/Modal/index.js.map +1 -1
  172. package/dist/Modal/showPrompt.ts +2 -2
  173. package/dist/NavMenu/NavMenu.torp +22 -111
  174. package/dist/NavMenu/NavMenuButton.torp +7 -8
  175. package/dist/NavMenu/NavMenuElement.torp +6 -7
  176. package/dist/NavMenu/NavMenuGroup.torp +5 -5
  177. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
  178. package/dist/NavMenu/NavMenuLink.torp +7 -10
  179. package/dist/NavMenu/NavMenuPopout.torp +15 -60
  180. package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
  181. package/dist/NavMenu/NavMenuPopoutTrigger.torp +17 -99
  182. package/dist/NavMenu/NavMenuSeparator.torp +3 -7
  183. package/dist/NavMenu/NavMenuTypes.ts +4 -14
  184. package/dist/NavMenu/index.d.ts +40 -44
  185. package/dist/NavMenu/index.js +11 -42
  186. package/dist/Notification/Notification.torp +12 -24
  187. package/dist/Notification/NotificationClose.torp +6 -3
  188. package/dist/Notification/NotificationContainer.torp +3 -7
  189. package/dist/Notification/NotificationContent.torp +3 -7
  190. package/dist/Notification/NotificationTypes.ts +1 -1
  191. package/dist/Notification/index.d.ts +15 -12
  192. package/dist/Notification/index.js +22 -32
  193. package/dist/Notification/index.js.map +1 -1
  194. package/dist/NumberInput/NumberInput.torp +255 -0
  195. package/dist/NumberInput/index.d.ts +44 -0
  196. package/dist/NumberInput/index.js +2 -0
  197. package/dist/Pagination/Pagination.torp +41 -34
  198. package/dist/Pagination/PaginationItem.torp +50 -13
  199. package/dist/Pagination/PaginationTypes.ts +3 -6
  200. package/dist/Pagination/buildPages.ts +9 -5
  201. package/dist/Pagination/index.d.ts +19 -9
  202. package/dist/Pagination/index.js +3 -40
  203. package/dist/Popover/Popover.torp +32 -50
  204. package/dist/Popover/PopoverContent.torp +27 -76
  205. package/dist/Popover/PopoverHover.torp +90 -0
  206. package/dist/Popover/PopoverTrigger.torp +17 -40
  207. package/dist/Popover/PopoverTypes.ts +4 -17
  208. package/dist/Popover/index.d.ts +40 -25
  209. package/dist/Popover/index.js +18 -18
  210. package/dist/Popover/index.js.map +1 -1
  211. package/dist/Progress/Progress.torp +88 -0
  212. package/dist/Progress/index.d.ts +37 -0
  213. package/dist/Progress/index.js +2 -0
  214. package/dist/Rating/Rating.torp +225 -0
  215. package/dist/Rating/index.d.ts +44 -0
  216. package/dist/Rating/index.js +2 -0
  217. package/dist/SegmentedControl/SegmentedControl.torp +233 -0
  218. package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
  219. package/dist/SegmentedControl/SegmentedItem.torp +78 -0
  220. package/dist/SegmentedControl/index.d.ts +74 -0
  221. package/dist/SegmentedControl/index.js +3 -0
  222. package/dist/SelectBox/SelectBox.torp +107 -53
  223. package/dist/SelectBox/SelectBoxContent.torp +49 -19
  224. package/dist/SelectBox/SelectBoxTrigger.torp +108 -8
  225. package/dist/SelectBox/SelectBoxTypes.ts +26 -11
  226. package/dist/SelectBox/index.d.ts +39 -54
  227. package/dist/SelectBox/index.js +5 -18
  228. package/dist/Slider/Slider.torp +245 -0
  229. package/dist/Slider/index.d.ts +45 -0
  230. package/dist/Slider/index.js +2 -0
  231. package/dist/Splitter/Splitter.torp +156 -0
  232. package/dist/Splitter/SplitterHandle.torp +161 -0
  233. package/dist/Splitter/SplitterPane.torp +63 -0
  234. package/dist/Splitter/SplitterTypes.ts +31 -0
  235. package/dist/Splitter/index.d.ts +103 -0
  236. package/dist/Splitter/index.js +4 -0
  237. package/dist/Stepper/Stepper.torp +146 -0
  238. package/dist/Stepper/StepperMarker.torp +24 -0
  239. package/dist/Stepper/StepperNext.torp +44 -0
  240. package/dist/Stepper/StepperPrevious.torp +44 -0
  241. package/dist/Stepper/StepperStep.torp +90 -0
  242. package/dist/Stepper/StepperTypes.ts +30 -0
  243. package/dist/Stepper/index.d.ts +149 -0
  244. package/dist/Stepper/index.js +6 -0
  245. package/dist/TabGroup/TabContent.torp +6 -6
  246. package/dist/TabGroup/TabGroup.torp +97 -113
  247. package/dist/TabGroup/TabGroupTypes.ts +1 -1
  248. package/dist/TabGroup/TabHeader.torp +23 -19
  249. package/dist/TabGroup/TabList.torp +8 -21
  250. package/dist/TabGroup/TabTrigger.torp +6 -7
  251. package/dist/TabGroup/index.d.ts +26 -26
  252. package/dist/TabGroup/index.js +6 -22
  253. package/dist/TagInput/TagInput.torp +378 -0
  254. package/dist/TagInput/index.d.ts +48 -0
  255. package/dist/TagInput/index.js +2 -0
  256. package/dist/TimePicker/TimePicker.torp +462 -0
  257. package/dist/TimePicker/index.d.ts +53 -0
  258. package/dist/TimePicker/index.js +2 -0
  259. package/dist/ToolBar/ToolBar.torp +29 -110
  260. package/dist/ToolBar/ToolBarButton.torp +7 -8
  261. package/dist/ToolBar/ToolBarElement.torp +7 -11
  262. package/dist/ToolBar/ToolBarPopout.torp +16 -68
  263. package/dist/ToolBar/ToolBarPopoutContent.torp +15 -73
  264. package/dist/ToolBar/ToolBarPopoutTrigger.torp +19 -110
  265. package/dist/ToolBar/ToolBarSeparator.torp +3 -7
  266. package/dist/ToolBar/ToolBarTypes.ts +7 -14
  267. package/dist/ToolBar/index.d.ts +30 -32
  268. package/dist/ToolBar/index.js +8 -30
  269. package/dist/Tree/Tree.torp +395 -0
  270. package/dist/Tree/TreeItem.torp +176 -0
  271. package/dist/Tree/TreeItemChildren.torp +60 -0
  272. package/dist/Tree/TreeItemContent.torp +46 -0
  273. package/dist/Tree/TreeItemLabel.torp +94 -0
  274. package/dist/Tree/TreeItemTrigger.torp +78 -0
  275. package/dist/Tree/TreeLoadedChildren.torp +122 -0
  276. package/dist/Tree/TreeTypes.ts +63 -0
  277. package/dist/Tree/index.d.ts +262 -0
  278. package/dist/Tree/index.js +7 -0
  279. package/dist/icons/ChevronDoubleLeft.torp +19 -0
  280. package/dist/icons/ChevronDoubleRight.torp +19 -0
  281. package/dist/icons/index.d.ts +61 -1
  282. package/dist/icons/index.js +17 -58
  283. package/dist/loader-DEeG5vFY.js +44 -0
  284. package/dist/loader-DEeG5vFY.js.map +1 -0
  285. package/dist/motion/index.d.ts +12 -8
  286. package/dist/motion/index.d.ts.map +1 -0
  287. package/dist/motion/index.js +70 -88
  288. package/dist/motion/index.js.map +1 -1
  289. package/dist/mount/draggable.ts +63 -0
  290. package/dist/mount/dropTarget.ts +108 -0
  291. package/dist/mount/hoverTrigger.ts +1 -1
  292. package/dist/utils/$handle.ts +23 -0
  293. package/dist/utils/LoadedItems.torp +47 -0
  294. package/dist/utils/PopoutClickTrigger.torp +99 -0
  295. package/dist/utils/PopoutTypes.ts +59 -12
  296. package/dist/utils/SubmenuPopout.torp +89 -0
  297. package/dist/utils/SubmenuPopoutContent.torp +87 -0
  298. package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
  299. package/dist/utils/chartColors.ts +13 -13
  300. package/dist/utils/chartLayout.ts +143 -0
  301. package/dist/utils/colorUtils.ts +103 -0
  302. package/dist/utils/createItemGroup.ts +152 -0
  303. package/dist/utils/dateUtils.ts +8 -7
  304. package/dist/utils/documentEvents.ts +4 -4
  305. package/dist/utils/dragState.ts +86 -0
  306. package/dist/utils/focusGroup.ts +204 -0
  307. package/dist/utils/focusItem.ts +44 -0
  308. package/dist/utils/formField.ts +70 -0
  309. package/dist/utils/hoverOpen.ts +50 -0
  310. package/dist/utils/hoverReveal.ts +194 -0
  311. package/dist/utils/loader.ts +113 -0
  312. package/dist/utils/maskUtils.ts +98 -0
  313. package/dist/utils/popoutContent.ts +137 -0
  314. package/dist/utils/reorderList.ts +52 -0
  315. package/package.json +97 -22
  316. package/dist/Accordion/index.js.map +0 -1
  317. package/dist/Breadcrumb/index.js.map +0 -1
  318. package/dist/Calendar/index.js.map +0 -1
  319. package/dist/Charts/index.js.map +0 -1
  320. package/dist/Contextual/index.js.map +0 -1
  321. package/dist/Dialog/index.js.map +0 -1
  322. package/dist/Disclosure/index.js.map +0 -1
  323. package/dist/Drawer/index.js.map +0 -1
  324. package/dist/Form/index.js.map +0 -1
  325. package/dist/ListBox/index.js.map +0 -1
  326. package/dist/Menu/index.js.map +0 -1
  327. package/dist/MenuBar/index.js.map +0 -1
  328. package/dist/NavMenu/index.js.map +0 -1
  329. package/dist/Pagination/index.js.map +0 -1
  330. package/dist/SelectBox/SelectBoxInput.torp +0 -95
  331. package/dist/SelectBox/index.js.map +0 -1
  332. package/dist/TabGroup/index.js.map +0 -1
  333. package/dist/ToolBar/index.js.map +0 -1
  334. package/dist/icons/index.js.map +0 -1
  335. package/dist/index.d.ts +0 -19
  336. package/dist/metafile-esm.json +0 -1
  337. package/dist/motion/fade.ts +0 -16
  338. package/dist/motion/grow.ts +0 -23
  339. package/dist/motion/measure.ts +0 -28
  340. package/dist/motion/slide.ts +0 -45
  341. package/dist/mount/index.d.ts +0 -2
  342. package/dist/utils/index.d.ts +0 -2
@@ -0,0 +1,137 @@
1
+ import { type ClassValue, type StyleValue } from "@torpor/view";
2
+ import { areDatesEqual } from "../utils/dateUtils";
3
+ import { type CalendarContext, CalendarContextName } from "../Calendar/CalendarTypes";
4
+ import {
5
+ type DateRangePickerContext,
6
+ DateRangePickerContextName,
7
+ } from "./DateRangePickerTypes";
8
+
9
+ // TODO: Internationalization?? On the server and/or the client...
10
+ const formatDate = (date: Date): string => {
11
+ return new Intl.DateTimeFormat("en-US", {
12
+ year: "numeric",
13
+ month: "long",
14
+ day: "numeric",
15
+ }).format(date);
16
+ };
17
+
18
+ interface DateRangePickerDayProps {
19
+ /** An ID for the root element */
20
+ id?: string;
21
+ /** Classes for the root element */
22
+ class?: ClassValue;
23
+ /** Styles for the root element */
24
+ style?: StyleValue;
25
+ /** The date to display */
26
+ date: Date;
27
+ /** Whether the date is muted (i.e. not in the currently displayed month) */
28
+ muted?: boolean;
29
+ /** Whether the date is the active (keyboard cursor) date */
30
+ active?: boolean;
31
+ /** An ARIA label for describing the day to screen readers */
32
+ ariaLabel?: string | undefined;
33
+ }
34
+
35
+ /**
36
+ * A day in a DateRangePicker's calendar, which highlights the start and end
37
+ * of the range being selected, the dates in between, and a preview of the
38
+ * range while the user hovers.
39
+ */
40
+ export default function DateRangePickerDay($props: DateRangePickerDayProps | undefined) {
41
+ // Ensure the value is a reactive date -- assigning a plain date to
42
+ // watched props/state wraps it automatically
43
+ $props!.date = new Date($unwrap($props?.date ?? new Date()));
44
+ let reactiveDate = $props!.date;
45
+
46
+ // Get stuff out of the Calendar context
47
+ const calendarContext = $context[CalendarContextName] as CalendarContext;
48
+ if (!calendarContext) {
49
+ throw new Error("DateRangePickerDay must be contained within a Calendar");
50
+ }
51
+
52
+ // Get stuff out of the DateRangePicker context
53
+ const rangeContext = $context[DateRangePickerContextName] as DateRangePickerContext;
54
+ if (!rangeContext) {
55
+ throw new Error("DateRangePickerDay must be contained within a DateRangePicker");
56
+ }
57
+
58
+ // Register this day with the parent Calendar, which will handle setting
59
+ // the active (keyboard cursor) date
60
+ calendarContext.registerDay(reactiveDate, setActive);
61
+
62
+ // This function is called by the parent Calendar to set this item's active value
63
+ function setActive(value: boolean) {
64
+ $props!.active = value;
65
+ }
66
+
67
+ function isToday() {
68
+ const today = new Date();
69
+ return areDatesEqual($props!.date, today);
70
+ }
71
+
72
+ function isStart(): boolean {
73
+ const start = rangeContext.getStart();
74
+ return !!start && areDatesEqual($props!.date, start);
75
+ }
76
+
77
+ function isEnd(): boolean {
78
+ const end = rangeContext.getEnd();
79
+ return !!end && areDatesEqual($props!.date, end);
80
+ }
81
+
82
+ // The end of the preview range is the hovered date while a range is being
83
+ // selected, or the real end once it's complete
84
+ function getRangeEnd(): Date | undefined {
85
+ return rangeContext.getEnd() ?? rangeContext.getPreview();
86
+ }
87
+
88
+ function isInRange(): boolean {
89
+ const start = rangeContext.getStart();
90
+ const end = getRangeEnd();
91
+ if (!start || !end) return false;
92
+ if (areDatesEqual($props!.date, start) || areDatesEqual($props!.date, end)) return false;
93
+ return $props!.date > start && $props!.date < end;
94
+ }
95
+
96
+ function handleClick() {
97
+ calendarContext.handleDay(reactiveDate);
98
+ }
99
+
100
+ function handleEnter() {
101
+ rangeContext.setPreview(new Date($props!.date));
102
+ }
103
+
104
+ @render {
105
+ <button
106
+ {$props?.id}
107
+ class={buildClass()}
108
+ {$props?.style}
109
+ type="button"
110
+ tabindex="-1"
111
+ onclick={handleClick}
112
+ onmouseenter={handleEnter}
113
+ aria-label={$props?.ariaLabel ?? formatDate($props!.date)}
114
+ aria-current={isToday() ? "date" : undefined}
115
+ aria-disabled={$props?.muted ? "true" : undefined}
116
+ data-range={isStart() ? "start" : isEnd() ? "end" : isInRange() ? "inside" : undefined}
117
+ >
118
+ <slot>
119
+ {$props!.date.getDate()}
120
+ </slot>
121
+ </button>
122
+ }
123
+
124
+ function buildClass() {
125
+ return [
126
+ "torp-date-range-day",
127
+ $props?.class,
128
+ {
129
+ muted: $props?.muted,
130
+ today: isToday(),
131
+ active: $props?.active,
132
+ selected: isStart() || isEnd(),
133
+ "in-range": isInRange(),
134
+ },
135
+ ];
136
+ }
137
+ }
@@ -0,0 +1,21 @@
1
+ export const DateRangePickerContextName: unique symbol = Symbol.for("torp.DateRangePicker");
2
+
3
+ export interface DateRange {
4
+ /** The first date in the range */
5
+ start: Date;
6
+ /** The last date in the range */
7
+ end: Date;
8
+ }
9
+
10
+ export interface DateRangePickerContext {
11
+ /** The first date in the range being selected, as a plain (unwrapped) date */
12
+ getStart: () => Date | undefined;
13
+ /** The last date in the range, once the range is complete, as a plain date */
14
+ getEnd: () => Date | undefined;
15
+ /** The hovered date extending the preview range, as a plain date */
16
+ getPreview: () => Date | undefined;
17
+ /** Whether the user has picked a start date but not an end date yet */
18
+ isSelecting: () => boolean;
19
+ /** Sets the hovered date that extends the range preview */
20
+ setPreview: (date: Date | undefined) => void;
21
+ }
@@ -0,0 +1,76 @@
1
+ import { type SlotRender } from "@torpor/view";
2
+
3
+
4
+ interface DateRangePickerProps {
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 name of the date range picker's form data fields; "-start" and "-end" are appended */
12
+ name?: string;
13
+ /** The selected date range */
14
+ value?: Bindable<DateRange | undefined>;
15
+ /** Text to display when the value is empty */
16
+ placeholder?: string;
17
+ /** The format for the displayed dates (e.g. "d MMM yyyy") */
18
+ dateFormat?: string;
19
+ /** If set to true, the user cannot interact with this date range picker */
20
+ disabled?: boolean;
21
+ /** An accessible name for the trigger button */
22
+ ariaLabel?: string;
23
+ /** Raised when a complete range has been selected */
24
+ onchange?: (value: DateRange) => void;
25
+ }
26
+
27
+ /**
28
+ * An input for selecting a range of dates from a calendar popout. The first
29
+ * click sets the start of the range and the second sets its end; clicking a
30
+ * date before the start begins a new range there, and a third click starts
31
+ * over.
32
+ *
33
+ * The structure of a DateRangePicker is a trigger button that displays the
34
+ * selected range, with a selectable Calendar in a popout.
35
+ */
36
+ declare function DateRangePicker(
37
+ $parent: ParentNode,
38
+ $anchor: Node | null,
39
+ $props: DateRangePickerProps | undefined,
40
+ $context?: Record<PropertyKey, any>,
41
+ $slots?: Record<string, SlotRender>,
42
+ ): void;
43
+
44
+
45
+
46
+ interface DateRangePickerDayProps {
47
+ /** An ID for the root element */
48
+ id?: string;
49
+ /** Classes for the root element */
50
+ class?: ClassValue;
51
+ /** Styles for the root element */
52
+ style?: StyleValue;
53
+ /** The date to display */
54
+ date: Date;
55
+ /** Whether the date is muted (i.e. not in the currently displayed month) */
56
+ muted?: boolean;
57
+ /** Whether the date is the active (keyboard cursor) date */
58
+ active?: boolean;
59
+ /** An ARIA label for describing the day to screen readers */
60
+ ariaLabel?: string | undefined;
61
+ }
62
+
63
+ /**
64
+ * A day in a DateRangePicker's calendar, which highlights the start and end
65
+ * of the range being selected, the dates in between, and a preview of the
66
+ * range while the user hovers.
67
+ */
68
+ declare function DateRangePickerDay(
69
+ $parent: ParentNode,
70
+ $anchor: Node | null,
71
+ $props: DateRangePickerDayProps | undefined,
72
+ $context?: Record<PropertyKey, any>,
73
+ $slots?: Record<string, SlotRender>,
74
+ ): void;
75
+
76
+ export { DateRangePicker, DateRangePickerDay };
@@ -0,0 +1,3 @@
1
+ import DateRangePicker from "./DateRangePicker.torp";
2
+ import DateRangePickerDay from "./DateRangePickerDay.torp";
3
+ export { DateRangePicker, DateRangePickerDay };
@@ -1,31 +1,35 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import { type TrapFocusOptions, trapFocus } from "../mount/trapFocus";
3
+ import {
4
+ type HandleButtonPress,
5
+ type PopoutContext,
6
+ PopoutContextName,
7
+ } from "../utils/PopoutTypes";
2
8
  import getId from "../utils/getId";
3
- import { trapFocus, type TrapFocusOptions } from "../mount/trapFocus";
4
- import { PopoutContextName, type PopoutContext, type HandleButtonPress } from "../utils/PopoutTypes";
5
- import { DialogContextName, type DialogContext, type DialogState } from "./DialogTypes";
9
+ import { type DialogContext, DialogContextName, type DialogState } from "./DialogTypes";
6
10
 
7
11
  interface DialogProps {
8
12
  /** An ID for the root element */
9
13
  id?: string;
10
14
  /** Classes for the root element */
11
- class?: ClassValue,
15
+ class?: ClassValue;
12
16
  /** Styles for the root element */
13
- style?: StyleValue,
17
+ style?: StyleValue;
14
18
  /** An ARIA label for describing the popover to screen readers */
15
- ariaLabel?: string,
19
+ ariaLabel?: string;
16
20
  /** Whether the dialog should alert the user via the screen reader */
17
- alert?: boolean,
21
+ alert?: boolean;
18
22
  }
19
23
 
20
24
  /**
21
25
  * A dialog that can be used to show a message to the user, or get information from the user.
22
- *
26
+ *
23
27
  * Dialogs are typically shown within a Modal or Popover.
24
- *
28
+ *
25
29
  * See [the WAI ARIA guidelines for Dialogs](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/).
26
- *
30
+ *
27
31
  * The structure of a Dialog is:
28
- *
32
+ *
29
33
  * ```
30
34
  * <Dialog>
31
35
  * <ModalOverlay /> (optional -- will set `modal` to true)
@@ -36,7 +40,7 @@ interface DialogProps {
36
40
  * </DialogFooter>
37
41
  * </Dialog>
38
42
  * ```
39
- *
43
+ *
40
44
  */
41
45
  export default function Dialog($props: DialogProps | undefined) {
42
46
  let defaultId = getId();
@@ -44,7 +48,7 @@ export default function Dialog($props: DialogProps | undefined) {
44
48
  //let div: HTMLDivElement;
45
49
 
46
50
  let trapFocusOptions: TrapFocusOptions = {
47
- focusableElements: []
51
+ focusableElements: [],
48
52
  };
49
53
 
50
54
  // Maybe get stuff out of a popout context
@@ -59,6 +63,11 @@ export default function Dialog($props: DialogProps | undefined) {
59
63
  // Set the focusFirstElement method in the PopoutContext so that it can be
60
64
  // called after everything has been shown
61
65
  popoutContext.focusFirstElement = focusFirstElement;
66
+
67
+ // Set the content ID and role so that triggers can use them with
68
+ // aria-controls / aria-haspopup
69
+ popoutContext.state.contentId = $props?.id ?? defaultId;
70
+ popoutContext.state.contentRole = "dialog";
62
71
  }
63
72
 
64
73
  // Set the IDs for using in the Dialog's ARIA attributes
@@ -72,7 +81,7 @@ export default function Dialog($props: DialogProps | undefined) {
72
81
  let context: DialogContext = {
73
82
  handleButton,
74
83
  state: $state,
75
- anchorElement: popoutContext ? popoutContext.anchorElement : undefined
84
+ anchorElement: popoutContext ? popoutContext.anchorElement : undefined,
76
85
  };
77
86
  $context[DialogContextName] = context;
78
87
 
@@ -82,7 +91,7 @@ export default function Dialog($props: DialogProps | undefined) {
82
91
  }
83
92
  }
84
93
 
85
- function handleClickOutside(e: MouseEvent) {
94
+ function handleClickOutside(e: MouseEvent | KeyboardEvent) {
86
95
  // Don't allow the user to click outside -- they must press a button or
87
96
  // the Esc key
88
97
  e.preventDefault();
@@ -93,7 +102,6 @@ export default function Dialog($props: DialogProps | undefined) {
93
102
 
94
103
  function handleKey(e: KeyboardEvent) {
95
104
  switch (e.key) {
96
- case "Esc":
97
105
  case "Escape": {
98
106
  if (context.cancelButton) {
99
107
  context.cancelButton.click();
@@ -124,7 +132,6 @@ export default function Dialog($props: DialogProps | undefined) {
124
132
  aria-describedby={$state.bodyId ? $state.bodyId : undefined}
125
133
  onkeydown={handleKey}
126
134
  onmount={(el) => trapFocus(el, trapFocusOptions)}
127
- @//&ref={div}
128
135
  >
129
136
  <slot />
130
137
  </div>
@@ -1,16 +1,16 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
2
  import getId from "../utils/getId";
3
- import { DialogContextName, type DialogContext } from "./DialogTypes";
3
+ import { type DialogContext, DialogContextName } from "./DialogTypes";
4
4
 
5
5
  interface DialogBodyProps {
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,
11
+ style?: StyleValue;
12
12
  /** Whether the body content will be announced by screen readers when the Dialog is opened */
13
- ariaAnnounce?: boolean,
13
+ ariaAnnounce?: boolean;
14
14
  }
15
15
 
16
16
  /**
@@ -33,11 +33,7 @@ export default function DialogBody($props: DialogBodyProps | undefined) {
33
33
  }
34
34
 
35
35
  @render {
36
- <div
37
- id={$props?.id ?? defaultId}
38
- class={["torp-dialog-body", $props?.class]}
39
- {$props?.style}
40
- >
36
+ <div id={$props?.id ?? defaultId} class={["torp-dialog-body", $props?.class]} {$props?.style}>
41
37
  <slot />
42
38
  </div>
43
39
  }
@@ -1,28 +1,28 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { DialogContextName, type DialogContext } from "./DialogTypes";
2
+ import { type DialogContext, DialogContextName } from "./DialogTypes";
3
3
 
4
4
  interface DialogButtonProps {
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
  /** The value that should be returned when this button is pressed and the Dialog was invoked by calling showContextual, showPrompt or showPopover */
12
- value?: any,
12
+ value?: any;
13
13
  /** "confirm" if the button should respond to the Enter key or "cancel" if the button should respond to the Escape key */
14
- type?: "confirm" | "cancel",
14
+ type?: "confirm" | "cancel";
15
15
  /** Whether this button is disabled */
16
- disabled?: boolean,
16
+ disabled?: boolean;
17
17
  /** Raised when the button is clicked */
18
- onclick?: (e: MouseEvent) => void,
18
+ onclick?: (e: MouseEvent) => void;
19
19
  /** Raised when a key is pressed down */
20
- onkeydown?: (e: KeyboardEvent) => void,
20
+ onkeydown?: (e: KeyboardEvent) => void;
21
21
  }
22
22
 
23
23
  /**
24
24
  * A button that is placed in a DialogFooter and signals a response by a user.
25
- *
25
+ *
26
26
  */
27
27
  export default function DialogButton($props: DialogButtonProps | undefined) {
28
28
  let button: HTMLButtonElement;
@@ -34,7 +34,7 @@ export default function DialogButton($props: DialogButtonProps | undefined) {
34
34
  }
35
35
  const handleButton = context.handleButton;
36
36
 
37
- $mount(() => {
37
+ $onmount(() => {
38
38
  // Store the confirm or cancel button in the DialogContext
39
39
  if ($props?.type === "confirm") {
40
40
  context.confirmButton = button;
@@ -45,7 +45,7 @@ export default function DialogButton($props: DialogButtonProps | undefined) {
45
45
 
46
46
  function handleClick(e: MouseEvent) {
47
47
  if ($props?.onclick) {
48
- $props?.onclick(e)
48
+ $props?.onclick(e);
49
49
  }
50
50
  if (handleButton) {
51
51
  handleButton($props?.type, $props?.value);
@@ -58,7 +58,7 @@ export default function DialogButton($props: DialogButtonProps | undefined) {
58
58
  {$props?.id}
59
59
  class={["torp-dialog-button", $props?.class]}
60
60
  {$props?.style}
61
- disabled={$props?.disabled}
61
+ {$props?.disabled}
62
62
  onclick={handleClick}
63
63
  {$props?.onkeydown}
64
64
  &ref={button}
@@ -4,9 +4,9 @@ interface DialogFooterProps {
4
4
  /** An ID for the root element */
5
5
  id?: string;
6
6
  /** Classes for the root element */
7
- class?: ClassValue,
7
+ class?: ClassValue;
8
8
  /** Styles for the root element */
9
- style?: StyleValue,
9
+ style?: StyleValue;
10
10
  }
11
11
 
12
12
  /**
@@ -14,11 +14,7 @@ interface DialogFooterProps {
14
14
  */
15
15
  export default function DialogFooter($props: DialogFooterProps | undefined) {
16
16
  @render {
17
- <div
18
- {$props?.id}
19
- class={["torp-dialog-footer", $props?.class]}
20
- {$props?.style}
21
- >
17
+ <div {$props?.id} class={["torp-dialog-footer", $props?.class]} {$props?.style}>
22
18
  <slot />
23
19
  </div>
24
20
  }
@@ -1,22 +1,22 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
2
  import getId from "../utils/getId";
3
- import { DialogContextName, type DialogContext } from "./DialogTypes";
3
+ import { type DialogContext, DialogContextName } from "./DialogTypes";
4
4
 
5
5
  interface DialogHeaderProps {
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,
11
+ style?: StyleValue;
12
12
  /** Whether the header will be announced by screen readers when the Dialog is opened */
13
- ariaAnnounce?: boolean,
13
+ ariaAnnounce?: boolean;
14
14
  }
15
15
 
16
16
  /**
17
17
  * The header for a Dialog. Content in the header will be announced by screen
18
18
  * readers when the Dialog is opened, unless ariaAnnounce is false.
19
- *
19
+ *
20
20
  */
21
21
  export default function DialogHeader($props: DialogHeaderProps | undefined) {
22
22
  let defaultId = getId();
@@ -34,11 +34,7 @@ export default function DialogHeader($props: DialogHeaderProps | undefined) {
34
34
  }
35
35
 
36
36
  @render {
37
- <div
38
- id={$props?.id ?? defaultId}
39
- class={["torp-dialog-footer", $props?.class]}
40
- {$props?.style}
41
- >
37
+ <div id={$props?.id ?? defaultId} class={["torp-dialog-footer", $props?.class]} {$props?.style}>
42
38
  <slot />
43
39
  </div>
44
40
  }
@@ -5,24 +5,24 @@ interface DialogProps {
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
  /** An ARIA label for describing the popover to screen readers */
12
- ariaLabel?: string,
12
+ ariaLabel?: string;
13
13
  /** Whether the dialog should alert the user via the screen reader */
14
- alert?: boolean,
14
+ alert?: boolean;
15
15
  }
16
16
 
17
17
  /**
18
18
  * A dialog that can be used to show a message to the user, or get information from the user.
19
- *
19
+ *
20
20
  * Dialogs are typically shown within a Modal or Popover.
21
- *
21
+ *
22
22
  * See [the WAI ARIA guidelines for Dialogs](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/).
23
- *
23
+ *
24
24
  * The structure of a Dialog is:
25
- *
25
+ *
26
26
  * ```
27
27
  * <Dialog>
28
28
  * <ModalOverlay /> (optional -- will set `modal` to true)
@@ -33,7 +33,7 @@ interface DialogProps {
33
33
  * </DialogFooter>
34
34
  * </Dialog>
35
35
  * ```
36
- *
36
+ *
37
37
  */
38
38
  declare function Dialog(
39
39
  $parent: ParentNode,
@@ -49,11 +49,11 @@ interface DialogBodyProps {
49
49
  /** An ID for the root element */
50
50
  id?: string;
51
51
  /** Classes for the root element */
52
- class?: ClassValue,
52
+ class?: ClassValue;
53
53
  /** Styles for the root element */
54
- style?: StyleValue,
54
+ style?: StyleValue;
55
55
  /** Whether the body content will be announced by screen readers when the Dialog is opened */
56
- ariaAnnounce?: boolean,
56
+ ariaAnnounce?: boolean;
57
57
  }
58
58
 
59
59
  /**
@@ -74,24 +74,24 @@ interface DialogButtonProps {
74
74
  /** An ID for the root element */
75
75
  id?: string;
76
76
  /** Classes for the root element */
77
- class?: ClassValue,
77
+ class?: ClassValue;
78
78
  /** Styles for the root element */
79
- style?: StyleValue,
79
+ style?: StyleValue;
80
80
  /** The value that should be returned when this button is pressed and the Dialog was invoked by calling showContextual, showPrompt or showPopover */
81
- value?: any,
81
+ value?: any;
82
82
  /** "confirm" if the button should respond to the Enter key or "cancel" if the button should respond to the Escape key */
83
- type?: "confirm" | "cancel",
83
+ type?: "confirm" | "cancel";
84
84
  /** Whether this button is disabled */
85
- disabled?: boolean,
85
+ disabled?: boolean;
86
86
  /** Raised when the button is clicked */
87
- onclick?: (e: MouseEvent) => void,
87
+ onclick?: (e: MouseEvent) => void;
88
88
  /** Raised when a key is pressed down */
89
- onkeydown?: (e: KeyboardEvent) => void,
89
+ onkeydown?: (e: KeyboardEvent) => void;
90
90
  }
91
91
 
92
92
  /**
93
93
  * A button that is placed in a DialogFooter and signals a response by a user.
94
- *
94
+ *
95
95
  */
96
96
  declare function DialogButton(
97
97
  $parent: ParentNode,
@@ -107,9 +107,9 @@ interface DialogFooterProps {
107
107
  /** An ID for the root element */
108
108
  id?: string;
109
109
  /** Classes for the root element */
110
- class?: ClassValue,
110
+ class?: ClassValue;
111
111
  /** Styles for the root element */
112
- style?: StyleValue,
112
+ style?: StyleValue;
113
113
  }
114
114
 
115
115
  /**
@@ -129,17 +129,17 @@ interface DialogHeaderProps {
129
129
  /** An ID for the root element */
130
130
  id?: string;
131
131
  /** Classes for the root element */
132
- class?: ClassValue,
132
+ class?: ClassValue;
133
133
  /** Styles for the root element */
134
- style?: StyleValue,
134
+ style?: StyleValue;
135
135
  /** Whether the header will be announced by screen readers when the Dialog is opened */
136
- ariaAnnounce?: boolean,
136
+ ariaAnnounce?: boolean;
137
137
  }
138
138
 
139
139
  /**
140
140
  * The header for a Dialog. Content in the header will be announced by screen
141
141
  * readers when the Dialog is opened, unless ariaAnnounce is false.
142
- *
142
+ *
143
143
  */
144
144
  declare function DialogHeader(
145
145
  $parent: ParentNode,
@@ -149,4 +149,4 @@ declare function DialogHeader(
149
149
  $slots?: Record<string, SlotRender>,
150
150
  ): void;
151
151
 
152
- export { Dialog, DialogBody, DialogButton, DialogFooter, DialogHeader };
152
+ export { Dialog, DialogBody, DialogButton, DialogFooter, DialogHeader };
@@ -1,22 +1,6 @@
1
- // src/Dialog/Dialog.torp
2
- import Dialog_default from "./Dialog.torp";
3
-
4
- // src/Dialog/DialogBody.torp
5
- import DialogBody_default from "./DialogBody.torp";
6
-
7
- // src/Dialog/DialogButton.torp
8
- import DialogButton_default from "./DialogButton.torp";
9
-
10
- // src/Dialog/DialogFooter.torp
11
- import DialogFooter_default from "./DialogFooter.torp";
12
-
13
- // src/Dialog/DialogHeader.torp
14
- import DialogHeader_default from "./DialogHeader.torp";
15
- export {
16
- Dialog_default as Dialog,
17
- DialogBody_default as DialogBody,
18
- DialogButton_default as DialogButton,
19
- DialogFooter_default as DialogFooter,
20
- DialogHeader_default as DialogHeader
21
- };
22
- //# sourceMappingURL=index.js.map
1
+ import Dialog from "./Dialog.torp";
2
+ import DialogBody from "./DialogBody.torp";
3
+ import DialogButton from "./DialogButton.torp";
4
+ import DialogFooter from "./DialogFooter.torp";
5
+ import DialogHeader from "./DialogHeader.torp";
6
+ export { Dialog, DialogBody, DialogButton, DialogFooter, DialogHeader };