@torpor/ui 0.2.0 → 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 +35 -0
- package/dist/Accordion/Accordion.torp +44 -25
- package/dist/Accordion/AccordionContent.torp +18 -12
- package/dist/Accordion/AccordionHeader.torp +15 -8
- package/dist/Accordion/AccordionItem.torp +34 -17
- package/dist/Accordion/AccordionTrigger.torp +17 -10
- package/dist/Accordion/AccordionTypes.ts +6 -3
- package/dist/Accordion/index.d.ts +100 -35
- package/dist/Breadcrumb/Breadcrumb.torp +18 -10
- package/dist/Breadcrumb/BreadcrumbItem.torp +14 -7
- package/dist/Breadcrumb/BreadcrumbSeparator.torp +10 -3
- package/dist/Breadcrumb/index.d.ts +50 -21
- package/dist/Calendar/Calendar.torp +21 -14
- package/dist/Calendar/CalendarDay.torp +12 -4
- package/dist/Calendar/index.d.ts +16 -18
- package/dist/Contextual/Contextual.torp +125 -0
- package/dist/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +21 -12
- 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 +49 -73
- package/dist/Dialog/DialogBody.torp +15 -9
- package/dist/Dialog/DialogButton.torp +27 -13
- package/dist/Dialog/DialogFooter.torp +11 -3
- package/dist/Dialog/DialogHeader.torp +15 -8
- package/dist/Dialog/DialogTypes.ts +3 -2
- package/dist/Dialog/index.d.ts +83 -35
- package/dist/Disclosure/Disclosure.torp +34 -25
- package/dist/Disclosure/DisclosureContent.torp +18 -12
- package/dist/Disclosure/DisclosureHeader.torp +16 -9
- package/dist/Disclosure/DisclosureTrigger.torp +15 -8
- package/dist/Disclosure/DisclosureTypes.ts +0 -1
- package/dist/Disclosure/index.d.ts +67 -28
- package/dist/Drawer/Drawer.torp +109 -68
- 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 +96 -8
- package/dist/Drawer/index.js +13 -1
- package/dist/Form/Field.torp +91 -0
- package/dist/Form/Form.torp +129 -0
- package/dist/Form/FormTypes.ts +30 -0
- package/dist/Form/Input.torp +97 -0
- package/dist/Form/Label.torp +31 -0
- package/dist/Form/Message.torp +35 -0
- package/dist/Form/StandardSchemaV1.ts +70 -0
- package/dist/Form/index.d.ts +131 -0
- package/dist/Form/index.js +22 -0
- package/dist/Form/index.js.map +1 -0
- package/dist/Menu/Menu.torp +25 -15
- package/dist/Menu/MenuButton.torp +30 -13
- package/dist/Menu/MenuCheck.torp +29 -14
- package/dist/Menu/MenuGroup.torp +14 -6
- package/dist/Menu/MenuIndicator.torp +14 -7
- package/dist/Menu/MenuPopout.torp +23 -15
- package/dist/Menu/MenuPopoutContent.torp +17 -10
- package/dist/Menu/MenuPopoutTrigger.torp +23 -16
- package/dist/Menu/MenuRadio.torp +27 -16
- package/dist/Menu/MenuRadioGroup.torp +34 -15
- package/dist/Menu/MenuSeparator.torp +11 -3
- package/dist/Menu/MenuTypes.ts +7 -5
- package/dist/Menu/index.d.ts +176 -77
- package/dist/MenuBar/MenuBar.torp +24 -16
- package/dist/MenuBar/MenuBarItem.torp +24 -16
- package/dist/MenuBar/MenuBarItemContent.torp +18 -11
- package/dist/MenuBar/MenuBarItemTrigger.torp +15 -9
- package/dist/MenuBar/index.d.ts +79 -28
- 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 +18 -10
- package/dist/NavMenu/NavMenuButton.torp +15 -10
- package/dist/NavMenu/NavMenuElement.torp +19 -11
- package/dist/NavMenu/NavMenuGroup.torp +13 -6
- package/dist/NavMenu/NavMenuGroupHeader.torp +15 -8
- package/dist/NavMenu/NavMenuLink.torp +21 -16
- package/dist/NavMenu/NavMenuPopout.torp +34 -18
- package/dist/NavMenu/NavMenuPopoutButton.torp +23 -18
- package/dist/NavMenu/NavMenuPopoutContent.torp +23 -13
- package/dist/NavMenu/NavMenuSeparator.torp +10 -3
- package/dist/NavMenu/index.d.ts +153 -70
- package/dist/Notification/Notification.torp +35 -16
- package/dist/Notification/NotificationClose.torp +10 -3
- package/dist/Notification/NotificationContainer.torp +11 -3
- package/dist/Notification/NotificationContent.torp +11 -3
- package/dist/Notification/index.d.ts +46 -28
- package/dist/Popover/Popover.torp +48 -28
- package/dist/Popover/PopoverContent.torp +42 -8
- package/dist/Popover/PopoverTrigger.torp +32 -3
- package/dist/Popover/PopoverTypes.ts +1 -1
- package/dist/Popover/index.d.ts +48 -111
- package/dist/Popover/index.js +1 -163
- package/dist/Popover/index.js.map +1 -1
- package/dist/TabGroup/TabContent.torp +20 -11
- package/dist/TabGroup/TabGroup.torp +58 -40
- package/dist/TabGroup/TabGroupTypes.ts +10 -5
- package/dist/TabGroup/TabHeader.torp +26 -10
- package/dist/TabGroup/TabList.torp +14 -7
- package/dist/TabGroup/TabTrigger.torp +17 -10
- package/dist/TabGroup/index.d.ts +101 -35
- package/dist/icons/ArrowDown.torp +5 -3
- package/dist/icons/ArrowLeft.torp +5 -3
- package/dist/icons/ArrowRight.torp +5 -3
- package/dist/icons/ArrowUp.torp +5 -3
- package/dist/icons/Bars.torp +5 -3
- package/dist/icons/Check.torp +5 -3
- package/dist/icons/ChevronDown.torp +5 -3
- package/dist/icons/ChevronLeft.torp +5 -3
- package/dist/icons/ChevronRight.torp +5 -3
- package/dist/icons/ChevronUp.torp +5 -3
- package/dist/icons/Cross.torp +5 -3
- package/dist/icons/IconTypes.ts +6 -0
- package/dist/icons/Loading.torp +5 -3
- package/dist/icons/Minus.torp +5 -3
- package/dist/icons/Plus.torp +5 -3
- package/dist/icons/index.d.ts +271 -126
- 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 +28 -12
- package/scripts/postbuild.ts +11 -1
- package/src/Accordion/Accordion.torp +44 -25
- package/src/Accordion/AccordionContent.torp +18 -12
- package/src/Accordion/AccordionHeader.torp +15 -8
- package/src/Accordion/AccordionItem.torp +34 -17
- package/src/Accordion/AccordionTrigger.torp +17 -10
- package/src/Accordion/AccordionTypes.ts +6 -3
- package/src/Breadcrumb/Breadcrumb.torp +18 -10
- package/src/Breadcrumb/BreadcrumbItem.torp +14 -7
- package/src/Breadcrumb/BreadcrumbSeparator.torp +10 -3
- package/src/Calendar/Calendar.torp +21 -14
- package/src/Calendar/CalendarDay.torp +12 -4
- package/src/Contextual/Contextual.torp +125 -0
- package/src/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +21 -12
- 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 +49 -73
- package/src/Dialog/DialogBody.torp +15 -9
- package/src/Dialog/DialogButton.torp +27 -13
- package/src/Dialog/DialogFooter.torp +11 -3
- package/src/Dialog/DialogHeader.torp +15 -8
- package/src/Dialog/DialogTypes.ts +3 -2
- package/src/Disclosure/Disclosure.torp +34 -25
- package/src/Disclosure/DisclosureContent.torp +18 -12
- package/src/Disclosure/DisclosureHeader.torp +16 -9
- package/src/Disclosure/DisclosureTrigger.torp +15 -8
- package/src/Disclosure/DisclosureTypes.ts +0 -1
- package/src/Drawer/Drawer.torp +109 -68
- 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 +91 -0
- package/src/Form/Form.torp +129 -0
- package/src/Form/FormTypes.ts +30 -0
- package/src/Form/Input.torp +97 -0
- package/src/Form/Label.torp +31 -0
- package/src/Form/Message.torp +35 -0
- package/src/Form/StandardSchemaV1.ts +70 -0
- package/src/Form/index.ts +7 -0
- package/src/Menu/Menu.torp +25 -15
- package/src/Menu/MenuButton.torp +30 -13
- package/src/Menu/MenuCheck.torp +29 -14
- package/src/Menu/MenuGroup.torp +14 -6
- package/src/Menu/MenuIndicator.torp +14 -7
- package/src/Menu/MenuPopout.torp +23 -15
- package/src/Menu/MenuPopoutContent.torp +17 -10
- package/src/Menu/MenuPopoutTrigger.torp +23 -16
- package/src/Menu/MenuRadio.torp +27 -16
- package/src/Menu/MenuRadioGroup.torp +34 -15
- package/src/Menu/MenuSeparator.torp +11 -3
- package/src/Menu/MenuTypes.ts +7 -5
- package/src/MenuBar/MenuBar.torp +24 -16
- package/src/MenuBar/MenuBarItem.torp +24 -16
- package/src/MenuBar/MenuBarItemContent.torp +18 -11
- package/src/MenuBar/MenuBarItemTrigger.torp +15 -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 +18 -10
- package/src/NavMenu/NavMenuButton.torp +15 -10
- package/src/NavMenu/NavMenuElement.torp +19 -11
- package/src/NavMenu/NavMenuGroup.torp +13 -6
- package/src/NavMenu/NavMenuGroupHeader.torp +15 -8
- package/src/NavMenu/NavMenuLink.torp +21 -16
- package/src/NavMenu/NavMenuPopout.torp +34 -18
- package/src/NavMenu/NavMenuPopoutButton.torp +23 -18
- package/src/NavMenu/NavMenuPopoutContent.torp +23 -13
- package/src/NavMenu/NavMenuSeparator.torp +10 -3
- package/src/Notification/Notification.torp +35 -16
- package/src/Notification/NotificationClose.torp +10 -3
- package/src/Notification/NotificationContainer.torp +11 -3
- package/src/Notification/NotificationContent.torp +11 -3
- package/src/Popover/Popover.torp +48 -28
- package/src/Popover/PopoverContent.torp +42 -8
- package/src/Popover/PopoverTrigger.torp +32 -3
- 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 +20 -11
- package/src/TabGroup/TabGroup.torp +58 -40
- package/src/TabGroup/TabGroupTypes.ts +10 -5
- package/src/TabGroup/TabHeader.torp +26 -10
- package/src/TabGroup/TabList.torp +14 -7
- package/src/TabGroup/TabTrigger.torp +17 -10
- package/src/icons/ArrowDown.torp +5 -3
- package/src/icons/ArrowLeft.torp +5 -3
- package/src/icons/ArrowRight.torp +5 -3
- package/src/icons/ArrowUp.torp +5 -3
- package/src/icons/Bars.torp +5 -3
- package/src/icons/Check.torp +5 -3
- package/src/icons/ChevronDown.torp +5 -3
- package/src/icons/ChevronLeft.torp +5 -3
- package/src/icons/ChevronRight.torp +5 -3
- package/src/icons/ChevronUp.torp +5 -3
- package/src/icons/Cross.torp +5 -3
- package/src/icons/IconTypes.ts +6 -0
- package/src/icons/Loading.torp +5 -3
- package/src/icons/Minus.torp +5 -3
- package/src/icons/Plus.torp +5 -3
- 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 -1
- package/test/Accordion/components/AccordionKeyboard.torp +1 -1
- package/test/Accordion/components/AccordionList.torp +1 -1
- package/test/Accordion/components/AccordionMultiple.torp +2 -2
- package/test/Accordion/components/AccordionSingle.torp +2 -2
- 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/accessibility.test.ts +3 -2
- package/test/Disclosure/components/DisclosureTest.torp +1 -1
- package/test/Disclosure/toggle.test.ts +3 -2
- package/test/Form/components/FieldTest.torp +25 -0
- package/test/Form/components/FormTest.torp +31 -0
- package/test/Form/components/InputTest.torp +9 -0
- package/test/Form/field.test.ts +34 -0
- package/test/Form/form.test.ts +34 -0
- package/test/Form/input.test.ts +19 -0
- package/test/Menu/accessibility.test.ts +3 -2
- package/test/Menu/basic.test.ts +11 -10
- package/test/Menu/components/MenuAccessibility.torp +5 -5
- package/test/Menu/components/MenuBasic.torp +5 -5
- package/test/MenuBar/accessibility.test.ts +3 -2
- package/test/MenuBar/basic.test.ts +3 -2
- package/test/NavMenu/basic.test.ts +1 -1
- package/test/NavMenu/components/{NavMenu.torp → NavMenuBasic.torp} +1 -1
- 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 -1
- package/test/TabGroup/components/TabGroupKeyboard.torp +1 -1
- package/test/TabGroup/components/TabGroupList.torp +1 -1
- package/test/TabGroup/components/TabGroupTrigger.torp +1 -1
- package/tsup.config.ts +3 -1
- package/dist/Popover/PopoverContentAnchored.torp +0 -106
- package/dist/Popover/PopoverOverlay.torp +0 -30
- package/dist/Popover/PopoverTriggerContextual.torp +0 -37
- package/dist/Popover/PopoverTriggerHover.torp +0 -38
- 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 -106
- package/src/Popover/PopoverOverlay.torp +0 -30
- package/src/Popover/PopoverTriggerContextual.torp +0 -37
- package/src/Popover/PopoverTriggerHover.torp +0 -38
- 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
|
@@ -5,15 +5,22 @@ import {
|
|
|
5
5
|
type MenuPopoutContext
|
|
6
6
|
} from "./MenuTypes";
|
|
7
7
|
|
|
8
|
+
interface MenuPopoutTriggerProps {
|
|
9
|
+
/** An ID for the root element */
|
|
10
|
+
id?: string;
|
|
11
|
+
/** Class name(s) for the root element */
|
|
12
|
+
class?: string,
|
|
13
|
+
/** The delay before showing the popout, in milliseconds */
|
|
14
|
+
hoverDelay?: number,
|
|
15
|
+
/** Whether this button is disabled */
|
|
16
|
+
disabled?: boolean,
|
|
17
|
+
}
|
|
18
|
+
|
|
8
19
|
/**
|
|
9
20
|
* A button that is placed in a Menu or MenuGroup and signals a response by a user.
|
|
10
|
-
*
|
|
11
|
-
* @prop {number} hoverDelay -- The delay before showing the popout, in milliseconds
|
|
12
|
-
* @prop {boolean} disabled -- Whether this button is disabled
|
|
13
21
|
*/
|
|
14
|
-
export default function MenuPopoutTrigger() {
|
|
15
|
-
|
|
16
|
-
$props.disabled ??= false;
|
|
22
|
+
export default function MenuPopoutTrigger($props: MenuPopoutTriggerProps | undefined) {
|
|
23
|
+
let defaultHoverDelay = 500;
|
|
17
24
|
|
|
18
25
|
let button: HTMLButtonElement;
|
|
19
26
|
let interval: NodeJS.Timeout | undefined;
|
|
@@ -63,16 +70,16 @@ export default function MenuPopoutTrigger() {
|
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
function handleMouseEnter() {
|
|
66
|
-
if ($props
|
|
73
|
+
if ($props?.disabled) return;
|
|
67
74
|
|
|
68
75
|
// Handle the hover after a delay
|
|
69
76
|
if (!interval) {
|
|
70
|
-
interval = setTimeout(() => setVisible(true), $props
|
|
77
|
+
interval = setTimeout(() => setVisible(true), $props?.hoverDelay ?? defaultHoverDelay);
|
|
71
78
|
}
|
|
72
79
|
}
|
|
73
80
|
|
|
74
81
|
function handleMouseLeave() {
|
|
75
|
-
if ($props
|
|
82
|
+
if ($props?.disabled) return;
|
|
76
83
|
|
|
77
84
|
// Prevent short hovers or touches from firing the event
|
|
78
85
|
if (interval) {
|
|
@@ -82,26 +89,26 @@ export default function MenuPopoutTrigger() {
|
|
|
82
89
|
}
|
|
83
90
|
|
|
84
91
|
function handleMouseMove() {
|
|
85
|
-
if ($props
|
|
92
|
+
if ($props?.disabled) return;
|
|
86
93
|
|
|
87
94
|
// Reset the interval on mouse move
|
|
88
95
|
if (interval) {
|
|
89
96
|
clearTimeout(interval);
|
|
90
|
-
interval = setTimeout(() => setVisible(true), $props
|
|
97
|
+
interval = setTimeout(() => setVisible(true), $props?.hoverDelay ?? defaultHoverDelay);
|
|
91
98
|
}
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
@render {
|
|
95
102
|
<button
|
|
96
|
-
{$props
|
|
97
|
-
class={`torp-menu-popout-trigger ${$props
|
|
103
|
+
{$props?.id}
|
|
104
|
+
class={`torp-menu-popout-trigger ${$props?.class ?? ""}`.trim()}
|
|
98
105
|
type="button"
|
|
99
|
-
{$props
|
|
106
|
+
{$props?.disabled}
|
|
100
107
|
role="menuitem"
|
|
101
108
|
aria-haspopup="true"
|
|
102
109
|
aria-expanded={($state.visible ?? false).toString()}
|
|
103
|
-
aria-disabled={$props
|
|
104
|
-
data-disabled={$props
|
|
110
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
111
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
105
112
|
onkeydown={handlePopoutKey}
|
|
106
113
|
onclick={handleClick}
|
|
107
114
|
onfocus={() => handleItemFocus(index)}
|
package/src/Menu/MenuRadio.torp
CHANGED
|
@@ -7,21 +7,32 @@ import {
|
|
|
7
7
|
type MenuRadioGroupContext
|
|
8
8
|
} from "./MenuTypes";
|
|
9
9
|
|
|
10
|
+
interface MenuRadioProps {
|
|
11
|
+
/** An ID for the root element */
|
|
12
|
+
id?: string;
|
|
13
|
+
/** Class name(s) for the root element */
|
|
14
|
+
class?: string,
|
|
15
|
+
/** The value of the item */
|
|
16
|
+
value?: string,
|
|
17
|
+
/** Whether this item is checked */
|
|
18
|
+
checked?: boolean,
|
|
19
|
+
/** Whether this item is disabled */
|
|
20
|
+
disabled?: boolean,
|
|
21
|
+
}
|
|
22
|
+
|
|
10
23
|
/**
|
|
11
24
|
* A button that is placed in a Menu or MenuGroup to allow the user to select
|
|
12
25
|
* from a number of options.
|
|
13
|
-
*
|
|
14
|
-
* @prop {string} value -- The value of the item
|
|
15
|
-
* @prop {boolean} checked -- Whether this item is checked
|
|
16
|
-
* @prop {boolean} disabled -- Whether this item is disabled
|
|
17
26
|
*/
|
|
18
|
-
export default function MenuRadio() {
|
|
27
|
+
export default function MenuRadio($props: MenuRadioProps | undefined) {
|
|
19
28
|
let $state = $watch({
|
|
20
|
-
checked: $props
|
|
29
|
+
checked: $props?.checked ?? false,
|
|
21
30
|
});
|
|
22
31
|
|
|
23
32
|
$run(() => {
|
|
24
|
-
$props
|
|
33
|
+
if ($props !== undefined) {
|
|
34
|
+
$props.checked = $state.checked;
|
|
35
|
+
}
|
|
25
36
|
});
|
|
26
37
|
|
|
27
38
|
let button: HTMLButtonElement;
|
|
@@ -44,7 +55,7 @@ export default function MenuRadio() {
|
|
|
44
55
|
const { index } = registerItem(setFocused);
|
|
45
56
|
|
|
46
57
|
// Register this item with the parent MenuRadioGroup
|
|
47
|
-
registerItemInGroup($props
|
|
58
|
+
registerItemInGroup($props?.value ?? "", setChecked);
|
|
48
59
|
|
|
49
60
|
// Set the context to pass down to items
|
|
50
61
|
let context: MenuButtonContext = {
|
|
@@ -62,21 +73,21 @@ export default function MenuRadio() {
|
|
|
62
73
|
|
|
63
74
|
function handleClick() {
|
|
64
75
|
if (!$state.checked) {
|
|
65
|
-
toggleItem($props
|
|
76
|
+
toggleItem($props?.value ?? "");
|
|
66
77
|
}
|
|
67
78
|
}
|
|
68
79
|
|
|
69
80
|
@render {
|
|
70
81
|
<button
|
|
71
|
-
{$props
|
|
72
|
-
class={`torp-menu-radio ${$props
|
|
82
|
+
{$props?.id}
|
|
83
|
+
class={`torp-menu-radio ${$props?.class ?? ""}`.trim()}
|
|
73
84
|
type="button"
|
|
74
|
-
{$props
|
|
85
|
+
{$props?.disabled}
|
|
75
86
|
role="menuitemradio"
|
|
76
|
-
aria-checked={$props
|
|
77
|
-
aria-disabled={$props
|
|
78
|
-
data-state={$props
|
|
79
|
-
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}
|
|
80
91
|
onkeydown={handleItemKey}
|
|
81
92
|
onclick={handleClick}
|
|
82
93
|
onfocus={() => handleItemFocus(index)}
|
|
@@ -4,17 +4,36 @@ import {
|
|
|
4
4
|
type RadioGroupItemState
|
|
5
5
|
} from "./MenuTypes";
|
|
6
6
|
|
|
7
|
+
interface MenuRadioGroupProps {
|
|
8
|
+
/** An ID for the root element */
|
|
9
|
+
id?: string;
|
|
10
|
+
/** Class name(s) for the root element */
|
|
11
|
+
class?: string,
|
|
12
|
+
/** An ARIA label for describing the menu to screen readers */
|
|
13
|
+
ariaLabel?: string,
|
|
14
|
+
/** The value of the checked MenuRadio */
|
|
15
|
+
value?: string | undefined,
|
|
16
|
+
/** Raised when the checked item has changed */
|
|
17
|
+
onchange?: (value: any) => void,
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
/**
|
|
8
21
|
* A container for a logical group of menu RadioGroup items.
|
|
9
|
-
*
|
|
10
|
-
* @prop {string} ariaLabel -- An ARIA label for describing the menu to screen readers
|
|
11
|
-
* @prop {string | undefined} value -- The value of the checked MenuRadio
|
|
12
|
-
* @prop {(any) => void} onchange - Called when the checked item has changed
|
|
13
22
|
*/
|
|
14
|
-
export default function MenuRadioGroup() {
|
|
23
|
+
export default function MenuRadioGroup($props: MenuRadioGroupProps | undefined) {
|
|
15
24
|
// A collection containing the state and some functions for each item
|
|
16
25
|
let itemStates: RadioGroupItemState[] = [];
|
|
17
26
|
|
|
27
|
+
let $state = $watch({
|
|
28
|
+
value: $props?.value
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
$run(() => {
|
|
32
|
+
if ($props !== undefined) {
|
|
33
|
+
$props.value = $state.value;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
18
37
|
// Set the context to pass down to items
|
|
19
38
|
let context: MenuRadioGroupContext = {
|
|
20
39
|
registerItemInGroup,
|
|
@@ -24,11 +43,11 @@ export default function MenuRadioGroup() {
|
|
|
24
43
|
|
|
25
44
|
$mount(() => {
|
|
26
45
|
// Set the initial checked item
|
|
27
|
-
setValue($props
|
|
46
|
+
setValue($props?.value);
|
|
28
47
|
});
|
|
29
48
|
|
|
30
49
|
function registerItemInGroup(itemValue: string, setChecked: (value: boolean) => void) {
|
|
31
|
-
// Add the item
|
|
50
|
+
// Add the item's state to the array
|
|
32
51
|
const newItemState: RadioGroupItemState = {
|
|
33
52
|
value: itemValue,
|
|
34
53
|
checked: false,
|
|
@@ -52,11 +71,11 @@ export default function MenuRadioGroup() {
|
|
|
52
71
|
}
|
|
53
72
|
|
|
54
73
|
// Set the value
|
|
55
|
-
if ($
|
|
56
|
-
$
|
|
74
|
+
if ($state.value !== newValue) {
|
|
75
|
+
$state.value = newValue;
|
|
57
76
|
|
|
58
|
-
if ($props
|
|
59
|
-
$props
|
|
77
|
+
if ($props?.onchange) {
|
|
78
|
+
$props?.onchange($props?.value);
|
|
60
79
|
}
|
|
61
80
|
}
|
|
62
81
|
}
|
|
@@ -70,15 +89,15 @@ export default function MenuRadioGroup() {
|
|
|
70
89
|
newValue = item.value;
|
|
71
90
|
}
|
|
72
91
|
}
|
|
73
|
-
$
|
|
92
|
+
$state.value = newValue;
|
|
74
93
|
}
|
|
75
94
|
|
|
76
95
|
@render {
|
|
77
96
|
<div
|
|
78
|
-
{$props
|
|
79
|
-
class={`torp-menu-radio-group ${$props
|
|
97
|
+
{$props?.id}
|
|
98
|
+
class={`torp-menu-radio-group ${$props?.class ?? ""}`.trim()}
|
|
80
99
|
role="group"
|
|
81
|
-
aria-label={$props
|
|
100
|
+
aria-label={$props?.ariaLabel}
|
|
82
101
|
>
|
|
83
102
|
<slot />
|
|
84
103
|
</div>
|
|
@@ -1,11 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
interface MenuSeparatorProps {
|
|
3
|
+
/** An ID for the root element */
|
|
4
|
+
id?: string;
|
|
5
|
+
/** Class name(s) for the root element */
|
|
6
|
+
class?: string,
|
|
7
|
+
}
|
|
8
|
+
|
|
1
9
|
/**
|
|
2
10
|
* An element in a menu that separates logical sets of menu items.
|
|
3
11
|
*/
|
|
4
|
-
export default function MenuSeparator() {
|
|
12
|
+
export default function MenuSeparator($props: MenuSeparatorProps | undefined) {
|
|
5
13
|
@render {
|
|
6
14
|
<div
|
|
7
|
-
{$props
|
|
8
|
-
class={`torp-menu-separator ${$props
|
|
15
|
+
{$props?.id}
|
|
16
|
+
class={`torp-menu-separator ${$props?.class ?? ""}`.trim()}
|
|
9
17
|
role="separator"
|
|
10
18
|
>
|
|
11
19
|
<slot />
|
package/src/Menu/MenuTypes.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface MenuContext {
|
|
|
7
7
|
setVisible: (value: boolean, result?: any) => void;
|
|
8
8
|
|
|
9
9
|
/** Called from a MenuButton to close the Menu and return a result */
|
|
10
|
-
|
|
10
|
+
handleButton: (type: "confirm" | "cancel" | undefined, value?: any) => void;
|
|
11
11
|
|
|
12
12
|
/** Called from a MenuButton when its button is focused */
|
|
13
13
|
handleItemFocus: (index: number) => void;
|
|
@@ -15,10 +15,7 @@ export interface MenuContext {
|
|
|
15
15
|
/** Called from a MenuButton when a key is pressed */
|
|
16
16
|
handleItemKey: (e: KeyboardEvent) => void;
|
|
17
17
|
|
|
18
|
-
state:
|
|
19
|
-
/** Whether the Menu is visible. Writable so that it can be subscribed to by children */
|
|
20
|
-
visible: boolean;
|
|
21
|
-
};
|
|
18
|
+
state: MenuState;
|
|
22
19
|
|
|
23
20
|
/** The element that caused this Menu to be shown */
|
|
24
21
|
anchorElement?: HTMLElement;
|
|
@@ -27,6 +24,11 @@ export interface MenuContext {
|
|
|
27
24
|
registerItem: (setFocused: () => void) => { index: number };
|
|
28
25
|
}
|
|
29
26
|
|
|
27
|
+
export interface MenuState {
|
|
28
|
+
/** Whether the Menu is visible */
|
|
29
|
+
visible: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
30
32
|
export interface MenuButtonContext {
|
|
31
33
|
state: {
|
|
32
34
|
checked: boolean;
|
package/src/MenuBar/MenuBar.torp
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { MenuBarContextName, type MenuBarContext, type ItemState } from "./MenuBarTypes";
|
|
2
2
|
|
|
3
|
+
interface MenuBarProps {
|
|
4
|
+
/** An ID for the root element */
|
|
5
|
+
id?: string;
|
|
6
|
+
/** Class name(s) for the root element */
|
|
7
|
+
class?: string,
|
|
8
|
+
/** An ARIA label for describing the menu to screen readers */
|
|
9
|
+
ariaLabel?: string,
|
|
10
|
+
/** The orientation of the menu, which affects keyboard navigation */
|
|
11
|
+
orientation?: "horizontal" | "vertical",
|
|
12
|
+
}
|
|
13
|
+
|
|
3
14
|
/**
|
|
4
15
|
* A menu bar, similar to that shown at the top of Windows applications or at the top of the screen on Macs.
|
|
5
16
|
*
|
|
@@ -9,20 +20,17 @@ import { MenuBarContextName, type MenuBarContext, type ItemState } from "./MenuB
|
|
|
9
20
|
*
|
|
10
21
|
* ```
|
|
11
22
|
* <MenuBar>
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
23
|
+
* <MenuBarItem>
|
|
24
|
+
* <MenuBarItemTrigger />
|
|
25
|
+
* <MenuBarItemContent>
|
|
26
|
+
* <Menu />
|
|
27
|
+
* </MenuBarItemContent>
|
|
28
|
+
* </MenuBarItem>
|
|
18
29
|
* </MenuBar>
|
|
19
30
|
* ```
|
|
20
|
-
*
|
|
21
|
-
* @prop {string} ariaLabel -- An ARIA label for describing the menu to screen readers
|
|
22
|
-
* @prop {"horizontal" | "vertical"} orientation -- The orientation of the menu, which affects keyboard navigation
|
|
23
31
|
*/
|
|
24
|
-
export default function MenuBar() {
|
|
25
|
-
$props
|
|
32
|
+
export default function MenuBar($props: MenuBarProps | undefined) {
|
|
33
|
+
let orientation = $props?.orientation ?? "horizontal";
|
|
26
34
|
|
|
27
35
|
let $state = $watch({
|
|
28
36
|
active: false,
|
|
@@ -43,7 +51,7 @@ export default function MenuBar() {
|
|
|
43
51
|
$context[MenuBarContextName] = context;
|
|
44
52
|
|
|
45
53
|
function registerItem(setVisible: (value: boolean) => void, setFocused: () => void) {
|
|
46
|
-
// Add the item
|
|
54
|
+
// Add the item's state to the array and return its index
|
|
47
55
|
const newItemState: ItemState = {
|
|
48
56
|
setVisible,
|
|
49
57
|
setFocused
|
|
@@ -137,12 +145,12 @@ export default function MenuBar() {
|
|
|
137
145
|
|
|
138
146
|
@render {
|
|
139
147
|
<div
|
|
140
|
-
{$props
|
|
141
|
-
class={`torp-menu-bar ${$props
|
|
148
|
+
{$props?.id}
|
|
149
|
+
class={`torp-menu-bar ${$props?.class ?? ""}`.trim()}
|
|
142
150
|
tabindex="-1"
|
|
143
151
|
role="menubar"
|
|
144
|
-
aria-label={$props
|
|
145
|
-
aria-orientation={
|
|
152
|
+
aria-label={$props?.ariaLabel}
|
|
153
|
+
aria-orientation={orientation}
|
|
146
154
|
>
|
|
147
155
|
<slot />
|
|
148
156
|
</div>
|
|
@@ -6,6 +6,21 @@ import {
|
|
|
6
6
|
} from "./MenuBarTypes";
|
|
7
7
|
import { PopoverContextName, type PopoverContext } from "../Popover/PopoverTypes";
|
|
8
8
|
|
|
9
|
+
interface MenuBarItemProps {
|
|
10
|
+
/** An ID for the root element */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Class name(s) for the root element */
|
|
13
|
+
class?: string,
|
|
14
|
+
/** Whether the item is visible */
|
|
15
|
+
visible?: boolean,
|
|
16
|
+
/** Raised when the item is opened or closed */
|
|
17
|
+
ontoggle?: (visible: boolean) => void,
|
|
18
|
+
/** Raised when the item has opened */
|
|
19
|
+
onopen?: () => void,
|
|
20
|
+
/** Raised when the item has closed */
|
|
21
|
+
onclose?: (result: any) => void,
|
|
22
|
+
}
|
|
23
|
+
|
|
9
24
|
/**
|
|
10
25
|
* A popout that is attached to a menubar button and can be used to show a submenu.
|
|
11
26
|
*
|
|
@@ -13,21 +28,14 @@ import { PopoverContextName, type PopoverContext } from "../Popover/PopoverTypes
|
|
|
13
28
|
*
|
|
14
29
|
* ```
|
|
15
30
|
* <MenuBarItem>
|
|
16
|
-
*
|
|
17
|
-
*
|
|
31
|
+
* <MenuBarItemTrigger /> (optional)
|
|
32
|
+
* <MenuBarItemContent />
|
|
18
33
|
* </MenuBarItem>
|
|
19
34
|
* ```
|
|
20
|
-
*
|
|
21
|
-
* @prop {boolean} visible -- Whether the item is visible
|
|
22
|
-
* @prop {(boolean) => void} ontoggle -- Called when the item is opened or closed
|
|
23
|
-
* @prop {() => void} onopen -- Called when the item has opened
|
|
24
|
-
* @prop {() => void} onclose -- Called when the item has closed
|
|
25
35
|
*/
|
|
26
|
-
export default function MenuBarItem() {
|
|
27
|
-
$props.visible ??= false;
|
|
28
|
-
|
|
36
|
+
export default function MenuBarItem($props: MenuBarItemProps | undefined) {
|
|
29
37
|
let $state = $watch({
|
|
30
|
-
visible: $props
|
|
38
|
+
visible: $props?.visible ?? false
|
|
31
39
|
});
|
|
32
40
|
|
|
33
41
|
let result: any;
|
|
@@ -72,9 +80,9 @@ export default function MenuBarItem() {
|
|
|
72
80
|
|
|
73
81
|
let firstToggle = true;
|
|
74
82
|
$run(() => {
|
|
75
|
-
const ontoggle = $props
|
|
76
|
-
const onopen = $props
|
|
77
|
-
const onclose = $props
|
|
83
|
+
const ontoggle = $props?.ontoggle;
|
|
84
|
+
const onopen = $props?.onopen;
|
|
85
|
+
const onclose = $props?.onclose;
|
|
78
86
|
const visible = $state.visible;
|
|
79
87
|
if (firstToggle) {
|
|
80
88
|
firstToggle = false;
|
|
@@ -95,8 +103,8 @@ export default function MenuBarItem() {
|
|
|
95
103
|
|
|
96
104
|
@render {
|
|
97
105
|
<div
|
|
98
|
-
{$props
|
|
99
|
-
class={`torp-menu-bar-item ${$props
|
|
106
|
+
{$props?.id}
|
|
107
|
+
class={`torp-menu-bar-item ${$props?.class ?? ""}`.trim()}
|
|
100
108
|
>
|
|
101
109
|
<slot />
|
|
102
110
|
</div>
|
|
@@ -7,16 +7,21 @@ import {
|
|
|
7
7
|
type MenuBarItemContext
|
|
8
8
|
} from "./MenuBarTypes";
|
|
9
9
|
|
|
10
|
+
interface MenuBarItemContentProps {
|
|
11
|
+
/** An ID for the root element */
|
|
12
|
+
id?: string;
|
|
13
|
+
/** Class name(s) for the root element */
|
|
14
|
+
class?: string,
|
|
15
|
+
/** Where the popout will be shown, relative to the popout button */
|
|
16
|
+
side?: "top" | "right" | "bottom" | "left",
|
|
17
|
+
/** How the popout will be aligned, relative to the popout button */
|
|
18
|
+
alignment?: "start" | "center" | "end",
|
|
19
|
+
}
|
|
20
|
+
|
|
10
21
|
/**
|
|
11
22
|
* The content that is displayed for a MenuBarItem when it is open.
|
|
12
|
-
*
|
|
13
|
-
* @prop {"top" | "right" | "bottom" | "left"} side -- Where the popout will be shown, relative to the popout button
|
|
14
|
-
* @prop {"start" | "center" | "end"} alignment -- How the popout will be aligned, relative to the popout button
|
|
15
23
|
*/
|
|
16
|
-
export default function MenuBarItemContent() {
|
|
17
|
-
$props.side ??= "bottom";
|
|
18
|
-
$props.alignment ??= "start";
|
|
19
|
-
|
|
24
|
+
export default function MenuBarItemContent($props: MenuBarItemContentProps | undefined) {
|
|
20
25
|
let div: HTMLDivElement;
|
|
21
26
|
let closeOnClick = false;
|
|
22
27
|
let shown = false;
|
|
@@ -80,7 +85,7 @@ export default function MenuBarItemContent() {
|
|
|
80
85
|
|
|
81
86
|
function handleDocumentClick(e: MouseEvent) {
|
|
82
87
|
if (closeOnClick && !div.contains(e.target as HTMLElement)) {
|
|
83
|
-
context.active = false;
|
|
88
|
+
//context.active = false;
|
|
84
89
|
setVisible(false);
|
|
85
90
|
}
|
|
86
91
|
}
|
|
@@ -90,14 +95,16 @@ export default function MenuBarItemContent() {
|
|
|
90
95
|
throw new Error("MenuBarItemContent must have an anchor element");
|
|
91
96
|
}
|
|
92
97
|
|
|
93
|
-
|
|
98
|
+
let side = $props?.side ?? "bottom";
|
|
99
|
+
let alignment = $props?.alignment ?? "start";
|
|
100
|
+
setPopoverPosition(itemContext.anchorElement, div, side, alignment);
|
|
94
101
|
}
|
|
95
102
|
|
|
96
103
|
@render {
|
|
97
104
|
@if ($state.visible) {
|
|
98
105
|
<div
|
|
99
|
-
{$props
|
|
100
|
-
class={`torp-menu-bar-item-content ${$props
|
|
106
|
+
{$props?.id}
|
|
107
|
+
class={`torp-menu-bar-item-content ${$props?.class ?? ""}`.trim()}
|
|
101
108
|
&ref={div}
|
|
102
109
|
onmount={show}
|
|
103
110
|
>
|
|
@@ -5,14 +5,20 @@ import {
|
|
|
5
5
|
type MenuBarItemContext
|
|
6
6
|
} from "./MenuBarTypes";
|
|
7
7
|
|
|
8
|
+
interface MenuBarItemTriggerProps {
|
|
9
|
+
/** An ID for the root element */
|
|
10
|
+
id?: string;
|
|
11
|
+
/** Class name(s) for the root element */
|
|
12
|
+
class?: string,
|
|
13
|
+
/** Whether this button is disabled */
|
|
14
|
+
disabled?: boolean,
|
|
15
|
+
}
|
|
16
|
+
|
|
8
17
|
/**
|
|
9
18
|
* A button that is placed in a MenuBar and opens a submenu.
|
|
10
19
|
*
|
|
11
|
-
* @prop {boolean} disabled -- Whether this button is disabled
|
|
12
20
|
*/
|
|
13
|
-
export default function MenuBarItemTrigger() {
|
|
14
|
-
$props.disabled ??= false;
|
|
15
|
-
|
|
21
|
+
export default function MenuBarItemTrigger($props: MenuBarItemTriggerProps | undefined) {
|
|
16
22
|
let button: HTMLButtonElement;
|
|
17
23
|
|
|
18
24
|
// Get stuff out of the MenuBarContext
|
|
@@ -67,15 +73,15 @@ export default function MenuBarItemTrigger() {
|
|
|
67
73
|
|
|
68
74
|
@render {
|
|
69
75
|
<button
|
|
70
|
-
{$props
|
|
71
|
-
class={`torp-menu-bar-item-button ${$props
|
|
76
|
+
{$props?.id}
|
|
77
|
+
class={`torp-menu-bar-item-button ${$props?.class ?? ""}`.trim()}
|
|
72
78
|
type="button"
|
|
73
|
-
{$props
|
|
79
|
+
{$props?.disabled}
|
|
74
80
|
role="menuitem"
|
|
75
81
|
aria-haspopup="true"
|
|
76
82
|
aria-expanded={($state.visible ?? false).toString()}
|
|
77
|
-
aria-disabled={$props
|
|
78
|
-
data-disabled={$props
|
|
83
|
+
aria-disabled={$props?.disabled ? "true" : undefined}
|
|
84
|
+
data-disabled={$props?.disabled ? "true" : undefined}
|
|
79
85
|
onkeydown={handleKey}
|
|
80
86
|
onclick={handleClick}
|
|
81
87
|
onfocus={() => handleButtonFocus(index)}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ModalContextName, type ModalContext, type ModalState } from "./ModalTypes";
|
|
2
|
+
|
|
3
|
+
interface ModalProps {
|
|
4
|
+
/** An ID for the root element */
|
|
5
|
+
id?: string;
|
|
6
|
+
/** Class name(s) for the root element */
|
|
7
|
+
class?: string,
|
|
8
|
+
/** Whether the modal is visible */
|
|
9
|
+
visible?: boolean,
|
|
10
|
+
/** A function to be called when the user selects a response */
|
|
11
|
+
callback?: ((value: any) => void),
|
|
12
|
+
/** Raised when the modal is opened or closed */
|
|
13
|
+
ontoggle?: (open: boolean) => void,
|
|
14
|
+
/** Raised when the modal has opened */
|
|
15
|
+
onopen?: () => void,
|
|
16
|
+
/** Raised when the modal has closed */
|
|
17
|
+
onclose?: (result: any) => void,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A modal window that can be used to show rich content or obtain information from a user.
|
|
22
|
+
*
|
|
23
|
+
* See [the WAI ARIA guidelines for Modals](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/).
|
|
24
|
+
*
|
|
25
|
+
* The structure of a Modal is:
|
|
26
|
+
*
|
|
27
|
+
* ```
|
|
28
|
+
* <Modal>
|
|
29
|
+
* <ModalOverlay />
|
|
30
|
+
* <ModalTrigger /> (optional)
|
|
31
|
+
* <ModalContent />
|
|
32
|
+
* </Modal>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export default function Modal($props: ModalProps | undefined) {
|
|
36
|
+
let $state: ModalState = $watch({
|
|
37
|
+
visible: false,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
// Sync props and state
|
|
41
|
+
$run(() => {
|
|
42
|
+
$state.visible = $props?.visible ?? false;
|
|
43
|
+
});
|
|
44
|
+
$run(() => {
|
|
45
|
+
if ($props !== undefined) {
|
|
46
|
+
$props.visible = $state.visible;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
let result: any;
|
|
51
|
+
|
|
52
|
+
// Set the context to pass down to items
|
|
53
|
+
let context: ModalContext = {
|
|
54
|
+
handleButton,
|
|
55
|
+
handleClickOutside,
|
|
56
|
+
state: $state,
|
|
57
|
+
};
|
|
58
|
+
$context[ModalContextName] = context;
|
|
59
|
+
|
|
60
|
+
// Dispatch the toggle event when the modal is opened or closed
|
|
61
|
+
let firstToggle = true;
|
|
62
|
+
$run(() => {
|
|
63
|
+
const ontoggle = $props?.ontoggle;
|
|
64
|
+
const onopen = $props?.onopen;
|
|
65
|
+
const onclose = $props?.onclose;
|
|
66
|
+
const visible = $state.visible;
|
|
67
|
+
if (firstToggle) {
|
|
68
|
+
firstToggle = false;
|
|
69
|
+
} else {
|
|
70
|
+
if (ontoggle) ontoggle(visible);
|
|
71
|
+
if (visible) {
|
|
72
|
+
if (onopen) onopen()
|
|
73
|
+
} else {
|
|
74
|
+
if (onclose) onclose(result);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
function handleButton(type: "confirm" | "cancel" | undefined, value?: any) {
|
|
80
|
+
// Get the button's result
|
|
81
|
+
switch (type) {
|
|
82
|
+
case "confirm": {
|
|
83
|
+
result = value || true;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case "cancel": {
|
|
87
|
+
result = value || false;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
default: {
|
|
91
|
+
result = value;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Hide the modal
|
|
97
|
+
$state.visible = false;
|
|
98
|
+
|
|
99
|
+
// Call the callback
|
|
100
|
+
if ($props?.callback) {
|
|
101
|
+
$props?.callback(result);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function handleClickOutside(e: MouseEvent) {
|
|
106
|
+
e.preventDefault();
|
|
107
|
+
$state.visible = false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@render {
|
|
111
|
+
<div
|
|
112
|
+
{$props?.id}
|
|
113
|
+
class={`torp-modal ${$props?.class ?? ""}`.trim()}
|
|
114
|
+
>
|
|
115
|
+
<slot />
|
|
116
|
+
</div>
|
|
117
|
+
}
|
|
118
|
+
}
|