@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.
- package/README.md +83 -7
- package/dist/Accordion/Accordion.torp +42 -165
- package/dist/Accordion/AccordionContent.torp +6 -6
- package/dist/Accordion/AccordionHeader.torp +7 -11
- package/dist/Accordion/AccordionItem.torp +24 -24
- package/dist/Accordion/AccordionTrigger.torp +17 -8
- package/dist/Accordion/AccordionTypes.ts +1 -1
- package/dist/Accordion/index.d.ts +23 -25
- package/dist/Accordion/index.js +6 -22
- package/dist/Breadcrumb/Breadcrumb.torp +12 -10
- package/dist/Breadcrumb/BreadcrumbItem.torp +6 -6
- package/dist/Breadcrumb/BreadcrumbList.torp +21 -0
- package/dist/Breadcrumb/BreadcrumbSeparator.torp +4 -4
- package/dist/Breadcrumb/index.d.ts +39 -15
- package/dist/Breadcrumb/index.js +5 -14
- package/dist/Calendar/Calendar.torp +163 -156
- package/dist/Calendar/CalendarDay.torp +91 -45
- package/dist/Calendar/CalendarDayHeader.torp +36 -0
- package/dist/Calendar/CalendarGrid.torp +104 -0
- package/dist/Calendar/CalendarGridHeader.torp +43 -0
- package/dist/Calendar/CalendarHeader.torp +48 -0
- package/dist/Calendar/CalendarHeaderTrigger.torp +54 -0
- package/dist/Calendar/CalendarTypes.ts +24 -3
- package/dist/Calendar/buildDays.ts +54 -0
- package/dist/Calendar/index.d.ts +191 -5
- package/dist/Calendar/index.js +8 -10
- package/dist/Carousel/Carousel.torp +180 -0
- package/dist/Carousel/CarouselIndicators.torp +65 -0
- package/dist/Carousel/CarouselNext.torp +43 -0
- package/dist/Carousel/CarouselPrevious.torp +44 -0
- package/dist/Carousel/CarouselSlide.torp +57 -0
- package/dist/Carousel/CarouselTypes.ts +28 -0
- package/dist/Carousel/index.d.ts +147 -0
- package/dist/Carousel/index.js +6 -0
- package/dist/Charts/BarChart.torp +55 -144
- package/dist/Charts/Chart.torp +120 -0
- package/dist/Charts/ChartBars.torp +78 -0
- package/dist/Charts/ChartColumns.torp +66 -0
- package/dist/Charts/ChartGrid.torp +54 -0
- package/dist/Charts/ChartLines.torp +60 -0
- package/dist/Charts/ChartTypes.ts +25 -0
- package/dist/Charts/ChartXAxis.torp +85 -0
- package/dist/Charts/ChartYAxis.torp +107 -0
- package/dist/Charts/ColumnChart.torp +70 -0
- package/dist/Charts/GridLines.torp +4 -4
- package/dist/Charts/LineChart.torp +55 -178
- package/dist/Charts/PieChart.torp +14 -20
- package/dist/Charts/ScatterChart.torp +45 -38
- package/dist/Charts/SparkLine.torp +16 -19
- package/dist/Charts/XAxis.torp +14 -11
- package/dist/Charts/YAxis.torp +10 -8
- package/dist/Charts/index.d.ts +328 -79
- package/dist/Charts/index.js +17 -34
- package/dist/ColorPicker/ColorPalette.torp +154 -0
- package/dist/ColorPicker/ColorPicker.torp +157 -0
- package/dist/ColorPicker/index.d.ts +85 -0
- package/dist/ColorPicker/index.js +3 -0
- package/dist/ComboBox/ComboBox.torp +205 -0
- package/dist/ComboBox/ComboBoxContent.torp +120 -0
- package/dist/ComboBox/ComboBoxInput.torp +161 -0
- package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
- package/dist/ComboBox/ComboBoxTypes.ts +39 -0
- package/dist/ComboBox/index.d.ts +154 -0
- package/dist/ComboBox/index.js +6 -0
- package/dist/CommandPalette/CommandPalette.torp +223 -0
- package/dist/CommandPalette/CommandTypes.ts +14 -0
- package/dist/CommandPalette/index.d.ts +45 -0
- package/dist/CommandPalette/index.js +2 -0
- package/dist/Contextual/Contextual.torp +32 -50
- package/dist/Contextual/ContextualContent.torp +29 -73
- package/dist/Contextual/ContextualHover.torp +112 -0
- package/dist/Contextual/ContextualTrigger.torp +31 -42
- package/dist/Contextual/ContextualTypes.ts +4 -17
- package/dist/Contextual/index.d.ts +44 -27
- package/dist/Contextual/index.js +5 -14
- package/dist/DataGrid/DataGrid.torp +496 -0
- package/dist/DataGrid/DataGridTypes.ts +25 -0
- package/dist/DataGrid/index.d.ts +90 -0
- package/dist/DataGrid/index.js +3 -0
- package/dist/DataGrid/sortRows.ts +32 -0
- package/dist/DatePicker/DatePicker.torp +222 -0
- package/dist/DatePicker/DatePickerHeader.torp +20 -0
- package/dist/DatePicker/index.d.ts +55 -0
- package/dist/DatePicker/index.js +2 -0
- package/dist/DateRangePicker/DateRangePicker.torp +315 -0
- package/dist/DateRangePicker/DateRangePickerDay.torp +137 -0
- package/dist/DateRangePicker/DateRangePickerTypes.ts +21 -0
- package/dist/DateRangePicker/index.d.ts +76 -0
- package/dist/DateRangePicker/index.js +3 -0
- package/dist/Dialog/Dialog.torp +24 -17
- package/dist/Dialog/DialogBody.torp +5 -9
- package/dist/Dialog/DialogButton.torp +12 -12
- package/dist/Dialog/DialogFooter.torp +3 -7
- package/dist/Dialog/DialogHeader.torp +6 -10
- package/dist/Dialog/index.d.ts +27 -27
- package/dist/Dialog/index.js +6 -22
- package/dist/Disclosure/Disclosure.torp +18 -18
- package/dist/Disclosure/DisclosureContent.torp +5 -6
- package/dist/Disclosure/DisclosureHeader.torp +7 -11
- package/dist/Disclosure/DisclosureTrigger.torp +4 -5
- package/dist/Disclosure/index.d.ts +14 -16
- package/dist/Disclosure/index.js +5 -18
- package/dist/Drawer/Drawer.torp +19 -49
- package/dist/Drawer/DrawerContent.torp +70 -13
- package/dist/Drawer/DrawerOverlay.torp +4 -4
- package/dist/Drawer/DrawerTrigger.torp +16 -4
- package/dist/Drawer/DrawerTypes.ts +3 -0
- package/dist/Drawer/index.d.ts +16 -20
- package/dist/Drawer/index.js +5 -18
- package/dist/FocusGroup/FocusGroup.torp +70 -0
- package/dist/FocusGroup/FocusGroupButton.torp +59 -0
- package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
- package/dist/FocusGroup/index.d.ts +44 -0
- package/dist/FocusGroup/index.js +3 -0
- package/dist/Form/CheckBox.torp +27 -18
- package/dist/Form/Field.torp +17 -17
- package/dist/Form/File.torp +31 -22
- package/dist/Form/FileDrop.torp +187 -0
- package/dist/Form/Form.torp +24 -22
- package/dist/Form/FormTypes.ts +2 -0
- package/dist/Form/FormValues.torp +37 -0
- package/dist/Form/Hidden.torp +4 -12
- package/dist/Form/Input.torp +38 -32
- package/dist/Form/Label.torp +3 -3
- package/dist/Form/Message.torp +13 -5
- package/dist/Form/MessageSummary.torp +5 -4
- package/dist/Form/Option.torp +11 -7
- package/dist/Form/Select.torp +32 -28
- package/dist/Form/TextArea.torp +35 -31
- package/dist/Form/Toggle.torp +109 -0
- package/dist/Form/index.d.ts +178 -79
- package/dist/Form/index.js +16 -50
- package/dist/ListBox/ListBox.torp +253 -150
- package/dist/ListBox/ListBoxItem.torp +54 -30
- package/dist/ListBox/ListBoxSeparator.torp +5 -2
- package/dist/ListBox/ListBoxTypes.ts +23 -5
- package/dist/ListBox/LoadedListBoxItems.torp +41 -0
- package/dist/ListBox/index.d.ts +56 -17
- package/dist/ListBox/index.js +4 -14
- package/dist/MaskedInput/MaskedInput.torp +143 -0
- package/dist/MaskedInput/index.d.ts +52 -0
- package/dist/MaskedInput/index.js +2 -0
- package/dist/Menu/Menu.torp +86 -71
- package/dist/Menu/MenuButton.torp +17 -10
- package/dist/Menu/MenuCheck.torp +22 -18
- package/dist/Menu/MenuGroup.torp +4 -4
- package/dist/Menu/MenuIndicator.torp +5 -13
- package/dist/Menu/MenuPopout.torp +20 -50
- package/dist/Menu/MenuPopoutContent.torp +15 -66
- package/dist/Menu/MenuPopoutTrigger.torp +19 -100
- package/dist/Menu/MenuRadio.torp +25 -26
- package/dist/Menu/MenuRadioGroup.torp +25 -68
- package/dist/Menu/MenuSeparator.torp +3 -2
- package/dist/Menu/MenuTypes.ts +9 -19
- package/dist/Menu/index.d.ts +45 -51
- package/dist/Menu/index.js +12 -46
- package/dist/MenuBar/MenuBar.torp +31 -83
- package/dist/MenuBar/MenuBarItem.torp +33 -51
- package/dist/MenuBar/MenuBarItemContent.torp +15 -101
- package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
- package/dist/MenuBar/MenuBarTypes.ts +11 -10
- package/dist/MenuBar/index.d.ts +17 -19
- package/dist/MenuBar/index.js +5 -18
- package/dist/Modal/Modal.torp +22 -47
- package/dist/Modal/ModalContent.torp +21 -44
- package/dist/Modal/ModalOverlay.torp +4 -4
- package/dist/Modal/ModalTrigger.torp +16 -32
- package/dist/Modal/ModalTypes.ts +5 -16
- package/dist/Modal/index.d.ts +17 -29
- package/dist/Modal/index.js +29 -28
- package/dist/Modal/index.js.map +1 -1
- package/dist/Modal/showPrompt.ts +2 -2
- package/dist/NavMenu/NavMenu.torp +22 -111
- package/dist/NavMenu/NavMenuButton.torp +7 -8
- package/dist/NavMenu/NavMenuElement.torp +6 -7
- package/dist/NavMenu/NavMenuGroup.torp +5 -5
- package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
- package/dist/NavMenu/NavMenuLink.torp +7 -10
- package/dist/NavMenu/NavMenuPopout.torp +15 -60
- package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
- package/dist/NavMenu/NavMenuPopoutTrigger.torp +17 -99
- package/dist/NavMenu/NavMenuSeparator.torp +3 -7
- package/dist/NavMenu/NavMenuTypes.ts +4 -14
- package/dist/NavMenu/index.d.ts +40 -44
- package/dist/NavMenu/index.js +11 -42
- package/dist/Notification/Notification.torp +12 -24
- package/dist/Notification/NotificationClose.torp +6 -3
- package/dist/Notification/NotificationContainer.torp +3 -7
- package/dist/Notification/NotificationContent.torp +3 -7
- package/dist/Notification/NotificationTypes.ts +1 -1
- package/dist/Notification/index.d.ts +15 -12
- package/dist/Notification/index.js +22 -32
- package/dist/Notification/index.js.map +1 -1
- package/dist/NumberInput/NumberInput.torp +255 -0
- package/dist/NumberInput/index.d.ts +44 -0
- package/dist/NumberInput/index.js +2 -0
- package/dist/Pagination/Pagination.torp +41 -34
- package/dist/Pagination/PaginationItem.torp +50 -13
- package/dist/Pagination/PaginationTypes.ts +3 -6
- package/dist/Pagination/buildPages.ts +9 -5
- package/dist/Pagination/index.d.ts +19 -9
- package/dist/Pagination/index.js +3 -40
- package/dist/Popover/Popover.torp +32 -50
- package/dist/Popover/PopoverContent.torp +27 -76
- package/dist/Popover/PopoverHover.torp +90 -0
- package/dist/Popover/PopoverTrigger.torp +17 -40
- package/dist/Popover/PopoverTypes.ts +4 -17
- package/dist/Popover/index.d.ts +40 -25
- package/dist/Popover/index.js +18 -18
- package/dist/Popover/index.js.map +1 -1
- package/dist/Progress/Progress.torp +88 -0
- package/dist/Progress/index.d.ts +37 -0
- package/dist/Progress/index.js +2 -0
- package/dist/Rating/Rating.torp +225 -0
- package/dist/Rating/index.d.ts +44 -0
- package/dist/Rating/index.js +2 -0
- package/dist/SegmentedControl/SegmentedControl.torp +233 -0
- package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
- package/dist/SegmentedControl/SegmentedItem.torp +78 -0
- package/dist/SegmentedControl/index.d.ts +74 -0
- package/dist/SegmentedControl/index.js +3 -0
- package/dist/SelectBox/SelectBox.torp +107 -53
- package/dist/SelectBox/SelectBoxContent.torp +49 -19
- package/dist/SelectBox/SelectBoxTrigger.torp +108 -8
- package/dist/SelectBox/SelectBoxTypes.ts +26 -11
- package/dist/SelectBox/index.d.ts +39 -54
- package/dist/SelectBox/index.js +5 -18
- package/dist/Slider/Slider.torp +245 -0
- package/dist/Slider/index.d.ts +45 -0
- package/dist/Slider/index.js +2 -0
- package/dist/Splitter/Splitter.torp +156 -0
- package/dist/Splitter/SplitterHandle.torp +161 -0
- package/dist/Splitter/SplitterPane.torp +63 -0
- package/dist/Splitter/SplitterTypes.ts +31 -0
- package/dist/Splitter/index.d.ts +103 -0
- package/dist/Splitter/index.js +4 -0
- package/dist/Stepper/Stepper.torp +146 -0
- package/dist/Stepper/StepperMarker.torp +24 -0
- package/dist/Stepper/StepperNext.torp +44 -0
- package/dist/Stepper/StepperPrevious.torp +44 -0
- package/dist/Stepper/StepperStep.torp +90 -0
- package/dist/Stepper/StepperTypes.ts +30 -0
- package/dist/Stepper/index.d.ts +149 -0
- package/dist/Stepper/index.js +6 -0
- package/dist/TabGroup/TabContent.torp +6 -6
- package/dist/TabGroup/TabGroup.torp +97 -113
- package/dist/TabGroup/TabGroupTypes.ts +1 -1
- package/dist/TabGroup/TabHeader.torp +23 -19
- package/dist/TabGroup/TabList.torp +8 -21
- package/dist/TabGroup/TabTrigger.torp +6 -7
- package/dist/TabGroup/index.d.ts +26 -26
- package/dist/TabGroup/index.js +6 -22
- package/dist/TagInput/TagInput.torp +378 -0
- package/dist/TagInput/index.d.ts +48 -0
- package/dist/TagInput/index.js +2 -0
- package/dist/TimePicker/TimePicker.torp +462 -0
- package/dist/TimePicker/index.d.ts +53 -0
- package/dist/TimePicker/index.js +2 -0
- package/dist/ToolBar/ToolBar.torp +29 -110
- package/dist/ToolBar/ToolBarButton.torp +7 -8
- package/dist/ToolBar/ToolBarElement.torp +7 -11
- package/dist/ToolBar/ToolBarPopout.torp +16 -68
- package/dist/ToolBar/ToolBarPopoutContent.torp +15 -73
- package/dist/ToolBar/ToolBarPopoutTrigger.torp +19 -110
- package/dist/ToolBar/ToolBarSeparator.torp +3 -7
- package/dist/ToolBar/ToolBarTypes.ts +7 -14
- package/dist/ToolBar/index.d.ts +30 -32
- package/dist/ToolBar/index.js +8 -30
- package/dist/Tree/Tree.torp +395 -0
- package/dist/Tree/TreeItem.torp +176 -0
- package/dist/Tree/TreeItemChildren.torp +60 -0
- package/dist/Tree/TreeItemContent.torp +46 -0
- package/dist/Tree/TreeItemLabel.torp +94 -0
- package/dist/Tree/TreeItemTrigger.torp +78 -0
- package/dist/Tree/TreeLoadedChildren.torp +122 -0
- package/dist/Tree/TreeTypes.ts +63 -0
- package/dist/Tree/index.d.ts +262 -0
- package/dist/Tree/index.js +7 -0
- package/dist/icons/ChevronDoubleLeft.torp +19 -0
- package/dist/icons/ChevronDoubleRight.torp +19 -0
- package/dist/icons/index.d.ts +61 -1
- package/dist/icons/index.js +17 -58
- package/dist/loader-DEeG5vFY.js +44 -0
- package/dist/loader-DEeG5vFY.js.map +1 -0
- package/dist/motion/index.d.ts +12 -8
- package/dist/motion/index.d.ts.map +1 -0
- package/dist/motion/index.js +70 -88
- package/dist/motion/index.js.map +1 -1
- package/dist/mount/draggable.ts +63 -0
- package/dist/mount/dropTarget.ts +108 -0
- package/dist/mount/hoverTrigger.ts +1 -1
- package/dist/utils/$handle.ts +23 -0
- package/dist/utils/LoadedItems.torp +47 -0
- package/dist/utils/PopoutClickTrigger.torp +99 -0
- package/dist/utils/PopoutTypes.ts +59 -12
- package/dist/utils/SubmenuPopout.torp +89 -0
- package/dist/utils/SubmenuPopoutContent.torp +87 -0
- package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
- package/dist/utils/chartColors.ts +13 -13
- package/dist/utils/chartLayout.ts +143 -0
- package/dist/utils/colorUtils.ts +103 -0
- package/dist/utils/createItemGroup.ts +152 -0
- package/dist/utils/dateUtils.ts +8 -7
- package/dist/utils/documentEvents.ts +4 -4
- package/dist/utils/dragState.ts +86 -0
- package/dist/utils/focusGroup.ts +204 -0
- package/dist/utils/focusItem.ts +44 -0
- package/dist/utils/formField.ts +70 -0
- package/dist/utils/hoverOpen.ts +50 -0
- package/dist/utils/hoverReveal.ts +194 -0
- package/dist/utils/loader.ts +113 -0
- package/dist/utils/maskUtils.ts +98 -0
- package/dist/utils/popoutContent.ts +137 -0
- package/dist/utils/reorderList.ts +52 -0
- package/package.json +97 -22
- package/dist/Accordion/index.js.map +0 -1
- package/dist/Breadcrumb/index.js.map +0 -1
- package/dist/Calendar/index.js.map +0 -1
- package/dist/Charts/index.js.map +0 -1
- package/dist/Contextual/index.js.map +0 -1
- package/dist/Dialog/index.js.map +0 -1
- package/dist/Disclosure/index.js.map +0 -1
- package/dist/Drawer/index.js.map +0 -1
- package/dist/Form/index.js.map +0 -1
- package/dist/ListBox/index.js.map +0 -1
- package/dist/Menu/index.js.map +0 -1
- package/dist/MenuBar/index.js.map +0 -1
- package/dist/NavMenu/index.js.map +0 -1
- package/dist/Pagination/index.js.map +0 -1
- package/dist/SelectBox/SelectBoxInput.torp +0 -95
- package/dist/SelectBox/index.js.map +0 -1
- package/dist/TabGroup/index.js.map +0 -1
- package/dist/ToolBar/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/index.d.ts +0 -19
- package/dist/metafile-esm.json +0 -1
- package/dist/motion/fade.ts +0 -16
- package/dist/motion/grow.ts +0 -23
- package/dist/motion/measure.ts +0 -28
- package/dist/motion/slide.ts +0 -45
- package/dist/mount/index.d.ts +0 -2
- package/dist/utils/index.d.ts +0 -2
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import { type SplitterContext, SplitterContextName } from "./SplitterTypes";
|
|
3
|
+
|
|
4
|
+
interface SplitterHandleProps {
|
|
5
|
+
/** An ID for the root element */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Classes for the root element */
|
|
8
|
+
class?: ClassValue;
|
|
9
|
+
/** Styles for the root element */
|
|
10
|
+
style?: StyleValue;
|
|
11
|
+
/** An accessible name for the separator */
|
|
12
|
+
ariaLabel?: string;
|
|
13
|
+
/** If set to true, the user cannot interact with this handle */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The separator in a Splitter that a user can drag, or move with the
|
|
19
|
+
* keyboard, to resize the panes on either side of it.
|
|
20
|
+
*
|
|
21
|
+
* See [the WAI ARIA guidelines for Window Splitters](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/).
|
|
22
|
+
*/
|
|
23
|
+
export default function SplitterHandle($props: SplitterHandleProps | undefined) {
|
|
24
|
+
// Get stuff out of the Splitter context
|
|
25
|
+
const context = $context[SplitterContextName] as SplitterContext;
|
|
26
|
+
if (!context) {
|
|
27
|
+
throw new Error("SplitterHandle must be contained within a Splitter");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function getDisabled(): boolean {
|
|
31
|
+
return $props?.disabled === true || context.getDisabled();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let dragging = false;
|
|
35
|
+
|
|
36
|
+
function removeDragListeners() {
|
|
37
|
+
removeEventListener("mousemove", handleMouseMove);
|
|
38
|
+
removeEventListener("mouseup", handleMouseUp);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Convert a pointer position into a percentage of the container
|
|
42
|
+
function valueFromPointer(e: { clientX: number; clientY: number }): number {
|
|
43
|
+
const container = context.getContainer();
|
|
44
|
+
if (!container) return context.getValue();
|
|
45
|
+
const rect = container.getBoundingClientRect();
|
|
46
|
+
const horizontal = context.getOrientation() === "horizontal";
|
|
47
|
+
const pos = horizontal ? e.clientX - rect.left : e.clientY - rect.top;
|
|
48
|
+
const size = horizontal ? rect.width : rect.height;
|
|
49
|
+
if (!(size > 0)) return context.getValue();
|
|
50
|
+
const ratio = Math.min(1, Math.max(0, pos / size));
|
|
51
|
+
return ratio * 100;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function handleMouseDown(e: MouseEvent) {
|
|
55
|
+
if (getDisabled()) return;
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
dragging = true;
|
|
58
|
+
context.setValue(valueFromPointer(e));
|
|
59
|
+
addEventListener("mousemove", handleMouseMove);
|
|
60
|
+
addEventListener("mouseup", handleMouseUp);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function handleMouseMove(e: MouseEvent) {
|
|
64
|
+
if (!dragging || getDisabled()) return;
|
|
65
|
+
context.setValue(valueFromPointer(e));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function handleMouseUp() {
|
|
69
|
+
if (!dragging) return;
|
|
70
|
+
dragging = false;
|
|
71
|
+
removeDragListeners();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Stop listening if the handle is unmounted mid-drag
|
|
75
|
+
$onmount(() => {
|
|
76
|
+
return () => removeDragListeners();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
function handleKey(e: KeyboardEvent) {
|
|
80
|
+
if (getDisabled()) return;
|
|
81
|
+
const step = context.getStep();
|
|
82
|
+
const vertical = context.getOrientation() === "vertical";
|
|
83
|
+
|
|
84
|
+
switch (e.key) {
|
|
85
|
+
case "ArrowRight": {
|
|
86
|
+
if (!vertical) {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
context.setValue(context.getValue() + step);
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case "ArrowLeft": {
|
|
93
|
+
if (!vertical) {
|
|
94
|
+
e.preventDefault();
|
|
95
|
+
context.setValue(context.getValue() - step);
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "ArrowUp": {
|
|
100
|
+
if (vertical) {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
context.setValue(context.getValue() + step);
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case "ArrowDown": {
|
|
107
|
+
if (vertical) {
|
|
108
|
+
e.preventDefault();
|
|
109
|
+
context.setValue(context.getValue() - step);
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case "PageUp": {
|
|
114
|
+
e.preventDefault();
|
|
115
|
+
context.setValue(context.getValue() + step * 10);
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
case "PageDown": {
|
|
119
|
+
e.preventDefault();
|
|
120
|
+
context.setValue(context.getValue() - step * 10);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case "Home": {
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
context.setValue(context.getMin());
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "End": {
|
|
129
|
+
e.preventDefault();
|
|
130
|
+
context.setValue(context.getMax());
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@render {
|
|
137
|
+
<div
|
|
138
|
+
{$props?.id}
|
|
139
|
+
class={["torp-splitter-handle", $props?.class]}
|
|
140
|
+
{$props?.style}
|
|
141
|
+
role="separator"
|
|
142
|
+
tabindex={getDisabled() ? -1 : 0}
|
|
143
|
+
aria-label={$props?.ariaLabel ?? "Resize"}
|
|
144
|
+
aria-orientation={context.getOrientation()}
|
|
145
|
+
aria-valuemin={Math.round(context.getMin())}
|
|
146
|
+
aria-valuemax={Math.round(context.getMax())}
|
|
147
|
+
aria-valuenow={Math.round(context.getValue())}
|
|
148
|
+
aria-disabled={getDisabled() ? "true" : undefined}
|
|
149
|
+
onmousedown={handleMouseDown}
|
|
150
|
+
onkeydown={handleKey}
|
|
151
|
+
/>
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@style {
|
|
155
|
+
/* Headless: behavior only, so the handle can be dragged on touch
|
|
156
|
+
devices. All appearance is up to the consuming theme */
|
|
157
|
+
.torp-splitter-handle {
|
|
158
|
+
touch-action: none;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import { type SplitterContext, SplitterContextName } from "./SplitterTypes";
|
|
3
|
+
|
|
4
|
+
interface SplitterPaneProps {
|
|
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
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A pane in a Splitter. When there is more than one pane, the first pane is
|
|
15
|
+
* sized to the splitter's value and the others share what's left.
|
|
16
|
+
*/
|
|
17
|
+
export default function SplitterPane($props: SplitterPaneProps | undefined) {
|
|
18
|
+
// Get stuff out of the Splitter context
|
|
19
|
+
const context = $context[SplitterContextName] as SplitterContext;
|
|
20
|
+
if (!context) {
|
|
21
|
+
throw new Error("SplitterPane must be contained within a Splitter");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Register this pane with the parent Splitter
|
|
25
|
+
let $state = context.registerPane();
|
|
26
|
+
|
|
27
|
+
$run(() => {
|
|
28
|
+
return () => {
|
|
29
|
+
context.removePane($state.index);
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// The primary (first) pane is sized to the value when there are other
|
|
34
|
+
// panes to share the rest of the space with
|
|
35
|
+
function getFlex(): string {
|
|
36
|
+
if ($state.index === 0 && context.count() > 1) {
|
|
37
|
+
return `0 0 ${context.getValue()}%;`;
|
|
38
|
+
}
|
|
39
|
+
return "1 1 0;";
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@render {
|
|
43
|
+
<div
|
|
44
|
+
{$props?.id}
|
|
45
|
+
class={["torp-splitter-pane", $props?.class]}
|
|
46
|
+
{$props?.style}
|
|
47
|
+
data-orientation={context.getOrientation()}
|
|
48
|
+
style={`flex: ${getFlex()}`}
|
|
49
|
+
>
|
|
50
|
+
<slot />
|
|
51
|
+
</div>
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@style {
|
|
55
|
+
/* Headless: min sizes only, so the panes can shrink below their
|
|
56
|
+
content. All other appearance is up to the consuming theme */
|
|
57
|
+
.torp-splitter-pane {
|
|
58
|
+
min-height: 0;
|
|
59
|
+
min-width: 0;
|
|
60
|
+
overflow: hidden;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const SplitterContextName: unique symbol = Symbol.for("torp.Splitter");
|
|
2
|
+
|
|
3
|
+
export interface SplitterPaneState {
|
|
4
|
+
/** The index of the pane */
|
|
5
|
+
index: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface SplitterContext {
|
|
9
|
+
/** Called from a pane when it is added */
|
|
10
|
+
registerPane: () => SplitterPaneState;
|
|
11
|
+
/** Called from a pane when it is removed */
|
|
12
|
+
removePane: (index: number) => void;
|
|
13
|
+
/** The orientation of the splitter */
|
|
14
|
+
getOrientation: () => "horizontal" | "vertical";
|
|
15
|
+
/** The clamped percentage of the container taken up by the primary pane */
|
|
16
|
+
getValue: () => number;
|
|
17
|
+
/** The minimum percentage for the primary pane */
|
|
18
|
+
getMin: () => number;
|
|
19
|
+
/** The maximum percentage for the primary pane */
|
|
20
|
+
getMax: () => number;
|
|
21
|
+
/** The amount by which keyboard interaction changes the value */
|
|
22
|
+
getStep: () => number;
|
|
23
|
+
/** Whether the user cannot interact with the splitter */
|
|
24
|
+
getDisabled: () => boolean;
|
|
25
|
+
/** Sets the value, clamped to the min and max */
|
|
26
|
+
setValue: (value: number) => void;
|
|
27
|
+
/** The number of registered panes */
|
|
28
|
+
count: () => number;
|
|
29
|
+
/** The splitter's root element, used to convert pointer positions into values */
|
|
30
|
+
getContainer: () => HTMLElement | undefined;
|
|
31
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { type SlotRender } from "@torpor/view";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
interface SplitterProps {
|
|
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 orientation of the splitter (default horizontal) */
|
|
12
|
+
orientation?: "horizontal" | "vertical";
|
|
13
|
+
/** The percentage of the container taken up by the primary (first) pane */
|
|
14
|
+
value?: Bindable<number>;
|
|
15
|
+
/** The minimum percentage for the primary pane (default 0) */
|
|
16
|
+
min?: number;
|
|
17
|
+
/** The maximum percentage for the primary pane (default 100) */
|
|
18
|
+
max?: number;
|
|
19
|
+
/** The percentage by which keyboard interaction changes the value (default 1) */
|
|
20
|
+
step?: number;
|
|
21
|
+
/** If set to true, the user cannot interact with this splitter */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Raised when the value has changed */
|
|
24
|
+
onchange?: (value: number) => void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Two resizable panes with a separator between them, which the user can drag
|
|
29
|
+
* or move with the keyboard to resize the panes.
|
|
30
|
+
*
|
|
31
|
+
* See [the WAI ARIA guidelines for Window Splitters](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/).
|
|
32
|
+
*
|
|
33
|
+
* The structure of a Splitter is:
|
|
34
|
+
*
|
|
35
|
+
* ```
|
|
36
|
+
* <Splitter>
|
|
37
|
+
* <SplitterPane>...</SplitterPane>
|
|
38
|
+
* <SplitterHandle ariaLabel="Resize" />
|
|
39
|
+
* <SplitterPane>...</SplitterPane>
|
|
40
|
+
* </Splitter>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function Splitter(
|
|
44
|
+
$parent: ParentNode,
|
|
45
|
+
$anchor: Node | null,
|
|
46
|
+
$props: SplitterProps | undefined,
|
|
47
|
+
$context?: Record<PropertyKey, any>,
|
|
48
|
+
$slots?: Record<string, SlotRender>,
|
|
49
|
+
): void;
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
interface SplitterHandleProps {
|
|
54
|
+
/** An ID for the root element */
|
|
55
|
+
id?: string;
|
|
56
|
+
/** Classes for the root element */
|
|
57
|
+
class?: ClassValue;
|
|
58
|
+
/** Styles for the root element */
|
|
59
|
+
style?: StyleValue;
|
|
60
|
+
/** An accessible name for the separator */
|
|
61
|
+
ariaLabel?: string;
|
|
62
|
+
/** If set to true, the user cannot interact with this handle */
|
|
63
|
+
disabled?: boolean;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The separator in a Splitter that a user can drag, or move with the
|
|
68
|
+
* keyboard, to resize the panes on either side of it.
|
|
69
|
+
*
|
|
70
|
+
* See [the WAI ARIA guidelines for Window Splitters](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/).
|
|
71
|
+
*/
|
|
72
|
+
declare function SplitterHandle(
|
|
73
|
+
$parent: ParentNode,
|
|
74
|
+
$anchor: Node | null,
|
|
75
|
+
$props: SplitterHandleProps | undefined,
|
|
76
|
+
$context?: Record<PropertyKey, any>,
|
|
77
|
+
$slots?: Record<string, SlotRender>,
|
|
78
|
+
): void;
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
interface SplitterPaneProps {
|
|
83
|
+
/** An ID for the root element */
|
|
84
|
+
id?: string;
|
|
85
|
+
/** Classes for the root element */
|
|
86
|
+
class?: ClassValue;
|
|
87
|
+
/** Styles for the root element */
|
|
88
|
+
style?: StyleValue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* A pane in a Splitter. When there is more than one pane, the first pane is
|
|
93
|
+
* sized to the splitter's value and the others share what's left.
|
|
94
|
+
*/
|
|
95
|
+
declare function SplitterPane(
|
|
96
|
+
$parent: ParentNode,
|
|
97
|
+
$anchor: Node | null,
|
|
98
|
+
$props: SplitterPaneProps | undefined,
|
|
99
|
+
$context?: Record<PropertyKey, any>,
|
|
100
|
+
$slots?: Record<string, SlotRender>,
|
|
101
|
+
): void;
|
|
102
|
+
|
|
103
|
+
export { Splitter, SplitterHandle, SplitterPane };
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { Bindable, ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import $handle from "../utils/$handle";
|
|
3
|
+
import { type StepperContext, StepperContextName } from "./StepperTypes";
|
|
4
|
+
|
|
5
|
+
interface StepperProps {
|
|
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
|
+
/** The index of the current step */
|
|
13
|
+
value?: Bindable<number>;
|
|
14
|
+
/** Whether steps can only be visited in order, with completed ones revisitable (default true) */
|
|
15
|
+
linear?: boolean;
|
|
16
|
+
/** An accessible label for the steps */
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
/** Raised when the current step has changed */
|
|
19
|
+
onchange?: (index: number) => void;
|
|
20
|
+
/** Raised when the user moves next from the last step */
|
|
21
|
+
oncomplete?: () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A sequence of steps in a task, showing progress through them. Steps before
|
|
26
|
+
* the current one are complete, and can be revisited; the user moves between
|
|
27
|
+
* steps with the navigation controls.
|
|
28
|
+
*
|
|
29
|
+
* The structure of a Stepper is:
|
|
30
|
+
*
|
|
31
|
+
* ```
|
|
32
|
+
* <Stepper ariaLabel="Sign up">
|
|
33
|
+
* <StepperStep label="Account" />
|
|
34
|
+
* <StepperStep label="Profile" />
|
|
35
|
+
* <fill name="nav">
|
|
36
|
+
* <StepperPrevious />
|
|
37
|
+
* <StepperNext />
|
|
38
|
+
* </fill>
|
|
39
|
+
* </Stepper>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export default function Stepper($props: StepperProps | undefined) {
|
|
43
|
+
let $state = $watch({
|
|
44
|
+
value: 0,
|
|
45
|
+
steps: [] as StepperStepStateLite[],
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
interface StepperStepStateLite {
|
|
49
|
+
index: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
$bind($state, $props, "value");
|
|
53
|
+
|
|
54
|
+
// Set the context to pass down to steps and navigation controls
|
|
55
|
+
const context: StepperContext = {
|
|
56
|
+
registerStep,
|
|
57
|
+
removeStep,
|
|
58
|
+
getValue,
|
|
59
|
+
setValue,
|
|
60
|
+
next,
|
|
61
|
+
previous,
|
|
62
|
+
canNext,
|
|
63
|
+
canPrevious,
|
|
64
|
+
steps: () => $state.steps,
|
|
65
|
+
count: () => $state.steps.length,
|
|
66
|
+
linear: $props?.linear !== false,
|
|
67
|
+
};
|
|
68
|
+
$context[StepperContextName] = context;
|
|
69
|
+
|
|
70
|
+
// Dispatch the change event when the current step changes
|
|
71
|
+
$handle((first) => {
|
|
72
|
+
const value = getValue();
|
|
73
|
+
if (!first) $props?.onchange?.(value);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// The clamped index of the current step
|
|
77
|
+
function getValue(): number {
|
|
78
|
+
const last = Math.max(0, $state.steps.length - 1);
|
|
79
|
+
return Math.min(last, Math.max(0, $state.value));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function canNext(): boolean {
|
|
83
|
+
return getValue() < $state.steps.length - 1;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function canPrevious(): boolean {
|
|
87
|
+
return getValue() > 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function setValue(index: number) {
|
|
91
|
+
const last = Math.max(0, $state.steps.length - 1);
|
|
92
|
+
$state.value = Math.min(last, Math.max(0, index));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function next() {
|
|
96
|
+
if (canNext()) {
|
|
97
|
+
setValue(getValue() + 1);
|
|
98
|
+
} else {
|
|
99
|
+
$props?.oncomplete?.();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function previous() {
|
|
104
|
+
if (canPrevious()) {
|
|
105
|
+
setValue(getValue() - 1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function registerStep(): StepperStepStateLite {
|
|
110
|
+
const state: StepperStepStateLite = $watch({ index: $state.steps.length });
|
|
111
|
+
$state.steps.push(state);
|
|
112
|
+
return state;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function removeStep(index: number) {
|
|
116
|
+
if (index >= 0 && index < $state.steps.length) {
|
|
117
|
+
$state.steps.splice(index, 1);
|
|
118
|
+
}
|
|
119
|
+
$state.steps.forEach((step, i) => (step.index = i));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@render {
|
|
123
|
+
<div {$props?.id} class={["torp-stepper", $props?.class]} {$props?.style}>
|
|
124
|
+
<ol class="torp-stepper-steps" aria-label={$props?.ariaLabel}>
|
|
125
|
+
<slot />
|
|
126
|
+
</ol>
|
|
127
|
+
<div class="torp-stepper-nav">
|
|
128
|
+
<slot name="nav" />
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@style {
|
|
134
|
+
/* Headless: layout only, so the steps and navigation sit in rows. All
|
|
135
|
+
appearance is up to the consuming theme */
|
|
136
|
+
.torp-stepper-steps {
|
|
137
|
+
display: flex;
|
|
138
|
+
list-style: none;
|
|
139
|
+
margin: 0;
|
|
140
|
+
padding: 0;
|
|
141
|
+
}
|
|
142
|
+
.torp-stepper-nav {
|
|
143
|
+
display: flex;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Check from "../icons/Check.torp";
|
|
2
|
+
|
|
3
|
+
interface StepperMarkerProps {
|
|
4
|
+
/** Whether the step this marker belongs to is complete */
|
|
5
|
+
complete: boolean;
|
|
6
|
+
/** The index of the step this marker belongs to */
|
|
7
|
+
index: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The marker for a Stepper step, which shows a check when the step is
|
|
12
|
+
* complete or its number otherwise.
|
|
13
|
+
*/
|
|
14
|
+
export default function StepperMarker($props: StepperMarkerProps) {
|
|
15
|
+
@render {
|
|
16
|
+
<span class="torp-stepper-marker" data-state={$props.complete ? "complete" : "incomplete"}>
|
|
17
|
+
@if ($props.complete) {
|
|
18
|
+
<Check />
|
|
19
|
+
} @else {
|
|
20
|
+
<span aria-hidden="true">{$props.index + 1}</span>
|
|
21
|
+
}
|
|
22
|
+
</span>
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import ChevronRight from "../icons/ChevronRight.torp";
|
|
3
|
+
import { type StepperContext, StepperContextName } from "./StepperTypes";
|
|
4
|
+
|
|
5
|
+
interface StepperNextProps {
|
|
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
|
+
/** An ARIA label for the button, for screen readers when the button contains no text */
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
/** If set to true, the user cannot interact with this button */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The button in a Stepper that a user can press to move to the next step,
|
|
20
|
+
* which raises the stepper's oncomplete event on the last step.
|
|
21
|
+
*/
|
|
22
|
+
export default function StepperNext($props: StepperNextProps | undefined) {
|
|
23
|
+
// Get stuff out of the Stepper context
|
|
24
|
+
const context = $context[StepperContextName] as StepperContext;
|
|
25
|
+
if (!context) {
|
|
26
|
+
throw new Error("StepperNext must be contained within a Stepper");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@render {
|
|
30
|
+
<button
|
|
31
|
+
{$props?.id}
|
|
32
|
+
class={["torp-stepper-next", $props?.class]}
|
|
33
|
+
{$props?.style}
|
|
34
|
+
type="button"
|
|
35
|
+
aria-label={$props?.ariaLabel ?? "Next step"}
|
|
36
|
+
disabled={$props?.disabled}
|
|
37
|
+
onclick={() => context.next()}
|
|
38
|
+
>
|
|
39
|
+
<slot>
|
|
40
|
+
<ChevronRight />
|
|
41
|
+
</slot>
|
|
42
|
+
</button>
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import ChevronLeft from "../icons/ChevronLeft.torp";
|
|
3
|
+
import { type StepperContext, StepperContextName } from "./StepperTypes";
|
|
4
|
+
|
|
5
|
+
interface StepperPreviousProps {
|
|
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
|
+
/** An ARIA label for the button, for screen readers when the button contains no text */
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
/** If set to true, the user cannot interact with this button */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The button in a Stepper that a user can press to move to the previous
|
|
20
|
+
* step.
|
|
21
|
+
*/
|
|
22
|
+
export default function StepperPrevious($props: StepperPreviousProps | undefined) {
|
|
23
|
+
// Get stuff out of the Stepper context
|
|
24
|
+
const context = $context[StepperContextName] as StepperContext;
|
|
25
|
+
if (!context) {
|
|
26
|
+
throw new Error("StepperPrevious must be contained within a Stepper");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@render {
|
|
30
|
+
<button
|
|
31
|
+
{$props?.id}
|
|
32
|
+
class={["torp-stepper-previous", $props?.class]}
|
|
33
|
+
{$props?.style}
|
|
34
|
+
type="button"
|
|
35
|
+
aria-label={$props?.ariaLabel ?? "Previous step"}
|
|
36
|
+
disabled={$props?.disabled || !context.canPrevious()}
|
|
37
|
+
onclick={() => context.previous()}
|
|
38
|
+
>
|
|
39
|
+
<slot>
|
|
40
|
+
<ChevronLeft />
|
|
41
|
+
</slot>
|
|
42
|
+
</button>
|
|
43
|
+
}
|
|
44
|
+
}
|