@torpor/ui 0.3.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/README.md +83 -7
  2. package/dist/Accordion/Accordion.torp +43 -165
  3. package/dist/Accordion/AccordionContent.torp +6 -6
  4. package/dist/Accordion/AccordionHeader.torp +7 -11
  5. package/dist/Accordion/AccordionItem.torp +24 -24
  6. package/dist/Accordion/AccordionTrigger.torp +17 -8
  7. package/dist/Accordion/AccordionTypes.ts +6 -6
  8. package/dist/Accordion/index.d.ts +23 -25
  9. package/dist/Accordion/index.js +6 -22
  10. package/dist/Breadcrumb/Breadcrumb.torp +12 -10
  11. package/dist/Breadcrumb/BreadcrumbItem.torp +6 -6
  12. package/dist/Breadcrumb/BreadcrumbList.torp +21 -0
  13. package/dist/Breadcrumb/BreadcrumbSeparator.torp +4 -4
  14. package/dist/Breadcrumb/index.d.ts +39 -15
  15. package/dist/Breadcrumb/index.js +5 -14
  16. package/dist/Calendar/Calendar.torp +163 -156
  17. package/dist/Calendar/CalendarDay.torp +91 -45
  18. package/dist/Calendar/CalendarDayHeader.torp +36 -0
  19. package/dist/Calendar/CalendarGrid.torp +104 -0
  20. package/dist/Calendar/CalendarGridHeader.torp +43 -0
  21. package/dist/Calendar/CalendarHeader.torp +48 -0
  22. package/dist/Calendar/CalendarHeaderTrigger.torp +54 -0
  23. package/dist/Calendar/CalendarTypes.ts +25 -4
  24. package/dist/Calendar/buildDays.ts +54 -0
  25. package/dist/Calendar/index.d.ts +191 -5
  26. package/dist/Calendar/index.js +8 -10
  27. package/dist/Carousel/Carousel.torp +180 -0
  28. package/dist/Carousel/CarouselIndicators.torp +65 -0
  29. package/dist/Carousel/CarouselNext.torp +43 -0
  30. package/dist/Carousel/CarouselPrevious.torp +44 -0
  31. package/dist/Carousel/CarouselSlide.torp +57 -0
  32. package/dist/Carousel/CarouselTypes.ts +28 -0
  33. package/dist/Carousel/index.d.ts +147 -0
  34. package/dist/Carousel/index.js +6 -0
  35. package/dist/Charts/BarChart.torp +70 -0
  36. package/dist/Charts/Chart.torp +120 -0
  37. package/dist/Charts/ChartBars.torp +78 -0
  38. package/dist/Charts/ChartColumns.torp +66 -0
  39. package/dist/Charts/ChartGrid.torp +54 -0
  40. package/dist/Charts/ChartLines.torp +60 -0
  41. package/dist/Charts/ChartTypes.ts +25 -0
  42. package/dist/Charts/ChartXAxis.torp +83 -0
  43. package/dist/Charts/ChartYAxis.torp +105 -0
  44. package/dist/Charts/ColumnChart.torp +70 -0
  45. package/dist/{Chart → Charts}/GridLines.torp +7 -4
  46. package/dist/Charts/LineChart.torp +73 -0
  47. package/dist/{Chart → Charts}/PieChart.torp +14 -20
  48. package/dist/{Chart → Charts}/ScatterChart.torp +45 -38
  49. package/dist/{Chart → Charts}/SparkLine.torp +16 -19
  50. package/dist/{Chart → Charts}/XAxis.torp +18 -12
  51. package/dist/{Chart → Charts}/YAxis.torp +15 -9
  52. package/dist/Charts/index.d.ts +469 -0
  53. package/dist/Charts/index.js +17 -0
  54. package/dist/ColorPicker/ColorPalette.torp +154 -0
  55. package/dist/ColorPicker/ColorPicker.torp +157 -0
  56. package/dist/ColorPicker/index.d.ts +85 -0
  57. package/dist/ColorPicker/index.js +3 -0
  58. package/dist/ComboBox/ComboBox.torp +205 -0
  59. package/dist/ComboBox/ComboBoxContent.torp +112 -0
  60. package/dist/ComboBox/ComboBoxInput.torp +145 -0
  61. package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
  62. package/dist/ComboBox/ComboBoxTypes.ts +39 -0
  63. package/dist/ComboBox/index.d.ts +152 -0
  64. package/dist/ComboBox/index.js +6 -0
  65. package/dist/CommandPalette/CommandPalette.torp +220 -0
  66. package/dist/CommandPalette/CommandTypes.ts +14 -0
  67. package/dist/CommandPalette/index.d.ts +45 -0
  68. package/dist/CommandPalette/index.js +2 -0
  69. package/dist/Contextual/Contextual.torp +39 -52
  70. package/dist/Contextual/ContextualContent.torp +29 -73
  71. package/dist/Contextual/ContextualHover.torp +112 -0
  72. package/dist/Contextual/ContextualTrigger.torp +31 -42
  73. package/dist/Contextual/ContextualTypes.ts +5 -18
  74. package/dist/Contextual/index.d.ts +44 -27
  75. package/dist/Contextual/index.js +5 -14
  76. package/dist/DataGrid/DataGrid.torp +496 -0
  77. package/dist/DataGrid/DataGridTypes.ts +25 -0
  78. package/dist/DataGrid/index.d.ts +90 -0
  79. package/dist/DataGrid/index.js +3 -0
  80. package/dist/DataGrid/sortRows.ts +32 -0
  81. package/dist/DatePicker/DatePicker.torp +222 -0
  82. package/dist/DatePicker/DatePickerHeader.torp +20 -0
  83. package/dist/DatePicker/index.d.ts +55 -0
  84. package/dist/DatePicker/index.js +2 -0
  85. package/dist/DateRangePicker/DateRangePicker.torp +311 -0
  86. package/dist/DateRangePicker/DateRangePickerDay.torp +137 -0
  87. package/dist/DateRangePicker/DateRangePickerTypes.ts +21 -0
  88. package/dist/DateRangePicker/index.d.ts +76 -0
  89. package/dist/DateRangePicker/index.js +3 -0
  90. package/dist/Dialog/Dialog.torp +33 -30
  91. package/dist/Dialog/DialogBody.torp +5 -9
  92. package/dist/Dialog/DialogButton.torp +14 -11
  93. package/dist/Dialog/DialogFooter.torp +3 -7
  94. package/dist/Dialog/DialogHeader.torp +6 -10
  95. package/dist/Dialog/DialogTypes.ts +2 -2
  96. package/dist/Dialog/index.d.ts +28 -26
  97. package/dist/Dialog/index.js +6 -22
  98. package/dist/Disclosure/Disclosure.torp +18 -18
  99. package/dist/Disclosure/DisclosureContent.torp +5 -6
  100. package/dist/Disclosure/DisclosureHeader.torp +7 -11
  101. package/dist/Disclosure/DisclosureTrigger.torp +4 -5
  102. package/dist/Disclosure/DisclosureTypes.ts +1 -1
  103. package/dist/Disclosure/index.d.ts +14 -16
  104. package/dist/Disclosure/index.js +5 -18
  105. package/dist/Drawer/Drawer.torp +21 -51
  106. package/dist/Drawer/DrawerContent.torp +67 -13
  107. package/dist/Drawer/DrawerOverlay.torp +4 -4
  108. package/dist/Drawer/DrawerTrigger.torp +16 -4
  109. package/dist/Drawer/DrawerTypes.ts +4 -1
  110. package/dist/Drawer/index.d.ts +16 -20
  111. package/dist/Drawer/index.js +5 -18
  112. package/dist/FocusGroup/FocusGroup.torp +70 -0
  113. package/dist/FocusGroup/FocusGroupButton.torp +59 -0
  114. package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
  115. package/dist/FocusGroup/index.d.ts +44 -0
  116. package/dist/FocusGroup/index.js +3 -0
  117. package/dist/Form/CheckBox.torp +28 -20
  118. package/dist/Form/Field.torp +17 -17
  119. package/dist/Form/File.torp +31 -22
  120. package/dist/Form/FileDrop.torp +187 -0
  121. package/dist/Form/Form.torp +24 -22
  122. package/dist/Form/FormTypes.ts +2 -0
  123. package/dist/Form/FormValues.torp +37 -0
  124. package/dist/Form/Hidden.torp +4 -12
  125. package/dist/Form/Input.torp +38 -32
  126. package/dist/Form/Label.torp +3 -3
  127. package/dist/Form/Message.torp +13 -5
  128. package/dist/Form/MessageSummary.torp +39 -0
  129. package/dist/Form/Option.torp +11 -7
  130. package/dist/Form/Select.torp +32 -28
  131. package/dist/Form/TextArea.torp +35 -31
  132. package/dist/Form/Toggle.torp +109 -0
  133. package/dist/Form/index.d.ts +198 -77
  134. package/dist/Form/index.js +16 -46
  135. package/dist/ListBox/ListBox.torp +374 -0
  136. package/dist/ListBox/ListBoxItem.torp +131 -0
  137. package/dist/ListBox/ListBoxSeparator.torp +29 -0
  138. package/dist/ListBox/ListBoxTypes.ts +41 -0
  139. package/dist/ListBox/LoadedListBoxItems.torp +41 -0
  140. package/dist/ListBox/index.d.ts +136 -0
  141. package/dist/ListBox/index.js +4 -0
  142. package/dist/MaskedInput/MaskedInput.torp +143 -0
  143. package/dist/MaskedInput/index.d.ts +52 -0
  144. package/dist/MaskedInput/index.js +2 -0
  145. package/dist/Menu/Menu.torp +90 -70
  146. package/dist/Menu/MenuButton.torp +17 -10
  147. package/dist/Menu/MenuCheck.torp +22 -18
  148. package/dist/Menu/MenuGroup.torp +4 -4
  149. package/dist/Menu/MenuIndicator.torp +5 -13
  150. package/dist/Menu/MenuPopout.torp +20 -50
  151. package/dist/Menu/MenuPopoutContent.torp +15 -66
  152. package/dist/Menu/MenuPopoutTrigger.torp +19 -100
  153. package/dist/Menu/MenuRadio.torp +25 -26
  154. package/dist/Menu/MenuRadioGroup.torp +25 -68
  155. package/dist/Menu/MenuSeparator.torp +3 -2
  156. package/dist/Menu/MenuTypes.ts +12 -21
  157. package/dist/Menu/index.d.ts +45 -51
  158. package/dist/Menu/index.js +12 -46
  159. package/dist/MenuBar/MenuBar.torp +31 -83
  160. package/dist/MenuBar/MenuBarItem.torp +34 -55
  161. package/dist/MenuBar/MenuBarItemContent.torp +15 -101
  162. package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
  163. package/dist/MenuBar/MenuBarTypes.ts +13 -12
  164. package/dist/MenuBar/index.d.ts +17 -19
  165. package/dist/MenuBar/index.js +5 -18
  166. package/dist/Modal/Modal.torp +28 -48
  167. package/dist/Modal/ModalContent.torp +21 -44
  168. package/dist/Modal/ModalOverlay.torp +4 -4
  169. package/dist/Modal/ModalTrigger.torp +16 -32
  170. package/dist/Modal/ModalTypes.ts +6 -17
  171. package/dist/Modal/index.d.ts +17 -29
  172. package/dist/Modal/index.js +29 -28
  173. package/dist/Modal/index.js.map +1 -1
  174. package/dist/Modal/showPrompt.ts +2 -2
  175. package/dist/NavMenu/NavMenu.torp +22 -104
  176. package/dist/NavMenu/NavMenuButton.torp +10 -8
  177. package/dist/NavMenu/NavMenuElement.torp +6 -7
  178. package/dist/NavMenu/NavMenuGroup.torp +5 -5
  179. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
  180. package/dist/NavMenu/NavMenuLink.torp +7 -10
  181. package/dist/NavMenu/NavMenuPopout.torp +16 -61
  182. package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
  183. package/dist/NavMenu/NavMenuPopoutTrigger.torp +47 -0
  184. package/dist/NavMenu/NavMenuSeparator.torp +3 -6
  185. package/dist/NavMenu/NavMenuTypes.ts +6 -15
  186. package/dist/NavMenu/index.d.ts +55 -55
  187. package/dist/NavMenu/index.js +11 -42
  188. package/dist/Notification/Notification.torp +12 -24
  189. package/dist/Notification/NotificationClose.torp +6 -3
  190. package/dist/Notification/NotificationContainer.torp +3 -7
  191. package/dist/Notification/NotificationContent.torp +3 -7
  192. package/dist/Notification/NotificationTypes.ts +1 -1
  193. package/dist/Notification/index.d.ts +15 -12
  194. package/dist/Notification/index.js +22 -32
  195. package/dist/Notification/index.js.map +1 -1
  196. package/dist/NumberInput/NumberInput.torp +255 -0
  197. package/dist/NumberInput/index.d.ts +44 -0
  198. package/dist/NumberInput/index.js +2 -0
  199. package/dist/Pagination/Pagination.torp +152 -0
  200. package/dist/Pagination/PaginationItem.torp +137 -0
  201. package/dist/Pagination/PaginationTypes.ts +22 -0
  202. package/dist/Pagination/buildPages.ts +61 -0
  203. package/dist/Pagination/index.d.ts +63 -0
  204. package/dist/Pagination/index.js +3 -0
  205. package/dist/Popover/Popover.torp +39 -52
  206. package/dist/Popover/PopoverContent.torp +27 -76
  207. package/dist/Popover/PopoverHover.torp +90 -0
  208. package/dist/Popover/PopoverTrigger.torp +17 -40
  209. package/dist/Popover/PopoverTypes.ts +5 -18
  210. package/dist/Popover/index.d.ts +40 -25
  211. package/dist/Popover/index.js +18 -18
  212. package/dist/Popover/index.js.map +1 -1
  213. package/dist/Progress/Progress.torp +88 -0
  214. package/dist/Progress/index.d.ts +37 -0
  215. package/dist/Progress/index.js +2 -0
  216. package/dist/Rating/Rating.torp +225 -0
  217. package/dist/Rating/index.d.ts +44 -0
  218. package/dist/Rating/index.js +2 -0
  219. package/dist/SegmentedControl/SegmentedControl.torp +233 -0
  220. package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
  221. package/dist/SegmentedControl/SegmentedItem.torp +78 -0
  222. package/dist/SegmentedControl/index.d.ts +74 -0
  223. package/dist/SegmentedControl/index.js +3 -0
  224. package/dist/SelectBox/SelectBox.torp +190 -0
  225. package/dist/SelectBox/SelectBoxContent.torp +107 -0
  226. package/dist/SelectBox/SelectBoxTrigger.torp +141 -0
  227. package/dist/SelectBox/SelectBoxTypes.ts +33 -0
  228. package/dist/SelectBox/index.d.ts +112 -0
  229. package/dist/SelectBox/index.js +5 -0
  230. package/dist/Slider/Slider.torp +248 -0
  231. package/dist/Slider/index.d.ts +45 -0
  232. package/dist/Slider/index.js +2 -0
  233. package/dist/Splitter/Splitter.torp +156 -0
  234. package/dist/Splitter/SplitterHandle.torp +161 -0
  235. package/dist/Splitter/SplitterPane.torp +63 -0
  236. package/dist/Splitter/SplitterTypes.ts +31 -0
  237. package/dist/Splitter/index.d.ts +103 -0
  238. package/dist/Splitter/index.js +4 -0
  239. package/dist/Stepper/Stepper.torp +146 -0
  240. package/dist/Stepper/StepperMarker.torp +24 -0
  241. package/dist/Stepper/StepperNext.torp +44 -0
  242. package/dist/Stepper/StepperPrevious.torp +44 -0
  243. package/dist/Stepper/StepperStep.torp +90 -0
  244. package/dist/Stepper/StepperTypes.ts +30 -0
  245. package/dist/Stepper/index.d.ts +149 -0
  246. package/dist/Stepper/index.js +6 -0
  247. package/dist/TabGroup/TabContent.torp +6 -6
  248. package/dist/TabGroup/TabGroup.torp +97 -113
  249. package/dist/TabGroup/TabGroupTypes.ts +3 -3
  250. package/dist/TabGroup/TabHeader.torp +23 -19
  251. package/dist/TabGroup/TabList.torp +8 -21
  252. package/dist/TabGroup/TabTrigger.torp +6 -7
  253. package/dist/TabGroup/index.d.ts +26 -26
  254. package/dist/TabGroup/index.js +6 -22
  255. package/dist/TagInput/TagInput.torp +378 -0
  256. package/dist/TagInput/index.d.ts +48 -0
  257. package/dist/TagInput/index.js +2 -0
  258. package/dist/TimePicker/TimePicker.torp +462 -0
  259. package/dist/TimePicker/index.d.ts +53 -0
  260. package/dist/TimePicker/index.js +2 -0
  261. package/dist/ToolBar/ToolBar.torp +117 -0
  262. package/dist/ToolBar/ToolBarButton.torp +56 -0
  263. package/dist/ToolBar/ToolBarElement.torp +51 -0
  264. package/dist/ToolBar/ToolBarPopout.torp +45 -0
  265. package/dist/ToolBar/ToolBarPopoutContent.torp +34 -0
  266. package/dist/ToolBar/ToolBarPopoutTrigger.torp +47 -0
  267. package/dist/ToolBar/ToolBarSeparator.torp +21 -0
  268. package/dist/ToolBar/ToolBarTypes.ts +28 -0
  269. package/dist/ToolBar/index.d.ts +210 -0
  270. package/dist/ToolBar/index.js +8 -0
  271. package/dist/Tree/Tree.torp +395 -0
  272. package/dist/Tree/TreeItem.torp +176 -0
  273. package/dist/Tree/TreeItemChildren.torp +60 -0
  274. package/dist/Tree/TreeItemContent.torp +46 -0
  275. package/dist/Tree/TreeItemLabel.torp +94 -0
  276. package/dist/Tree/TreeItemTrigger.torp +78 -0
  277. package/dist/Tree/TreeLoadedChildren.torp +122 -0
  278. package/dist/Tree/TreeTypes.ts +63 -0
  279. package/dist/Tree/index.d.ts +262 -0
  280. package/dist/Tree/index.js +7 -0
  281. package/dist/icons/ChevronDoubleLeft.torp +19 -0
  282. package/dist/icons/ChevronDoubleRight.torp +19 -0
  283. package/dist/icons/index.d.ts +61 -1
  284. package/dist/icons/index.js +17 -58
  285. package/dist/loader-DEeG5vFY.js +44 -0
  286. package/dist/loader-DEeG5vFY.js.map +1 -0
  287. package/dist/motion/index.d.ts +12 -8
  288. package/dist/motion/index.d.ts.map +1 -0
  289. package/dist/motion/index.js +72 -88
  290. package/dist/motion/index.js.map +1 -1
  291. package/dist/mount/draggable.ts +63 -0
  292. package/dist/mount/dropTarget.ts +108 -0
  293. package/dist/mount/hoverTrigger.ts +1 -1
  294. package/dist/utils/$handle.ts +23 -0
  295. package/dist/utils/LoadedItems.torp +47 -0
  296. package/dist/utils/PopoutClickTrigger.torp +99 -0
  297. package/dist/utils/PopoutTypes.ts +82 -0
  298. package/dist/utils/SubmenuPopout.torp +89 -0
  299. package/dist/utils/SubmenuPopoutContent.torp +87 -0
  300. package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
  301. package/dist/utils/chartColors.ts +13 -13
  302. package/dist/utils/chartLayout.ts +143 -0
  303. package/dist/utils/chartUtils.ts +1 -1
  304. package/dist/utils/colorUtils.ts +103 -0
  305. package/dist/utils/createItemGroup.ts +152 -0
  306. package/dist/utils/dateUtils.ts +8 -7
  307. package/dist/utils/documentEvents.ts +4 -4
  308. package/dist/utils/dragState.ts +86 -0
  309. package/dist/utils/focusGroup.ts +204 -0
  310. package/dist/utils/focusItem.ts +44 -0
  311. package/dist/utils/formField.ts +70 -0
  312. package/dist/utils/hoverOpen.ts +50 -0
  313. package/dist/utils/hoverReveal.ts +194 -0
  314. package/dist/utils/loader.ts +113 -0
  315. package/dist/utils/maskUtils.ts +98 -0
  316. package/dist/utils/popoutContent.ts +137 -0
  317. package/dist/utils/reorderList.ts +52 -0
  318. package/package.json +116 -25
  319. package/dist/Accordion/index.js.map +0 -1
  320. package/dist/Breadcrumb/index.js.map +0 -1
  321. package/dist/Calendar/index.js.map +0 -1
  322. package/dist/Chart/BarChart.torp +0 -159
  323. package/dist/Chart/LineChart.torp +0 -196
  324. package/dist/Chart/index.d.ts +0 -220
  325. package/dist/Chart/index.js +0 -34
  326. package/dist/Chart/index.js.map +0 -1
  327. package/dist/Contextual/index.js.map +0 -1
  328. package/dist/Dialog/index.js.map +0 -1
  329. package/dist/Disclosure/index.js.map +0 -1
  330. package/dist/Drawer/index.js.map +0 -1
  331. package/dist/Form/index.js.map +0 -1
  332. package/dist/Menu/index.js.map +0 -1
  333. package/dist/MenuBar/index.js.map +0 -1
  334. package/dist/NavMenu/NavMenuPopoutButton.torp +0 -129
  335. package/dist/NavMenu/index.js.map +0 -1
  336. package/dist/TabGroup/index.js.map +0 -1
  337. package/dist/icons/index.js.map +0 -1
  338. package/dist/index.d.ts +0 -19
  339. package/dist/metafile-esm.json +0 -1
  340. package/dist/motion/fade.ts +0 -16
  341. package/dist/motion/grow.ts +0 -23
  342. package/dist/motion/measure.ts +0 -28
  343. package/dist/motion/slide.ts +0 -45
  344. package/dist/mount/index.d.ts +0 -2
  345. package/dist/utils/index.d.ts +0 -2
  346. /package/dist/{Chart → Charts}/DataSeries.ts +0 -0
