@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
package/README.md CHANGED
@@ -2,15 +2,91 @@
2
2
 
3
3
  Accessible, unstyled components for use in your Torpor front-end.
4
4
 
5
- 🚧 WARNING: WORK IN PROGRESS 🚧
5
+ Each component is exported as a separate subpath (e.g.
6
+ `@torpor/ui/Accordion`) and is bundled with sensible behavior and ARIA
7
+ attributes, while styling is left up to you.
6
8
 
7
- ## Features
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @torpor/ui
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```torp
18
+ import {
19
+ Accordion,
20
+ AccordionContent,
21
+ AccordionHeader,
22
+ AccordionItem,
23
+ AccordionTrigger,
24
+ } from "@torpor/ui/Accordion";
25
+
26
+ @render {
27
+ <Accordion>
28
+ <AccordionItem>
29
+ <AccordionHeader>
30
+ <AccordionTrigger>Header 1</AccordionTrigger>
31
+ </AccordionHeader>
32
+ <AccordionContent>Content 1</AccordionContent>
33
+ </AccordionItem>
34
+ </Accordion>
35
+ }
36
+ ```
37
+
38
+ ## Components
8
39
 
9
40
  - Accordion
10
- - motion
11
- - fade
41
+ - Breadcrumb
42
+ - Calendar
43
+ - Carousel
44
+ - Charts
45
+ - ColorPicker
46
+ - ComboBox
47
+ - CommandPalette
48
+ - Contextual
49
+ - DataGrid
50
+ - DatePicker
51
+ - DateRangePicker
52
+ - Dialog
53
+ - Disclosure
54
+ - Drawer
55
+ - FocusGroup
56
+ - Form
57
+ - icons
58
+ - ListBox
59
+ - MaskedInput
60
+ - Menu
61
+ - MenuBar
62
+ - Modal
63
+ - NavMenu
64
+ - Notification
65
+ - NumberInput
66
+ - Pagination
67
+ - Popover
68
+ - Progress
69
+ - Rating
70
+ - SegmentedControl
71
+ - SelectBox
72
+ - Slider
73
+ - Splitter
74
+ - Stepper
75
+ - TabGroup
76
+ - TagInput
77
+ - TimePicker
78
+ - ToolBar
79
+ - Tree
80
+
81
+ ## Motion
82
+
83
+ Transition helpers for use with the `transition` / `transition-in` /
84
+ `transition-out` directives (see [torpor/view](../view)), exported from
85
+ `@torpor/ui/motion`:
12
86
 
13
- ## Not yet
87
+ - `fade`
88
+ - `grow`
89
+ - `slide`
14
90
 
15
- - Forms, validation etc
16
- - Utility functions e.g. intersection observer
91
+ Plus `measure`, a utility for measuring an element before it is added to the
92
+ DOM (used by `grow` and `slide`).
@@ -1,21 +1,24 @@
1
- import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { AccordionContextName, type AccordionContext, type ItemState } from "./AccordionTypes";
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
+ import $handle from "../utils/$handle";
3
+ import { type AccordionContext, AccordionContextName, type ItemState } from "./AccordionTypes";
4
+ import { createItemGroup } from "../utils/createItemGroup";
5
+ import { focusItem } from "../utils/focusItem";
3
6
 
4
7
  interface AccordionProps {
5
8
  /** An ID for the root element */
6
9
  id?: string;
7
10
  /** Classes for the root element */
8
- class?: ClassValue,
11
+ class?: ClassValue;
9
12
  /** Styles for the root element */
10
- style?: StyleValue,
13
+ style?: StyleValue;
11
14
  /** Whether a single AccordionItem or multiple AccordionItems can be expanded at the same time */
12
- type?: "single" | "multiple",
15
+ type?: "single" | "multiple";
13
16
  /** The value of the expanded AccordionItem, or an array of values if the type is "multiple" */
14
- value?: string | string[],
17
+ value?: Bindable<any | any[]>;
15
18
  /** If set to true, the user cannot interact with any items in the Accordion */
16
- disabled?: boolean,
19
+ disabled?: boolean;
17
20
  /** Raised when the expanded item(s) have changed */
18
- onchange?: (value: string | string[]) => void,
21
+ onchange?: (value: any | any[]) => void;
19
22
  }
20
23
 
21
24
  /**
@@ -38,192 +41,67 @@ interface AccordionProps {
38
41
  * ```
39
42
  */
