@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
|
@@ -13,21 +13,24 @@ export interface AccordionContext {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export interface AccordionItemContext {
|
|
16
|
-
/**
|
|
16
|
+
/** Raised when an AccordionItem is toggled */
|
|
17
17
|
toggleItem: (value: string) => void;
|
|
18
|
-
/**
|
|
18
|
+
/** Raised when an AccordionHeader receives a keyboard event */
|
|
19
19
|
handleHeaderKey: (index: number, e: KeyboardEvent) => void;
|
|
20
20
|
/** The reactive state for an AccordionItem */
|
|
21
21
|
state: ItemState;
|
|
22
|
+
/** Called in an AccordionItem when its header needs to be focused */
|
|
23
|
+
setHeaderFocused?: () => void;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
export interface ItemState {
|
|
25
27
|
index: number;
|
|
26
28
|
value: string;
|
|
27
29
|
expanded: boolean;
|
|
30
|
+
headerId: string;
|
|
31
|
+
contentId: string;
|
|
28
32
|
disabled: boolean;
|
|
29
33
|
parentDisabled: boolean;
|
|
30
|
-
dataState: "open" | "closed";
|
|
31
34
|
/** Called in the Accordion when a header needs to be focused */
|
|
32
35
|
setFocused: () => void;
|
|
33
36
|
}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
|
|
2
|
+
interface BreadcrumbProps {
|
|
3
|
+
/** An ID for the root element */
|
|
4
|
+
id?: string;
|
|
5
|
+
/** Class name(s) for the root element */
|
|
6
|
+
class?: string,
|
|
7
|
+
/** An ARIA label for describing the popover to screen readers */
|
|
8
|
+
ariaLabel?: string | undefined,
|
|
9
|
+
}
|
|
10
|
+
|
|
2
11
|
/**
|
|
3
12
|
*
|
|
4
13
|
* A list of links to the parent pages of the current page in hierarchical order.
|
|
@@ -9,23 +18,22 @@
|
|
|
9
18
|
*
|
|
10
19
|
* ```
|
|
11
20
|
* <Breadcrumb>
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
21
|
+
* <BreadcrumbItem />
|
|
22
|
+
* <BreadcrumbSeparator /> (optional)
|
|
23
|
+
* <BreadcrumbItem>
|
|
24
|
+
* ...
|
|
25
|
+
* </BreadcrumbItem>
|
|
16
26
|
* </Breadcrumb>
|
|
17
27
|
* ```
|
|
18
28
|
*
|
|
19
29
|
* You can separate BreadcrumbItems using BreadcrumbSeparators or by using CSS.
|
|
20
|
-
*
|
|
21
|
-
* @prop {string | undefined} ariaLabel -- An ARIA label for describing the popover to screen readers
|
|
22
30
|
*/
|
|
23
|
-
export default function Breadcrumb($props:
|
|
31
|
+
export default function Breadcrumb($props: BreadcrumbProps | undefined) {
|
|
24
32
|
@render {
|
|
25
33
|
<nav
|
|
26
|
-
{$props
|
|
27
|
-
class={`torp-breadcrumb ${$props
|
|
28
|
-
aria-label={$props
|
|
34
|
+
{$props?.id}
|
|
35
|
+
class={`torp-breadcrumb ${$props?.class ?? ""}`.trim()}
|
|
36
|
+
aria-label={$props?.ariaLabel}
|
|
29
37
|
>
|
|
30
38
|
<slot />
|
|
31
39
|
</nav>
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
|
|
2
|
+
interface BreadcrumbItemProps {
|
|
3
|
+
/** An ID for the root element */
|
|
4
|
+
id?: string;
|
|
5
|
+
/** Class name(s) for the root element */
|
|
6
|
+
class?: string,
|
|
7
|
+
/** Whether this is the current page */
|
|
8
|
+
current?: boolean,
|
|
9
|
+
}
|
|
10
|
+
|
|
2
11
|
/**
|
|
3
12
|
* An item in a breadcrumb, containing a link to one of the parent pages of the
|
|
4
13
|
* current page (or the current page).
|
|
5
|
-
*
|
|
6
|
-
* @prop {boolean | undefined} current -- Whether this is the current page
|
|
7
14
|
*/
|
|
8
|
-
export default function BreadcrumbItem($props:
|
|
15
|
+
export default function BreadcrumbItem($props: BreadcrumbItemProps | undefined) {
|
|
9
16
|
@render {
|
|
10
17
|
<div
|
|
11
|
-
{$props
|
|
12
|
-
class={`torp-breadcrumb ${$props
|
|
13
|
-
aria-current={$props
|
|
14
|
-
data-current={$props
|
|
18
|
+
{$props?.id}
|
|
19
|
+
class={`torp-breadcrumb ${$props?.class ?? ""}`.trim()}
|
|
20
|
+
aria-current={$props?.current ? "page" : undefined}
|
|
21
|
+
data-current={$props?.current ? "current" : undefined}
|
|
15
22
|
>
|
|
16
23
|
<slot />
|
|
17
24
|
</div>
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
|
|
2
|
+
interface BreadcrumbSeparatorProps {
|
|
3
|
+
/** An ID for the root element */
|
|
4
|
+
id?: string;
|
|
5
|
+
/** Class name(s) for the root element */
|
|
6
|
+
class?: string,
|
|
7
|
+
}
|
|
8
|
+
|
|
2
9
|
/**
|
|
3
10
|
* A separator between links in a Breadcrumb component. It is hidden from
|
|
4
11
|
* screen readers.
|
|
5
12
|
*/
|
|
6
|
-
export default function BreadcrumbSeparator($props:
|
|
13
|
+
export default function BreadcrumbSeparator($props: BreadcrumbSeparatorProps | undefined) {
|
|
7
14
|
@render {
|
|
8
15
|
<div
|
|
9
|
-
{$props
|
|
10
|
-
class={`torp-breadcrumb-separator ${$props
|
|
16
|
+
{$props?.id}
|
|
17
|
+
class={`torp-breadcrumb-separator ${$props?.class ?? ""}`.trim()}
|
|
11
18
|
aria-hidden="true"
|
|
12
19
|
>
|
|
13
20
|
<slot />
|
|
@@ -7,7 +7,15 @@ import ChevronRight from "../icons/ChevronRight.torp";
|
|
|
7
7
|
|
|
8
8
|
// TODO: Split this out into Calendar, CalendarHeader, CalendarPreviousTrigger, CalendarGrid etc
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
interface CalendarProps {
|
|
11
|
+
/** An ID for the root element */
|
|
12
|
+
id?: string;
|
|
13
|
+
/** Class name(s) for the root element */
|
|
14
|
+
class?: string,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function Calendar($props: CalendarProps) {
|
|
18
|
+
$props ??= $watch({});
|
|
11
19
|
$props.startOfWeek ??= 1;
|
|
12
20
|
$props.selectable ??= false;
|
|
13
21
|
$props.value ??= new Date();
|
|
@@ -24,10 +32,11 @@ export default function Calendar() {
|
|
|
24
32
|
let $state = $watch({
|
|
25
33
|
activeDate: $props.value,
|
|
26
34
|
visibleDate: $props.value,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
get days() {
|
|
36
|
+
return $cache(() => {
|
|
37
|
+
return buildDays($state.visibleDate, $props.startOfWeek)
|
|
38
|
+
});
|
|
39
|
+
},
|
|
31
40
|
});
|
|
32
41
|
|
|
33
42
|
let visibleStartDate = $props.value;
|
|
@@ -41,8 +50,6 @@ export default function Calendar() {
|
|
|
41
50
|
$context[CalendarContextName] = context;
|
|
42
51
|
|
|
43
52
|
$run(() => {
|
|
44
|
-
$state.days = buildDays($state.visibleDate, $props.startOfWeek)
|
|
45
|
-
|
|
46
53
|
// HACK: Shouldn't need this
|
|
47
54
|
if (refocus) {
|
|
48
55
|
refocus = false;
|
|
@@ -211,27 +218,27 @@ export default function Calendar() {
|
|
|
211
218
|
|
|
212
219
|
@render {
|
|
213
220
|
<div
|
|
214
|
-
{$props
|
|
215
|
-
class={`torp-calendar ${$props
|
|
221
|
+
{$props?.id}
|
|
222
|
+
class={`torp-calendar ${$props?.class ?? ""}`.trim()}
|
|
216
223
|
&ref={container}
|
|
217
224
|
>
|
|
218
|
-
<div class={`torp-calendar-header ${$props
|
|
219
|
-
<button class={`torp-calendar-previous-trigger ${$props
|
|
225
|
+
<div class={`torp-calendar-header ${$props?.class ?? ""}`.trim()}>
|
|
226
|
+
<button class={`torp-calendar-previous-trigger ${$props?.class ?? ""}`.trim()} onclick={handlePrevMonth}>
|
|
220
227
|
<slot name="prev-button">
|
|
221
228
|
<ChevronLeft />
|
|
222
229
|
</slot>
|
|
223
230
|
</button>
|
|
224
|
-
<span class={`torp-calendar-month-name ${$props
|
|
231
|
+
<span class={`torp-calendar-month-name ${$props?.class ?? ""}`.trim()}>
|
|
225
232
|
{monthNames[$state.visibleDate.getMonth()] + " " + $state.visibleDate.getFullYear()}
|
|
226
233
|
</span>
|
|
227
|
-
<button class={`torp-calendar-next-trigger ${$props
|
|
234
|
+
<button class={`torp-calendar-next-trigger ${$props?.class ?? ""}`.trim()} onclick={handleNextMonth}>
|
|
228
235
|
<slot name="next-button">
|
|
229
236
|
<ChevronRight />
|
|
230
237
|
</slot>
|
|
231
238
|
</button>
|
|
232
239
|
</div>
|
|
233
240
|
<div
|
|
234
|
-
class={`torp-calendar-grid ${$props
|
|
241
|
+
class={`torp-calendar-grid ${$props?.class ?? ""}`.trim()}
|
|
235
242
|
tabindex={$props.selectable ? 0 : -1}
|
|
236
243
|
onfocus={handleFocus}
|
|
237
244
|
onkeydown={handleKey}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { areDatesEqual } from "../utils/dateUtils";
|
|
2
2
|
import { type CalendarContext, type CalendarEvent, CalendarContextName } from "./CalendarTypes";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
interface CalendarDayProps {
|
|
5
|
+
/** An ID for the root element */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Class name(s) for the root element */
|
|
8
|
+
class?: string,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default function CalendarDay($props: CalendarDayProps) {
|
|
12
|
+
$props ??= $watch({});
|
|
5
13
|
$props.date ??= new Date();
|
|
6
14
|
$props.selectable ??= false;
|
|
7
15
|
$props.muted ??= false;
|
|
@@ -40,9 +48,9 @@ export default function CalendarDay() {
|
|
|
40
48
|
|
|
41
49
|
@render {
|
|
42
50
|
<div
|
|
43
|
-
{$props
|
|
51
|
+
{$props?.id}
|
|
44
52
|
class={[
|
|
45
|
-
`torp-calendar-day ${$props
|
|
53
|
+
`torp-calendar-day ${$props?.class ?? ""}`.trim(),
|
|
46
54
|
{
|
|
47
55
|
muted: $props.muted,
|
|
48
56
|
today: isToday(),
|
|
@@ -57,7 +65,7 @@ export default function CalendarDay() {
|
|
|
57
65
|
} else {
|
|
58
66
|
<span>{date.getDate()}</span>
|
|
59
67
|
}
|
|
60
|
-
<ul class={`torp-calendar-day-events ${$props
|
|
68
|
+
<ul class={`torp-calendar-day-events ${$props?.class ?? ""}`.trim()}>
|
|
61
69
|
@for (ev of $props.events) {
|
|
62
70
|
<li title={ev.content} />
|
|
63
71
|
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ContextualContextName, type Point, type ContextualContext, type ContextualState } from "./ContextualTypes";
|
|
2
|
+
|
|
3
|
+
interface ContextualProps {
|
|
4
|
+
/** An ID for the root element */
|
|
5
|
+
id?: string;
|
|
6
|
+
/** Class name(s) for the root element */
|
|
7
|
+
class?: string,
|
|
8
|
+
/** Whether the contextual is modal. If true, an overlay should be supplied to obscure outside content, and only the context content will be visible to screen readers */
|
|
9
|
+
modal?: boolean,
|
|
10
|
+
/** Whether the contextual is visible */
|
|
11
|
+
visible?: boolean,
|
|
12
|
+
/** The element to anchor this contextual to, as an alternative to supplying a ContextualTrigger */
|
|
13
|
+
anchor?: HTMLElement,
|
|
14
|
+
/** The position to display this contextual at */
|
|
15
|
+
position?: Point,
|
|
16
|
+
/** A function to be called when the user selects a response */
|
|
17
|
+
callback?: ((value: any) => void),
|
|
18
|
+
/** Raised when this contextual is opened or closed */
|
|
19
|
+
ontoggle?: (open: boolean) => void,
|
|
20
|
+
/** Raised when the contextual has opened */
|
|
21
|
+
onopen?: () => void,
|
|
22
|
+
/** Raised when the contextual has closed */
|
|
23
|
+
onclose?: (result: any) => void,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A contextual window that is shown to the user at the cursor's location.
|
|
28
|
+
*
|
|
29
|
+
* The structure of a Contextual is:
|
|
30
|
+
*
|
|
31
|
+
* ```
|
|
32
|
+
* <Contextual>
|
|
33
|
+
* <ContextualTrigger /> (optional)
|
|
34
|
+
* <ContextualContent />
|
|
35
|
+
* </Contextual>
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export default function Contextual($props: ContextualProps | undefined) {
|
|
39
|
+
let $state: ContextualState = $watch({
|
|
40
|
+
visible: false,
|
|
41
|
+
position: { x: 0, y: 0 }
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// Sync props and state
|
|
45
|
+
$run(() => {
|
|
46
|
+
$state.visible = $props?.visible ?? false;
|
|
47
|
+
$state.position = $props?.position ?? { x: 0, y: 0 };
|
|
48
|
+
});
|
|
49
|
+
$run(() => {
|
|
50
|
+
if ($props !== undefined) {
|
|
51
|
+
$props.visible = $state.visible;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
let result: any;
|
|
56
|
+
|
|
57
|
+
// Set the context to pass down to items
|
|
58
|
+
let context: ContextualContext = {
|
|
59
|
+
handleButton,
|
|
60
|
+
handleClickOutside,
|
|
61
|
+
state: $state,
|
|
62
|
+
modal: $props?.modal,
|
|
63
|
+
anchorElement: $props?.anchor ? $unwrap($props.anchor) : undefined,
|
|
64
|
+
};
|
|
65
|
+
$context[ContextualContextName] = context;
|
|
66
|
+
|
|
67
|
+
// Dispatch the toggle event when the contextual is opened or closed
|
|
68
|
+
let firstToggle = true;
|
|
69
|
+
$run(() => {
|
|
70
|
+
const ontoggle = $props?.ontoggle;
|
|
71
|
+
const onopen = $props?.onopen;
|
|
72
|
+
const onclose = $props?.onclose;
|
|
73
|
+
const visible = $state.visible;
|
|
74
|
+
if (firstToggle) {
|
|
75
|
+
firstToggle = false;
|
|
76
|
+
} else {
|
|
77
|
+
if (ontoggle) ontoggle(visible);
|
|
78
|
+
if (visible) {
|
|
79
|
+
if (onopen) onopen()
|
|
80
|
+
} else {
|
|
81
|
+
if (onclose) onclose(result);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
function handleButton(type: "confirm" | "cancel" | undefined, value?: any) {
|
|
87
|
+
// Get the button's result
|
|
88
|
+
switch (type) {
|
|
89
|
+
case "confirm": {
|
|
90
|
+
result = value || true;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case "cancel": {
|
|
94
|
+
result = value || false;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
default: {
|
|
98
|
+
result = value;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Hide the contextual
|
|
104
|
+
$state.visible = false;
|
|
105
|
+
|
|
106
|
+
// Call the callback
|
|
107
|
+
if ($props?.callback) {
|
|
108
|
+
$props.callback(result);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function handleClickOutside(e: MouseEvent) {
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
$state.visible = false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@render {
|
|
118
|
+
<div
|
|
119
|
+
{$props?.id}
|
|
120
|
+
class={`torp-context ${$props?.class ?? ""}`.trim()}
|
|
121
|
+
>
|
|
122
|
+
<slot />
|
|
123
|
+
</div>
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -2,21 +2,28 @@
|
|
|
2
2
|
import { addDocumentEvent, removeDocumentEvent } from "../utils/documentEvents";
|
|
3
3
|
import getScrollParent from "../utils/getScrollParent";
|
|
4
4
|
import setContextPosition from "../utils/setContextPosition";
|
|
5
|
-
import {
|
|
5
|
+
import { ContextualContextName, type ContextualContext } from "./ContextualTypes";
|
|
6
|
+
|
|
7
|
+
interface ContextualContentProps {
|
|
8
|
+
/** An ID for the root element */
|
|
9
|
+
id?: string;
|
|
10
|
+
/** Class name(s) for the root element */
|
|
11
|
+
class?: string,
|
|
12
|
+
}
|
|
6
13
|
|
|
7
14
|
/**
|
|
8
|
-
* The content that is displayed for a
|
|
15
|
+
* The content that is displayed for a Contextual when it is open, displayed at the
|
|
9
16
|
* position that the user right-clicked.
|
|
10
17
|
*/
|
|
11
|
-
export default function
|
|
18
|
+
export default function ContextualContent($props: ContextualContentProps | undefined) {
|
|
12
19
|
let div: HTMLDivElement;
|
|
13
20
|
let shown = false;
|
|
14
21
|
let closeOnClick = false;
|
|
15
22
|
|
|
16
|
-
// Get stuff out of the
|
|
17
|
-
const context = $context[
|
|
23
|
+
// Get stuff out of the ContextualContext
|
|
24
|
+
const context = $context[ContextualContextName] as ContextualContext;
|
|
18
25
|
if (!context) {
|
|
19
|
-
throw new Error("
|
|
26
|
+
throw new Error("ContextualContent must be contained within a Contextual");
|
|
20
27
|
}
|
|
21
28
|
let $state = context.state;
|
|
22
29
|
|
|
@@ -37,7 +44,8 @@ export default function PopoverContentContextual($props: any) {
|
|
|
37
44
|
|
|
38
45
|
// Set the position and listen for window resize and scroll to reset the position
|
|
39
46
|
setPosition();
|
|
40
|
-
const
|
|
47
|
+
const anchorElement = context.anchorElement!;
|
|
48
|
+
const scrollParent = getScrollParent(anchorElement)
|
|
41
49
|
scrollParent.addEventListener("resize", setPosition);
|
|
42
50
|
scrollParent.addEventListener("scroll", setPosition);
|
|
43
51
|
if (context.focusFirstElement) {
|
|
@@ -52,11 +60,12 @@ export default function PopoverContentContextual($props: any) {
|
|
|
52
60
|
removeDocumentEvent("click", handleDocumentClick);
|
|
53
61
|
|
|
54
62
|
// Stop listening for window resize and focus the anchor element per WAI guidelines
|
|
55
|
-
const
|
|
63
|
+
const anchorElement = context.anchorElement!;
|
|
64
|
+
const scrollParent = getScrollParent(anchorElement)
|
|
56
65
|
scrollParent.removeEventListener("resize", setPosition);
|
|
57
66
|
scrollParent.removeEventListener("scroll", setPosition);
|
|
58
|
-
if (
|
|
59
|
-
|
|
67
|
+
if (anchorElement.focus) {
|
|
68
|
+
anchorElement.focus();
|
|
60
69
|
}
|
|
61
70
|
}
|
|
62
71
|
|
|
@@ -88,8 +97,8 @@ export default function PopoverContentContextual($props: any) {
|
|
|
88
97
|
@render {
|
|
89
98
|
@if ($state.visible) {
|
|
90
99
|
<div
|
|
91
|
-
{$props
|
|
92
|
-
class={`torp-popover-content-contextual ${$props
|
|
100
|
+
{$props?.id}
|
|
101
|
+
class={`torp-popover-content-contextual ${$props?.class ?? ""}`.trim()}
|
|
93
102
|
&ref={div}
|
|
94
103
|
onmount={show}
|
|
95
104
|
>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ContextualContextName, type ContextualContext } from "./ContextualTypes";
|
|
2
|
+
import hoverTrigger from "../mount/hoverTrigger";
|
|
3
|
+
|
|
4
|
+
interface ContextualTriggerProps {
|
|
5
|
+
/** An ID for the root element */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Class name(s) for the root element */
|
|
8
|
+
class?: string,
|
|
9
|
+
/** Whether the popover is activated by click/press or by hover **/
|
|
10
|
+
activation?: "press" | "hover"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The element that causes a Contextual to appear or disappear when right-clicked.
|
|
15
|
+
*/
|
|
16
|
+
export default function ContextualTrigger($props: ContextualTriggerProps | undefined) {
|
|
17
|
+
let activation = $props?.activation ?? "press";
|
|
18
|
+
|
|
19
|
+
// Get stuff out of the ContextualContext
|
|
20
|
+
const context = $context[ContextualContextName] as ContextualContext;
|
|
21
|
+
if (!context) {
|
|
22
|
+
throw new Error("ContextualTrigger must be contained within a Contextual");
|
|
23
|
+
}
|
|
24
|
+
let $state = context.state;
|
|
25
|
+
|
|
26
|
+
function handleContextualMenu(e: MouseEvent & { currentTarget: EventTarget & HTMLDivElement }) {
|
|
27
|
+
if (activation !== "press") return;
|
|
28
|
+
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
if ($state.position) {
|
|
31
|
+
// Get the position relative to the element, so we can reposition on scroll
|
|
32
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
33
|
+
const x = e.clientX - rect.left;
|
|
34
|
+
const y = e.clientY - rect.top;
|
|
35
|
+
$state.position = { x, y };
|
|
36
|
+
//$state.position = { x: window.scrollX + e.clientX, y: window.scrollY + e.clientY };
|
|
37
|
+
}
|
|
38
|
+
$state.visible = !$state.visible;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function handleHover(node: HTMLElement, e: MouseEvent) {
|
|
42
|
+
if (activation !== "hover") return;
|
|
43
|
+
|
|
44
|
+
if ($state.position) {
|
|
45
|
+
// Get the position relative to the element, so we can reposition on scroll
|
|
46
|
+
const rect = node.getBoundingClientRect();
|
|
47
|
+
const x = e.clientX - rect.left;
|
|
48
|
+
const y = e.clientY - rect.top;
|
|
49
|
+
$state.position = { x, y };
|
|
50
|
+
//$state.position = { x: window.scrollX + e.clientX, y: window.scrollY + e.clientY };
|
|
51
|
+
}
|
|
52
|
+
$state.visible = !$state.visible
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@render {
|
|
56
|
+
<div
|
|
57
|
+
{$props?.id}
|
|
58
|
+
class={`torp-popover-trigger-contextual ${$props?.class ?? ""}`.trim()}
|
|
59
|
+
oncontextmenu={handleContextualMenu}
|
|
60
|
+
onmount={(el) => hoverTrigger(el, { onHover: handleHover, onExit: handleHover })}
|
|
61
|
+
&ref={context.anchorElement}
|
|
62
|
+
>
|
|
63
|
+
<slot />
|
|
64
|
+
</div>
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const ContextualContextName = "Contextual";
|
|
2
|
+
|
|
3
|
+
/** The shared context for popover components (Contextual, Prompt and Contextual) */
|
|
4
|
+
export interface ContextualContext {
|
|
5
|
+
handleButton: (type: "confirm" | "cancel" | undefined, value?: any) => void;
|
|
6
|
+
// HACK: We need to be able to let children (i.e. Dialogs) override the click outside functionality
|
|
7
|
+
// There may be a more elegant way to accomplish this too
|
|
8
|
+
handleClickOutside?: (e: MouseEvent) => void;
|
|
9
|
+
state: ContextualState;
|
|
10
|
+
//modal: boolean;
|
|
11
|
+
anchorElement?: HTMLElement;
|
|
12
|
+
// HACK: focusFirstElement is necessary because if we focus the first element e.g. in a Dialog's
|
|
13
|
+
// onMount, it will scroll the page to the focused element and mess up our careful positioning
|
|
14
|
+
// We need to be able to manually set the order to
|
|
15
|
+
// 1. set visible (so we have an element with content)
|
|
16
|
+
// 2. set position (so the element is in the right place)
|
|
17
|
+
// 3. set focus (for accessibility)
|
|
18
|
+
// There may be a more elegant way to accomplish this!
|
|
19
|
+
focusFirstElement?: () => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ContextualState {
|
|
23
|
+
visible: boolean;
|
|
24
|
+
position: Point;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface Point {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
}
|