@torpor/ui 0.2.1 → 0.3.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/CHANGELOG.md +23 -0
- package/dist/Accordion/Accordion.torp +29 -22
- package/dist/Accordion/AccordionContent.torp +7 -8
- package/dist/Accordion/AccordionHeader.torp +4 -6
- package/dist/Accordion/AccordionItem.torp +15 -12
- package/dist/Accordion/AccordionTrigger.torp +6 -7
- package/dist/Accordion/AccordionTypes.ts +4 -3
- package/dist/Accordion/index.d.ts +5 -5
- package/dist/Breadcrumb/Breadcrumb.torp +9 -10
- package/dist/Breadcrumb/BreadcrumbItem.torp +5 -7
- package/dist/Breadcrumb/BreadcrumbSeparator.torp +3 -5
- package/dist/Breadcrumb/index.d.ts +8 -7
- package/dist/Calendar/Calendar.torp +12 -13
- package/dist/Calendar/CalendarDay.torp +3 -3
- package/dist/Contextual/Contextual.torp +125 -0
- package/dist/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +15 -15
- package/dist/Contextual/ContextualTrigger.torp +66 -0
- package/dist/Contextual/ContextualTypes.ts +30 -0
- package/dist/Contextual/index.d.ts +90 -0
- package/dist/Contextual/index.js +14 -0
- package/dist/Contextual/index.js.map +1 -0
- package/dist/Dialog/Dialog.torp +38 -72
- package/dist/Dialog/DialogBody.torp +6 -8
- package/dist/Dialog/DialogButton.torp +14 -12
- package/dist/Dialog/DialogFooter.torp +3 -5
- package/dist/Dialog/DialogHeader.torp +6 -8
- package/dist/Dialog/DialogTypes.ts +3 -2
- package/dist/Dialog/index.d.ts +16 -11
- package/dist/Disclosure/Disclosure.torp +22 -23
- package/dist/Disclosure/DisclosureContent.torp +7 -8
- package/dist/Disclosure/DisclosureHeader.torp +5 -7
- package/dist/Disclosure/DisclosureTrigger.torp +7 -8
- package/dist/Disclosure/DisclosureTypes.ts +0 -1
- package/dist/Disclosure/index.d.ts +12 -12
- package/dist/Drawer/Drawer.torp +101 -70
- package/dist/Drawer/DrawerContent.torp +80 -0
- package/dist/Drawer/DrawerOverlay.torp +38 -0
- package/dist/Drawer/DrawerTrigger.torp +35 -0
- package/dist/Drawer/DrawerTypes.ts +24 -0
- package/dist/Drawer/index.d.ts +90 -3
- package/dist/Drawer/index.js +13 -1
- package/dist/Form/Field.torp +2 -4
- package/dist/Form/Form.torp +7 -9
- package/dist/Form/Input.torp +20 -17
- package/dist/Form/Label.torp +1 -1
- package/dist/Form/Message.torp +1 -1
- package/dist/Form/index.d.ts +18 -4
- package/dist/Menu/Menu.torp +16 -15
- package/dist/Menu/MenuButton.torp +19 -13
- package/dist/Menu/MenuCheck.torp +18 -14
- package/dist/Menu/MenuGroup.torp +4 -6
- package/dist/Menu/MenuIndicator.torp +5 -7
- package/dist/Menu/MenuPopout.torp +12 -15
- package/dist/Menu/MenuPopoutContent.torp +6 -8
- package/dist/Menu/MenuPopoutTrigger.torp +12 -14
- package/dist/Menu/MenuRadio.torp +14 -14
- package/dist/Menu/MenuRadioGroup.torp +22 -14
- package/dist/Menu/MenuSeparator.torp +3 -5
- package/dist/Menu/MenuTypes.ts +7 -5
- package/dist/Menu/index.d.ts +28 -22
- package/dist/MenuBar/MenuBar.torp +13 -14
- package/dist/MenuBar/MenuBarItem.torp +13 -16
- package/dist/MenuBar/MenuBarItemContent.torp +7 -9
- package/dist/MenuBar/MenuBarItemTrigger.torp +6 -9
- package/dist/MenuBar/index.d.ts +16 -16
- package/dist/Modal/Modal.torp +118 -0
- package/dist/Modal/ModalContent.torp +77 -0
- package/dist/Modal/ModalOverlay.torp +38 -0
- package/dist/Modal/ModalTrigger.torp +50 -0
- package/dist/Modal/ModalTypes.ts +22 -0
- package/dist/Modal/index.d.ts +108 -0
- package/dist/Modal/index.js +33 -0
- package/dist/Modal/index.js.map +1 -0
- package/dist/Modal/showModal.ts +19 -0
- package/dist/Modal/showPrompt.ts +23 -0
- package/dist/NavMenu/NavMenu.torp +7 -8
- package/dist/NavMenu/NavMenuButton.torp +6 -8
- package/dist/NavMenu/NavMenuElement.torp +8 -8
- package/dist/NavMenu/NavMenuGroup.torp +4 -6
- package/dist/NavMenu/NavMenuGroupHeader.torp +5 -6
- package/dist/NavMenu/NavMenuLink.torp +8 -11
- package/dist/NavMenu/NavMenuPopout.torp +25 -17
- package/dist/NavMenu/NavMenuPopoutButton.torp +12 -13
- package/dist/NavMenu/NavMenuPopoutContent.torp +12 -12
- package/dist/NavMenu/NavMenuSeparator.torp +3 -5
- package/dist/NavMenu/index.d.ts +17 -11
- package/dist/Notification/Notification.torp +22 -13
- package/dist/Notification/NotificationClose.torp +3 -5
- package/dist/Notification/NotificationContainer.torp +3 -5
- package/dist/Notification/NotificationContent.torp +3 -5
- package/dist/Notification/index.d.ts +4 -4
- package/dist/Popover/Popover.torp +31 -25
- package/dist/Popover/PopoverContent.torp +35 -10
- package/dist/Popover/PopoverTrigger.torp +24 -4
- package/dist/Popover/PopoverTypes.ts +1 -1
- package/dist/Popover/index.d.ts +16 -124
- package/dist/Popover/index.js +1 -163
- package/dist/Popover/index.js.map +1 -1
- package/dist/TabGroup/TabContent.torp +12 -9
- package/dist/TabGroup/TabGroup.torp +41 -35
- package/dist/TabGroup/TabGroupTypes.ts +10 -5
- package/dist/TabGroup/TabHeader.torp +15 -8
- package/dist/TabGroup/TabList.torp +4 -6
- package/dist/TabGroup/TabTrigger.torp +8 -9
- package/dist/TabGroup/index.d.ts +14 -6
- package/dist/icons/ArrowDown.torp +3 -1
- package/dist/icons/ArrowLeft.torp +3 -1
- package/dist/icons/ArrowRight.torp +3 -1
- package/dist/icons/ArrowUp.torp +3 -1
- package/dist/icons/Bars.torp +3 -1
- package/dist/icons/Check.torp +3 -1
- package/dist/icons/ChevronDown.torp +3 -1
- package/dist/icons/ChevronLeft.torp +3 -1
- package/dist/icons/ChevronRight.torp +3 -1
- package/dist/icons/ChevronUp.torp +3 -1
- package/dist/icons/Cross.torp +3 -1
- package/dist/icons/IconTypes.ts +6 -0
- package/dist/icons/Loading.torp +3 -1
- package/dist/icons/Minus.torp +3 -1
- package/dist/icons/Plus.torp +3 -1
- package/dist/icons/index.d.ts +271 -14
- package/dist/index.d.ts +17 -4
- package/dist/metafile-esm.json +1 -1
- package/dist/motion/fade.ts +15 -6
- package/dist/motion/grow.ts +23 -0
- package/dist/motion/index.d.ts +19 -2
- package/dist/motion/index.js +93 -3
- package/dist/motion/index.js.map +1 -1
- package/dist/motion/measure.ts +28 -0
- package/dist/motion/slide.ts +45 -0
- package/dist/mount/clickPopover.ts +51 -0
- package/dist/mount/contextPopover.ts +51 -0
- package/dist/mount/hoverPopover.ts +58 -0
- package/package.json +21 -14
- package/scripts/postbuild.ts +11 -1
- package/src/Accordion/Accordion.torp +29 -22
- package/src/Accordion/AccordionContent.torp +7 -8
- package/src/Accordion/AccordionHeader.torp +4 -6
- package/src/Accordion/AccordionItem.torp +15 -12
- package/src/Accordion/AccordionTrigger.torp +6 -7
- package/src/Accordion/AccordionTypes.ts +4 -3
- package/src/Breadcrumb/Breadcrumb.torp +9 -10
- package/src/Breadcrumb/BreadcrumbItem.torp +5 -7
- package/src/Breadcrumb/BreadcrumbSeparator.torp +3 -5
- package/src/Calendar/Calendar.torp +12 -13
- package/src/Calendar/CalendarDay.torp +3 -3
- package/src/Contextual/Contextual.torp +125 -0
- package/src/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +15 -15
- package/src/Contextual/ContextualTrigger.torp +66 -0
- package/src/Contextual/ContextualTypes.ts +30 -0
- package/src/Contextual/index.ts +5 -0
- package/src/Dialog/Dialog.torp +38 -72
- package/src/Dialog/DialogBody.torp +6 -8
- package/src/Dialog/DialogButton.torp +14 -12
- package/src/Dialog/DialogFooter.torp +3 -5
- package/src/Dialog/DialogHeader.torp +6 -8
- package/src/Dialog/DialogTypes.ts +3 -2
- package/src/Disclosure/Disclosure.torp +22 -23
- package/src/Disclosure/DisclosureContent.torp +7 -8
- package/src/Disclosure/DisclosureHeader.torp +5 -7
- package/src/Disclosure/DisclosureTrigger.torp +7 -8
- package/src/Disclosure/DisclosureTypes.ts +0 -1
- package/src/Drawer/Drawer.torp +101 -70
- package/src/Drawer/DrawerContent.torp +80 -0
- package/src/Drawer/DrawerOverlay.torp +38 -0
- package/src/Drawer/DrawerTrigger.torp +35 -0
- package/src/Drawer/DrawerTypes.ts +24 -0
- package/src/Drawer/index.ts +4 -1
- package/src/Form/Field.torp +2 -4
- package/src/Form/Form.torp +7 -9
- package/src/Form/Input.torp +20 -17
- package/src/Form/Label.torp +1 -1
- package/src/Form/Message.torp +1 -1
- package/src/Menu/Menu.torp +16 -15
- package/src/Menu/MenuButton.torp +19 -13
- package/src/Menu/MenuCheck.torp +18 -14
- package/src/Menu/MenuGroup.torp +4 -6
- package/src/Menu/MenuIndicator.torp +5 -7
- package/src/Menu/MenuPopout.torp +12 -15
- package/src/Menu/MenuPopoutContent.torp +6 -8
- package/src/Menu/MenuPopoutTrigger.torp +12 -14
- package/src/Menu/MenuRadio.torp +14 -14
- package/src/Menu/MenuRadioGroup.torp +22 -14
- package/src/Menu/MenuSeparator.torp +3 -5
- package/src/Menu/MenuTypes.ts +7 -5
- package/src/MenuBar/MenuBar.torp +13 -14
- package/src/MenuBar/MenuBarItem.torp +13 -16
- package/src/MenuBar/MenuBarItemContent.torp +7 -9
- package/src/MenuBar/MenuBarItemTrigger.torp +6 -9
- package/src/Modal/Modal.torp +118 -0
- package/src/Modal/ModalContent.torp +77 -0
- package/src/Modal/ModalOverlay.torp +38 -0
- package/src/Modal/ModalTrigger.torp +50 -0
- package/src/Modal/ModalTypes.ts +22 -0
- package/src/Modal/index.ts +10 -0
- package/src/Modal/showModal.ts +19 -0
- package/src/Modal/showPrompt.ts +23 -0
- package/src/NavMenu/NavMenu.torp +7 -8
- package/src/NavMenu/NavMenuButton.torp +6 -8
- package/src/NavMenu/NavMenuElement.torp +8 -8
- package/src/NavMenu/NavMenuGroup.torp +4 -6
- package/src/NavMenu/NavMenuGroupHeader.torp +5 -6
- package/src/NavMenu/NavMenuLink.torp +8 -11
- package/src/NavMenu/NavMenuPopout.torp +25 -17
- package/src/NavMenu/NavMenuPopoutButton.torp +12 -13
- package/src/NavMenu/NavMenuPopoutContent.torp +12 -12
- package/src/NavMenu/NavMenuSeparator.torp +3 -5
- package/src/Notification/Notification.torp +22 -13
- package/src/Notification/NotificationClose.torp +3 -5
- package/src/Notification/NotificationContainer.torp +3 -5
- package/src/Notification/NotificationContent.torp +3 -5
- package/src/Popover/Popover.torp +31 -25
- package/src/Popover/PopoverContent.torp +35 -10
- package/src/Popover/PopoverTrigger.torp +24 -4
- package/src/Popover/PopoverTypes.ts +1 -1
- package/src/Popover/index.ts +1 -24
- package/src/Slider/Slider.torp +3 -3
- package/src/TabGroup/TabContent.torp +12 -9
- package/src/TabGroup/TabGroup.torp +41 -35
- package/src/TabGroup/TabGroupTypes.ts +10 -5
- package/src/TabGroup/TabHeader.torp +15 -8
- package/src/TabGroup/TabList.torp +4 -6
- package/src/TabGroup/TabTrigger.torp +8 -9
- package/src/icons/ArrowDown.torp +3 -1
- package/src/icons/ArrowLeft.torp +3 -1
- package/src/icons/ArrowRight.torp +3 -1
- package/src/icons/ArrowUp.torp +3 -1
- package/src/icons/Bars.torp +3 -1
- package/src/icons/Check.torp +3 -1
- package/src/icons/ChevronDown.torp +3 -1
- package/src/icons/ChevronLeft.torp +3 -1
- package/src/icons/ChevronRight.torp +3 -1
- package/src/icons/ChevronUp.torp +3 -1
- package/src/icons/Cross.torp +3 -1
- package/src/icons/IconTypes.ts +6 -0
- package/src/icons/Loading.torp +3 -1
- package/src/icons/Minus.torp +3 -1
- package/src/icons/Plus.torp +3 -1
- package/src/motion/fade.ts +15 -6
- package/src/motion/grow.ts +23 -0
- package/src/motion/index.ts +4 -1
- package/src/motion/measure.ts +28 -0
- package/src/motion/slide.ts +45 -0
- package/src/mount/clickPopover.ts +51 -0
- package/src/mount/contextPopover.ts +51 -0
- package/src/mount/hoverPopover.ts +58 -0
- package/test/Accordion/components/AccordionAccessibility.torp +1 -3
- package/test/Accordion/components/AccordionKeyboard.torp +1 -3
- package/test/Accordion/components/AccordionList.torp +1 -3
- package/test/Accordion/components/AccordionMultiple.torp +2 -4
- package/test/Accordion/components/AccordionSingle.torp +2 -4
- package/test/Dialog/accessibility-modal.test.ts +2 -2
- package/test/Dialog/components/DialogAccessibility.torp +8 -14
- package/test/Dialog/components/DialogFunction.torp +20 -4
- package/test/Dialog/components/DialogModal.torp +30 -0
- package/test/Dialog/components/DialogVariable.torp +7 -7
- package/test/Disclosure/components/DisclosureTest.torp +1 -3
- package/test/Menu/components/MenuAccessibility.torp +5 -5
- package/test/Menu/components/MenuBasic.torp +5 -5
- package/test/Notification/components/NotificationFunction.torp +0 -3
- package/test/Notification/components/NotificationVariable.torp +1 -1
- package/test/Popover/components/PopoverFunction.torp +37 -0
- package/test/Popover/components/PopoverTrigger.torp +36 -0
- package/test/Popover/components/{PromptVariable.torp → PopoverVariable.torp} +5 -3
- package/test/Popover/function.test.ts +2 -7
- package/test/Popover/trigger.test.ts +27 -0
- package/test/Popover/variable.test.ts +2 -2
- package/test/TabGroup/components/TabGroupAccessibility.torp +1 -3
- package/test/TabGroup/components/TabGroupKeyboard.torp +1 -3
- package/test/TabGroup/components/TabGroupList.torp +1 -3
- package/test/TabGroup/components/TabGroupTrigger.torp +1 -3
- package/tsup.config.ts +2 -0
- package/dist/Popover/PopoverContentAnchored.torp +0 -113
- package/dist/Popover/PopoverOverlay.torp +0 -39
- package/dist/Popover/PopoverTriggerContextual.torp +0 -46
- package/dist/Popover/PopoverTriggerHover.torp +0 -47
- package/dist/Popover/mountClickPopover.ts +0 -50
- package/dist/Popover/mountContextPopover.ts +0 -50
- package/dist/Popover/mountHoverPopover.ts +0 -57
- package/dist/Popover/showPopoverPrompt.ts +0 -23
- package/src/Popover/PopoverContentAnchored.torp +0 -113
- package/src/Popover/PopoverOverlay.torp +0 -39
- package/src/Popover/PopoverTriggerContextual.torp +0 -46
- package/src/Popover/PopoverTriggerHover.torp +0 -47
- package/src/Popover/mountClickPopover.ts +0 -50
- package/src/Popover/mountContextPopover.ts +0 -50
- package/src/Popover/mountHoverPopover.ts +0 -57
- package/src/Popover/showPopoverPrompt.ts +0 -23
- package/test/Dialog/components/CustomDialog.torp +0 -20
- package/test/Popover/components/PromptFunction.torp +0 -19
package/src/Form/Form.torp
CHANGED
|
@@ -18,11 +18,9 @@ interface FormProps {
|
|
|
18
18
|
/**
|
|
19
19
|
* A form for submitting values.
|
|
20
20
|
*/
|
|
21
|
-
export default function Form($props: FormProps) {
|
|
22
|
-
$props ??= $watch({});
|
|
23
|
-
|
|
21
|
+
export default function Form($props: FormProps | undefined) {
|
|
24
22
|
let $state = $watch({
|
|
25
|
-
data: $props
|
|
23
|
+
data: $props?.data ?? {},
|
|
26
24
|
issues: [] as ValidationIssue[],
|
|
27
25
|
get valid() {
|
|
28
26
|
return this.issues.length === 0;
|
|
@@ -35,7 +33,7 @@ export default function Form($props: FormProps) {
|
|
|
35
33
|
|
|
36
34
|
// Set the context to pass down to Fields
|
|
37
35
|
let context: FormContext = {
|
|
38
|
-
schema: $props
|
|
36
|
+
schema: $props?.schema,
|
|
39
37
|
state: $state,
|
|
40
38
|
validate: handleValidate
|
|
41
39
|
};
|
|
@@ -43,7 +41,7 @@ export default function Form($props: FormProps) {
|
|
|
43
41
|
$context[FormContextName] = context;
|
|
44
42
|
|
|
45
43
|
async function validate() {
|
|
46
|
-
if ($props
|
|
44
|
+
if ($props?.schema) {
|
|
47
45
|
const validator = $props.schema["~standard"];
|
|
48
46
|
let result = validator.validate($props.data);
|
|
49
47
|
if (result instanceof Promise) {
|
|
@@ -77,7 +75,7 @@ export default function Form($props: FormProps) {
|
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
// Dispatch the submit event for the user to handle
|
|
80
|
-
if ($props
|
|
78
|
+
if ($props?.onsubmit) {
|
|
81
79
|
let userSubmit = $props.onsubmit(e);
|
|
82
80
|
if (userSubmit instanceof Promise) {
|
|
83
81
|
userSubmit = await userSubmit;
|
|
@@ -118,8 +116,8 @@ export default function Form($props: FormProps) {
|
|
|
118
116
|
|
|
119
117
|
@render {
|
|
120
118
|
<form
|
|
121
|
-
{$props
|
|
122
|
-
class={`torp-form ${$props
|
|
119
|
+
{$props?.id}
|
|
120
|
+
class={`torp-form ${$props?.class ?? ""}`.trim()}
|
|
123
121
|
method="POST"
|
|
124
122
|
onsubmit={handleSubmit}
|
|
125
123
|
@// Set novalidate only if JS is enabled (to override HTML validation)
|
package/src/Form/Input.torp
CHANGED
|
@@ -25,10 +25,11 @@ interface InputProps {
|
|
|
25
25
|
/**
|
|
26
26
|
* A standard input in a form.
|
|
27
27
|
*/
|
|
28
|
-
export default function Input($props: InputProps) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
$props
|
|
28
|
+
export default function Input($props: InputProps | undefined) {
|
|
29
|
+
let defaultId = getId();
|
|
30
|
+
|
|
31
|
+
let type = $props?.type ?? "text";
|
|
32
|
+
let name = $props?.name
|
|
32
33
|
|
|
33
34
|
let blurred = false;
|
|
34
35
|
|
|
@@ -36,13 +37,13 @@ export default function Input($props: InputProps) {
|
|
|
36
37
|
const formContext = $context[FormContextName] as FormContext;
|
|
37
38
|
const fieldContext = $context[FieldContextName] as FieldContext;
|
|
38
39
|
if (fieldContext) {
|
|
39
|
-
|
|
40
|
+
name ??= fieldContext.name;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
// Use the FieldContext's state, or create a new one
|
|
43
44
|
let $state = fieldContext?.state ?? $watch({
|
|
44
|
-
inputId: $props
|
|
45
|
-
value: $props
|
|
45
|
+
inputId: $props?.id ?? defaultId,
|
|
46
|
+
value: $props?.value,
|
|
46
47
|
errors: {} as Record<string, string>,
|
|
47
48
|
valid: false,
|
|
48
49
|
message: "",
|
|
@@ -50,11 +51,13 @@ export default function Input($props: InputProps) {
|
|
|
50
51
|
|
|
51
52
|
// Binding
|
|
52
53
|
$run(() => {
|
|
53
|
-
$props
|
|
54
|
+
if ($props !== undefined) {
|
|
55
|
+
$props.value = $state.value;
|
|
56
|
+
}
|
|
54
57
|
});
|
|
55
58
|
|
|
56
59
|
// Set the input ID now that we know it and it will get linked with the associated label
|
|
57
|
-
$state.inputId = $props
|
|
60
|
+
$state.inputId = $props?.id ?? defaultId;
|
|
58
61
|
|
|
59
62
|
// NOTE: Adapted this from https://stackoverflow.com/a/57393751,
|
|
60
63
|
// not sure if it's still a good way to do things
|
|
@@ -77,15 +80,15 @@ export default function Input($props: InputProps) {
|
|
|
77
80
|
|
|
78
81
|
@render {
|
|
79
82
|
<input
|
|
80
|
-
{$props
|
|
81
|
-
class={`torp-input ${$props
|
|
82
|
-
{
|
|
83
|
+
id={$props?.id ?? defaultId}
|
|
84
|
+
class={`torp-input ${$props?.class ?? ""}`.trim()}
|
|
85
|
+
{type}
|
|
86
|
+
{name}
|
|
83
87
|
&value={$state.value}
|
|
84
|
-
{$props
|
|
85
|
-
{$props
|
|
86
|
-
{$props
|
|
87
|
-
{$props
|
|
88
|
-
aria-label={$props.ariaLabel}
|
|
88
|
+
{$props?.placeholder}
|
|
89
|
+
{$props?.readonly}
|
|
90
|
+
{$props?.maxlength}
|
|
91
|
+
aria-label={$props?.ariaLabel}
|
|
89
92
|
data-valid={$state.valid ? "valid" : "invalid"}
|
|
90
93
|
oninput={handleInput}
|
|
91
94
|
onblur={handleBlur}
|
package/src/Form/Label.torp
CHANGED
|
@@ -10,7 +10,7 @@ interface LabelProps {
|
|
|
10
10
|
/**
|
|
11
11
|
* A label to describe the contents of an input in a form.
|
|
12
12
|
*/
|
|
13
|
-
export default function Label($props
|
|
13
|
+
export default function Label($props: LabelProps | undefined) {
|
|
14
14
|
// Get stuff out of the FieldContext
|
|
15
15
|
const context = $context[FieldContextName] as FieldContext;
|
|
16
16
|
if (!context) {
|
package/src/Form/Message.torp
CHANGED
|
@@ -11,7 +11,7 @@ interface MessageProps {
|
|
|
11
11
|
* A validation message to show when the contents of an input component have
|
|
12
12
|
* problems that need to be fixed.
|
|
13
13
|
*/
|
|
14
|
-
export default function Message($props
|
|
14
|
+
export default function Message($props: MessageProps | undefined) {
|
|
15
15
|
// Get stuff out of the FieldContext
|
|
16
16
|
const context = $context[FieldContextName] as FieldContext;
|
|
17
17
|
if (!context) {
|
package/src/Menu/Menu.torp
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ContextualContextName } from "../Contextual/ContextualTypes";
|
|
2
|
+
import { ModalContextName } from "../Modal/ModalTypes";
|
|
1
3
|
import { PopoverContextName, type PopoverContext } from "../Popover/PopoverTypes";
|
|
2
4
|
import {
|
|
3
5
|
MenuContextName,
|
|
@@ -26,27 +28,26 @@ interface MenuProps {
|
|
|
26
28
|
*
|
|
27
29
|
* ```
|
|
28
30
|
* <Menu>
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
31
|
+
* <MenuButton />
|
|
32
|
+
* <MenuSeparator /> (optional)
|
|
33
|
+
* <MenuGroup> (optional)
|
|
34
|
+
* <MenuButton />
|
|
35
|
+
* </MenuGroup>
|
|
34
36
|
* </Menu>
|
|
35
37
|
* ```
|
|
36
38
|
*/
|
|
37
|
-
export default function Menu($props: MenuProps) {
|
|
38
|
-
$props ??= $watch({});
|
|
39
|
-
|
|
39
|
+
export default function Menu($props: MenuProps | undefined) {
|
|
40
40
|
// A collection containing the state and some functions for each item
|
|
41
41
|
let itemStates: ItemState[] = [];
|
|
42
42
|
let focusIndex = -1;
|
|
43
43
|
|
|
44
44
|
// Get stuff out of the PopoverContext
|
|
45
|
-
|
|
45
|
+
// HACK: share state in PopupState and extend in context/modal/popover
|
|
46
|
+
const popoverContext = $context[ContextualContextName] ?? $context[ModalContextName] ?? $context[PopoverContextName] as PopoverContext;
|
|
46
47
|
if (!popoverContext) {
|
|
47
|
-
throw new Error("Menu must be contained within a
|
|
48
|
+
throw new Error("Menu must be contained within a Context, Modal or Popover");
|
|
48
49
|
}
|
|
49
|
-
const { setVisible, handleButton,
|
|
50
|
+
const { setVisible, handleButton, visible } = popoverContext;
|
|
50
51
|
|
|
51
52
|
// Check whether this is a menu in a popout
|
|
52
53
|
const popoutContext = $context[MenuPopoutContextName] as MenuPopoutContext;
|
|
@@ -77,7 +78,7 @@ export default function Menu($props: MenuProps) {
|
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
function registerItem(setFocused: () => void) {
|
|
80
|
-
// Add the item
|
|
81
|
+
// Add the item's state to the array and return its index
|
|
81
82
|
const newItemState: ItemState = {
|
|
82
83
|
setFocused
|
|
83
84
|
};
|
|
@@ -156,11 +157,11 @@ export default function Menu($props: MenuProps) {
|
|
|
156
157
|
|
|
157
158
|
@render {
|
|
158
159
|
<div
|
|
159
|
-
{$props
|
|
160
|
-
class={`torp-menu ${$props
|
|
160
|
+
{$props?.id}
|
|
161
|
+
class={`torp-menu ${$props?.class ?? ""}`.trim()}
|
|
161
162
|
tabindex="-1"
|
|
162
163
|
role="menu"
|
|
163
|
-
aria-label={$props
|
|
164
|
+
aria-label={$props?.ariaLabel}
|
|
164
165
|
aria-orientation="vertical"
|
|
165
166
|
>
|
|
166
167
|
<slot />
|
package/src/Menu/MenuButton.torp
CHANGED
|
@@ -9,15 +9,17 @@ interface MenuButtonProps {
|
|
|
9
9
|
value?: any,
|
|
10
10
|
/** Whether this button is disabled */
|
|
11
11
|
disabled?: boolean,
|
|
12
|
+
/** Raised when the button is clicked */
|
|
13
|
+
onclick?: (e: MouseEvent) => void,
|
|
14
|
+
/** Raised when a key is pressed down */
|
|
15
|
+
onkeydown?: (e: KeyboardEvent) => void,
|
|
12
16
|
}
|
|
13
17
|
|
|
14
18
|
/**
|
|
15
19
|
* A button that is placed in a Menu or MenuGroup and signals a response by a user.
|
|
16
20
|
*
|
|
17
21
|
*/
|
|
18
|
-
export default function MenuButton($props: MenuButtonProps) {
|
|
19
|
-
$props ??= $watch({});
|
|
20
|
-
|
|
22
|
+
export default function MenuButton($props: MenuButtonProps | undefined) {
|
|
21
23
|
let button: HTMLButtonElement;
|
|
22
24
|
|
|
23
25
|
// Get stuff out of the MenuContext
|
|
@@ -30,14 +32,18 @@ export default function MenuButton($props: MenuButtonProps) {
|
|
|
30
32
|
// Register this item with the parent Menu and store the index
|
|
31
33
|
const { index } = registerItem(setFocused);
|
|
32
34
|
|
|
33
|
-
function handleKeyDown(e) {
|
|
35
|
+
function handleKeyDown(e: KeyboardEvent) {
|
|
34
36
|
handleItemKey(e);
|
|
35
|
-
if ($props
|
|
37
|
+
if ($props?.onkeydown) {
|
|
38
|
+
$props.onkeydown(e);
|
|
39
|
+
}
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
function handleClick(e) {
|
|
39
|
-
handleButton($props
|
|
40
|
-
if ($props
|
|
42
|
+
function handleClick(e: MouseEvent) {
|
|
43
|
+
handleButton($props?.value);
|
|
44
|
+
if ($props?.onclick) {
|
|
45
|
+
$props.onclick(e);
|
|
46
|
+
}
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
function setFocused() {
|
|
@@ -46,13 +52,13 @@ export default function MenuButton($props: MenuButtonProps) {
|
|
|
46
52
|
|
|
47
53
|
@render {
|
|
48
54
|
<button
|
|
49
|
-
{$props
|
|
50
|
-
class={`torp-menu-button ${$props
|
|
55
|
+
{$props?.id}
|
|
56
|
+
class={`torp-menu-button ${$props?.class ?? ""}`.trim()}
|
|
51
57
|
type="button"
|
|
52
|
-
{$props
|
|
58
|
+
{$props?.disabled}
|
|
53
59
|
role="menuitem"
|
|
54
|
-
aria-disabled={$props
|
|
55
|
-
data-disabled={$props
|
|
60
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
61
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
56
62
|
onkeydown={handleKeyDown}
|
|
57
63
|
onclick={handleClick}
|
|
58
64
|
onfocus={() => handleItemFocus(index)}
|
package/src/Menu/MenuCheck.torp
CHANGED
|
@@ -14,6 +14,8 @@ interface MenuCheckProps {
|
|
|
14
14
|
checked?: boolean,
|
|
15
15
|
/** Whether this item is disabled */
|
|
16
16
|
disabled?: boolean,
|
|
17
|
+
/** Raised when the checkbox is clicked */
|
|
18
|
+
onclick?: (e: MouseEvent) => void,
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
/**
|
|
@@ -21,15 +23,15 @@ interface MenuCheckProps {
|
|
|
21
23
|
* option on or off.
|
|
22
24
|
*
|
|
23
25
|
*/
|
|
24
|
-
export default function MenuCheck($props: MenuCheckProps) {
|
|
25
|
-
$props ??= $watch({});
|
|
26
|
-
|
|
26
|
+
export default function MenuCheck($props: MenuCheckProps | undefined) {
|
|
27
27
|
let $state = $watch({
|
|
28
|
-
checked: $props
|
|
28
|
+
checked: $props?.checked ?? false
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
$run(() => {
|
|
32
|
-
$props
|
|
32
|
+
if ($props !== undefined) {
|
|
33
|
+
$props.checked = $state.checked;
|
|
34
|
+
}
|
|
33
35
|
});
|
|
34
36
|
|
|
35
37
|
let button: HTMLButtonElement;
|
|
@@ -54,22 +56,24 @@ export default function MenuCheck($props: MenuCheckProps) {
|
|
|
54
56
|
button.focus();
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
function handleClick() {
|
|
59
|
+
function handleClick(e: MouseEvent) {
|
|
58
60
|
$state.checked = !$state.checked;
|
|
59
|
-
if ($props
|
|
61
|
+
if ($props?.onclick) {
|
|
62
|
+
$props.onclick(e);
|
|
63
|
+
}
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
@render {
|
|
63
67
|
<button
|
|
64
|
-
{$props
|
|
65
|
-
class={`torp-menu-check ${$props
|
|
68
|
+
{$props?.id}
|
|
69
|
+
class={`torp-menu-check ${$props?.class ?? ""}`.trim()}
|
|
66
70
|
type="button"
|
|
67
|
-
{$props
|
|
71
|
+
{$props?.disabled}
|
|
68
72
|
role="menuitemcheckbox"
|
|
69
|
-
aria-checked={$props
|
|
70
|
-
aria-disabled={$props
|
|
71
|
-
data-state={$props
|
|
72
|
-
data-disabled={$props
|
|
73
|
+
aria-checked={$props?.checked ? "true" : "false"}
|
|
74
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
75
|
+
data-state={$props?.checked ? "checked" : "unchecked"}
|
|
76
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
73
77
|
onkeydown={handleItemKey}
|
|
74
78
|
onclick={handleClick}
|
|
75
79
|
onfocus={() => handleItemFocus(index)}
|
package/src/Menu/MenuGroup.torp
CHANGED
|
@@ -11,17 +11,15 @@ interface MenuGroupProps {
|
|
|
11
11
|
/**
|
|
12
12
|
* A container for a logical group of menu items.
|
|
13
13
|
*/
|
|
14
|
-
export default function MenuGroup($props: MenuGroupProps) {
|
|
15
|
-
$props ??= $watch({});
|
|
16
|
-
|
|
14
|
+
export default function MenuGroup($props: MenuGroupProps | undefined) {
|
|
17
15
|
// TODO: Intercept the context to steal toggleItem??
|
|
18
16
|
|
|
19
17
|
@render {
|
|
20
18
|
<div
|
|
21
|
-
{$props
|
|
22
|
-
class={`torp-menu-group ${$props
|
|
19
|
+
{$props?.id}
|
|
20
|
+
class={`torp-menu-group ${$props?.class ?? ""}`.trim()}
|
|
23
21
|
role="group"
|
|
24
|
-
aria-label={$props
|
|
22
|
+
aria-label={$props?.ariaLabel}
|
|
25
23
|
>
|
|
26
24
|
<slot />
|
|
27
25
|
</div>
|
|
@@ -13,9 +13,7 @@ interface MenuIndicatorProps {
|
|
|
13
13
|
* An indicator for a MenuCheck or MenuRadio component, which is displayed
|
|
14
14
|
* when the value of checked is true.
|
|
15
15
|
*/
|
|
16
|
-
export default function MenuIndicator($props: MenuIndicatorProps) {
|
|
17
|
-
$props ??= $watch({});
|
|
18
|
-
|
|
16
|
+
export default function MenuIndicator($props: MenuIndicatorProps | undefined) {
|
|
19
17
|
// Get stuff out of the MenuButtonContext
|
|
20
18
|
const context = $context[MenuButtonContextName] as MenuButtonContext;
|
|
21
19
|
if (!context) {
|
|
@@ -26,10 +24,10 @@ export default function MenuIndicator($props: MenuIndicatorProps) {
|
|
|
26
24
|
@render {
|
|
27
25
|
@if ($state.checked) {
|
|
28
26
|
<div
|
|
29
|
-
{$props
|
|
30
|
-
class={`torp-menu-indicator ${$props
|
|
31
|
-
aria-disabled={$props
|
|
32
|
-
data-disabled={$props
|
|
27
|
+
{$props?.id}
|
|
28
|
+
class={`torp-menu-indicator ${$props?.class ?? ""}`.trim()}
|
|
29
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
30
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
33
31
|
>
|
|
34
32
|
<slot />
|
|
35
33
|
</div>
|
package/src/Menu/MenuPopout.torp
CHANGED
|
@@ -7,12 +7,12 @@ interface MenuPopoutProps {
|
|
|
7
7
|
class?: string,
|
|
8
8
|
/** Whether the popout is visible */
|
|
9
9
|
visible?: boolean,
|
|
10
|
-
/**
|
|
10
|
+
/** Raised when the popout is opened or closed */
|
|
11
11
|
ontoggle?: (open: boolean) => void,
|
|
12
|
-
/**
|
|
12
|
+
/** Raised when the popout has opened */
|
|
13
13
|
onopen?: () => void,
|
|
14
|
-
/**
|
|
15
|
-
onclose?: () => void,
|
|
14
|
+
/** Raised when the popout has closed */
|
|
15
|
+
onclose?: (result: any) => void,
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -22,17 +22,14 @@ interface MenuPopoutProps {
|
|
|
22
22
|
*
|
|
23
23
|
* ```
|
|
24
24
|
* <MenuPopout>
|
|
25
|
-
*
|
|
25
|
+
* <MenuPopoutTrigger /> (optional)
|
|
26
26
|
* <MenuPopoutContent />
|
|
27
27
|
* </MenuPopout>
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
|
-
export default function MenuPopout($props: MenuPopoutProps) {
|
|
31
|
-
$props ??= $watch({});
|
|
32
|
-
$props.visible ??= false;
|
|
33
|
-
|
|
30
|
+
export default function MenuPopout($props: MenuPopoutProps | undefined) {
|
|
34
31
|
let $state = $watch({
|
|
35
|
-
visible: $props
|
|
32
|
+
visible: $props?.visible ?? false
|
|
36
33
|
});
|
|
37
34
|
|
|
38
35
|
let result: any;
|
|
@@ -50,9 +47,9 @@ export default function MenuPopout($props: MenuPopoutProps) {
|
|
|
50
47
|
|
|
51
48
|
let firstToggle = true;
|
|
52
49
|
$run(() => {
|
|
53
|
-
const ontoggle = $props
|
|
54
|
-
const onopen = $props
|
|
55
|
-
const onclose = $props
|
|
50
|
+
const ontoggle = $props?.ontoggle;
|
|
51
|
+
const onopen = $props?.onopen;
|
|
52
|
+
const onclose = $props?.onclose;
|
|
56
53
|
const visible = $state.visible;
|
|
57
54
|
if (firstToggle) {
|
|
58
55
|
firstToggle = false;
|
|
@@ -72,8 +69,8 @@ export default function MenuPopout($props: MenuPopoutProps) {
|
|
|
72
69
|
|
|
73
70
|
@render {
|
|
74
71
|
<div
|
|
75
|
-
{$props
|
|
76
|
-
class={`torp-menu-popout ${$props
|
|
72
|
+
{$props?.id}
|
|
73
|
+
class={`torp-menu-popout ${$props?.class ?? ""}`.trim()}
|
|
77
74
|
onmouseleave={handleMouseLeave}
|
|
78
75
|
>
|
|
79
76
|
<slot />
|
|
@@ -16,11 +16,7 @@ interface MenuPopoutContentProps {
|
|
|
16
16
|
/**
|
|
17
17
|
* The content that is displayed for a MenuPopout when it is open.
|
|
18
18
|
*/
|
|
19
|
-
export default function MenuPopoutContent($props: MenuPopoutContentProps) {
|
|
20
|
-
$props ??= $watch({});
|
|
21
|
-
$props.side ??= "right";
|
|
22
|
-
$props.alignment ??= "start";
|
|
23
|
-
|
|
19
|
+
export default function MenuPopoutContent($props: MenuPopoutContentProps | undefined) {
|
|
24
20
|
let div: HTMLDivElement;
|
|
25
21
|
let shown = false;
|
|
26
22
|
|
|
@@ -65,14 +61,16 @@ export default function MenuPopoutContent($props: MenuPopoutContentProps) {
|
|
|
65
61
|
throw new Error("MenuPopoutContent must have an anchor element");
|
|
66
62
|
}
|
|
67
63
|
|
|
68
|
-
|
|
64
|
+
let side = $props?.side ?? "right";
|
|
65
|
+
let alignment = $props?.alignment ?? "start";
|
|
66
|
+
setPopoverPosition(popoutContext.anchorElement, div, side, alignment);
|
|
69
67
|
}
|
|
70
68
|
|
|
71
69
|
@render {
|
|
72
70
|
@if ($state.visible) {
|
|
73
71
|
<div
|
|
74
|
-
{$props
|
|
75
|
-
class={`torp-menu-popout-content ${$props
|
|
72
|
+
{$props?.id}
|
|
73
|
+
class={`torp-menu-popout-content ${$props?.class ?? ""}`.trim()}
|
|
76
74
|
&ref={div}
|
|
77
75
|
onmount={show}
|
|
78
76
|
>
|
|
@@ -19,10 +19,8 @@ interface MenuPopoutTriggerProps {
|
|
|
19
19
|
/**
|
|
20
20
|
* A button that is placed in a Menu or MenuGroup and signals a response by a user.
|
|
21
21
|
*/
|
|
22
|
-
export default function MenuPopoutTrigger($props: MenuPopoutTriggerProps) {
|
|
23
|
-
|
|
24
|
-
$props.hoverDelay ??= 500;
|
|
25
|
-
$props.disabled ??= false;
|
|
22
|
+
export default function MenuPopoutTrigger($props: MenuPopoutTriggerProps | undefined) {
|
|
23
|
+
let defaultHoverDelay = 500;
|
|
26
24
|
|
|
27
25
|
let button: HTMLButtonElement;
|
|
28
26
|
let interval: NodeJS.Timeout | undefined;
|
|
@@ -72,16 +70,16 @@ export default function MenuPopoutTrigger($props: MenuPopoutTriggerProps) {
|
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
function handleMouseEnter() {
|
|
75
|
-
if ($props
|
|
73
|
+
if ($props?.disabled) return;
|
|
76
74
|
|
|
77
75
|
// Handle the hover after a delay
|
|
78
76
|
if (!interval) {
|
|
79
|
-
interval = setTimeout(() => setVisible(true), $props
|
|
77
|
+
interval = setTimeout(() => setVisible(true), $props?.hoverDelay ?? defaultHoverDelay);
|
|
80
78
|
}
|
|
81
79
|
}
|
|
82
80
|
|
|
83
81
|
function handleMouseLeave() {
|
|
84
|
-
if ($props
|
|
82
|
+
if ($props?.disabled) return;
|
|
85
83
|
|
|
86
84
|
// Prevent short hovers or touches from firing the event
|
|
87
85
|
if (interval) {
|
|
@@ -91,26 +89,26 @@ export default function MenuPopoutTrigger($props: MenuPopoutTriggerProps) {
|
|
|
91
89
|
}
|
|
92
90
|
|
|
93
91
|
function handleMouseMove() {
|
|
94
|
-
if ($props
|
|
92
|
+
if ($props?.disabled) return;
|
|
95
93
|
|
|
96
94
|
// Reset the interval on mouse move
|
|
97
95
|
if (interval) {
|
|
98
96
|
clearTimeout(interval);
|
|
99
|
-
interval = setTimeout(() => setVisible(true), $props
|
|
97
|
+
interval = setTimeout(() => setVisible(true), $props?.hoverDelay ?? defaultHoverDelay);
|
|
100
98
|
}
|
|
101
99
|
}
|
|
102
100
|
|
|
103
101
|
@render {
|
|
104
102
|
<button
|
|
105
|
-
{$props
|
|
106
|
-
class={`torp-menu-popout-trigger ${$props
|
|
103
|
+
{$props?.id}
|
|
104
|
+
class={`torp-menu-popout-trigger ${$props?.class ?? ""}`.trim()}
|
|
107
105
|
type="button"
|
|
108
|
-
{$props
|
|
106
|
+
{$props?.disabled}
|
|
109
107
|
role="menuitem"
|
|
110
108
|
aria-haspopup="true"
|
|
111
109
|
aria-expanded={($state.visible ?? false).toString()}
|
|
112
|
-
aria-disabled={$props
|
|
113
|
-
data-disabled={$props
|
|
110
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
111
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
114
112
|
onkeydown={handlePopoutKey}
|
|
115
113
|
onclick={handleClick}
|
|
116
114
|
onfocus={() => handleItemFocus(index)}
|
package/src/Menu/MenuRadio.torp
CHANGED
|
@@ -24,15 +24,15 @@ interface MenuRadioProps {
|
|
|
24
24
|
* A button that is placed in a Menu or MenuGroup to allow the user to select
|
|
25
25
|
* from a number of options.
|
|
26
26
|
*/
|
|
27
|
-
export default function MenuRadio($props: MenuRadioProps) {
|
|
28
|
-
$props ??= $watch({});
|
|
29
|
-
|
|
27
|
+
export default function MenuRadio($props: MenuRadioProps | undefined) {
|
|
30
28
|
let $state = $watch({
|
|
31
|
-
checked: $props
|
|
29
|
+
checked: $props?.checked ?? false,
|
|
32
30
|
});
|
|
33
31
|
|
|
34
32
|
$run(() => {
|
|
35
|
-
$props
|
|
33
|
+
if ($props !== undefined) {
|
|
34
|
+
$props.checked = $state.checked;
|
|
35
|
+
}
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
let button: HTMLButtonElement;
|
|
@@ -55,7 +55,7 @@ export default function MenuRadio($props: MenuRadioProps) {
|
|
|
55
55
|
const { index } = registerItem(setFocused);
|
|
56
56
|
|
|
57
57
|
// Register this item with the parent MenuRadioGroup
|
|
58
|
-
registerItemInGroup($props
|
|
58
|
+
registerItemInGroup($props?.value ?? "", setChecked);
|
|
59
59
|
|
|
60
60
|
// Set the context to pass down to items
|
|
61
61
|
let context: MenuButtonContext = {
|
|
@@ -73,21 +73,21 @@ export default function MenuRadio($props: MenuRadioProps) {
|
|
|
73
73
|
|
|
74
74
|
function handleClick() {
|
|
75
75
|
if (!$state.checked) {
|
|
76
|
-
toggleItem($props
|
|
76
|
+
toggleItem($props?.value ?? "");
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
@render {
|
|
81
81
|
<button
|
|
82
|
-
{$props
|
|
83
|
-
class={`torp-menu-radio ${$props
|
|
82
|
+
{$props?.id}
|
|
83
|
+
class={`torp-menu-radio ${$props?.class ?? ""}`.trim()}
|
|
84
84
|
type="button"
|
|
85
|
-
{$props
|
|
85
|
+
{$props?.disabled}
|
|
86
86
|
role="menuitemradio"
|
|
87
|
-
aria-checked={$props
|
|
88
|
-
aria-disabled={$props
|
|
89
|
-
data-state={$props
|
|
90
|
-
data-disabled={$props
|
|
87
|
+
aria-checked={$props?.checked}
|
|
88
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
89
|
+
data-state={$props?.checked ? "checked" : "unchecked"}
|
|
90
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
91
91
|
onkeydown={handleItemKey}
|
|
92
92
|
onclick={handleClick}
|
|
93
93
|
onfocus={() => handleItemFocus(index)}
|