40
43
  export default function Accordion($props: AccordionProps | undefined) {
41
- let type = $props?.type ?? "single";
42
-
43
44
  let $state = $watch({
44
- value: $props?.value ?? (type === "single" ? "" : [] as string[])
45
- });
46
-
47
- $run(() => {
48
- if ($props !== undefined) {
49
- $props.value = $state.value;
50
- }
45
+ value: $props?.value ?? (($props?.type ?? "single") === "single" ? undefined : []),
51
46
  });
52
47
 
53
- let itemStates: ItemState[] = [];
54
-
55
- // This is used to assign automatic indexes to items where needed
56
- let nextIndex = 0;
57
-
58
- // Set the context to pass down to items, with functions for each item to call
59
- let context: AccordionContext = {
60
- registerItem,
61
- removeItem,
62
- toggleItem,
63
- handleHeaderKey
64
- };
65
- $context[AccordionContextName] = context;
66
-
67
- $run(() => {
68
- // HACK: This should probably be done with setters?
69
- let newValue = $state.value;
70
-
71
- // Get the value
72
- switch (type) {
73
- case "single": {
74
- // Ensure the value passed in was a string (in case e.g. the user has set values to ints)
75
- newValue = newValue.toString();
76
- for (let item of itemStates) {
77
- item.expanded = item.value === newValue;
78
- }
79
- break;
80
- }
81
- case "multiple": {
82
- // Ensure the value passed in is an array
83
- if (!Array.isArray(newValue)) {
84
- newValue = [newValue];
85
- }
86
- for (let item of itemStates) {
87
- item.expanded = newValue.indexOf(item.value) !== -1;
88
- }
89
- break;
90
- }
91
- }
92
-
93
- // Set the value
94
- $state.value = newValue;
95
- })
96
-
97
- $run(() => {
98
- itemStates.forEach((s) => s.parentDisabled = $props?.disabled === true);
99
- });
48
+ $bind($state, $props, "value");
100
49
 
101
50
  // Dispatch the change event when the value changes
102
- let firstChange = true;
103
- $run(() => {
104
- const ev = $props?.onchange;
51
+ $handle((first) => {
105
52
  const value = $state.value;
106
- if (firstChange) {
107
- firstChange = false;
108
- } else if (ev) {
109
- ev(value);
110
- }
53
+ if (!first) $props?.onchange?.(value);
111
54
  });
112
55
 
113
- function registerItem(itemState: ItemState) {
114
- // If an index wasn't set for the item, set it automatically
115
- if (itemState.index === -1) {
116
- itemState.index = nextIndex++;
117
- }
118
-
119
- // If a value wasn't set for the item, set it to the index
120
- if (!itemState.value) {
121
- itemState.value = itemState.index.toString();
122
- }
123
-
124
- // If we have a value, set whether the item should be expanded
125
- if ($state.value) {
126
- switch (type) {
127
- case "single": {
128
- itemState.expanded = $state.value === itemState.value;
129
- break;
130
- }
131
- case "multiple": {
132
- itemState.expanded = $state.value.includes(itemState.value);
133
- break;
134
- }
56
+ const group = createItemGroup<ItemState>({
57
+ state: $state,
58
+ type: () => $props?.type ?? "single",
59
+ selectedProperty: "expanded",
60
+ disabled: () => $props?.disabled,
61
+ onRegister: (item) => {
62
+ if (!item.value) {
63
+ item.value = item.index;
135
64
  }
136
- }
137
-
138
- // Set whether the Accordion itself is disabled
139
- itemState.parentDisabled = $props?.disabled === true
140
-
141
- // Add the item's state to the array
142
- itemStates.splice(itemState.index, 0, itemState);
143
- }
144
-
145
- // TODO: I think this should be done by value
146
- function removeItem(itemIndex: number) {
147
- // Remove the item and re-index
148
- let index = itemStates.findIndex((item) => item.index === itemIndex);
149
- if (index !== -1) {
150
- itemStates.splice(itemIndex, 1);
151
- }
152
- itemStates.forEach((item, i) => (item.index = i));
153
- }
65
+ },
66
+ });
154
67
 
155
- function toggleItem(toggleValue: string) {
156
- switch (type) {
157
- case "single": {
158
- for (let item of itemStates) {
159
- // The item is expanded if it has the supplied value (i.e. if it was clicked) and if it
160
- // wasn't already expanded (i.e. we collapse it if it was expanded and clicked)
161
- if (item.value === toggleValue) {
162
- $state.value = item.expanded ? "" : item.value;
163
- break;
164
- }
165
- }
166
- break;
167
- }
168
- case "multiple": {
169
- let newValue = [];
170
- for (let item of itemStates) {
171
- // The item is expanded if it has the supplied value (i.e. if it was clicked) or if it
172
- // was already expanded
173
- if (
174
- (item.value === toggleValue && !item.expanded) ||
175
- (item.value !== toggleValue && item.expanded)
176
- ) {
177
- newValue.push(item.value);
178
- }
179
- }
180
- $state.value = newValue.sort();
181
- break;
182
- }
183
- }
184
- }
68
+ // Set the context to pass down to items, with functions for each item to call
69
+ let context: AccordionContext = {
70
+ registerItem: (state: ItemState) => group.registerItem(state),
71
+ removeItem: group.removeItem,
72
+ toggleItem: group.toggleItem,
73
+ handleHeaderKey,
74
+ };
75
+ $context[AccordionContextName] = context;
185
76
 
186
77
  function handleHeaderKey(headerIndex: number, e: KeyboardEvent) {
78
+ const itemStates = group.itemStates;
187
79
  switch (e.key) {
188
- case "Up":
189
80
  case "ArrowUp": {
190
- if (headerIndex > 0) {
191
- e.preventDefault();
192
- itemStates[headerIndex - 1].setFocused();
193
- }
81
+ e.preventDefault();
82
+ focusItem(itemStates, headerIndex, "previous");
194
83
  break;
195
84
  }
196
- case "Down":
197
85
  case "ArrowDown": {
198
- if (headerIndex < itemStates.length - 1) {
199
- e.preventDefault();
200
- itemStates[headerIndex + 1].setFocused();
201
- }
86
+ e.preventDefault();
87
+ focusItem(itemStates, headerIndex, "next");
202
88
  break;
203
89
  }
204
90
  case "Home": {
205
- if (headerIndex > 0) {
206
- e.preventDefault();
207
- itemStates[0].setFocused();
208
- }
91
+ e.preventDefault();
92
+ focusItem(itemStates, headerIndex, "start");
209
93
  break;
210
94
  }
211
95
  case "End": {
212
- if (headerIndex < itemStates.length - 1) {
213
- e.preventDefault();
214
- itemStates[itemStates.length - 1].setFocused();
215
- }
96
+ e.preventDefault();
97
+ focusItem(itemStates, headerIndex, "end");
216
98
  break;
217
99
  }
218
100
  }
219
101
  }
220
102
 
221
103
  @render {
222
- <div
223
- {$props?.id}
224
- class={["torp-accordion", $props?.class]}
225
- {$props?.style}
226
- >
104
+ <div {$props?.id} class={["torp-accordion", $props?.class]} {$props?.style}>
227
105
  <slot />
228
106
  </div>
229
107
  }
@@ -1,16 +1,16 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
2
  import getId from "../utils/getId";
3
- import { AccordionItemContextName, type AccordionItemContext } from "./AccordionTypes";
3
+ import { type AccordionItemContext, AccordionItemContextName } from "./AccordionTypes";
4
4
 
5
5
  interface AccordionContentProps {
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 this content should act as a region. Set this when the content contains heading elements or a nested Accordion */
13
- ariaRegion?: boolean,
13
+ ariaRegion?: boolean;
14
14
  }
15
15
 
16
16
  /**
@@ -23,7 +23,7 @@ export default function AccordionContent($props: AccordionContentProps | undefin
23
23
  if (!context) {
24
24
  throw new Error("AccordionContent must be contained within an AccordionItem");
25
25
  }
26
- let $state = context.state
26
+ let $state = context.state;
27
27
 
28
28
  // Set the content ID so that it can be used with aria-controls in AccordionTrigger
29
29
  $state.contentId = $props?.id ?? defaultId;
@@ -35,8 +35,8 @@ export default function AccordionContent($props: AccordionContentProps | undefin
35
35
  {$props?.style}
36
36
  role={$props?.ariaRegion ? "region" : undefined}
37
37
  aria-labelledby={$state.headerId}
38
+ aria-hidden={$state.expanded ? undefined : "true"}
38
39
  data-state={$state.expanded ? "open" : "closed"}
39
- data-disabled={$state.disabled ? "true" : undefined}
40
40
  >
41
41
  @if ($state.expanded) {
42
42
  <slot />
@@ -1,22 +1,20 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { AccordionItemContextName, type AccordionItemContext } from "./AccordionTypes";
2
+ import { type AccordionItemContext, AccordionItemContextName } from "./AccordionTypes";
3
3
 
4
4
  interface AccordionHeaderProps {
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,
11
- /** The type of HTML header to use */
12
- as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6",
10
+ style?: StyleValue;
13
11
  }
14
12
 
15
13
  /**
16
14
  * The header for an AccordionItem, which contains the AccordionTrigger.
17
15
  *
18
16
  * The structure of an AccordionHeader is:
19
- *
17
+ *
20
18
  * ```
21
19
  * <AccordionHeader>
22
20
  * <AccordionTrigger />
@@ -28,18 +26,16 @@ export default function AccordionHeader($props: AccordionHeaderProps | undefined
28
26
  if (!context) {
29
27
  throw new Error("AccordionHeader must be contained within an AccordionItem");
30
28
  }
31
- let $state = context.state
29
+ let $state = context.state;
32
30
 
33
31
  @render {
34
- @// TODO: $props.as
35
- <h4
32
+ <div
36
33
  {$props?.id}
37
34
  class={["torp-accordion-header", $props?.class]}
38
35
  {$props?.style}
39
36
  data-state={$state.expanded ? "open" : "closed"}
40
- data-disabled={$state.disabled ? "true" : undefined}
41
37
  >
42
38
  <slot />
43
- </h4>
39
+ </div>
44
40
  }
45
41
  }
@@ -1,28 +1,35 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { AccordionContextName, AccordionItemContextName, type ItemState, type AccordionContext, type AccordionItemContext } from "./AccordionTypes";
2
+ import $handle from "../utils/$handle";
3
+ import {
4
+ type AccordionContext,
5
+ AccordionContextName,
6
+ type AccordionItemContext,
7
+ AccordionItemContextName,
8
+ type ItemState,
9
+ } from "./AccordionTypes";
3
10
 
4
11
  interface AccordionItemProps {
5
12
  /** An ID for the root element */
6
13
  id?: string;
7
14
  /** Classes for the root element */
8
- class?: ClassValue,
15
+ class?: ClassValue;
9
16
  /** Styles for the root element */
10
- style?: StyleValue,
17
+ style?: StyleValue;
11
18
  /** The index of this item in the Accordion. Set this if you will be inserting, removing or sorting items. If you don't set this, it will be set automatically */
12
- index?: number,
19
+ index?: number;
13
20
  /** A value for the item. Set this if you need more control over which item(s) are expanded. If you don't set this, the value will be set to the item's initial index */
14
- value?: string,
21
+ value?: any;
15
22
  /** If set to true, the user cannot interact with this AccordionItem */
16
- disabled?: boolean,
23
+ disabled?: boolean;
17
24
  /** Raised when this item is opened or closed */
18
- ontoggle?: (open: boolean) => void,
25
+ onchange?: (open: boolean) => void;
19
26
  }
20
27
 
21
28
  /**
22
29
  * An item in an Accordion, which must consist of an AccordionTrigger and an AccordionContent.
23
- *
30
+ *
24
31
  * The structure of an AccordionItem is:
25
- *
32
+ *
26
33
  * ```
27
34
  * <AccordionItem>
28
35
  * <AccordionHeader>
@@ -35,14 +42,14 @@ interface AccordionItemProps {
35
42
  export default function AccordionItem($props: AccordionItemProps | undefined) {
36
43
  let $state: ItemState = $watch({
37
44
  index: -1,
38
- value: "",
45
+ value: $props?.value,
39
46
  expanded: false,
40
47
  headerId: "",
41
48
  contentId: "",
42
49
  disabled: $props?.disabled ?? false,
43
50
  parentDisabled: false,
44
- setFocused
45
- })
51
+ setFocused,
52
+ });
46
53
 
47
54
  // Get stuff out of the AccordionContext
48
55
  const context = $context[AccordionContextName] as AccordionContext;
@@ -59,25 +66,19 @@ export default function AccordionItem($props: AccordionItemProps | undefined) {
59
66
  $context[AccordionItemContextName] = itemContext;
60
67
 
61
68
  // Register this item with the parent Accordion, which will handle toggling expanded for all items
62
- context.registerItem($state, setFocused);
69
+ context.registerItem($state);
63
70
 
64
71
  // Remove the item from the parent Accordion when this item is destroyed
65
72
  $run(() => {
66
73
  return () => {
67
74
  context.removeItem($state.index);
68
- }
75
+ };
69
76
  });
70
77
 
71
- // Dispatch the toggle event when the value of expanded changes
72
- let firstToggle = true;
73
- $run(() => {
74
- const ev = $props?.ontoggle;
78
+ // Dispatch the change event when the value of expanded changes
79
+ $handle((first) => {
75
80
  const expanded = $state.expanded;
76
- if (firstToggle) {
77
- firstToggle = false;
78
- } else if (ev) {
79
- ev(expanded);
80
- }
81
+ if (!first) $props?.onchange?.(expanded);
81
82
  });
82
83
 
83
84
  // Called from the parent Accordion; pass the focus command along to the AccordionButton
@@ -93,7 +94,6 @@ export default function AccordionItem($props: AccordionItemProps | undefined) {
93
94
  class={["torp-accordion-item", $props?.class]}
94
95
  {$props?.style}
95
96
  data-state={$state.expanded ? "open" : "closed"}
96
- data-disabled={$state.disabled ? "true" : undefined}
97
97
  >
98
98
  <slot />
99
99
  </div>
@@ -1,14 +1,14 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
2
  import getId from "../utils/getId";
3
- import { AccordionItemContextName, type AccordionItemContext } from "./AccordionTypes";
3
+ import { type AccordionItemContext, AccordionItemContextName } from "./AccordionTypes";
4
4
 
5
5
  interface AccordionTriggerProps {
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
  }
13
13
 
14
14
  /**
@@ -44,8 +44,18 @@ export default function AccordionTrigger($props: AccordionTriggerProps | undefin
44
44
  }
45
45
 
46
46
  function handleKey(e: KeyboardEvent) {
47
- // Pass the key press up to the parent Accordion which will handle setting the focused button
48
- context.handleHeaderKey($state.index, e);
47
+ switch (e.key) {
48
+ case "Enter":
49
+ case " ": {
50
+ e.preventDefault();
51
+ handleClick();
52
+ break;
53
+ }
54
+ default: {
55
+ // Pass the key press up to the parent Accordion which will handle setting the focused button
56
+ context.handleHeaderKey($state.index, e);
57
+ }
58
+ }
49
59
  }
50
60
 
51
61
  @render {
@@ -55,11 +65,10 @@ export default function AccordionTrigger($props: AccordionTriggerProps | undefin
55
65
  class={["torp-accordion-trigger", $props?.class]}
56
66
  {$props?.style}
57
67
  disabled={$state.disabled || $state.parentDisabled}
58
- aria-expanded={$state.expanded.toString()}
59
- aria-disabled={$state.disabled ? "true" : undefined}
68
+ aria-expanded={$state.expanded ? "true" : "false"}
69
+ aria-disabled={$state.disabled || $state.parentDisabled ? "true" : undefined}
60
70
  aria-controls={$state.contentId}
61
71
  data-state={$state.expanded ? "open" : "closed"}
62
- data-disabled={$state.disabled ? "true" : undefined}
63
72
  &ref={button}
64
73
  onclick={handleClick}
65
74
  onkeydown={handleKey}
@@ -1,20 +1,20 @@
1
- export const AccordionContextName = "Accordion";
2
- export const AccordionItemContextName = "AccordionItem";
1
+ export const AccordionContextName: unique symbol = Symbol.for("torp.Accordion");
2
+ export const AccordionItemContextName: unique symbol = Symbol.for("torp.AccordionItem");
3
3
 
4
4
  export interface AccordionContext {
5
5
  /** Called from an AccordionItem when it is added */
6
- registerItem: (state: ItemState, setFocused: () => void) => void;
6
+ registerItem: (state: ItemState) => void;
7
7
  /** Called from an AccordionItem when it is removed */
8
8
  removeItem: (index: number) => void;
9
9
  /** Called from an AccordionItem when it is toggled */
10
- toggleItem: (value: string) => void;
10
+ toggleItem: (value: any) => void;
11
11
  /** Called from an AccordionHeader when it receives a keyboard event */
12
12
  handleHeaderKey: (index: number, e: KeyboardEvent) => void;
13
13
  }
14
14
 
15
15
  export interface AccordionItemContext {
16
16
  /** Raised when an AccordionItem is toggled */
17
- toggleItem: (value: string) => void;
17
+ toggleItem: (value: any) => void;
18
18
  /** Raised when an AccordionHeader receives a keyboard event */
19
19
  handleHeaderKey: (index: number, e: KeyboardEvent) => void;
20
20
  /** The reactive state for an AccordionItem */
@@ -25,7 +25,7 @@ export interface AccordionItemContext {
25
25
 
26
26
  export interface ItemState {
27
27
  index: number;
28
- value: string;
28
+ value: any;
29
29
  expanded: boolean;
30
30
  headerId: string;
31
31
  contentId: string;