@torpor/ui 0.3.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/README.md +83 -7
  2. package/dist/Accordion/Accordion.torp +43 -165
  3. package/dist/Accordion/AccordionContent.torp +6 -6
  4. package/dist/Accordion/AccordionHeader.torp +7 -11
  5. package/dist/Accordion/AccordionItem.torp +24 -24
  6. package/dist/Accordion/AccordionTrigger.torp +17 -8
  7. package/dist/Accordion/AccordionTypes.ts +6 -6
  8. package/dist/Accordion/index.d.ts +23 -25
  9. package/dist/Accordion/index.js +6 -22
  10. package/dist/Breadcrumb/Breadcrumb.torp +12 -10
  11. package/dist/Breadcrumb/BreadcrumbItem.torp +6 -6
  12. package/dist/Breadcrumb/BreadcrumbList.torp +21 -0
  13. package/dist/Breadcrumb/BreadcrumbSeparator.torp +4 -4
  14. package/dist/Breadcrumb/index.d.ts +39 -15
  15. package/dist/Breadcrumb/index.js +5 -14
  16. package/dist/Calendar/Calendar.torp +163 -156
  17. package/dist/Calendar/CalendarDay.torp +91 -45
  18. package/dist/Calendar/CalendarDayHeader.torp +36 -0
  19. package/dist/Calendar/CalendarGrid.torp +104 -0
  20. package/dist/Calendar/CalendarGridHeader.torp +43 -0
  21. package/dist/Calendar/CalendarHeader.torp +48 -0
  22. package/dist/Calendar/CalendarHeaderTrigger.torp +54 -0
  23. package/dist/Calendar/CalendarTypes.ts +25 -4
  24. package/dist/Calendar/buildDays.ts +54 -0
  25. package/dist/Calendar/index.d.ts +191 -5
  26. package/dist/Calendar/index.js +8 -10
  27. package/dist/Carousel/Carousel.torp +180 -0
  28. package/dist/Carousel/CarouselIndicators.torp +65 -0
  29. package/dist/Carousel/CarouselNext.torp +43 -0
  30. package/dist/Carousel/CarouselPrevious.torp +44 -0
  31. package/dist/Carousel/CarouselSlide.torp +57 -0
  32. package/dist/Carousel/CarouselTypes.ts +28 -0
  33. package/dist/Carousel/index.d.ts +147 -0
  34. package/dist/Carousel/index.js +6 -0
  35. package/dist/Charts/BarChart.torp +70 -0
  36. package/dist/Charts/Chart.torp +120 -0
  37. package/dist/Charts/ChartBars.torp +78 -0
  38. package/dist/Charts/ChartColumns.torp +66 -0
  39. package/dist/Charts/ChartGrid.torp +54 -0
  40. package/dist/Charts/ChartLines.torp +60 -0
  41. package/dist/Charts/ChartTypes.ts +25 -0
  42. package/dist/Charts/ChartXAxis.torp +83 -0
  43. package/dist/Charts/ChartYAxis.torp +105 -0
  44. package/dist/Charts/ColumnChart.torp +70 -0
  45. package/dist/{Chart → Charts}/GridLines.torp +7 -4
  46. package/dist/Charts/LineChart.torp +73 -0
  47. package/dist/{Chart → Charts}/PieChart.torp +14 -20
  48. package/dist/{Chart → Charts}/ScatterChart.torp +45 -38
  49. package/dist/{Chart → Charts}/SparkLine.torp +16 -19
  50. package/dist/{Chart → Charts}/XAxis.torp +18 -12
  51. package/dist/{Chart → Charts}/YAxis.torp +15 -9
  52. package/dist/Charts/index.d.ts +469 -0
  53. package/dist/Charts/index.js +17 -0
  54. package/dist/ColorPicker/ColorPalette.torp +154 -0
  55. package/dist/ColorPicker/ColorPicker.torp +157 -0
  56. package/dist/ColorPicker/index.d.ts +85 -0
  57. package/dist/ColorPicker/index.js +3 -0
  58. package/dist/ComboBox/ComboBox.torp +205 -0
  59. package/dist/ComboBox/ComboBoxContent.torp +112 -0
  60. package/dist/ComboBox/ComboBoxInput.torp +145 -0
  61. package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
  62. package/dist/ComboBox/ComboBoxTypes.ts +39 -0
  63. package/dist/ComboBox/index.d.ts +152 -0
  64. package/dist/ComboBox/index.js +6 -0
  65. package/dist/CommandPalette/CommandPalette.torp +220 -0
  66. package/dist/CommandPalette/CommandTypes.ts +14 -0
  67. package/dist/CommandPalette/index.d.ts +45 -0
  68. package/dist/CommandPalette/index.js +2 -0
  69. package/dist/Contextual/Contextual.torp +39 -52
  70. package/dist/Contextual/ContextualContent.torp +29 -73
  71. package/dist/Contextual/ContextualHover.torp +112 -0
  72. package/dist/Contextual/ContextualTrigger.torp +31 -42
  73. package/dist/Contextual/ContextualTypes.ts +5 -18
  74. package/dist/Contextual/index.d.ts +44 -27
  75. package/dist/Contextual/index.js +5 -14
  76. package/dist/DataGrid/DataGrid.torp +496 -0
  77. package/dist/DataGrid/DataGridTypes.ts +25 -0
  78. package/dist/DataGrid/index.d.ts +90 -0
  79. package/dist/DataGrid/index.js +3 -0
  80. package/dist/DataGrid/sortRows.ts +32 -0
  81. package/dist/DatePicker/DatePicker.torp +222 -0
  82. package/dist/DatePicker/DatePickerHeader.torp +20 -0
  83. package/dist/DatePicker/index.d.ts +55 -0
  84. package/dist/DatePicker/index.js +2 -0
  85. package/dist/DateRangePicker/DateRangePicker.torp +311 -0
  86. package/dist/DateRangePicker/DateRangePickerDay.torp +137 -0
  87. package/dist/DateRangePicker/DateRangePickerTypes.ts +21 -0
  88. package/dist/DateRangePicker/index.d.ts +76 -0
  89. package/dist/DateRangePicker/index.js +3 -0
  90. package/dist/Dialog/Dialog.torp +33 -30
  91. package/dist/Dialog/DialogBody.torp +5 -9
  92. package/dist/Dialog/DialogButton.torp +14 -11
  93. package/dist/Dialog/DialogFooter.torp +3 -7
  94. package/dist/Dialog/DialogHeader.torp +6 -10
  95. package/dist/Dialog/DialogTypes.ts +2 -2
  96. package/dist/Dialog/index.d.ts +28 -26
  97. package/dist/Dialog/index.js +6 -22
  98. package/dist/Disclosure/Disclosure.torp +18 -18
  99. package/dist/Disclosure/DisclosureContent.torp +5 -6
  100. package/dist/Disclosure/DisclosureHeader.torp +7 -11
  101. package/dist/Disclosure/DisclosureTrigger.torp +4 -5
  102. package/dist/Disclosure/DisclosureTypes.ts +1 -1
  103. package/dist/Disclosure/index.d.ts +14 -16
  104. package/dist/Disclosure/index.js +5 -18
  105. package/dist/Drawer/Drawer.torp +21 -51
  106. package/dist/Drawer/DrawerContent.torp +67 -13
  107. package/dist/Drawer/DrawerOverlay.torp +4 -4
  108. package/dist/Drawer/DrawerTrigger.torp +16 -4
  109. package/dist/Drawer/DrawerTypes.ts +4 -1
  110. package/dist/Drawer/index.d.ts +16 -20
  111. package/dist/Drawer/index.js +5 -18
  112. package/dist/FocusGroup/FocusGroup.torp +70 -0
  113. package/dist/FocusGroup/FocusGroupButton.torp +59 -0
  114. package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
  115. package/dist/FocusGroup/index.d.ts +44 -0
  116. package/dist/FocusGroup/index.js +3 -0
  117. package/dist/Form/CheckBox.torp +28 -20
  118. package/dist/Form/Field.torp +17 -17
  119. package/dist/Form/File.torp +31 -22
  120. package/dist/Form/FileDrop.torp +187 -0
  121. package/dist/Form/Form.torp +24 -22
  122. package/dist/Form/FormTypes.ts +2 -0
  123. package/dist/Form/FormValues.torp +37 -0
  124. package/dist/Form/Hidden.torp +4 -12
  125. package/dist/Form/Input.torp +38 -32
  126. package/dist/Form/Label.torp +3 -3
  127. package/dist/Form/Message.torp +13 -5
  128. package/dist/Form/MessageSummary.torp +39 -0
  129. package/dist/Form/Option.torp +11 -7
  130. package/dist/Form/Select.torp +32 -28
  131. package/dist/Form/TextArea.torp +35 -31
  132. package/dist/Form/Toggle.torp +109 -0
  133. package/dist/Form/index.d.ts +198 -77
  134. package/dist/Form/index.js +16 -46
  135. package/dist/ListBox/ListBox.torp +374 -0
  136. package/dist/ListBox/ListBoxItem.torp +131 -0
  137. package/dist/ListBox/ListBoxSeparator.torp +29 -0
  138. package/dist/ListBox/ListBoxTypes.ts +41 -0
  139. package/dist/ListBox/LoadedListBoxItems.torp +41 -0
  140. package/dist/ListBox/index.d.ts +136 -0
  141. package/dist/ListBox/index.js +4 -0
  142. package/dist/MaskedInput/MaskedInput.torp +143 -0
  143. package/dist/MaskedInput/index.d.ts +52 -0
  144. package/dist/MaskedInput/index.js +2 -0
  145. package/dist/Menu/Menu.torp +90 -70
  146. package/dist/Menu/MenuButton.torp +17 -10
  147. package/dist/Menu/MenuCheck.torp +22 -18
  148. package/dist/Menu/MenuGroup.torp +4 -4
  149. package/dist/Menu/MenuIndicator.torp +5 -13
  150. package/dist/Menu/MenuPopout.torp +20 -50
  151. package/dist/Menu/MenuPopoutContent.torp +15 -66
  152. package/dist/Menu/MenuPopoutTrigger.torp +19 -100
  153. package/dist/Menu/MenuRadio.torp +25 -26
  154. package/dist/Menu/MenuRadioGroup.torp +25 -68
  155. package/dist/Menu/MenuSeparator.torp +3 -2
  156. package/dist/Menu/MenuTypes.ts +12 -21
  157. package/dist/Menu/index.d.ts +45 -51
  158. package/dist/Menu/index.js +12 -46
  159. package/dist/MenuBar/MenuBar.torp +31 -83
  160. package/dist/MenuBar/MenuBarItem.torp +34 -55
  161. package/dist/MenuBar/MenuBarItemContent.torp +15 -101
  162. package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
  163. package/dist/MenuBar/MenuBarTypes.ts +13 -12
  164. package/dist/MenuBar/index.d.ts +17 -19
  165. package/dist/MenuBar/index.js +5 -18
  166. package/dist/Modal/Modal.torp +28 -48
  167. package/dist/Modal/ModalContent.torp +21 -44
  168. package/dist/Modal/ModalOverlay.torp +4 -4
  169. package/dist/Modal/ModalTrigger.torp +16 -32
  170. package/dist/Modal/ModalTypes.ts +6 -17
  171. package/dist/Modal/index.d.ts +17 -29
  172. package/dist/Modal/index.js +29 -28
  173. package/dist/Modal/index.js.map +1 -1
  174. package/dist/Modal/showPrompt.ts +2 -2
  175. package/dist/NavMenu/NavMenu.torp +22 -104
  176. package/dist/NavMenu/NavMenuButton.torp +10 -8
  177. package/dist/NavMenu/NavMenuElement.torp +6 -7
  178. package/dist/NavMenu/NavMenuGroup.torp +5 -5
  179. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
  180. package/dist/NavMenu/NavMenuLink.torp +7 -10
  181. package/dist/NavMenu/NavMenuPopout.torp +16 -61
  182. package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
  183. package/dist/NavMenu/NavMenuPopoutTrigger.torp +47 -0
  184. package/dist/NavMenu/NavMenuSeparator.torp +3 -6
  185. package/dist/NavMenu/NavMenuTypes.ts +6 -15
  186. package/dist/NavMenu/index.d.ts +55 -55
  187. package/dist/NavMenu/index.js +11 -42
  188. package/dist/Notification/Notification.torp +12 -24
  189. package/dist/Notification/NotificationClose.torp +6 -3
  190. package/dist/Notification/NotificationContainer.torp +3 -7
  191. package/dist/Notification/NotificationContent.torp +3 -7
  192. package/dist/Notification/NotificationTypes.ts +1 -1
  193. package/dist/Notification/index.d.ts +15 -12
  194. package/dist/Notification/index.js +22 -32
  195. package/dist/Notification/index.js.map +1 -1
  196. package/dist/NumberInput/NumberInput.torp +255 -0
  197. package/dist/NumberInput/index.d.ts +44 -0
  198. package/dist/NumberInput/index.js +2 -0
  199. package/dist/Pagination/Pagination.torp +152 -0
  200. package/dist/Pagination/PaginationItem.torp +137 -0
  201. package/dist/Pagination/PaginationTypes.ts +22 -0
  202. package/dist/Pagination/buildPages.ts +61 -0
  203. package/dist/Pagination/index.d.ts +63 -0
  204. package/dist/Pagination/index.js +3 -0
  205. package/dist/Popover/Popover.torp +39 -52
  206. package/dist/Popover/PopoverContent.torp +27 -76
  207. package/dist/Popover/PopoverHover.torp +90 -0
  208. package/dist/Popover/PopoverTrigger.torp +17 -40
  209. package/dist/Popover/PopoverTypes.ts +5 -18
  210. package/dist/Popover/index.d.ts +40 -25
  211. package/dist/Popover/index.js +18 -18
  212. package/dist/Popover/index.js.map +1 -1
  213. package/dist/Progress/Progress.torp +88 -0
  214. package/dist/Progress/index.d.ts +37 -0
  215. package/dist/Progress/index.js +2 -0
  216. package/dist/Rating/Rating.torp +225 -0
  217. package/dist/Rating/index.d.ts +44 -0
  218. package/dist/Rating/index.js +2 -0
  219. package/dist/SegmentedControl/SegmentedControl.torp +233 -0
  220. package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
  221. package/dist/SegmentedControl/SegmentedItem.torp +78 -0
  222. package/dist/SegmentedControl/index.d.ts +74 -0
  223. package/dist/SegmentedControl/index.js +3 -0
  224. package/dist/SelectBox/SelectBox.torp +190 -0
  225. package/dist/SelectBox/SelectBoxContent.torp +107 -0
  226. package/dist/SelectBox/SelectBoxTrigger.torp +141 -0
  227. package/dist/SelectBox/SelectBoxTypes.ts +33 -0
  228. package/dist/SelectBox/index.d.ts +112 -0
  229. package/dist/SelectBox/index.js +5 -0
  230. package/dist/Slider/Slider.torp +248 -0
  231. package/dist/Slider/index.d.ts +45 -0
  232. package/dist/Slider/index.js +2 -0
  233. package/dist/Splitter/Splitter.torp +156 -0
  234. package/dist/Splitter/SplitterHandle.torp +161 -0
  235. package/dist/Splitter/SplitterPane.torp +63 -0
  236. package/dist/Splitter/SplitterTypes.ts +31 -0
  237. package/dist/Splitter/index.d.ts +103 -0
  238. package/dist/Splitter/index.js +4 -0
  239. package/dist/Stepper/Stepper.torp +146 -0
  240. package/dist/Stepper/StepperMarker.torp +24 -0
  241. package/dist/Stepper/StepperNext.torp +44 -0
  242. package/dist/Stepper/StepperPrevious.torp +44 -0
  243. package/dist/Stepper/StepperStep.torp +90 -0
  244. package/dist/Stepper/StepperTypes.ts +30 -0
  245. package/dist/Stepper/index.d.ts +149 -0
  246. package/dist/Stepper/index.js +6 -0
  247. package/dist/TabGroup/TabContent.torp +6 -6
  248. package/dist/TabGroup/TabGroup.torp +97 -113
  249. package/dist/TabGroup/TabGroupTypes.ts +3 -3
  250. package/dist/TabGroup/TabHeader.torp +23 -19
  251. package/dist/TabGroup/TabList.torp +8 -21
  252. package/dist/TabGroup/TabTrigger.torp +6 -7
  253. package/dist/TabGroup/index.d.ts +26 -26
  254. package/dist/TabGroup/index.js +6 -22
  255. package/dist/TagInput/TagInput.torp +378 -0
  256. package/dist/TagInput/index.d.ts +48 -0
  257. package/dist/TagInput/index.js +2 -0
  258. package/dist/TimePicker/TimePicker.torp +462 -0
  259. package/dist/TimePicker/index.d.ts +53 -0
  260. package/dist/TimePicker/index.js +2 -0
  261. package/dist/ToolBar/ToolBar.torp +117 -0
  262. package/dist/ToolBar/ToolBarButton.torp +56 -0
  263. package/dist/ToolBar/ToolBarElement.torp +51 -0
  264. package/dist/ToolBar/ToolBarPopout.torp +45 -0
  265. package/dist/ToolBar/ToolBarPopoutContent.torp +34 -0
  266. package/dist/ToolBar/ToolBarPopoutTrigger.torp +47 -0
  267. package/dist/ToolBar/ToolBarSeparator.torp +21 -0
  268. package/dist/ToolBar/ToolBarTypes.ts +28 -0
  269. package/dist/ToolBar/index.d.ts +210 -0
  270. package/dist/ToolBar/index.js +8 -0
  271. package/dist/Tree/Tree.torp +395 -0
  272. package/dist/Tree/TreeItem.torp +176 -0
  273. package/dist/Tree/TreeItemChildren.torp +60 -0
  274. package/dist/Tree/TreeItemContent.torp +46 -0
  275. package/dist/Tree/TreeItemLabel.torp +94 -0
  276. package/dist/Tree/TreeItemTrigger.torp +78 -0
  277. package/dist/Tree/TreeLoadedChildren.torp +122 -0
  278. package/dist/Tree/TreeTypes.ts +63 -0
  279. package/dist/Tree/index.d.ts +262 -0
  280. package/dist/Tree/index.js +7 -0
  281. package/dist/icons/ChevronDoubleLeft.torp +19 -0
  282. package/dist/icons/ChevronDoubleRight.torp +19 -0
  283. package/dist/icons/index.d.ts +61 -1
  284. package/dist/icons/index.js +17 -58
  285. package/dist/loader-DEeG5vFY.js +44 -0
  286. package/dist/loader-DEeG5vFY.js.map +1 -0
  287. package/dist/motion/index.d.ts +12 -8
  288. package/dist/motion/index.d.ts.map +1 -0
  289. package/dist/motion/index.js +72 -88
  290. package/dist/motion/index.js.map +1 -1
  291. package/dist/mount/draggable.ts +63 -0
  292. package/dist/mount/dropTarget.ts +108 -0
  293. package/dist/mount/hoverTrigger.ts +1 -1
  294. package/dist/utils/$handle.ts +23 -0
  295. package/dist/utils/LoadedItems.torp +47 -0
  296. package/dist/utils/PopoutClickTrigger.torp +99 -0
  297. package/dist/utils/PopoutTypes.ts +82 -0
  298. package/dist/utils/SubmenuPopout.torp +89 -0
  299. package/dist/utils/SubmenuPopoutContent.torp +87 -0
  300. package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
  301. package/dist/utils/chartColors.ts +13 -13
  302. package/dist/utils/chartLayout.ts +143 -0
  303. package/dist/utils/chartUtils.ts +1 -1
  304. package/dist/utils/colorUtils.ts +103 -0
  305. package/dist/utils/createItemGroup.ts +152 -0
  306. package/dist/utils/dateUtils.ts +8 -7
  307. package/dist/utils/documentEvents.ts +4 -4
  308. package/dist/utils/dragState.ts +86 -0
  309. package/dist/utils/focusGroup.ts +204 -0
  310. package/dist/utils/focusItem.ts +44 -0
  311. package/dist/utils/formField.ts +70 -0
  312. package/dist/utils/hoverOpen.ts +50 -0
  313. package/dist/utils/hoverReveal.ts +194 -0
  314. package/dist/utils/loader.ts +113 -0
  315. package/dist/utils/maskUtils.ts +98 -0
  316. package/dist/utils/popoutContent.ts +137 -0
  317. package/dist/utils/reorderList.ts +52 -0
  318. package/package.json +116 -25
  319. package/dist/Accordion/index.js.map +0 -1
  320. package/dist/Breadcrumb/index.js.map +0 -1
  321. package/dist/Calendar/index.js.map +0 -1
  322. package/dist/Chart/BarChart.torp +0 -159
  323. package/dist/Chart/LineChart.torp +0 -196
  324. package/dist/Chart/index.d.ts +0 -220
  325. package/dist/Chart/index.js +0 -34
  326. package/dist/Chart/index.js.map +0 -1
  327. package/dist/Contextual/index.js.map +0 -1
  328. package/dist/Dialog/index.js.map +0 -1
  329. package/dist/Disclosure/index.js.map +0 -1
  330. package/dist/Drawer/index.js.map +0 -1
  331. package/dist/Form/index.js.map +0 -1
  332. package/dist/Menu/index.js.map +0 -1
  333. package/dist/MenuBar/index.js.map +0 -1
  334. package/dist/NavMenu/NavMenuPopoutButton.torp +0 -129
  335. package/dist/NavMenu/index.js.map +0 -1
  336. package/dist/TabGroup/index.js.map +0 -1
  337. package/dist/icons/index.js.map +0 -1
  338. package/dist/index.d.ts +0 -19
  339. package/dist/metafile-esm.json +0 -1
  340. package/dist/motion/fade.ts +0 -16
  341. package/dist/motion/grow.ts +0 -23
  342. package/dist/motion/measure.ts +0 -28
  343. package/dist/motion/slide.ts +0 -45
  344. package/dist/mount/index.d.ts +0 -2
  345. package/dist/utils/index.d.ts +0 -2
  346. /package/dist/{Chart → Charts}/DataSeries.ts +0 -0