@@ -1,23 +1,25 @@
1
- import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { TabGroupContextName, type TabGroupContext, type ItemState } from "./TabGroupTypes";
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
+ import $handle from "../utils/$handle";
3
+ import { createItemGroup } from "../utils/createItemGroup";
4
+ import { type ItemState, type TabGroupContext, TabGroupContextName } from "./TabGroupTypes";
3
5
 
4
6
  interface TabGroupProps {
5
7
  /** An ID for the root element */
6
8
  id?: string;
7
9
  /** Classes for the root element */
8
- class?: ClassValue,
10
+ class?: ClassValue;
9
11
  /** Styles for the root element */
10
- style?: StyleValue,
12
+ style?: StyleValue;
11
13
  /** The orientation of the tab buttons, which affects keyboard navigation */
12
- orientation?: "horizontal" | "vertical",
14
+ orientation?: "horizontal" | "vertical";
13
15
  /** How tabs are activated; if automatic they are shown on focus, if manual they must be clicked */
14
- activation?: "automatic" | "manual",
16
+ activation?: "automatic" | "manual";
15
17
  /** The value of the active TabContent */
16
- value?: string,
18
+ value?: Bindable<string | undefined>;
17
19
  /** If set to true, the user cannot interact with any items in the TabGroup */
18
- disabled?: boolean,
20
+ disabled?: boolean;
19
21
  /** Raised when the active item has changed */
20
- onchange?: (value: string | string[]) => void
22
+ onchange?: (value: string | string[]) => void;
21
23
  }
