@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
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?: any | any[],
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: any | any[]) => void,
21
+ onchange?: (value: any | any[]) => void;
19
22
  }
20
23
 
21
24
  /**
@@ -38,193 +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" ? undefined : [])
45
+ value: $props?.value ?? (($props?.type ?? "single") === "single" ? undefined : []),
45
46
  });
46
47
 
47
- // Update $state on $props change
48
- $run(() => {
49
- $state.value = $props?.value ?? (type === "single" ? undefined : [])
50
- });
48
+ $bind($state, $props, "value");
51
49
 
52
- // Update $props on $state change
53
- $run(() => {
54
- if ($props !== undefined) {
55
- $props.value = $state.value;
56
- }
50
+ // Dispatch the change event when the value changes
51
+ $handle((first) => {
52
+ const value = $state.value;
53
+ if (!first) $props?.onchange?.(value);
57
54
  });
58
55
 
59
- let itemStates: ItemState[] = [];
60
-
61
- // This is used to assign automatic indexes to items where needed
62
- let nextIndex = 0;
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;
64
+ }
65
+ },
66
+ });
63
67
 
64
68
  // Set the context to pass down to items, with functions for each item to call
65
69
  let context: AccordionContext = {
66
- registerItem,
67
- removeItem,
68
- toggleItem,
69
- handleHeaderKey
70
+ registerItem: (state: ItemState) => group.registerItem(state),
71
+ removeItem: group.removeItem,
72
+ toggleItem: group.toggleItem,
73
+ handleHeaderKey,
70
74
  };
71
75
  $context[AccordionContextName] = context;
72
76
 
73
- $run(() => {
74
- // Get the value to ensure that this effect will be subscribed
75
- let value = $state.value;
76
-
77
- // And set the expanded item(s)
78
- switch (type) {
79
- case "single": {
80
- for (let item of itemStates) {
81
- item.expanded = item.value === value;
82
- }
83
- break;
84
- }
85
- case "multiple": {
86
- if (!Array.isArray(value)) {
87
- value = [value];
88
- }
89
- for (let item of itemStates) {
90
- item.expanded = value.indexOf(item.value) !== -1;
91
- }
92
- break;
93
- }
94
- }
95
- })
96
-
97
- $run(() => {
98
- let disabled = $props?.disabled;
99
- itemStates.forEach((s) => s.parentDisabled = disabled === true);
100
- });
101
-
102
- // Dispatch the change event when the value changes
103
- let firstChange = true;
104
- $run(() => {
105
- const onchange = $props?.onchange;
106
- const value = $state.value;
107
- if (firstChange) {
108
- firstChange = false;
109
- } else if (onchange) {
110
- onchange(value);
111
- }
112
- });
113
-
114
- function registerItem(itemState: ItemState) {
115
- // If an index wasn't set for the item, set it automatically
116
- if (itemState.index === -1) {
117
- itemState.index = nextIndex++;
118
- }
119
-
120
- // If a value wasn't set for the item, set it to the index
121
- if (!itemState.value) {
122
- itemState.value = itemState.index;
123
- }
124
-
125
- // If we have a value, set whether the item should be expanded
126
- if ($state.value !== undefined && $state.value !== null) {
127
- switch (type) {
128
- case "single": {
129
- itemState.expanded = $state.value === itemState.value;
130
- break;
131
- }
132
- case "multiple": {
133
- itemState.expanded = $state.value.includes(itemState.value);
134
- break;
135
- }
136
- }
137
- }
138
-
139
- // Set whether the Accordion itself is disabled
140
- itemState.parentDisabled = $props?.disabled === true
141
-
142
- // Add the item's state to the array
143
- itemStates.splice(itemState.index, 0, itemState);
144
- }
145
-
146
- // TODO: I think this should be done by value
147
- function removeItem(itemIndex: number) {
148
- // Remove the item and re-index
149
- let index = itemStates.findIndex((item) => item.index === itemIndex);
150
- if (index !== -1) {
151
- itemStates.splice(itemIndex, 1);
152
- }
153
- itemStates.forEach((item, i) => (item.index = i));
154
- }
155
-
156
- function toggleItem(toggleValue: string) {
157
- switch (type) {
158
- case "single": {
159
- for (let item of itemStates) {
160
- // The item is expanded if it has the supplied value (i.e. if it was clicked) and if it
161
- // wasn't already expanded (i.e. we collapse it if it was expanded and clicked)
162
- if (item.value === toggleValue) {
163
- $state.value = item.expanded ? "" : item.value;
164
- break;
165
- }
166
- }
167
- break;
168
- }
169
- case "multiple": {
170
- let value = [];
171
- for (let item of itemStates) {
172
- // The item is expanded if it has the supplied value (i.e. if it was clicked) or if it
173
- // was already expanded
174
- if (
175
- (item.value === toggleValue && !item.expanded) ||
176
- (item.value !== toggleValue && item.expanded)
177
- ) {
178
- value.push(item.value);
179
- }
180
- }
181
- $state.value = value.sort();
182
- break;
183
- }
184
- }
185
- }
186
-
187
77
  function handleHeaderKey(headerIndex: number, e: KeyboardEvent) {
78
+ const itemStates = group.itemStates;
188
79
  switch (e.key) {
189
- case "Up":
190
80
  case "ArrowUp": {
191
- if (headerIndex > 0) {
192
- e.preventDefault();
193
- itemStates[headerIndex - 1].setFocused();
194
- }
81
+ e.preventDefault();
82
+ focusItem(itemStates, headerIndex, "previous");
195
83
  break;
196
84
  }
197
- case "Down":
198
85
  case "ArrowDown": {
199
- if (headerIndex < itemStates.length - 1) {
200
- e.preventDefault();
201
- itemStates[headerIndex + 1].setFocused();
202
- }
86
+ e.preventDefault();
87
+ focusItem(itemStates, headerIndex, "next");
203
88
  break;
204
89
  }
205
90
  case "Home": {
206
- if (headerIndex > 0) {
207
- e.preventDefault();
208
- itemStates[0].setFocused();
209
- }
91
+ e.preventDefault();
92
+ focusItem(itemStates, headerIndex, "start");
210
93
  break;
211
94
  }
212
95
  case "End": {
213
- if (headerIndex < itemStates.length - 1) {
214
- e.preventDefault();
215
- itemStates[itemStates.length - 1].setFocused();
216
- }
96
+ e.preventDefault();
97
+ focusItem(itemStates, headerIndex, "end");
217
98
  break;
218
99
  }
219
100
  }
220
101
  }
221
102
 
222
103
  @render {
223
- <div
224
- {$props?.id}
225
- class={["torp-accordion", $props?.class]}
226
- {$props?.style}
227
- >
104
+ <div {$props?.id} class={["torp-accordion", $props?.class]} {$props?.style}>
228
105
  <slot />
229
106
  </div>
230
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 ontoggle = $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 (ontoggle) {
79
- ontoggle(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}
@@ -3,7 +3,7 @@ export const AccordionItemContextName: unique symbol = Symbol.for("torp.Accordio
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 */