@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
@@ -0,0 +1,104 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import { type CalendarContext, CalendarContextName, type DayState } from "./CalendarTypes";
3
+
4
+ interface CalendarGridProps {
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
+ /** An ARIA label for describing the grid to screen readers */
12
+ ariaLabel?: string | undefined;
13
+ }
14
+
15
+ /**
16
+ * The grid of calendar days, wrapped in the row/gridcell structure that the
17
+ * grid role requires: each week is a `role="row"` and each day is a
18
+ * `role="gridcell"`.
19
+ *
20
+ * The days come from the Calendar's state as a flat list; they are grouped
21
+ * into rows of seven here. The slot is rendered once per day, with the day
22
+ * passed back to the slot content (`$slot.day`).
23
+ */
24
+ export default function CalendarGrid($props: CalendarGridProps | undefined) {
25
+ // Get stuff out of the Calendar context
26
+ const context = $context[CalendarContextName] as CalendarContext;
27
+ if (!context) {
28
+ throw new Error("CalendarGrid must be contained within a Calendar");
29
+ }
30
+ const { handleKey, state: $state } = context;
31
+
32
+ // Group the flat days list into rows of seven (one row per week)
33
+ let $grid = $watch({
34
+ get weeks(): DayState[][] {
35
+ return $cache(() => {
36
+ const days = $state.days;
37
+ const weeks: DayState[][] = [];
38
+ for (let i = 0; i < days.length; i += 7) {
39
+ weeks.push(days.slice(i, i + 7));
40
+ }
41
+ return weeks;
42
+ });
43
+ },
44
+ });
45
+
46
+ // The selected date is marked on the gridcell (aria-selected is only
47
+ // valid there, not on the day component's button); the Calendar decides
48
+ // which dates count via its isSelected hook
49
+ function isSelected(day: DayState): boolean {
50
+ return context.isSelected(day.date);
51
+ }
52
+
53
+ // Focus the day with `class=active`
54
+ function handleFocus(e: FocusEvent & { currentTarget: EventTarget & HTMLElement }) {
55
+ const el = e.currentTarget.getElementsByClassName("active")[0];
56
+ if (el && el.children[0] instanceof HTMLElement) {
57
+ el.children[0].focus();
58
+ e.preventDefault();
59
+ }
60
+ }
61
+
62
+ @render {
63
+ <div
64
+ {$props?.id}
65
+ class={["torp-calendar-grid", $props?.class]}
66
+ {$props?.style}
67
+ tabindex={context.selectable ? 0 : -1}
68
+ onfocus={handleFocus}
69
+ onkeydown={handleKey}
70
+ role="grid"
71
+ aria-label={$props?.ariaLabel ?? "Calendar"}
72
+ aria-colcount="7"
73
+ aria-readonly={!context.selectable ? "true" : undefined}
74
+ >
75
+ @for (let week of $grid.weeks) {
76
+ <div role="row" class="torp-calendar-row">
77
+ @for (let day of week) {
78
+ @key = day.date
79
+ <span
80
+ role="gridcell"
81
+ class="torp-calendar-cell"
82
+ aria-selected={context.selectable ? (isSelected(day) ? "true" : "false") : undefined}
83
+ >
84
+ <slot {day} />
85
+ </span>
86
+ }
87
+ </div>
88
+ }
89
+ </div>
90
+ }
91
+
92
+ @style {
93
+ .torp-calendar-grid {
94
+ display: grid;
95
+ }
96
+ .torp-calendar-row {
97
+ display: grid;
98
+ grid-template-columns: repeat(7, 1fr);
99
+ }
100
+ .torp-calendar-cell {
101
+ display: grid;
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,43 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import { dayNames, shortDayNames } from "../utils/dateUtils";
3
+ import { type CalendarContext, CalendarContextName } from "./CalendarTypes";
4
+
5
+ interface CalendarGridHeaderProps {
6
+ /** An ID for the root element */
7
+ id?: string;
8
+ /** Classes for the root element */
9
+ class?: ClassValue;
10
+ /** Styles for the root element */
11
+ style?: StyleValue;
12
+ }
13
+
14
+ /**
15
+ * The calendar grid header.
16
+ */
17
+ export default function CalendarGridHeader($props: CalendarGridHeaderProps | undefined) {
18
+ // Get stuff out of the Calendar context
19
+ const context = $context[CalendarContextName] as CalendarContext;
20
+ if (!context) {
21
+ throw new Error("CalendarGridHeader must be contained within a Calendar");
22
+ }
23
+ const { startOfWeek } = context;
24
+
25
+ const days = [0, 1, 2, 3, 4, 5, 6].map((i) => ({
26
+ dayNumber: (startOfWeek + i) % 7,
27
+ dayName: dayNames[(startOfWeek + i) % 7],
28
+ shortDayName: shortDayNames[(startOfWeek + i) % 7],
29
+ }));
30
+
31
+ @render {
32
+ <div {$props?.id} class={["torp-calendar-grid-header", $props?.class]} {$props?.style} role="row">
33
+ <slot {days} />
34
+ </div>
35
+ }
36
+
37
+ @style {
38
+ .torp-calendar-grid-header {
39
+ display: grid;
40
+ grid-template-columns: repeat(7, 1fr);
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,48 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import { monthNames } from "../utils/dateUtils";
3
+ import { type CalendarContext, CalendarContextName } from "./CalendarTypes";
4
+
5
+ interface CalendarHeaderProps {
6
+ /** An ID for the root element */
7
+ id?: string;
8
+ /** Classes for the root element */
9
+ class?: ClassValue;
10
+ /** Styles for the root element */
11
+ style?: StyleValue;
12
+ }
13
+
14
+ /**
15
+ * The calendar header, containing the name of the active month and previous and next triggers.
16
+ */
17
+ export default function CalendarHeader($props: CalendarHeaderProps | undefined) {
18
+ // Get stuff out of the Calendar context
19
+ const context = $context[CalendarContextName] as CalendarContext;
20
+ if (!context) {
21
+ throw new Error("CalendarHeader must be contained within a Calendar");
22
+ }
23
+ const { state: $calState } = context;
24
+
25
+ let $state = $watch({
26
+ get monthNumber() {
27
+ return $calState.visibleDate.getMonth();
28
+ },
29
+ get monthName() {
30
+ return monthNames[$state.monthNumber];
31
+ },
32
+ get year() {
33
+ return $calState.visibleDate.getFullYear();
34
+ },
35
+ });
36
+
37
+ @render {
38
+ <div
39
+ {$props?.id}
40
+ class={["torp-calendar-header", $props?.class]}
41
+ {$props?.style}
42
+ aria-live="polite"
43
+ aria-atomic="true"
44
+ >
45
+ <slot {$state.monthNumber} {$state.monthName} {$state.year} />
46
+ </div>
47
+ }
48
+ }
@@ -0,0 +1,54 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import ChevronLeft from "../icons/ChevronLeft.torp";
3
+ import ChevronRight from "../icons/ChevronRight.torp";
4
+ import { type CalendarContext, CalendarContextName, type TriggerType } from "./CalendarTypes";
5
+
6
+ interface CalendarTriggerProps {
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
+ /** The type for the button */
14
+ type: TriggerType;
15
+ /** Whether this item is disabled */
16
+ disabled?: boolean;
17
+ /** An ARIA label for describing the button to screen readers */
18
+ ariaLabel?: string | undefined;
19
+ }
20
+
21
+ export default function CalendarHeaderTrigger($props: CalendarTriggerProps) {
22
+ // Get stuff out of the Calendar context
23
+ const context = $context[CalendarContextName] as CalendarContext;
24
+ if (!context) {
25
+ throw new Error("CalendarHeaderTrigger must be contained within a Calendar");
26
+ }
27
+ const { handleTrigger } = context;
28
+
29
+ function handleClick() {
30
+ // Pass the value to the toggleItem method in the parent Calendar which will handle toggling
31
+ // the value for all items
32
+ handleTrigger($props.type);
33
+ }
34
+
35
+ @render {
36
+ <button
37
+ type="button"
38
+ {$props?.id}
39
+ class={["torp-calendar-trigger", $props?.class]}
40
+ {$props?.disabled}
41
+ data-type={$props.type}
42
+ onclick={handleClick}
43
+ aria-label={$props?.ariaLabel ?? ($props.type === "previous" ? "Previous month" : "Next month")}
44
+ >
45
+ <slot>
46
+ @if ($props.type === "previous") {
47
+ <ChevronLeft />
48
+ } else if ($props.type === "next") {
49
+ <ChevronRight />
50
+ }
51
+ </slot>
52
+ </button>
53
+ }
54
+ }
@@ -1,17 +1,36 @@
1
- export const CalendarContextName = "Calendar";
1
+ export const CalendarContextName: unique symbol = Symbol.for("torp.Calendar");
2
2
 
3
3
  export interface CalendarContext {
4
+ selectable: boolean;
5
+ startOfWeek: number;
4
6
  // The registerDay function is called from each CalendarDay to register itself with this
5
7
  // Calendar. They pass us a setActive method that we can call
6
8
  registerDay: (date: Date, setActive: (value: boolean) => void) => void;
9
+ handleTrigger: (type: TriggerType) => void;
10
+ handleDay: (date: Date) => void;
11
+ handleKey: (e: KeyboardEvent) => void;
12
+ /**
13
+ * Whether a date counts as selected, used for the day gridcells'
14
+ * aria-selected (which is only valid on a gridcell). Defaults to the
15
+ * active date; date range pickers override it so both range endpoints
16
+ * are announced
17
+ */
18
+ isSelected: (date: Date) => boolean;
19
+ state: CalendarState;
20
+ }
21
+
22
+ export interface CalendarState {
23
+ activeDate: Date;
24
+ visibleDate: Date;
25
+ visibleStartDate: Date;
26
+ visibleEndDate: Date;
27
+ days: DayState[];
7
28
  }
8
29
 
9
30
  export interface DayState {
10
31
  date: Date;
11
32
  muted: boolean;
12
- state: {
13
- active: boolean;
14
- };
33
+ active: boolean;
15
34
  setActive?: (value: boolean) => void;
16
35
  }
17
36
 
@@ -20,3 +39,5 @@ export interface CalendarEvent {
20
39
  content: string;
21
40
  color: string;
22
41
  }
42
+
43
+ export type TriggerType = "previous" | "next";
@@ -0,0 +1,54 @@
1
+ import { areDatesEqual } from "../utils/dateUtils";
2
+ import { type CalendarState, type DayState } from "./CalendarTypes";
3
+
4
+ // The dates created here are plain dates -- they get wrapped automatically
5
+ // when they're assigned to watched state
6
+ export default function buildDays($state: CalendarState, startOfWeek: number): DayState[] {
7
+ const newDays = [];
8
+
9
+ const date = $state.visibleDate;
10
+ const activeDate = $state.activeDate;
11
+
12
+ // Set the first day to the start of the week before the first day of
13
+ // the month (e.g. Monday the 28th of the previous month)
14
+ let visibleStartDate = new Date();
15
+ visibleStartDate.setFullYear(date.getFullYear(), date.getMonth(), 1);
16
+ visibleStartDate.setDate(
17
+ visibleStartDate.getDate() - ((visibleStartDate.getDay() + 7 - startOfWeek) % 7),
18
+ );
19
+
20
+ // Set the last day to the end of the week after the last day of the
21
+ // month (e.g. Sunday the 6th of the next month)
22
+ let visibleEndDate = new Date();
23
+ visibleEndDate.setFullYear(date.getFullYear(), date.getMonth() + 1, 0);
24
+ visibleEndDate.setDate(
25
+ visibleEndDate.getDate() + ((startOfWeek - 1 - visibleEndDate.getDay() + 7) % 7),
26
+ );
27
+
28
+ $state.visibleStartDate = visibleStartDate;
29
+ $state.visibleEndDate = visibleEndDate;
30
+
31
+ const dayDiff =
32
+ Math.round((visibleEndDate.getTime() - visibleStartDate.getTime()) / (1000 * 60 * 60 * 24)) + 1;
33
+
34
+ for (let i = 0; i < dayDiff; i++) {
35
+ const dayDate = new Date();
36
+ dayDate.setFullYear(
37
+ visibleStartDate.getFullYear(),
38
+ visibleStartDate.getMonth(),
39
+ visibleStartDate.getDate() + i,
40
+ );
41
+ dayDate.setHours(0);
42
+ dayDate.setMinutes(0);
43
+ dayDate.setSeconds(0);
44
+ dayDate.setMilliseconds(0);
45
+ const newDay: DayState = {
46
+ date: dayDate,
47
+ muted: dayDate.getMonth() !== date.getMonth(),
48
+ active: areDatesEqual(dayDate, activeDate),
49
+ };
50
+ newDays.push(newDay);
51
+ }
52
+
53
+ return newDays;
54
+ }
@@ -5,11 +5,60 @@ interface CalendarProps {
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
+ /** The starting index of the week, where 0 is Sunday */
12
+ startOfWeek?: number;
13
+ /** Whether a date can be selected. Set this to true for use in date pickers etc */
14
+ selectable?: boolean;
15
+ /** The selected date */
16
+ value?: Date;
17
+ // /** Events to show in the calendar */
18
+ // TODO: events?: CalendarEvent[],
19
+ /**
20
+ * Raised when the user selects a date (only when `selectable` is true);
21
+ * use this for the calendar's value
22
+ */
23
+ onchange?: (value: Date) => void;
24
+ /**
25
+ * Raised when the visible date changes, i.e. when the user navigates to a
26
+ * different month via the previous/next triggers or the keyboard
27
+ */
28
+ onchangedate?: (value: Date) => void;
29
+ /** Raised when the user presses Escape, so date pickers can close */
30
+ onclose?: () => void;
31
+ /**
32
+ * Whether a date counts as selected, used for the day gridcells'
33
+ * aria-selected. Defaults to the active date
34
+ */
35
+ isSelected?: (date: Date) => boolean;
11
36
  }
12
37
 
38
+ /**
39
+ * A basic calendar.
40
+ *
41
+ * The structure of a Calendar is:
42
+ *
43
+ * ```
44
+ * <Calendar>
45
+ * <CalendarHeader>
46
+ * <CalendarHeaderTrigger type="previous" />
47
+ * <h4>{$slot.monthName} {$slot.year}</h4>
48
+ * <CalendarHeaderTrigger type="next" />
49
+ * </CalendarHeader>
50
+ * <CalendarGridHeader>
51
+ * <CalendarDayHeader />
52
+ * </CalendarGridHeader>
53
+ * <CalendarGrid>
54
+ * <CalendarDay />
55
+ * </CalendarGrid>
56
+ * </Calendar>
57
+ * ```
58
+ *
59
+ * The CalendarGrid slot is rendered once per day, with the day passed back
60
+ * as `$slot.day`.
61
+ */
13
62
  declare function Calendar(
14
63
  $parent: ParentNode,
15
64
  $anchor: Node | null,
@@ -24,9 +73,19 @@ interface CalendarDayProps {
24
73
  /** An ID for the root element */
25
74
  id?: string;
26
75
  /** Classes for the root element */
27
- class?: ClassValue,
76
+ class?: ClassValue;
28
77
  /** Styles for the root element */
29
- style?: StyleValue,
78
+ style?: StyleValue;
79
+ /** The date to display */
80
+ date: Date;
81
+ /** Whether the date is muted (i.e. not in the currently displayed month) */
82
+ muted?: boolean;
83
+ /** Whether the date is active */
84
+ active?: boolean;
85
+ /** An ARIA label for describing the day to screen readers */
86
+ ariaLabel?: string | undefined;
87
+ onclick?: () => void;
88
+ onkeydown?: () => void;
30
89
  }
31
90
 
32
91
  declare function CalendarDay(
@@ -37,4 +96,131 @@ declare function CalendarDay(
37
96
  $slots?: Record<string, SlotRender>,
38
97
  ): void;
39
98
 
40
- export { Calendar, CalendarDay };
99
+
100
+
101
+ interface CalendarDayHeaderProps {
102
+ /** An ID for the root element */
103
+ id?: string;
104
+ /** Classes for the root element */
105
+ class?: ClassValue;
106
+ /** Styles for the root element */
107
+ style?: StyleValue;
108
+ /** The day to display */
109
+ dayName: string;
110
+ /** The short day to display */
111
+ shortDayName: string;
112
+ /** An ARIA label for describing the day header to screen readers */
113
+ ariaLabel?: string | undefined;
114
+ }
115
+
116
+ /**
117
+ * The calendar grid header.
118
+ */
119
+ declare function CalendarDayHeader(
120
+ $parent: ParentNode,
121
+ $anchor: Node | null,
122
+ $props: CalendarDayHeaderProps | undefined,
123
+ $context?: Record<PropertyKey, any>,
124
+ $slots?: Record<string, SlotRender>,
125
+ ): void;
126
+
127
+
128
+
129
+ interface CalendarGridProps {
130
+ /** An ID for the root element */
131
+ id?: string;
132
+ /** Classes for the root element */
133
+ class?: ClassValue;
134
+ /** Styles for the root element */
135
+ style?: StyleValue;
136
+ /** An ARIA label for describing the grid to screen readers */
137
+ ariaLabel?: string | undefined;
138
+ }
139
+
140
+ /**
141
+ * The grid of calendar days, wrapped in the row/gridcell structure that the
142
+ * grid role requires: each week is a `role="row"` and each day is a
143
+ * `role="gridcell"`.
144
+ *
145
+ * The days come from the Calendar's state as a flat list; they are grouped
146
+ * into rows of seven here. The slot is rendered once per day, with the day
147
+ * passed back to the slot content (`$slot.day`).
148
+ */
149
+ declare function CalendarGrid(
150
+ $parent: ParentNode,
151
+ $anchor: Node | null,
152
+ $props: CalendarGridProps | undefined,
153
+ $context?: Record<PropertyKey, any>,
154
+ $slots?: Record<string, SlotRender>,
155
+ ): void;
156
+
157
+
158
+
159
+ interface CalendarGridHeaderProps {
160
+ /** An ID for the root element */
161
+ id?: string;
162
+ /** Classes for the root element */
163
+ class?: ClassValue;
164
+ /** Styles for the root element */
165
+ style?: StyleValue;
166
+ }
167
+
168
+ /**
169
+ * The calendar grid header.
170
+ */
171
+ declare function CalendarGridHeader(
172
+ $parent: ParentNode,
173
+ $anchor: Node | null,
174
+ $props: CalendarGridHeaderProps | undefined,
175
+ $context?: Record<PropertyKey, any>,
176
+ $slots?: Record<string, SlotRender>,
177
+ ): void;
178
+
179
+
180
+
181
+ interface CalendarHeaderProps {
182
+ /** An ID for the root element */
183
+ id?: string;
184
+ /** Classes for the root element */
185
+ class?: ClassValue;
186
+ /** Styles for the root element */
187
+ style?: StyleValue;
188
+ }
189
+
190
+ /**
191
+ * The calendar header, containing the name of the active month and previous and next triggers.
192
+ */
193
+ declare function CalendarHeader(
194
+ $parent: ParentNode,
195
+ $anchor: Node | null,
196
+ $props: CalendarHeaderProps | undefined,
197
+ $context?: Record<PropertyKey, any>,
198
+ $slots?: Record<string, SlotRender>,
199
+ ): void;
200
+
201
+
202
+
203
+ interface CalendarTriggerProps {
204
+ /** An ID for the root element */
205
+ id?: string;
206
+ /** Classes for the root element */
207
+ class?: ClassValue;
208
+ /** Styles for the root element */
209
+ style?: StyleValue;
210
+ /** The type for the button */
211
+ type: TriggerType;
212
+ /** Whether this item is disabled */
213
+ disabled?: boolean;
214
+ /** An ARIA label for describing the button to screen readers */
215
+ ariaLabel?: string | undefined;
216
+ }
217
+
218
+ declare function CalendarHeaderTrigger(
219
+ $parent: ParentNode,
220
+ $anchor: Node | null,
221
+ $props: CalendarTriggerProps,
222
+ $context?: Record<PropertyKey, any>,
223
+ $slots?: Record<string, SlotRender>,
224
+ ): void;
225
+
226
+ export { Calendar, CalendarDay, CalendarDayHeader, CalendarGrid, CalendarGridHeader, CalendarHeader, CalendarHeaderTrigger };
@@ -1,10 +1,8 @@
1
- // src/Calendar/Calendar.torp
2
- import Calendar_default from "./Calendar.torp";
3
-
4
- // src/Calendar/CalendarDay.torp
5
- import CalendarDay_default from "./CalendarDay.torp";
6
- export {
7
- Calendar_default as Calendar,
8
- CalendarDay_default as CalendarDay
9
- };
10
- //# sourceMappingURL=index.js.map
1
+ import Calendar from "./Calendar.torp";
2
+ import CalendarDay from "./CalendarDay.torp";
3
+ import CalendarDayHeader from "./CalendarDayHeader.torp";
4
+ import CalendarGrid from "./CalendarGrid.torp";
5
+ import CalendarGridHeader from "./CalendarGridHeader.torp";
6
+ import CalendarHeader from "./CalendarHeader.torp";
7
+ import CalendarHeaderTrigger from "./CalendarHeaderTrigger.torp";
8
+ export { Calendar, CalendarDay, CalendarDayHeader, CalendarGrid, CalendarGridHeader, CalendarHeader, CalendarHeaderTrigger };