@@ -0,0 +1,49 @@
1
+ import type { ClassValue, StyleValue } from "@torpor/view";
2
+ import getId from "../utils/getId";
3
+ import { type ComboBoxContext, ComboBoxContextName } from "./ComboBoxTypes";
4
+
5
+ interface ComboBoxTriggerProps {
6
+ /** An ID for the root element */
7
+ id?: string;
8
+ /** Classes for the root element */
9
+ class?: ClassValue;
10
+ /** Styles for the root element */
11
+ style?: StyleValue;
12
+ }
13
+
14
+ /**
15
+ * The button that causes a ComboBox to appear or disappear.
16
+ */
17
+ export default function ComboBoxTrigger($props: ComboBoxTriggerProps | undefined) {
18
+ let defaultId = getId();
19
+
20
+ // Get stuff out of the ComboBoxContext
21
+ const context = $context[ComboBoxContextName] as ComboBoxContext;
22
+ if (!context) {
23
+ throw new Error("ComboBoxTrigger must be contained within a ComboBox");
24
+ }
25
+ let $state = context.state;
26
+
27
+ // Set the trigger ID so that it can be used with aria-labelledby
28
+ $state.triggerId = $props?.id ?? defaultId;
29
+
30
+ function handleClick() {
31
+ $state.visible = !$state.visible;
32
+ }
33
+
34
+ @render {
35
+ <button
36
+ type="button"
37
+ id={$props?.id ?? defaultId}
38
+ class={["torp-combo-box-trigger", $props?.class]}
39
+ {$props?.style}
40
+ aria-haspopup={$state.contentRole}
41
+ aria-expanded={$state.visible ? "true" : "false"}
42
+ aria-controls={$state.contentId}
43
+ onclick={handleClick}
44
+ &ref={context.anchorElement}
45
+ >
46
+ <slot />
47
+ </button>
48
+ }
49
+ }
@@ -0,0 +1,39 @@
1
+ import { type LoadResult, type Loader } from "../utils/loader";
2
+ import { type PopoutContext, type PopoutState } from "../utils/PopoutTypes";
3
+
4
+ export const ComboBoxContextName: unique symbol = Symbol.for("torp.ComboBox");
5
+
6
+ /** The shared context for ComboBox components */
7
+ export interface ComboBoxContext extends PopoutContext {
8
+ placeholder?: string;
9
+ required?: boolean;
10
+ ariaLabel?: string;
11
+ name?: string;
12
+ multiple?: boolean;
13
+ state: ComboBoxState;
14
+ focusInput?: () => void;
15
+ /** Whether the component is contained within a Form Field */
16
+ inField?: () => boolean;
17
+ /** Whether the Field's value is valid, for data-valid / aria-invalid */
18
+ valid?: () => boolean;
19
+ /** The ID of the Field's Message component, for aria-describedby */
20
+ messageId?: () => string | undefined;
21
+ /** Called by the input when it loses focus, to run Field validation */
22
+ handleBlur?: () => void;
23
+ /** Returns the items loaded from the network loader, when one is set */
24
+ getLoadedItems?: () => any[];
25
+ /** Extracts the display text for a loaded item */
26
+ getItemLabel?: (item: any) => any;
27
+ /** Extracts the value for a loaded item */
28
+ getItemValue?: (item: any) => any;
29
+ }
30
+
31
+ export interface ComboBoxState extends PopoutState {
32
+ value: any;
33
+ name?: string;
34
+ activeDescendant?: string;
35
+ /** The current search text, kept up to date by the input when loading */
36
+ searchText?: string;
37
+ }
38
+
39
+ export type { LoadResult, Loader };
@@ -0,0 +1,152 @@
1
+ import { type SlotRender } from "@torpor/view";
2
+
3
+
4
+ interface ComboBoxProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Classes for the root element */
8
+ class?: ClassValue;
9
+ /** Styles for the root element */
10
+ style?: StyleValue;
11
+ /** The name of the input's form data field */
12
+ name?: string;
13
+ /** The data value selected by the user, or an array of values if multiple is set */
14
+ value: Bindable<any>;
15
+ /** Whether multiple values can be selected at the same time */
16
+ multiple?: boolean;
17
+ /**
18
+ * Reads options from the network (or anywhere async) as the user types,
19
+ * receiving `{ searchText }`. When set and no content is slotted in, the
20
+ * options are rendered automatically.
21
+ */
22
+ load?: Loader;
23
+ /** Called after each successful load with the normalized result */
24
+ onload?: (result: LoadResult) => void;
25
+ /** Extracts the display text for a loaded item (defaults to `label ?? text ?? item`) */
26
+ getItemLabel?: (item: any) => any;
27
+ /** Extracts the value for a loaded item (defaults to `value ?? id`) */
28
+ getItemValue?: (item: any) => any;
29
+ /** Text to display when the input value is empty */
30
+ placeholder?: string;
31
+ /** Whether the input's value is required */
32
+ required?: boolean;
33
+ /** An ARIA label for describing the input to screen readers when there is no associated label element */
34
+ ariaLabel?: string;
35
+ /** Whether the popout is visible; only bind this to control it from outside */
36
+ visible?: Bindable<boolean | undefined>;
37
+ /** Raised when the value has changed */
38
+ onchange?: (value: any) => void;
39
+ /** Raised when the popout has opened */
40
+ onopen?: () => void;
41
+ /** Raised when the popout has closed */
42
+ onclose?: (result: any) => void;
43
+ }
44
+
45
+ /**
46
+ * An input box for selecting a value from a popout ListBox or Dialog.
47
+ *
48
+ * See [the WAI ARIA guidelines for ComboBoxes](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/).
49
+ *
50
+ * The structure of a ComboBox is:
51
+ *
52
+ * ```
53
+ * <ComboBox>
54
+ * <ComboBoxInput />
55
+ * <ComboBoxTrigger /> (optional)
56
+ * <ComboBoxContent />
57
+ * </ComboBox>
58
+ * ```
59
+ */
60
+ declare function ComboBox(
61
+ $parent: ParentNode,
62
+ $anchor: Node | null,
63
+ $props: ComboBoxProps | undefined,
64
+ $context?: Record<PropertyKey, any>,
65
+ $slots?: Record<string, SlotRender>,
66
+ ): void;
67
+
68
+
69
+
70
+ interface ComboBoxContentProps {
71
+ /** An ID for the root element */
72
+ id?: string;
73
+ /** Classes for the root element */
74
+ class?: ClassValue;
75
+ /** Styles for the root element */
76
+ style?: StyleValue;
77
+ }
78
+
79
+ /**
80
+ * The content that is displayed for a ComboBox when it is open, displayed
81
+ * alongside an element.
82
+ */
83
+ declare function ComboBoxContent(
84
+ $parent: ParentNode,
85
+ $anchor: Node | null,
86
+ $props: ComboBoxContentProps | undefined,
87
+ $context?: Record<PropertyKey, any>,
88
+ $slots?: Record<string, SlotRender>,
89
+ ): void;
90
+
91
+
92
+
93
+ interface ComboBoxInputProps {
94
+ /** An ID for the root element */
95
+ id?: string;
96
+ /** Classes for the root element */
97
+ class?: ClassValue;
98
+ /** Styles for the root element */
99
+ style?: StyleValue;
100
+
101
+ // TODO: Get these from the parent
102
+ /** The name of the input's form data field */
103
+ name?: string;
104
+ /** The value displayed in the input */
105
+ value?: any;
106
+ /** Text to display when the input value is empty */
107
+ placeholder?: string;
108
+ /** Whether the input's value is required */
109
+ required?: boolean;
110
+
111
+ /** An ARIA label for describing the input to screen readers when there is no associated label element */
112
+ ariaLabel?: string;
113
+ /** Raised on change */
114
+ onchange?: (e: Event) => void;
115
+ /** Raised on input */
116
+ oninput?: (e: InputEvent) => void;
117
+ }
118
+
119
+ /**
120
+ * The input that causes a ComboBox to appear or disappear.
121
+ */
122
+ declare function ComboBoxInput(
123
+ $parent: ParentNode,
124
+ $anchor: Node | null,
125
+ $props: ComboBoxInputProps | undefined,
126
+ $context?: Record<PropertyKey, any>,
127
+ $slots?: Record<string, SlotRender>,
128
+ ): void;
129
+
130
+
131
+
132
+ interface ComboBoxTriggerProps {
133
+ /** An ID for the root element */
134
+ id?: string;
135
+ /** Classes for the root element */
136
+ class?: ClassValue;
137
+ /** Styles for the root element */
138
+ style?: StyleValue;
139
+ }
140
+
141
+ /**
142
+ * The button that causes a ComboBox to appear or disappear.
143
+ */
144
+ declare function ComboBoxTrigger(
145
+ $parent: ParentNode,
146
+ $anchor: Node | null,
147
+ $props: ComboBoxTriggerProps | undefined,
148
+ $context?: Record<PropertyKey, any>,
149
+ $slots?: Record<string, SlotRender>,
150
+ ): void;
151
+
152
+ export { ComboBox, ComboBoxContent, ComboBoxInput, ComboBoxTrigger };
@@ -0,0 +1,6 @@
1
+ import { n as normalizeLoadResult, t as createItemLoader } from "../loader-DEeG5vFY.js";
2
+ import ComboBox from "./ComboBox.torp";
3
+ import ComboBoxContent from "./ComboBoxContent.torp";
4
+ import ComboBoxInput from "./ComboBoxInput.torp";
5
+ import ComboBoxTrigger from "./ComboBoxTrigger.torp";
6
+ export { ComboBox, ComboBoxContent, ComboBoxInput, ComboBoxTrigger, createItemLoader, normalizeLoadResult };
@@ -0,0 +1,220 @@
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
+ import Modal from "../Modal/Modal.torp";
3
+ import ModalContent from "../Modal/ModalContent.torp";
4
+ import ModalOverlay from "../Modal/ModalOverlay.torp";
5
+ import getId from "../utils/getId";
6
+ import type { Command } from "./CommandTypes";
7
+
8
+ interface CommandPaletteProps {
9
+ /** An ID for the root element */
10
+ id?: string;
11
+ /** Classes for the root element */
12
+ class?: ClassValue;
13
+ /** Styles for the root element */
14
+ style?: StyleValue;
15
+ /** Whether the palette is visible */
16
+ visible: Bindable<boolean | undefined>;
17
+ /** The commands that the user can choose from */
18
+ commands: Command[];
19
+ /** Text to display in the input when it is empty */
20
+ placeholder?: string;
21
+ /**
22
+ * A keyboard shortcut that toggles the palette, e.g. "mod+k", where "mod"
23
+ * means the Cmd key on Mac and the Ctrl key elsewhere
24
+ */
25
+ hotkey?: string;
26
+ /** An accessible name for the input */
27
+ ariaLabel?: string;
28
+ /** Text to display when no commands match the search */
29
+ emptyText?: string;
30
+ /** Raised when a command has been run */
31
+ onrun?: (command: Command) => void;
32
+ }
33
+
34
+ /**
35
+ * A modal input for searching and running commands, opened with a keyboard
36
+ * shortcut or programmatically.
37
+ *
38
+ * The structure of a CommandPalette is a Modal containing a search input and
39
+ * a filtered list of commands.
40
+ */
41
+ export default function CommandPalette($props: CommandPaletteProps | undefined) {
42
+ let defaultId = getId();
43
+ let input: HTMLInputElement;
44
+
45
+ function getDisabled(command: Command): boolean {
46
+ return command.disabled === true;
47
+ }
48
+
49
+ let $state = $watch({
50
+ visible: false,
51
+ search: "",
52
+ activeIndex: 0,
53
+ });
54
+
55
+ $bind($state, $props, "visible");
56
+
57
+ // Reset the active item whenever the search changes or the palette opens
58
+ let lastSearch = "";
59
+ let lastVisible = false;
60
+ $run(() => {
61
+ const search = $state.search;
62
+ const visible = $state.visible;
63
+ if (search !== lastSearch || (visible && !lastVisible)) {
64
+ $state.activeIndex = 0;
65
+ }
66
+ lastSearch = search;
67
+ lastVisible = visible;
68
+ if (!visible) {
69
+ $state.search = "";
70
+ if (input) {
71
+ input.value = "";
72
+ }
73
+ }
74
+ });
75
+
76
+ // The commands that match the current search text
77
+ function filteredCommands(): Command[] {
78
+ const search = $state.search.trim().toLowerCase();
79
+ if (search === "") return $props?.commands ?? [];
80
+ return ($props?.commands ?? []).filter(
81
+ (command) =>
82
+ command.label.toLowerCase().includes(search) ||
83
+ (command.keywords ?? "").toLowerCase().includes(search),
84
+ );
85
+ }
86
+
87
+ function activeCommand(): Command | undefined {
88
+ return filteredCommands()[$state.activeIndex];
89
+ }
90
+
91
+ function optionId(index: number): string {
92
+ return `${$props?.id ?? defaultId}-option-${index}`;
93
+ }
94
+
95
+ function runCommand(command: Command | undefined) {
96
+ if (!command || getDisabled(command)) return;
97
+ $state.visible = false;
98
+ command.run?.();
99
+ $props?.onrun?.(command);
100
+ }
101
+
102
+ function handleInput(e: Event) {
103
+ $state.search = (e.currentTarget as HTMLInputElement).value;
104
+ }
105
+
106
+ function handleKey(e: KeyboardEvent) {
107
+ switch (e.key) {
108
+ case "ArrowDown": {
109
+ e.preventDefault();
110
+ const count = filteredCommands().length;
111
+ $state.activeIndex = Math.min(count - 1, $state.activeIndex + 1);
112
+ break;
113
+ }
114
+ case "ArrowUp": {
115
+ e.preventDefault();
116
+ $state.activeIndex = Math.max(0, $state.activeIndex - 1);
117
+ break;
118
+ }
119
+ case "Enter": {
120
+ e.preventDefault();
121
+ runCommand(activeCommand());
122
+ break;
123
+ }
124
+ case "Escape": {
125
+ e.preventDefault();
126
+ $state.visible = false;
127
+ break;
128
+ }
129
+ }
130
+ }
131
+
132
+ // Toggle the palette with a keyboard shortcut, e.g. mod+k
133
+ $onmount(() => {
134
+ if (!$props?.hotkey) return;
135
+ const [modifier, key] = parseHotkey($props.hotkey);
136
+ if (!key) return;
137
+ const handler = (e: KeyboardEvent) => {
138
+ const modOk =
139
+ modifier === "mod" ? e.metaKey || e.ctrlKey : modifier === "shift" ? e.shiftKey : true;
140
+ if (modOk && e.key.toLowerCase() === key.toLowerCase()) {
141
+ e.preventDefault();
142
+ $state.visible = !$state.visible;
143
+ }
144
+ };
145
+ document.addEventListener("keydown", handler);
146
+ return () => document.removeEventListener("keydown", handler);
147
+ });
148
+
149
+ function parseHotkey(hotkey: string): [string | undefined, string | undefined] {
150
+ const parts = hotkey.split("+");
151
+ if (parts.length === 2) {
152
+ return [parts[0].toLowerCase(), parts[1]];
153
+ }
154
+ return [undefined, hotkey];
155
+ }
156
+
157
+ @render {
158
+ <div {$props?.id} class={["torp-command-palette", $props?.class]} {$props?.style}>
159
+ <Modal {$state.visible}>
160
+ <ModalOverlay />
161
+ <ModalContent class="torp-command-palette-content">
162
+ <input
163
+ class="torp-command-palette-input"
164
+ type="text"
165
+ role="combobox"
166
+ aria-expanded="true"
167
+ aria-controls={`${$props?.id ?? defaultId}-list`}
168
+ aria-activedescendant={optionId($state.activeIndex)}
169
+ aria-autocomplete="list"
170
+ aria-label={$props?.ariaLabel}
171
+ placeholder={$props?.placeholder}
172
+ &ref={input}
173
+ oninput={handleInput}
174
+ onkeydown={handleKey}
175
+ />
176
+ <ul class="torp-command-palette-list" role="listbox" id={`${$props?.id ?? defaultId}-list`}>
177
+ @for (let [index, command] of filteredCommands().entries()) {
178
+ @key = command.value
179
+ <li
180
+ class="torp-command-palette-item"
181
+ role="option"
182
+ id={optionId(index)}
183
+ aria-selected={$state.activeIndex === index ? "true" : "false"}
184
+ aria-disabled={getDisabled(command) ? "true" : undefined}
185
+ data-state={$state.activeIndex === index ? "active" : "inactive"}
186
+ onclick={() => runCommand(command)}
187
+ >
188
+ <span class="torp-command-palette-label">{command.label}</span>
189
+ @if (command.shortcut) {
190
+ <span class="torp-command-palette-shortcut" aria-hidden="true">
191
+ {command.shortcut}
192
+ </span>
193
+ }
194
+ </li>
195
+ }
196
+ @if (filteredCommands().length === 0) {
197
+ <li class="torp-command-palette-empty">
198
+ {$props?.emptyText ?? "No results"}
199
+ </li>
200
+ }
201
+ </ul>
202
+ </ModalContent>
203
+ </Modal>
204
+ </div>
205
+ }
206
+
207
+ @style {
208
+ /* Headless: layout only, so the input sits above the list. All
209
+ appearance is up to the consuming theme */
210
+ .torp-command-palette-content {
211
+ display: flex;
212
+ flex-direction: column;
213
+ }
214
+ .torp-command-palette-list {
215
+ list-style: none;
216
+ margin: 0;
217
+ padding: 0;
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,14 @@
1
+ export interface Command {
2
+ /** A value identifying the command */
3
+ value: any;
4
+ /** The display label for the command */
5
+ label: string;
6
+ /** Extra text that is matched when searching, but isn't displayed */
7
+ keywords?: string;
8
+ /** A keyboard shortcut hint to display, e.g. "⌘N" */
9
+ shortcut?: string;
10
+ /** If set to true, the command can't be run */
11
+ disabled?: boolean;
12
+ /** The function to call when the command is run */
13
+ run?: () => void;
14
+ }
@@ -0,0 +1,45 @@
1
+ import { type SlotRender } from "@torpor/view";
2
+
3
+
4
+ interface CommandPaletteProps {
5
+ /** An ID for the root element */
6
+ id?: string;
7
+ /** Classes for the root element */
8
+ class?: ClassValue;
9
+ /** Styles for the root element */
10
+ style?: StyleValue;
11
+ /** Whether the palette is visible */
12
+ visible: Bindable<boolean | undefined>;
13
+ /** The commands that the user can choose from */
14
+ commands: Command[];
15
+ /** Text to display in the input when it is empty */
16
+ placeholder?: string;
17
+ /**
18
+ * A keyboard shortcut that toggles the palette, e.g. "mod+k", where "mod"
19
+ * means the Cmd key on Mac and the Ctrl key elsewhere
20
+ */
21
+ hotkey?: string;
22
+ /** An accessible name for the input */
23
+ ariaLabel?: string;
24
+ /** Text to display when no commands match the search */
25
+ emptyText?: string;
26
+ /** Raised when a command has been run */
27
+ onrun?: (command: Command) => void;
28
+ }
29
+
30
+ /**
31
+ * A modal input for searching and running commands, opened with a keyboard
32
+ * shortcut or programmatically.
33
+ *
34
+ * The structure of a CommandPalette is a Modal containing a search input and
35
+ * a filtered list of commands.
36
+ */
37
+ declare function CommandPalette(
38
+ $parent: ParentNode,
39
+ $anchor: Node | null,
40
+ $props: CommandPaletteProps | undefined,
41
+ $context?: Record<PropertyKey, any>,
42
+ $slots?: Record<string, SlotRender>,
43
+ ): void;
44
+
45
+ export { CommandPalette };
@@ -0,0 +1,2 @@
1
+ import CommandPalette from "./CommandPalette.torp";
2
+ export { CommandPalette };
@@ -1,29 +1,32 @@
1
- import type { ClassValue, StyleValue } from "@torpor/view";
2
- import { ContextualContextName, type Point, type ContextualContext, type ContextualState } from "./ContextualTypes";
1
+ import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
2
+ import $handle from "../utils/$handle";
3
+ import { type PopoutContext, PopoutContextName } from "../utils/PopoutTypes";
4
+ import {
5
+ type ContextualContext,
6
+ ContextualContextName,
7
+ type ContextualState,
8
+ type Point,
9
+ } from "./ContextualTypes";
3
10
 
4
11
  interface ContextualProps {
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
  /** Whether the contextual is modal. If true, an overlay should be supplied to obscure outside content, and only the context content will be visible to screen readers */
12
- modal?: boolean,
19
+ modal?: boolean;
13
20
  /** Whether the contextual is visible */
14
- visible?: boolean,
21
+ visible: Bindable<boolean | undefined>;
15
22
  /** The element to anchor this contextual to, as an alternative to supplying a ContextualTrigger */
16
- anchor?: HTMLElement,
23
+ anchor?: HTMLElement;
17
24
  /** The position to display this contextual at */
18
- position?: Point,
19
- /** A function to be called when the user selects a response */
20
- callback?: ((value: any) => void),
21
- /** Raised when this contextual is opened or closed */
22
- ontoggle?: (open: boolean) => void,
25
+ position?: Point;
23
26
  /** Raised when the contextual has opened */
24
- onopen?: () => void,
27
+ onopen?: () => void;
25
28
  /** Raised when the contextual has closed */
26
- onclose?: (result: any) => void,
29
+ onclose?: (result: any) => void;
27
30
  }
28
31
 
29
32
  /**
@@ -41,19 +44,16 @@ interface ContextualProps {
41
44
  export default function Contextual($props: ContextualProps | undefined) {
42
45
  let $state: ContextualState = $watch({
43
46
  visible: false,
44
- position: { x: 0, y: 0 }
45
- })
47
+ position: { x: 0, y: 0 },
48
+ contentId: undefined,
49
+ triggerId: undefined,
50
+ contentRole: undefined,
51
+ });
46
52
 
47
- // Sync props and state
53
+ $bind($state, $props, "visible");
48
54
  $run(() => {
49
- $state.visible = $props?.visible ?? false;
50
55
  $state.position = $props?.position ?? { x: 0, y: 0 };
51
56
  });
52
- $run(() => {
53
- if ($props !== undefined) {
54
- $props.visible = $state.visible;
55
- }
56
- });
57
57
 
58
58
  let result: any;
59
59
 
@@ -62,27 +62,23 @@ export default function Contextual($props: ContextualProps | undefined) {
62
62
  handleButton,
63
63
  handleClickOutside,
64
64
  state: $state,
65
- modal: $props?.modal,
65
+ //modal: $props?.modal,
66
66
  anchorElement: $props?.anchor ? $unwrap($props.anchor) : undefined,
67
67
  };
68
68
  $context[ContextualContextName] = context;
69
69
 
70
- // Dispatch the toggle event when the contextual is opened or closed
71
- let firstToggle = true;
72
- $run(() => {
73
- const ontoggle = $props?.ontoggle;
74
- const onopen = $props?.onopen;
75
- const onclose = $props?.onclose;
70
+ // Set the context to pass down to items
71
+ let popoutContext: PopoutContext = context;
72
+ $context[PopoutContextName] = popoutContext;
73
+
74
+ // Dispatch the open/close events when the contextual is opened or closed
75
+ $handle((first) => {
76
76
  const visible = $state.visible;
77
- if (firstToggle) {
78
- firstToggle = false;
77
+ if (first) return;
78
+ if (visible) {
79
+ $props?.onopen?.();
79
80
  } else {
80
- if (ontoggle) ontoggle(visible);
81
- if (visible) {
82
- if (onopen) onopen()
83
- } else {
84
- if (onclose) onclose(result);
85
- }
81
+ $props?.onclose?.(result);
86
82
  }
87
83
  });
88
84
 
@@ -90,11 +86,11 @@ export default function Contextual($props: ContextualProps | undefined) {
90
86
  // Get the button's result
91
87
  switch (type) {
92
88
  case "confirm": {
93
- result = value || true;
89
+ result = value ?? true;
94
90
  break;
95
91
  }
96
92
  case "cancel": {
97
- result = value || false;
93
+ result = value ?? false;
98
94
  break;
99
95
  }
100
96
  default: {
@@ -105,25 +101,16 @@ export default function Contextual($props: ContextualProps | undefined) {
105
101
 
106
102
  // Hide the contextual
107
103
  $state.visible = false;
108
-
109
- // Call the callback
110
- if ($props?.callback) {
111
- $props.callback(result);
112
- }
113
104
  }
114
105
 
115
- function handleClickOutside(e: MouseEvent) {
106
+ function handleClickOutside(e: MouseEvent | KeyboardEvent) {
116
107
  e.preventDefault();
117
108
  $state.visible = false;
118
109
  }
119
110
 
120
111
  @render {
121
- <div
122
- {$props?.id}
123
- class={["torp-context", $props?.class]}
124
- {$props?.style}
125
- >
112
+ <div {$props?.id} class={["torp-context", $props?.class]} {$props?.style}>
126
113
  <slot />
127
114
  </div>
128
115
  }
129
- }
116
+ }