22
24
 
23
25
  /**
@@ -40,24 +42,19 @@ interface TabGroupProps {
40
42
  * ```
41
43
  */
42
44
  export default function TabGroup($props: TabGroupProps | undefined) {
43
- let orientation = $props?.orientation ?? "horizontal";
44
- let activation = $props?.activation ?? "automatic";
45
-
46
45
  let $state = $watch({
47
- value: ""
46
+ value: "",
48
47
  });
49
48
 
50
- // Sync props and state
51
- $run(() => {
52
- $state.value = $props?.value ?? "";
53
- });
54
- $run(() => {
55
- if ($props !== undefined) {
56
- $props.value = $state.value;
57
- }
58
- });
49
+ $bind($state, $props, "value");
59
50
 
60
- let itemStates: ItemState[] = [];
51
+ const group = createItemGroup<ItemState>({
52
+ state: $state,
53
+ type: "single",
54
+ selectedProperty: "active",
55
+ allowDeselect: false,
56
+ disabled: () => $props?.disabled,
57
+ });
61
58
 
62
59
  // This is used to assign automatic indexes to items where needed
63
60
  let nextHeaderIndex = 0;
@@ -67,55 +64,43 @@ export default function TabGroup($props: TabGroupProps | undefined) {
67
64
  let context: TabGroupContext = {
68
65
  registerHeader,
69
66
  registerItem,
70
- removeItem,
71
- triggerItem,
67
+ removeItem: group.removeItem,
68
+ triggerItem: group.toggleItem,
72
69
  handleHeaderKey,
73
- orientation,
74
- activation,
70
+ get orientation() {
71
+ return $props?.orientation ?? "horizontal";
72
+ },
73
+ get activation() {
74
+ return $props?.activation ?? "automatic";
75
+ },
75
76
  };
76
77
  $context[TabGroupContextName] = context;
77
78
 
78
- $run(() => {
79
- // Ensure the value passed in was a string (in case e.g. the user has set values to ints)
80
- $state.value = $state.value.toString();
81
- for (let item of itemStates) {
82
- item.active = item.value === $state.value;
83
- }
84
- });
85
-
86
- $run(() => {
87
- itemStates.forEach((s) => s.parentDisabled = $props?.disabled === true);
88
- });
89
-
90
79
  // Dispatch the change event when the value changes
91
- let firstChange = true;
92
- $run(() => {
93
- const ev = $props?.onchange;
80
+ $handle((first) => {
94
81
  const value = $props?.value;
95
- if (firstChange) {
96
- firstChange = false;
97
- } else if (ev) {
98
- ev(value!);
99
- }
82
+ if (!first) $props?.onchange?.(value!);
100
83
  });
101
84
 
102
85
  // On mount, if no value was set, show the first tab content
103
- $mount(() => {
104
- if ($state.value === "" && itemStates.length) {
105
- $state.value = itemStates[0].value;
86
+ $onmount(() => {
87
+ if ($state.value === "" && group.itemStates.length) {
88
+ $state.value = group.itemStates[0].value;
106
89
  }
107
90
  });
108
91
 
109
- function registerHeader(index: number | undefined, value: string | undefined, setFocused: () => void): ItemState {
92
+ function registerHeader(
93
+ index: number | undefined,
94
+ value: string | undefined,
95
+ disabled: boolean | undefined,
96
+ ): ItemState {
110
97
  // If an index wasn't set for the header, set it automatically
111
- if (!index) {
98
+ if (index === undefined) {
112
99
  index = nextHeaderIndex++;
113
100
  }
114
101
 
115
102
  // Get or add the ItemState at this index
116
- const itemState = getItemState(index, value);
117
-
118
- itemState.setFocused = setFocused;
103
+ const itemState = getItemState(index, value, disabled);
119
104
 
120
105
  return itemState;
121
106
  }
@@ -132,10 +117,11 @@ export default function TabGroup($props: TabGroupProps | undefined) {
132
117
  return itemState;
133
118
  }
134
119
 
135
- function getItemState(index: number, value: string | undefined): ItemState {
136
- // If we already have an item at this index, just return it
137
- if (itemStates.length > index) {
138
- return itemStates[index];
120
+ function getItemState(index: number, value: string | undefined, disabled?: boolean): ItemState {
121
+ // If we already have an item with this index, just return it
122
+ const existing = group.itemStates.find((item) => item.index === index);
123
+ if (existing) {
124
+ return existing;
139
125
  }
140
126
 
141
127
  // If a value wasn't set for the item, set it to the index
@@ -143,94 +129,92 @@ export default function TabGroup($props: TabGroupProps | undefined) {
143
129
  value = index.toString();
144
130
  }
145
131
 
146
- // Add the item's state to the array
132
+ // Add the item's state to the array; the group assigns the active and
133
+ // parentDisabled states and places it at its index
147
134
  const newItemState: ItemState = $watch({
148
135
  index,
149
136
  value,
150
- // TODO: this would be better than using $mount, but it doesn't work with nested tabs
151
- // active: value === $props?.value || ($props?.value === "" && index === 0),
152
- active: value === $state.value,
137
+ active: false,
153
138
  headerId: "",
154
139
  contentId: "",
155
- disabled: false,
156
- parentDisabled: false,
157
- get dataState() {
158
- return this.active ? "active" : "inactive";
159
- },
140
+ disabled: $props?.disabled ?? disabled ?? false,
141
+ parentDisabled: $props?.disabled ?? false,
160
142
  setFocused: () => {},
161
- orientation,
162
- activation
163
143
  });
164
- itemStates.splice(index, 0, newItemState);
144
+ group.registerItem(newItemState);
165
145
 
166
146
  return newItemState;
167
147
  }
168
148
 
169
- // TODO: I think this should be done by value
170
- function removeItem(itemIndex: number) {
171
- // Remove the item and re-index
172
- let index = itemStates.findIndex((item) => item.index === itemIndex);
173
- if (index !== -1) {
174
- itemStates.splice(itemIndex, 1);
175
- }
176
- itemStates.forEach((item, i) => (item.index = i));
177
- }
178
-
179
- function triggerItem(toggleValue: string) {
180
- for (let item of itemStates) {
181
- // The item is active if it has the supplied value
182
- if (item.value === toggleValue) {
183
- $state.value = item.value;
184
- break;
185
- }
186
- }
187
- }
188
-
189
149
  function handleHeaderKey(headerIndex: number, e: KeyboardEvent) {
150
+ const itemStates = group.itemStates;
151
+ const orientation = $props?.orientation ?? "horizontal";
190
152
  switch (e.key) {
191
- case "Left":
192
153
  case "ArrowLeft": {
193
- if (orientation === "horizontal" && headerIndex > 0) {
194
- e.preventDefault();
195
- itemStates[headerIndex - 1].setFocused();
154
+ if (orientation === "horizontal") {
155
+ for (let i = headerIndex - 1; i >= 0; i--) {
156
+ if (!itemStates[i].disabled) {
157
+ e.preventDefault();
158
+ itemStates[i].setFocused();
159
+ break;
160
+ }
161
+ }
196
162
  }
197
163
  break;
198
164
  }
199
- case "Up":
200
165
  case "ArrowUp": {
201
- if (orientation === "vertical" && headerIndex > 0) {
202
- e.preventDefault();
203
- itemStates[headerIndex - 1].setFocused();
166
+ if (orientation === "vertical") {
167
+ for (let i = headerIndex - 1; i >= 0; i--) {
168
+ if (!itemStates[i].disabled) {
169
+ e.preventDefault();
170
+ itemStates[i].setFocused();
171
+ break;
172
+ }
173
+ }
204
174
  }
205
175
  break;
206
176
  }
207
- case "Right":
208
177
  case "ArrowRight": {
209
- if (orientation === "horizontal" && headerIndex < itemStates.length - 1) {
210
- e.preventDefault();
211
- itemStates[headerIndex + 1].setFocused();
178
+ if (orientation === "horizontal") {
179
+ for (let i = headerIndex + 1; i < itemStates.length; i++) {
180
+ if (!itemStates[i].disabled) {
181
+ e.preventDefault();
182
+ itemStates[i].setFocused();
183
+ break;
184
+ }
185
+ }
212
186
  }
213
187
  break;
214
188
  }
215
- case "Down":
216
189
  case "ArrowDown": {
217
- if (orientation === "vertical" && headerIndex < itemStates.length - 1) {
218
- e.preventDefault();
219
- itemStates[headerIndex + 1].setFocused();
190
+ if (orientation === "vertical") {
191
+ for (let i = headerIndex + 1; i < itemStates.length; i++) {
192
+ if (!itemStates[i].disabled) {
193
+ e.preventDefault();
194
+ itemStates[i].setFocused();
195
+ break;
196
+ }
197
+ }
220
198
  }
221
199
  break;
222
200
  }
223
201
  case "Home": {
224
- if (headerIndex > 0) {
225
- e.preventDefault();
226
- itemStates[0].setFocused();
202
+ for (let i = 0; i < itemStates.length; i++) {
203
+ if (!itemStates[i].disabled) {
204
+ e.preventDefault();
205
+ itemStates[i].setFocused();
206
+ break;
207
+ }
227
208
  }
228
209
  break;
229
210
  }
230
211
  case "End": {
231
- if (headerIndex < itemStates.length - 1) {
232
- e.preventDefault();
233
- itemStates[itemStates.length - 1].setFocused();
212
+ for (let i = itemStates.length - 1; i >= 0; i--) {
213
+ if (!itemStates[i].disabled) {
214
+ e.preventDefault();
215
+ itemStates[i].setFocused();
216
+ break;
217
+ }
234
218
  }
235
219
  break;
236
220
  }
@@ -1,12 +1,12 @@
1
- export const TabGroupContextName = "TabGroup";
2
- export const TabItemContextName = "TabItem";
1
+ export const TabGroupContextName: unique symbol = Symbol.for("torp.TabGroup");
2
+ export const TabItemContextName: unique symbol = Symbol.for("torp.TabItem");
3
3
 
4
4
  export interface TabGroupContext {
5
5
  /** Called from a header when it is added */
6
6
  registerHeader: (
7
7
  index: number | undefined,
8
8
  value: string | undefined,
9
- setFocused: () => void,
9
+ disabled: boolean | undefined,
10
10
  ) => ItemState;
11
11
  /** Called from an item when it is added */
12
12
  registerItem: (index: number | undefined, value: string | undefined) => ItemState;
@@ -1,26 +1,31 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { TabGroupContextName, TabItemContextName, type TabGroupContext, type TabItemContext } from "./TabGroupTypes";
2
+ import {
3
+ type TabGroupContext,
4
+ TabGroupContextName,
5
+ type TabItemContext,
6
+ TabItemContextName,
7
+ } from "./TabGroupTypes";
3
8
 
4
9
  interface TabHeaderProps {
5
10
  /** An ID for the root element */
6
11
  id?: string;
7
12
  /** Classes for the root element */
8
- class?: ClassValue,
13
+ class?: ClassValue;
9
14
  /** Styles for the root element */
10
- style?: StyleValue,
11
- /** The type of HTML header to use */
12
- as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"
15
+ style?: StyleValue;
13
16
  /** The index of this header's item */
14
- index?: number,
17
+ index?: number;
15
18
  /** The value for this header's item */
16
- value?: string,
19
+ value?: string;
20
+ /** If set to true, the user cannot interact with this header */
21
+ disabled?: boolean;
17
22
  }
18
23
 
19
24
  /**
20
25
  * The header for a tab item, which contains the TabTrigger.
21
26
  *
22
27
  * The structure of a TabHeader is:
23
- *
28
+ *
24
29
  * ```
25
30
  * <TabHeader>
26
31
  * <TabTrigger />
@@ -28,20 +33,22 @@ interface TabHeaderProps {
28
33
  * ```
29
34
  */
30
35
  export default function TabHeader($props: TabHeaderProps | undefined) {
31
- let button: HTMLButtonElement;
32
-
33
36
  const context = $context[TabGroupContextName] as TabGroupContext;
34
37
  if (!context) {
35
38
  throw new Error("TabHeader must be contained within a TabGroup");
36
39
  }
37
- let $state = context.registerHeader($props?.index, $props?.value);
40
+ let $state = context.registerHeader($props?.index, $props?.value, $props?.disabled);
38
41
 
39
42
  const itemContext: TabItemContext = {
40
43
  triggerItem: context.triggerItem,
41
44
  handleHeaderKey: context.handleHeaderKey,
42
45
  state: $state,
43
- orientation: context.orientation,
44
- activation: context.activation
46
+ get orientation() {
47
+ return context.orientation;
48
+ },
49
+ get activation() {
50
+ return context.activation;
51
+ },
45
52
  };
46
53
  $context[TabItemContextName] = itemContext;
47
54
 
@@ -49,12 +56,11 @@ export default function TabHeader($props: TabHeaderProps | undefined) {
49
56
  $run(() => {
50
57
  return () => {
51
58
  context.removeItem($state.index);
52
- }
59
+ };
53
60
  });
54
61
 
55
62
  @render {
56
- @// TODO: $props?.as
57
- <h4
63
+ <div
58
64
  {$props?.id}
59
65
  class={[
60
66
  "torp-tab-header",
@@ -62,11 +68,9 @@ export default function TabHeader($props: TabHeaderProps | undefined) {
62
68
  context.orientation
63
69
  ]}
64
70
  data-state={$state.active ? "active" : "inactive"}
65
- data-disabled={$state.disabled ? "true" : undefined}
66
- &ref={button}
67
71
  >
68
72
  <slot />
69
- </h4>
73
+ </div>
70
74
  }
71
75
 
72
76
  @style {
@@ -1,22 +1,22 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { TabGroupContextName, type TabGroupContext } from "./TabGroupTypes";
2
+ import { type TabGroupContext, TabGroupContextName } from "./TabGroupTypes";
3
3
 
4
4
  interface TabListProps {
5
5
  /** An ID for the root element */
6
6
  id?: string;
7
7
  /** Classes for the root element */
8
- class?: ClassValue,
8
+ class?: ClassValue;
9
9
  /** Styles for the root element */
10
- style?: StyleValue,
10
+ style?: StyleValue;
11
11
  /** An ARIA label for describing the tab list to screen readers */
12
- ariaLabel?: string,
12
+ ariaLabel?: string;
13
13
  }
14
14
 
15
15
  /**
16
16
  * A component that holds the TabHeaders of a TabGroup.
17
- *
17
+ *
18
18
  * The structure of a TabList is:
19
- *
19
+ *
20
20
  * ```
21
21
  * <TabList>
22
22
  * <TabHeader>
@@ -31,17 +31,6 @@ export default function TabList($props: TabListProps | undefined) {
31
31
  if (!context) {
32
32
  throw new Error("TabList must be contained within a TabGroup");
33
33
  }
34
- // TODO: const { orientation } = context;
35
- const orientation = context.orientation;
36
-
37
- function handleFocus(e: FocusEvent & { currentTarget: EventTarget & HTMLElement }) {
38
- // TODO: Should this be the first button?
39
- const el = e.currentTarget.childNodes[0];
40
- if (el instanceof HTMLElement) {
41
- el.focus();
42
- e.preventDefault();
43
- }
44
- }
45
34
 
46
35
  @render {
47
36
  <div
@@ -50,10 +39,8 @@ export default function TabList($props: TabListProps | undefined) {
50
39
  {$props?.style}
51
40
  role="tablist"
52
41
  aria-label={$props?.ariaLabel}
53
- aria-orientation={orientation}
54
- data-orientation={orientation}
55
- tabindex="0"
56
- onfocus={handleFocus}
42
+ aria-orientation={context.orientation}
43
+ data-orientation={context.orientation}
57
44
  >
58
45
  <slot />
59
46
  </div>
@@ -1,14 +1,14 @@
1
1
  import type { ClassValue, StyleValue } from "@torpor/view";
2
2
  import getId from "../utils/getId";
3
- import { TabItemContextName, type TabItemContext } from "./TabGroupTypes";
3
+ import { type TabItemContext, TabItemContextName } from "./TabGroupTypes";
4
4
 
5
5
  interface TabTriggerProps {
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
  /**
@@ -58,13 +58,12 @@ export default function TabTrigger($props: TabTriggerProps | undefined) {
58
58
  class={["torp-tab-trigger", $props?.class]}
59
59
  {$props?.style}
60
60
  role="tab"
61
- tabindex="-1"
61
+ tabindex={$state.active ? "0" : "-1"}
62
62
  disabled={$state.disabled || $state.parentDisabled}
63
- aria-selected={$state.active.toString()}
64
- aria-disabled={$state.disabled}
63
+ aria-selected={$state.active ? "true" : "false"}
64
+ aria-disabled={$state.disabled || $state.parentDisabled}
65
65
  aria-controls={$state.contentId}
66
66
  data-state={$state.active ? "active" : "inactive"}
67
- data-disabled={$state.disabled}
68
67
  data-orientation={context.orientation}
69
68
  &ref={button}
70
69
  onclick={handleClick}
@@ -5,13 +5,13 @@ interface TabContentProps {
5
5
  /** An ID for the root element */
6
6
  id?: string;
7
7
  /** Classes for the root element */
8
- class?: ClassValue,
8
+ class?: ClassValue;
9
9
  /** Styles for the root element */
10
- style?: StyleValue,
10
+ style?: StyleValue;
11
11
  /** The index of this item */
12
- index?: number,
12
+ index?: number;
13
13
  /** The value for this item */
14
- value?: string,
14
+ value?: string;
15
15
  }
16
16
 
17
17
  /**
@@ -31,19 +31,19 @@ interface TabGroupProps {
31
31
  /** An ID for the root element */
32
32
  id?: string;
33
33
  /** Classes for the root element */
34
- class?: ClassValue,
34
+ class?: ClassValue;
35
35
  /** Styles for the root element */
36
- style?: StyleValue,
36
+ style?: StyleValue;
37
37
  /** The orientation of the tab buttons, which affects keyboard navigation */
38
- orientation?: "horizontal" | "vertical",
38
+ orientation?: "horizontal" | "vertical";
39
39
  /** How tabs are activated; if automatic they are shown on focus, if manual they must be clicked */
40
- activation?: "automatic" | "manual",
40
+ activation?: "automatic" | "manual";
41
41
  /** The value of the active TabContent */
42
- value?: string,
42
+ value?: Bindable<string | undefined>;
43
43
  /** If set to true, the user cannot interact with any items in the TabGroup */
44
- disabled?: boolean,
44
+ disabled?: boolean;
45
45
  /** Raised when the active item has changed */
46
- onchange?: (value: string | string[]) => void
46
+ onchange?: (value: string | string[]) => void;
47
47
  }
48
48
 
49
49
  /**
@@ -79,22 +79,22 @@ interface TabHeaderProps {
79
79
  /** An ID for the root element */
80
80
  id?: string;
81
81
  /** Classes for the root element */
82
- class?: ClassValue,
82
+ class?: ClassValue;
83
83
  /** Styles for the root element */
84
- style?: StyleValue,
85
- /** The type of HTML header to use */
86
- as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"
84
+ style?: StyleValue;
87
85
  /** The index of this header's item */
88
- index?: number,
86
+ index?: number;
89
87
  /** The value for this header's item */
90
- value?: string,
88
+ value?: string;
89
+ /** If set to true, the user cannot interact with this header */
90
+ disabled?: boolean;
91
91
  }
92
92
 
93
93
  /**
94
94
  * The header for a tab item, which contains the TabTrigger.
95
95
  *
96
96
  * The structure of a TabHeader is:
97
- *
97
+ *
98
98
  * ```
99
99
  * <TabHeader>
100
100
  * <TabTrigger />
@@ -115,18 +115,18 @@ interface TabListProps {
115
115
  /** An ID for the root element */
116
116
  id?: string;
117
117
  /** Classes for the root element */
118
- class?: ClassValue,
118
+ class?: ClassValue;
119
119
  /** Styles for the root element */
120
- style?: StyleValue,
120
+ style?: StyleValue;
121
121
  /** An ARIA label for describing the tab list to screen readers */
122
- ariaLabel?: string,
122
+ ariaLabel?: string;
123
123
  }
124
124
 
125
125
  /**
126
126
  * A component that holds the TabHeaders of a TabGroup.
127
- *
127
+ *
128
128
  * The structure of a TabList is:
129
- *
129
+ *
130
130
  * ```
131
131
  * <TabList>
132
132
  * <TabHeader>
@@ -149,9 +149,9 @@ interface TabTriggerProps {
149
149
  /** An ID for the root element */
150
150
  id?: string;
151
151
  /** Classes for the root element */
152
- class?: ClassValue,
152
+ class?: ClassValue;
153
153
  /** Styles for the root element */
154
- style?: StyleValue,
154
+ style?: StyleValue;
155
155
  }
156
156
 
157
157
  /**
@@ -165,4 +165,4 @@ declare function TabTrigger(
165
165
  $slots?: Record<string, SlotRender>,
166
166
  ): void;
167
167
 
168
- export { TabContent, TabGroup, TabHeader, TabList, TabTrigger };
168
+ export { TabContent, TabGroup, TabHeader, TabList, TabTrigger };
@@ -1,22 +1,6 @@
1
- // src/TabGroup/TabContent.torp
2
- import TabContent_default from "./TabContent.torp";
3
-
4
- // src/TabGroup/TabGroup.torp
5
- import TabGroup_default from "./TabGroup.torp";
6
-
7
- // src/TabGroup/TabHeader.torp
8
- import TabHeader_default from "./TabHeader.torp";
9
-
10
- // src/TabGroup/TabList.torp
11
- import TabList_default from "./TabList.torp";
12
-
13
- // src/TabGroup/TabTrigger.torp
14
- import TabTrigger_default from "./TabTrigger.torp";
15
- export {
16
- TabContent_default as TabContent,
17
- TabGroup_default as TabGroup,
18
- TabHeader_default as TabHeader,
19
- TabList_default as TabList,
20
- TabTrigger_default as TabTrigger
21
- };
22
- //# sourceMappingURL=index.js.map
1
+ import TabContent from "./TabContent.torp";
2
+ import TabGroup from "./TabGroup.torp";
3
+ import TabHeader from "./TabHeader.torp";
4
+ import TabList from "./TabList.torp";
5
+ import TabTrigger from "./TabTrigger.torp";
6
+ export { TabContent, TabGroup, TabHeader, TabList, TabTrigger };