@torpor/ui 0.4.0 → 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.
- 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 +83 -0
- package/dist/Charts/ChartYAxis.torp +105 -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 +11 -11
- package/dist/Charts/YAxis.torp +8 -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 +112 -0
- package/dist/ComboBox/ComboBoxInput.torp +145 -0
- package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
- package/dist/ComboBox/ComboBoxTypes.ts +39 -0
- package/dist/ComboBox/index.d.ts +152 -0
- package/dist/ComboBox/index.js +6 -0
- package/dist/CommandPalette/CommandPalette.torp +220 -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 +311 -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 +67 -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 +45 -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 +248 -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 +72 -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,90 @@
|
|
|
1
|
+
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import StepperMarker from "./StepperMarker.torp";
|
|
3
|
+
import { type StepperContext, StepperContextName } from "./StepperTypes";
|
|
4
|
+
|
|
5
|
+
interface StepperStepProps {
|
|
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
|
+
/** A label for the step, shown next to its marker */
|
|
13
|
+
label?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A step in a Stepper, which is complete once the stepper has moved past it,
|
|
18
|
+
* and current when the stepper is on it.
|
|
19
|
+
*/
|
|
20
|
+
export default function StepperStep($props: StepperStepProps | undefined) {
|
|
21
|
+
// Get stuff out of the Stepper context
|
|
22
|
+
const context = $context[StepperContextName] as StepperContext;
|
|
23
|
+
if (!context) {
|
|
24
|
+
throw new Error("StepperStep must be contained within a Stepper");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Register this step with the parent Stepper
|
|
28
|
+
let $state = context.registerStep();
|
|
29
|
+
|
|
30
|
+
$run(() => {
|
|
31
|
+
return () => {
|
|
32
|
+
context.removeStep($state.index);
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
function isComplete(): boolean {
|
|
37
|
+
return $state.index < context.getValue();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isCurrent(): boolean {
|
|
41
|
+
return $state.index === context.getValue();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Steps can always be revisited once complete; when the stepper is not
|
|
45
|
+
// linear, any step can be jumped to
|
|
46
|
+
function canVisit(): boolean {
|
|
47
|
+
return isComplete() || !context.linear;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function handleClick() {
|
|
51
|
+
if (canVisit()) {
|
|
52
|
+
context.setValue($state.index);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function stepLabel(): string {
|
|
57
|
+
return $props?.label ?? `Step ${$state.index + 1}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@render {
|
|
61
|
+
<li
|
|
62
|
+
{$props?.id}
|
|
63
|
+
class={["torp-stepper-step", $props?.class]}
|
|
64
|
+
{$props?.style}
|
|
65
|
+
aria-current={isCurrent() ? "step" : undefined}
|
|
66
|
+
data-state={isComplete() ? "complete" : isCurrent() ? "current" : "upcoming"}
|
|
67
|
+
>
|
|
68
|
+
@if (canVisit()) {
|
|
69
|
+
<button
|
|
70
|
+
type="button"
|
|
71
|
+
class="torp-stepper-step-button"
|
|
72
|
+
aria-label={`Go to ${stepLabel()}`}
|
|
73
|
+
onclick={handleClick}
|
|
74
|
+
>
|
|
75
|
+
<StepperMarker complete={isComplete()} index={$state.index} />
|
|
76
|
+
<slot>
|
|
77
|
+
<span>{stepLabel()}</span>
|
|
78
|
+
</slot>
|
|
79
|
+
</button>
|
|
80
|
+
} @else {
|
|
81
|
+
<span class="torp-stepper-step-label">
|
|
82
|
+
<StepperMarker complete={isComplete()} index={$state.index} />
|
|
83
|
+
<slot>
|
|
84
|
+
<span>{stepLabel()}</span>
|
|
85
|
+
</slot>
|
|
86
|
+
</span>
|
|
87
|
+
}
|
|
88
|
+
</li>
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const StepperContextName: unique symbol = Symbol.for("torp.Stepper");
|
|
2
|
+
|
|
3
|
+
export interface StepperStepState {
|
|
4
|
+
/** The index of the step */
|
|
5
|
+
index: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface StepperContext {
|
|
9
|
+
/** Called from a step when it is added */
|
|
10
|
+
registerStep: () => StepperStepState;
|
|
11
|
+
/** Called from a step when it is removed */
|
|
12
|
+
removeStep: (index: number) => void;
|
|
13
|
+
/** The index of the current step */
|
|
14
|
+
getValue: () => number;
|
|
15
|
+
/** Moves to the step at the given index */
|
|
16
|
+
setValue: (index: number) => void;
|
|
17
|
+
/** Moves to the next step, or raises oncomplete on the last one */
|
|
18
|
+
next: () => void;
|
|
19
|
+
/** Moves to the previous step */
|
|
20
|
+
previous: () => void;
|
|
21
|
+
/** Whether the next / previous controls can move from the current step */
|
|
22
|
+
canNext: () => boolean;
|
|
23
|
+
canPrevious: () => boolean;
|
|
24
|
+
/** The reactive list of registered steps */
|
|
25
|
+
steps: () => StepperStepState[];
|
|
26
|
+
/** The number of registered steps */
|
|
27
|
+
count: () => number;
|
|
28
|
+
/** Whether steps can only be visited in order, with completed ones revisitable */
|
|
29
|
+
linear: boolean;
|
|
30
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { type SlotRender } from "@torpor/view";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
interface StepperProps {
|
|
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 index of the current step */
|
|
12
|
+
value?: Bindable<number>;
|
|
13
|
+
/** Whether steps can only be visited in order, with completed ones revisitable (default true) */
|
|
14
|
+
linear?: boolean;
|
|
15
|
+
/** An accessible label for the steps */
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
/** Raised when the current step has changed */
|
|
18
|
+
onchange?: (index: number) => void;
|
|
19
|
+
/** Raised when the user moves next from the last step */
|
|
20
|
+
oncomplete?: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A sequence of steps in a task, showing progress through them. Steps before
|
|
25
|
+
* the current one are complete, and can be revisited; the user moves between
|
|
26
|
+
* steps with the navigation controls.
|
|
27
|
+
*
|
|
28
|
+
* The structure of a Stepper is:
|
|
29
|
+
*
|
|
30
|
+
* ```
|
|
31
|
+
* <Stepper ariaLabel="Sign up">
|
|
32
|
+
* <StepperStep label="Account" />
|
|
33
|
+
* <StepperStep label="Profile" />
|
|
34
|
+
* <fill name="nav">
|
|
35
|
+
* <StepperPrevious />
|
|
36
|
+
* <StepperNext />
|
|
37
|
+
* </fill>
|
|
38
|
+
* </Stepper>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
declare function Stepper(
|
|
42
|
+
$parent: ParentNode,
|
|
43
|
+
$anchor: Node | null,
|
|
44
|
+
$props: StepperProps | undefined,
|
|
45
|
+
$context?: Record<PropertyKey, any>,
|
|
46
|
+
$slots?: Record<string, SlotRender>,
|
|
47
|
+
): void;
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
interface StepperMarkerProps {
|
|
52
|
+
/** Whether the step this marker belongs to is complete */
|
|
53
|
+
complete: boolean;
|
|
54
|
+
/** The index of the step this marker belongs to */
|
|
55
|
+
index: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The marker for a Stepper step, which shows a check when the step is
|
|
60
|
+
* complete or its number otherwise.
|
|
61
|
+
*/
|
|
62
|
+
declare function StepperMarker(
|
|
63
|
+
$parent: ParentNode,
|
|
64
|
+
$anchor: Node | null,
|
|
65
|
+
$props: StepperMarkerProps,
|
|
66
|
+
$context?: Record<PropertyKey, any>,
|
|
67
|
+
$slots?: Record<string, SlotRender>,
|
|
68
|
+
): void;
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
interface StepperNextProps {
|
|
73
|
+
/** An ID for the root element */
|
|
74
|
+
id?: string;
|
|
75
|
+
/** Classes for the root element */
|
|
76
|
+
class?: ClassValue;
|
|
77
|
+
/** Styles for the root element */
|
|
78
|
+
style?: StyleValue;
|
|
79
|
+
/** An ARIA label for the button, for screen readers when the button contains no text */
|
|
80
|
+
ariaLabel?: string;
|
|
81
|
+
/** If set to true, the user cannot interact with this button */
|
|
82
|
+
disabled?: boolean;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The button in a Stepper that a user can press to move to the next step,
|
|
87
|
+
* which raises the stepper's oncomplete event on the last step.
|
|
88
|
+
*/
|
|
89
|
+
declare function StepperNext(
|
|
90
|
+
$parent: ParentNode,
|
|
91
|
+
$anchor: Node | null,
|
|
92
|
+
$props: StepperNextProps | undefined,
|
|
93
|
+
$context?: Record<PropertyKey, any>,
|
|
94
|
+
$slots?: Record<string, SlotRender>,
|
|
95
|
+
): void;
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
interface StepperPreviousProps {
|
|
100
|
+
/** An ID for the root element */
|
|
101
|
+
id?: string;
|
|
102
|
+
/** Classes for the root element */
|
|
103
|
+
class?: ClassValue;
|
|
104
|
+
/** Styles for the root element */
|
|
105
|
+
style?: StyleValue;
|
|
106
|
+
/** An ARIA label for the button, for screen readers when the button contains no text */
|
|
107
|
+
ariaLabel?: string;
|
|
108
|
+
/** If set to true, the user cannot interact with this button */
|
|
109
|
+
disabled?: boolean;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The button in a Stepper that a user can press to move to the previous
|
|
114
|
+
* step.
|
|
115
|
+
*/
|
|
116
|
+
declare function StepperPrevious(
|
|
117
|
+
$parent: ParentNode,
|
|
118
|
+
$anchor: Node | null,
|
|
119
|
+
$props: StepperPreviousProps | undefined,
|
|
120
|
+
$context?: Record<PropertyKey, any>,
|
|
121
|
+
$slots?: Record<string, SlotRender>,
|
|
122
|
+
): void;
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
interface StepperStepProps {
|
|
127
|
+
/** An ID for the root element */
|
|
128
|
+
id?: string;
|
|
129
|
+
/** Classes for the root element */
|
|
130
|
+
class?: ClassValue;
|
|
131
|
+
/** Styles for the root element */
|
|
132
|
+
style?: StyleValue;
|
|
133
|
+
/** A label for the step, shown next to its marker */
|
|
134
|
+
label?: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* A step in a Stepper, which is complete once the stepper has moved past it,
|
|
139
|
+
* and current when the stepper is on it.
|
|
140
|
+
*/
|
|
141
|
+
declare function StepperStep(
|
|
142
|
+
$parent: ParentNode,
|
|
143
|
+
$anchor: Node | null,
|
|
144
|
+
$props: StepperStepProps | undefined,
|
|
145
|
+
$context?: Record<PropertyKey, any>,
|
|
146
|
+
$slots?: Record<string, SlotRender>,
|
|
147
|
+
): void;
|
|
148
|
+
|
|
149
|
+
export { Stepper, StepperMarker, StepperNext, StepperPrevious, StepperStep };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import Stepper from "./Stepper.torp";
|
|
2
|
+
import StepperMarker from "./StepperMarker.torp";
|
|
3
|
+
import StepperNext from "./StepperNext.torp";
|
|
4
|
+
import StepperPrevious from "./StepperPrevious.torp";
|
|
5
|
+
import StepperStep from "./StepperStep.torp";
|
|
6
|
+
export { Stepper, StepperMarker, StepperNext, StepperPrevious, StepperStep };
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
2
|
import getId from "../utils/getId";
|
|
3
|
-
import {
|
|
3
|
+
import { type TabGroupContext, TabGroupContextName } from "./TabGroupTypes";
|
|
4
4
|
|
|
5
5
|
interface TabContentProps {
|
|
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
|
/** The index of this item */
|
|
13
|
-
index?: number
|
|
13
|
+
index?: number;
|
|
14
14
|
/** The value for this item */
|
|
15
|
-
value?: string
|
|
15
|
+
value?: string;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -36,10 +36,10 @@ export default function TabContent($props: TabContentProps | undefined) {
|
|
|
36
36
|
class={["torp-tab-content", $props?.class]}
|
|
37
37
|
{$props?.style}
|
|
38
38
|
role="tabpanel"
|
|
39
|
+
tabindex="0"
|
|
39
40
|
aria-labelledby={$state.headerId}
|
|
40
41
|
data-orientation={context.orientation}
|
|
41
42
|
data-state={$state.active ? "active" : "inactive"}
|
|
42
|
-
data-disabled={$state.disabled ? "true" : undefined}
|
|
43
43
|
>
|
|
44
44
|
@if ($state.active) {
|
|
45
45
|
<slot />
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
import
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
92
|
-
$run(() => {
|
|
93
|
-
const onchange = $props?.onchange;
|
|
80
|
+
$handle((first) => {
|
|
94
81
|
const value = $props?.value;
|
|
95
|
-
if (
|
|
96
|
-
firstChange = false;
|
|
97
|
-
} else if (onchange) {
|
|
98
|
-
onchange(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
|
-
$
|
|
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(
|
|
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 (
|
|
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
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
194
|
-
|
|
195
|
-
|
|
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"
|
|
202
|
-
|
|
203
|
-
|
|
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"
|
|
210
|
-
|
|
211
|
-
|
|
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"
|
|
218
|
-
|
|
219
|
-
|
|
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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
}
|
|
@@ -6,7 +6,7 @@ export interface TabGroupContext {
|
|
|
6
6
|
registerHeader: (
|
|
7
7
|
index: number | undefined,
|
|
8
8
|
value: string | undefined,
|
|
9
|
-
|
|
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;
|