@torpor/ui 0.3.5 → 0.3.7
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/dist/Chart/BarChart.torp +159 -0
- package/dist/Chart/DataSeries.ts +5 -0
- package/dist/Chart/GridLines.torp +62 -0
- package/dist/Chart/LineChart.torp +196 -0
- package/dist/Chart/PieChart.torp +145 -0
- package/dist/Chart/ScatterChart.torp +215 -0
- package/dist/Chart/SparkLine.torp +71 -0
- package/dist/Chart/XAxis.torp +60 -0
- package/dist/Chart/YAxis.torp +41 -0
- package/dist/Chart/index.d.ts +220 -0
- package/dist/Chart/index.js +34 -0
- package/dist/Chart/index.js.map +1 -0
- package/dist/Form/TextArea.torp +3 -0
- package/dist/Form/index.d.ts +2 -0
- package/dist/metafile-esm.json +1 -1
- package/dist/utils/chartColors.ts +17 -0
- package/dist/utils/chartUtils.ts +71 -0
- package/package.json +10 -3
- package/CHANGELOG.md +0 -344
- package/scripts/postbuild.ts +0 -127
- package/src/Accordion/Accordion.torp +0 -230
- package/src/Accordion/AccordionContent.torp +0 -46
- package/src/Accordion/AccordionHeader.torp +0 -45
- package/src/Accordion/AccordionItem.torp +0 -101
- package/src/Accordion/AccordionTrigger.torp +0 -70
- package/src/Accordion/AccordionTypes.ts +0 -36
- package/src/Accordion/index.ts +0 -7
- package/src/Breadcrumb/Breadcrumb.torp +0 -45
- package/src/Breadcrumb/BreadcrumbItem.torp +0 -30
- package/src/Breadcrumb/BreadcrumbSeparator.torp +0 -27
- package/src/Breadcrumb/index.ts +0 -5
- package/src/Calendar/Calendar.torp +0 -277
- package/src/Calendar/CalendarDay.torp +0 -78
- package/src/Calendar/CalendarTypes.ts +0 -22
- package/src/Calendar/index.ts +0 -4
- package/src/Contextual/Contextual.torp +0 -129
- package/src/Contextual/ContextualContent.torp +0 -112
- package/src/Contextual/ContextualTrigger.torp +0 -70
- package/src/Contextual/ContextualTypes.ts +0 -30
- package/src/Contextual/index.ts +0 -5
- package/src/Dialog/Dialog.torp +0 -136
- package/src/Dialog/DialogBody.torp +0 -44
- package/src/Dialog/DialogButton.torp +0 -66
- package/src/Dialog/DialogFooter.torp +0 -25
- package/src/Dialog/DialogHeader.torp +0 -45
- package/src/Dialog/DialogTypes.ts +0 -17
- package/src/Dialog/index.ts +0 -7
- package/src/Disclosure/Disclosure.torp +0 -82
- package/src/Disclosure/DisclosureContent.torp +0 -46
- package/src/Disclosure/DisclosureHeader.torp +0 -45
- package/src/Disclosure/DisclosureTrigger.torp +0 -47
- package/src/Disclosure/DisclosureTypes.ts +0 -13
- package/src/Disclosure/index.ts +0 -6
- package/src/Drawer/Drawer.torp +0 -127
- package/src/Drawer/DrawerContent.torp +0 -83
- package/src/Drawer/DrawerOverlay.torp +0 -42
- package/src/Drawer/DrawerTrigger.torp +0 -39
- package/src/Drawer/DrawerTypes.ts +0 -24
- package/src/Drawer/index.ts +0 -6
- package/src/Form/CheckBox.torp +0 -94
- package/src/Form/Field.torp +0 -95
- package/src/Form/File.torp +0 -102
- package/src/Form/Form.torp +0 -147
- package/src/Form/FormTypes.ts +0 -35
- package/src/Form/Hidden.torp +0 -25
- package/src/Form/Input.torp +0 -112
- package/src/Form/Label.torp +0 -35
- package/src/Form/Message.torp +0 -39
- package/src/Form/Option.torp +0 -28
- package/src/Form/Select.torp +0 -101
- package/src/Form/StandardSchemaV1.ts +0 -70
- package/src/Form/TextArea.torp +0 -105
- package/src/Form/index.ts +0 -13
- package/src/Menu/Menu.torp +0 -174
- package/src/Menu/MenuButton.torp +0 -74
- package/src/Menu/MenuCheck.torp +0 -89
- package/src/Menu/MenuGroup.torp +0 -31
- package/src/Menu/MenuIndicator.torp +0 -40
- package/src/Menu/MenuPopout.torp +0 -83
- package/src/Menu/MenuPopoutContent.torp +0 -84
- package/src/Menu/MenuPopoutTrigger.torp +0 -128
- package/src/Menu/MenuRadio.torp +0 -103
- package/src/Menu/MenuRadioGroup.torp +0 -109
- package/src/Menu/MenuSeparator.torp +0 -26
- package/src/Menu/MenuTypes.ts +0 -60
- package/src/Menu/index.ts +0 -25
- package/src/MenuBar/MenuBar.torp +0 -162
- package/src/MenuBar/MenuBarItem.torp +0 -116
- package/src/MenuBar/MenuBarItemContent.torp +0 -119
- package/src/MenuBar/MenuBarItemTrigger.torp +0 -99
- package/src/MenuBar/MenuBarTypes.ts +0 -36
- package/src/MenuBar/index.ts +0 -6
- package/src/Modal/Modal.torp +0 -122
- package/src/Modal/ModalContent.torp +0 -81
- package/src/Modal/ModalOverlay.torp +0 -42
- package/src/Modal/ModalTrigger.torp +0 -54
- package/src/Modal/ModalTypes.ts +0 -22
- package/src/Modal/index.ts +0 -10
- package/src/Modal/showModal.ts +0 -19
- package/src/Modal/showPrompt.ts +0 -23
- package/src/NavMenu/NavMenu.torp +0 -190
- package/src/NavMenu/NavMenuButton.torp +0 -55
- package/src/NavMenu/NavMenuElement.torp +0 -55
- package/src/NavMenu/NavMenuGroup.torp +0 -41
- package/src/NavMenu/NavMenuGroupHeader.torp +0 -41
- package/src/NavMenu/NavMenuLink.torp +0 -60
- package/src/NavMenu/NavMenuPopout.torp +0 -89
- package/src/NavMenu/NavMenuPopoutButton.torp +0 -129
- package/src/NavMenu/NavMenuPopoutContent.torp +0 -92
- package/src/NavMenu/NavMenuSeparator.torp +0 -24
- package/src/NavMenu/NavMenuTypes.ts +0 -32
- package/src/NavMenu/index.ts +0 -23
- package/src/Notification/Notification.torp +0 -71
- package/src/Notification/NotificationClose.torp +0 -39
- package/src/Notification/NotificationContainer.torp +0 -26
- package/src/Notification/NotificationContent.torp +0 -25
- package/src/Notification/NotificationTypes.ts +0 -5
- package/src/Notification/index.ts +0 -13
- package/src/Notification/showNotification.ts +0 -30
- package/src/Popover/Popover.torp +0 -129
- package/src/Popover/PopoverContent.torp +0 -117
- package/src/Popover/PopoverTrigger.torp +0 -62
- package/src/Popover/PopoverTypes.ts +0 -30
- package/src/Popover/index.ts +0 -6
- package/src/Popover/showPopover.ts +0 -24
- package/src/Slider/Slider.torp +0 -84
- package/src/Slider/index.ts +0 -3
- package/src/TabGroup/TabContent.torp +0 -49
- package/src/TabGroup/TabGroup.torp +0 -250
- package/src/TabGroup/TabGroupTypes.ts +0 -44
- package/src/TabGroup/TabHeader.torp +0 -81
- package/src/TabGroup/TabList.torp +0 -61
- package/src/TabGroup/TabTrigger.torp +0 -76
- package/src/TabGroup/index.ts +0 -7
- package/src/ambient.d.ts +0 -7
- package/src/icons/ArrowDown.torp +0 -18
- package/src/icons/ArrowLeft.torp +0 -18
- package/src/icons/ArrowRight.torp +0 -18
- package/src/icons/ArrowUp.torp +0 -18
- package/src/icons/Bars.torp +0 -20
- package/src/icons/Check.torp +0 -18
- package/src/icons/ChevronDown.torp +0 -18
- package/src/icons/ChevronLeft.torp +0 -18
- package/src/icons/ChevronRight.torp +0 -18
- package/src/icons/ChevronUp.torp +0 -18
- package/src/icons/Cross.torp +0 -19
- package/src/icons/IconTypes.ts +0 -10
- package/src/icons/Loading.torp +0 -19
- package/src/icons/Minus.torp +0 -18
- package/src/icons/Plus.torp +0 -19
- package/src/icons/index.ts +0 -31
- package/src/motion/fade.ts +0 -16
- package/src/motion/grow.ts +0 -23
- package/src/motion/index.ts +0 -6
- package/src/motion/measure.ts +0 -28
- package/src/motion/slide.ts +0 -45
- package/src/mount/clickPopover.ts +0 -51
- package/src/mount/contextPopover.ts +0 -51
- package/src/mount/disableScroll.ts +0 -28
- package/src/mount/hoverPopover.ts +0 -58
- package/src/mount/hoverTrigger.ts +0 -59
- package/src/mount/trapFocus.ts +0 -58
- package/src/utils/dateUtils.ts +0 -244
- package/src/utils/documentEvents.ts +0 -17
- package/src/utils/getId.ts +0 -6
- package/src/utils/getScrollParent.ts +0 -22
- package/src/utils/setContextPosition.ts +0 -31
- package/src/utils/setPopoverPosition.ts +0 -142
- package/test/Accordion/accessibility.test.ts +0 -59
- package/test/Accordion/components/AccordionAccessibility.torp +0 -44
- package/test/Accordion/components/AccordionKeyboard.torp +0 -32
- package/test/Accordion/components/AccordionList.torp +0 -23
- package/test/Accordion/components/AccordionMultiple.torp +0 -32
- package/test/Accordion/components/AccordionSingle.torp +0 -32
- package/test/Accordion/for-items.test.ts +0 -52
- package/test/Accordion/keyboard.test.ts +0 -64
- package/test/Accordion/multiple-item-toggle.test.ts +0 -32
- package/test/Accordion/multiple-item-value.test.ts +0 -17
- package/test/Accordion/single-item-toggle.test.ts +0 -31
- package/test/Accordion/single-item-value.test.ts +0 -17
- package/test/Breadcrumb/accessibility.test.ts +0 -29
- package/test/Breadcrumb/basic.test.ts +0 -17
- package/test/Breadcrumb/components/BreadcrumbTest.torp +0 -15
- package/test/Calendar/components/CalendarTest.torp +0 -9
- package/test/Calendar/default.test.ts +0 -18
- package/test/Dialog/accessibility-alert.test.ts +0 -40
- package/test/Dialog/accessibility-modal.test.ts +0 -52
- package/test/Dialog/components/DialogAccessibility.torp +0 -25
- package/test/Dialog/components/DialogFunction.torp +0 -36
- package/test/Dialog/components/DialogModal.torp +0 -30
- package/test/Dialog/components/DialogVariable.torp +0 -33
- package/test/Dialog/function.test.ts +0 -26
- package/test/Dialog/variable.test.ts +0 -27
- package/test/Disclosure/accessibility.test.ts +0 -31
- package/test/Disclosure/components/DisclosureTest.torp +0 -17
- package/test/Disclosure/default.test.ts +0 -15
- package/test/Disclosure/toggle.test.ts +0 -20
- package/test/Form/components/FieldTest.torp +0 -25
- package/test/Form/components/FormTest.torp +0 -31
- package/test/Form/components/InputTest.torp +0 -9
- package/test/Form/field.test.ts +0 -34
- package/test/Form/form.test.ts +0 -34
- package/test/Form/input.test.ts +0 -19
- package/test/Menu/accessibility.test.ts +0 -83
- package/test/Menu/basic.test.ts +0 -58
- package/test/Menu/components/MenuAccessibility.torp +0 -59
- package/test/Menu/components/MenuBasic.torp +0 -58
- package/test/MenuBar/accessibility.test.ts +0 -87
- package/test/MenuBar/basic.test.ts +0 -22
- package/test/MenuBar/components/MenuBarAccessibility.torp +0 -34
- package/test/MenuBar/components/MenuBarBasic.torp +0 -25
- package/test/NavMenu/accessibility.test.ts +0 -97
- package/test/NavMenu/basic.test.ts +0 -22
- package/test/NavMenu/components/NavMenuAccessibility.torp +0 -35
- package/test/NavMenu/components/NavMenuBasic.torp +0 -28
- package/test/Notification/accessibility.test.ts +0 -21
- package/test/Notification/components/CustomNotification.torp +0 -14
- package/test/Notification/components/NotificationAccessibility.torp +0 -14
- package/test/Notification/components/NotificationFunction.torp +0 -17
- package/test/Notification/components/NotificationVariable.torp +0 -22
- package/test/Notification/function.test.ts +0 -25
- package/test/Notification/variable.test.ts +0 -25
- package/test/Popover/components/CustomDialog.torp +0 -25
- package/test/Popover/components/PopoverFunction.torp +0 -37
- package/test/Popover/components/PopoverTrigger.torp +0 -36
- package/test/Popover/components/PopoverVariable.torp +0 -40
- package/test/Popover/function.test.ts +0 -21
- package/test/Popover/trigger.test.ts +0 -27
- package/test/Popover/variable.test.ts +0 -27
- package/test/TabGroup/accessibility.test.ts +0 -67
- package/test/TabGroup/components/TabGroupAccessibility.torp +0 -28
- package/test/TabGroup/components/TabGroupKeyboard.torp +0 -28
- package/test/TabGroup/components/TabGroupList.torp +0 -26
- package/test/TabGroup/components/TabGroupTrigger.torp +0 -28
- package/test/TabGroup/for-items.test.ts +0 -52
- package/test/TabGroup/item-trigger.test.ts +0 -33
- package/test/TabGroup/item-value.test.ts +0 -17
- package/test/TabGroup/keyboard.test.ts +0 -72
- package/tsconfig.json +0 -4
- package/tsup.config.ts +0 -37
- package/vitest.config.ts +0 -12
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
import getId from "../utils/getId";
|
|
3
|
-
import { AccordionItemContextName, type AccordionItemContext } from "./AccordionTypes";
|
|
4
|
-
|
|
5
|
-
interface AccordionContentProps {
|
|
6
|
-
/** An ID for the root element */
|
|
7
|
-
id?: string;
|
|
8
|
-
/** Classes for the root element */
|
|
9
|
-
class?: ClassValue,
|
|
10
|
-
/** Styles for the root element */
|
|
11
|
-
style?: StyleValue,
|
|
12
|
-
/** Whether this content should act as a region. Set this when the content contains heading elements or a nested Accordion */
|
|
13
|
-
ariaRegion?: boolean,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Content for an AccordionItem, which can be revealed or hidden by an associated AccordionTrigger.
|
|
18
|
-
*/
|
|
19
|
-
export default function AccordionContent($props: AccordionContentProps | undefined) {
|
|
20
|
-
let defaultId = getId();
|
|
21
|
-
|
|
22
|
-
const context = $context[AccordionItemContextName] as AccordionItemContext;
|
|
23
|
-
if (!context) {
|
|
24
|
-
throw new Error("AccordionContent must be contained within an AccordionItem");
|
|
25
|
-
}
|
|
26
|
-
let $state = context.state
|
|
27
|
-
|
|
28
|
-
// Set the content ID so that it can be used with aria-controls in AccordionTrigger
|
|
29
|
-
$state.contentId = $props?.id ?? defaultId;
|
|
30
|
-
|
|
31
|
-
@render {
|
|
32
|
-
<div
|
|
33
|
-
id={$props?.id ?? defaultId}
|
|
34
|
-
class={["torp-accordion-content", $props?.class]}
|
|
35
|
-
{$props?.style}
|
|
36
|
-
role={$props?.ariaRegion ? "region" : undefined}
|
|
37
|
-
aria-labelledby={$state.headerId}
|
|
38
|
-
data-state={$state.expanded ? "open" : "closed"}
|
|
39
|
-
data-disabled={$state.disabled ? "true" : undefined}
|
|
40
|
-
>
|
|
41
|
-
@if ($state.expanded) {
|
|
42
|
-
<slot />
|
|
43
|
-
}
|
|
44
|
-
</div>
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
import { AccordionItemContextName, type AccordionItemContext } from "./AccordionTypes";
|
|
3
|
-
|
|
4
|
-
interface AccordionHeaderProps {
|
|
5
|
-
/** An ID for the root element */
|
|
6
|
-
id?: string;
|
|
7
|
-
/** Classes for the root element */
|
|
8
|
-
class?: ClassValue,
|
|
9
|
-
/** Styles for the root element */
|
|
10
|
-
style?: StyleValue,
|
|
11
|
-
/** The type of HTML header to use */
|
|
12
|
-
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6",
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* The header for an AccordionItem, which contains the AccordionTrigger.
|
|
17
|
-
*
|
|
18
|
-
* The structure of an AccordionHeader is:
|
|
19
|
-
*
|
|
20
|
-
* ```
|
|
21
|
-
* <AccordionHeader>
|
|
22
|
-
* <AccordionTrigger />
|
|
23
|
-
* </AccordionHeader>
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export default function AccordionHeader($props: AccordionHeaderProps | undefined) {
|
|
27
|
-
const context = $context[AccordionItemContextName] as AccordionItemContext;
|
|
28
|
-
if (!context) {
|
|
29
|
-
throw new Error("AccordionHeader must be contained within an AccordionItem");
|
|
30
|
-
}
|
|
31
|
-
let $state = context.state
|
|
32
|
-
|
|
33
|
-
@render {
|
|
34
|
-
@// TODO: $props.as
|
|
35
|
-
<h4
|
|
36
|
-
{$props?.id}
|
|
37
|
-
class={["torp-accordion-header", $props?.class]}
|
|
38
|
-
{$props?.style}
|
|
39
|
-
data-state={$state.expanded ? "open" : "closed"}
|
|
40
|
-
data-disabled={$state.disabled ? "true" : undefined}
|
|
41
|
-
>
|
|
42
|
-
<slot />
|
|
43
|
-
</h4>
|
|
44
|
-
}
|
|
45
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
import { AccordionContextName, AccordionItemContextName, type ItemState, type AccordionContext, type AccordionItemContext } from "./AccordionTypes";
|
|
3
|
-
|
|
4
|
-
interface AccordionItemProps {
|
|
5
|
-
/** An ID for the root element */
|
|
6
|
-
id?: string;
|
|
7
|
-
/** Classes for the root element */
|
|
8
|
-
class?: ClassValue,
|
|
9
|
-
/** Styles for the root element */
|
|
10
|
-
style?: StyleValue,
|
|
11
|
-
/** The index of this item in the Accordion. Set this if you will be inserting, removing or sorting items. If you don't set this, it will be set automatically */
|
|
12
|
-
index?: number,
|
|
13
|
-
/** A value for the item. Set this if you need more control over which item(s) are expanded. If you don't set this, the value will be set to the item's initial index */
|
|
14
|
-
value?: string,
|
|
15
|
-
/** If set to true, the user cannot interact with this AccordionItem */
|
|
16
|
-
disabled?: boolean,
|
|
17
|
-
/** Raised when this item is opened or closed */
|
|
18
|
-
ontoggle?: (open: boolean) => void,
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* An item in an Accordion, which must consist of an AccordionTrigger and an AccordionContent.
|
|
23
|
-
*
|
|
24
|
-
* The structure of an AccordionItem is:
|
|
25
|
-
*
|
|
26
|
-
* ```
|
|
27
|
-
* <AccordionItem>
|
|
28
|
-
* <AccordionHeader>
|
|
29
|
-
* <AccordionTrigger />
|
|
30
|
-
* </AccordionHeader>
|
|
31
|
-
* <AccordionContent />
|
|
32
|
-
* </AccordionItem>
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export default function AccordionItem($props: AccordionItemProps | undefined) {
|
|
36
|
-
let $state: ItemState = $watch({
|
|
37
|
-
index: -1,
|
|
38
|
-
value: "",
|
|
39
|
-
expanded: false,
|
|
40
|
-
headerId: "",
|
|
41
|
-
contentId: "",
|
|
42
|
-
disabled: $props?.disabled ?? false,
|
|
43
|
-
parentDisabled: false,
|
|
44
|
-
setFocused
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// Get stuff out of the AccordionContext
|
|
48
|
-
const context = $context[AccordionContextName] as AccordionContext;
|
|
49
|
-
if (!context) {
|
|
50
|
-
throw new Error("AccordionItem must be contained within an Accordion");
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Put stuff into an AccordionItemContext
|
|
54
|
-
const itemContext: AccordionItemContext = {
|
|
55
|
-
toggleItem: context.toggleItem,
|
|
56
|
-
handleHeaderKey: context.handleHeaderKey,
|
|
57
|
-
state: $state,
|
|
58
|
-
};
|
|
59
|
-
$context[AccordionItemContextName] = itemContext;
|
|
60
|
-
|
|
61
|
-
// Register this item with the parent Accordion, which will handle toggling expanded for all items
|
|
62
|
-
context.registerItem($state, setFocused);
|
|
63
|
-
|
|
64
|
-
// Remove the item from the parent Accordion when this item is destroyed
|
|
65
|
-
$run(() => {
|
|
66
|
-
return () => {
|
|
67
|
-
context.removeItem($state.index);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// Dispatch the toggle event when the value of expanded changes
|
|
72
|
-
let firstToggle = true;
|
|
73
|
-
$run(() => {
|
|
74
|
-
const ev = $props?.ontoggle;
|
|
75
|
-
const expanded = $state.expanded;
|
|
76
|
-
if (firstToggle) {
|
|
77
|
-
firstToggle = false;
|
|
78
|
-
} else if (ev) {
|
|
79
|
-
ev(expanded);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
// Called from the parent Accordion; pass the focus command along to the AccordionButton
|
|
84
|
-
function setFocused() {
|
|
85
|
-
if (itemContext.setHeaderFocused) {
|
|
86
|
-
itemContext.setHeaderFocused();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
@render {
|
|
91
|
-
<div
|
|
92
|
-
{$props?.id}
|
|
93
|
-
class={["torp-accordion-item", $props?.class]}
|
|
94
|
-
{$props?.style}
|
|
95
|
-
data-state={$state.expanded ? "open" : "closed"}
|
|
96
|
-
data-disabled={$state.disabled ? "true" : undefined}
|
|
97
|
-
>
|
|
98
|
-
<slot />
|
|
99
|
-
</div>
|
|
100
|
-
}
|
|
101
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
import getId from "../utils/getId";
|
|
3
|
-
import { AccordionItemContextName, type AccordionItemContext } from "./AccordionTypes";
|
|
4
|
-
|
|
5
|
-
interface AccordionTriggerProps {
|
|
6
|
-
/** An ID for the root element */
|
|
7
|
-
id?: string;
|
|
8
|
-
/** Classes for the root element */
|
|
9
|
-
class?: ClassValue,
|
|
10
|
-
/** Styles for the root element */
|
|
11
|
-
style?: StyleValue,
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* A header button for an AccordionItem, which can be used to reveal or hide an associated AccordionContent.
|
|
16
|
-
*/
|
|
17
|
-
export default function AccordionTrigger($props: AccordionTriggerProps | undefined) {
|
|
18
|
-
let defaultId = getId();
|
|
19
|
-
|
|
20
|
-
let button: HTMLButtonElement;
|
|
21
|
-
|
|
22
|
-
// Get stuff out of the AccordionItemContext
|
|
23
|
-
const context = $context[AccordionItemContextName] as AccordionItemContext;
|
|
24
|
-
if (!context) {
|
|
25
|
-
throw new Error("AccordionTrigger must be contained within an AccordionItem");
|
|
26
|
-
}
|
|
27
|
-
let $state = context.state;
|
|
28
|
-
|
|
29
|
-
// Set the header ID so that it can be used with aria-labelledby in AccordionContent
|
|
30
|
-
$state.headerId = $props?.id ?? defaultId;
|
|
31
|
-
|
|
32
|
-
// Let the item know how to set the button's focus
|
|
33
|
-
$state.setFocused = setFocused;
|
|
34
|
-
|
|
35
|
-
// This function is called by the parent Accordion to focus this item's button
|
|
36
|
-
function setFocused() {
|
|
37
|
-
button.focus();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function handleClick() {
|
|
41
|
-
// Pass the value to the toggleItem method in the parent Accordion which will handle toggling
|
|
42
|
-
// the value of expanded for all items (e.g. to close other items if necessary)
|
|
43
|
-
context.toggleItem($state.value);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function handleKey(e: KeyboardEvent) {
|
|
47
|
-
// Pass the key press up to the parent Accordion which will handle setting the focused button
|
|
48
|
-
context.handleHeaderKey($state.index, e);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@render {
|
|
52
|
-
<button
|
|
53
|
-
type="button"
|
|
54
|
-
id={$props?.id ?? defaultId}
|
|
55
|
-
class={["torp-accordion-trigger", $props?.class]}
|
|
56
|
-
{$props?.style}
|
|
57
|
-
disabled={$state.disabled || $state.parentDisabled}
|
|
58
|
-
aria-expanded={$state.expanded.toString()}
|
|
59
|
-
aria-disabled={$state.disabled ? "true" : undefined}
|
|
60
|
-
aria-controls={$state.contentId}
|
|
61
|
-
data-state={$state.expanded ? "open" : "closed"}
|
|
62
|
-
data-disabled={$state.disabled ? "true" : undefined}
|
|
63
|
-
&ref={button}
|
|
64
|
-
onclick={handleClick}
|
|
65
|
-
onkeydown={handleKey}
|
|
66
|
-
>
|
|
67
|
-
<slot />
|
|
68
|
-
</button>
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export const AccordionContextName = "Accordion";
|
|
2
|
-
export const AccordionItemContextName = "AccordionItem";
|
|
3
|
-
|
|
4
|
-
export interface AccordionContext {
|
|
5
|
-
/** Called from an AccordionItem when it is added */
|
|
6
|
-
registerItem: (state: ItemState, setFocused: () => void) => void;
|
|
7
|
-
/** Called from an AccordionItem when it is removed */
|
|
8
|
-
removeItem: (index: number) => void;
|
|
9
|
-
/** Called from an AccordionItem when it is toggled */
|
|
10
|
-
toggleItem: (value: string) => void;
|
|
11
|
-
/** Called from an AccordionHeader when it receives a keyboard event */
|
|
12
|
-
handleHeaderKey: (index: number, e: KeyboardEvent) => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface AccordionItemContext {
|
|
16
|
-
/** Raised when an AccordionItem is toggled */
|
|
17
|
-
toggleItem: (value: string) => void;
|
|
18
|
-
/** Raised when an AccordionHeader receives a keyboard event */
|
|
19
|
-
handleHeaderKey: (index: number, e: KeyboardEvent) => void;
|
|
20
|
-
/** The reactive state for an AccordionItem */
|
|
21
|
-
state: ItemState;
|
|
22
|
-
/** Called in an AccordionItem when its header needs to be focused */
|
|
23
|
-
setHeaderFocused?: () => void;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface ItemState {
|
|
27
|
-
index: number;
|
|
28
|
-
value: string;
|
|
29
|
-
expanded: boolean;
|
|
30
|
-
headerId: string;
|
|
31
|
-
contentId: string;
|
|
32
|
-
disabled: boolean;
|
|
33
|
-
parentDisabled: boolean;
|
|
34
|
-
/** Called in the Accordion when a header needs to be focused */
|
|
35
|
-
setFocused: () => void;
|
|
36
|
-
}
|
package/src/Accordion/index.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import Accordion from "./Accordion.torp";
|
|
2
|
-
import AccordionContent from "./AccordionContent.torp";
|
|
3
|
-
import AccordionHeader from "./AccordionHeader.torp";
|
|
4
|
-
import AccordionItem from "./AccordionItem.torp";
|
|
5
|
-
import AccordionTrigger from "./AccordionTrigger.torp";
|
|
6
|
-
|
|
7
|
-
export { Accordion, AccordionItem, AccordionHeader, AccordionTrigger, AccordionContent };
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
|
|
3
|
-
interface BreadcrumbProps {
|
|
4
|
-
/** An ID for the root element */
|
|
5
|
-
id?: string;
|
|
6
|
-
/** Classes for the root element */
|
|
7
|
-
class?: ClassValue,
|
|
8
|
-
/** Styles for the root element */
|
|
9
|
-
style?: StyleValue,
|
|
10
|
-
/** An ARIA label for describing the popover to screen readers */
|
|
11
|
-
ariaLabel?: string | undefined,
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
* A list of links to the parent pages of the current page in hierarchical order.
|
|
17
|
-
*
|
|
18
|
-
* See [the WAI ARIA guidelines for Breadcrumbs](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/).
|
|
19
|
-
*
|
|
20
|
-
* The structure of a Breadcrumb is:
|
|
21
|
-
*
|
|
22
|
-
* ```
|
|
23
|
-
* <Breadcrumb>
|
|
24
|
-
* <BreadcrumbItem />
|
|
25
|
-
* <BreadcrumbSeparator /> (optional)
|
|
26
|
-
* <BreadcrumbItem>
|
|
27
|
-
* ...
|
|
28
|
-
* </BreadcrumbItem>
|
|
29
|
-
* </Breadcrumb>
|
|
30
|
-
* ```
|
|
31
|
-
*
|
|
32
|
-
* You can separate BreadcrumbItems using BreadcrumbSeparators or by using CSS.
|
|
33
|
-
*/
|
|
34
|
-
export default function Breadcrumb($props: BreadcrumbProps | undefined) {
|
|
35
|
-
@render {
|
|
36
|
-
<nav
|
|
37
|
-
{$props?.id}
|
|
38
|
-
class={["torp-breadcrumb", $props?.class]}
|
|
39
|
-
{$props?.style}
|
|
40
|
-
aria-label={$props?.ariaLabel}
|
|
41
|
-
>
|
|
42
|
-
<slot />
|
|
43
|
-
</nav>
|
|
44
|
-
}
|
|
45
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
|
|
3
|
-
interface BreadcrumbItemProps {
|
|
4
|
-
/** An ID for the root element */
|
|
5
|
-
id?: string;
|
|
6
|
-
/** Classes for the root element */
|
|
7
|
-
class?: ClassValue,
|
|
8
|
-
/** Styles for the root element */
|
|
9
|
-
style?: StyleValue,
|
|
10
|
-
/** Whether this is the current page */
|
|
11
|
-
current?: boolean,
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* An item in a breadcrumb, containing a link to one of the parent pages of the
|
|
16
|
-
* current page (or the current page).
|
|
17
|
-
*/
|
|
18
|
-
export default function BreadcrumbItem($props: BreadcrumbItemProps | undefined) {
|
|
19
|
-
@render {
|
|
20
|
-
<div
|
|
21
|
-
{$props?.id}
|
|
22
|
-
class={["torp-breadcrumb", $props?.class]}
|
|
23
|
-
{$props?.style}
|
|
24
|
-
aria-current={$props?.current ? "page" : undefined}
|
|
25
|
-
data-current={$props?.current ? "current" : undefined}
|
|
26
|
-
>
|
|
27
|
-
<slot />
|
|
28
|
-
</div>
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
|
|
3
|
-
interface BreadcrumbSeparatorProps {
|
|
4
|
-
/** An ID for the root element */
|
|
5
|
-
id?: string;
|
|
6
|
-
/** Classes for the root element */
|
|
7
|
-
class?: ClassValue,
|
|
8
|
-
/** Styles for the root element */
|
|
9
|
-
style?: StyleValue,
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* A separator between links in a Breadcrumb component. It is hidden from
|
|
14
|
-
* screen readers.
|
|
15
|
-
*/
|
|
16
|
-
export default function BreadcrumbSeparator($props: BreadcrumbSeparatorProps | undefined) {
|
|
17
|
-
@render {
|
|
18
|
-
<div
|
|
19
|
-
{$props?.id}
|
|
20
|
-
class={["torp-breadcrumb-separator", $props?.class]}
|
|
21
|
-
{$props?.style}
|
|
22
|
-
aria-hidden="true"
|
|
23
|
-
>
|
|
24
|
-
<slot />
|
|
25
|
-
</div>
|
|
26
|
-
}
|
|
27
|
-
}
|
package/src/Breadcrumb/index.ts
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
import { ReactiveDate } from "@torpor/view";
|
|
3
|
-
import { areDatesEqual, dayNames, monthNames } from "../utils/dateUtils";
|
|
4
|
-
import CalendarDay from "./CalendarDay.torp";
|
|
5
|
-
import { type CalendarContext, type DayState, type CalendarEvent, CalendarContextName } from "./CalendarTypes";
|
|
6
|
-
import ChevronLeft from "../icons/ChevronLeft.torp";
|
|
7
|
-
import ChevronRight from "../icons/ChevronRight.torp";
|
|
8
|
-
|
|
9
|
-
// TODO: Split this out into Calendar, CalendarHeader, CalendarPreviousTrigger, CalendarGrid etc
|
|
10
|
-
|
|
11
|
-
interface CalendarProps {
|
|
12
|
-
/** An ID for the root element */
|
|
13
|
-
id?: string;
|
|
14
|
-
/** Classes for the root element */
|
|
15
|
-
class?: ClassValue,
|
|
16
|
-
/** Styles for the root element */
|
|
17
|
-
style?: StyleValue,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default function Calendar($props: CalendarProps) {
|
|
21
|
-
$props ??= $watch({});
|
|
22
|
-
$props.startOfWeek ??= 1;
|
|
23
|
-
$props.selectable ??= false;
|
|
24
|
-
$props.value ??= new Date();
|
|
25
|
-
$props.events ??= [];
|
|
26
|
-
|
|
27
|
-
// Ensure the value is a reactive date
|
|
28
|
-
$props.value = new ReactiveDate($unwrap($props.value));
|
|
29
|
-
|
|
30
|
-
// A note on dates:
|
|
31
|
-
// * value is the selected value
|
|
32
|
-
// * activeDate is the date that is active when the user is navigating via keyboard
|
|
33
|
-
// * visibleDate is the date that is currently being displayed in the calendar (really only the month part is important here)
|
|
34
|
-
|
|
35
|
-
let $state = $watch({
|
|
36
|
-
activeDate: $props.value,
|
|
37
|
-
visibleDate: $props.value,
|
|
38
|
-
get days() {
|
|
39
|
-
return $cache(() => {
|
|
40
|
-
return buildDays($state.visibleDate, $props.startOfWeek)
|
|
41
|
-
});
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
let visibleStartDate = $props.value;
|
|
46
|
-
let visibleEndDate = $props.value;
|
|
47
|
-
let container: HTMLElement;
|
|
48
|
-
let refocus = false;
|
|
49
|
-
|
|
50
|
-
const context: CalendarContext = {
|
|
51
|
-
registerDay
|
|
52
|
-
};
|
|
53
|
-
$context[CalendarContextName] = context;
|
|
54
|
-
|
|
55
|
-
$run(() => {
|
|
56
|
-
// HACK: Shouldn't need this
|
|
57
|
-
if (refocus) {
|
|
58
|
-
refocus = false;
|
|
59
|
-
const el = container.getElementsByClassName("active")[0];
|
|
60
|
-
if (el && el.children[0] instanceof HTMLElement) {
|
|
61
|
-
el.children[0].focus();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
function registerDay(date: ReactiveDate, setActive: (value: boolean) => void) {
|
|
67
|
-
const day = $state.days.find((day) => areDatesEqual(day.date, date));
|
|
68
|
-
if (day) {
|
|
69
|
-
day.setActive = setActive;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function buildDays(date: ReactiveDate, start: number): DayState[] {
|
|
74
|
-
const newDays = [];
|
|
75
|
-
|
|
76
|
-
// Set the first day to the start of the week before the first day of
|
|
77
|
-
// the month (e.g. Monday the 28th of the previous month)
|
|
78
|
-
visibleStartDate = new Date();
|
|
79
|
-
visibleStartDate.setFullYear(date.getFullYear(), date.getMonth(), 1);
|
|
80
|
-
visibleStartDate.setDate(
|
|
81
|
-
visibleStartDate.getDate() - ((visibleStartDate.getDay() + 7 - start) % 7)
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
// Set the last day to the end of the week after the last day of the
|
|
85
|
-
// month (e.g. Sunday the 6th of the next month)
|
|
86
|
-
visibleEndDate = new Date();
|
|
87
|
-
visibleEndDate.setFullYear(date.getFullYear(), date.getMonth() + 1, 0);
|
|
88
|
-
visibleEndDate.setDate(
|
|
89
|
-
visibleEndDate.getDate() + ((start - 1 - visibleEndDate.getDay() + 7) % 7)
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
const dayDiff =
|
|
93
|
-
Math.round((visibleEndDate.getTime() - visibleStartDate.getTime()) / (1000 * 60 * 60 * 24)) +
|
|
94
|
-
1;
|
|
95
|
-
|
|
96
|
-
for (let i = 0; i < dayDiff; i++) {
|
|
97
|
-
const dayDate = new ReactiveDate();
|
|
98
|
-
dayDate.setFullYear(
|
|
99
|
-
visibleStartDate.getFullYear(),
|
|
100
|
-
visibleStartDate.getMonth(),
|
|
101
|
-
visibleStartDate.getDate() + i
|
|
102
|
-
);
|
|
103
|
-
dayDate.setHours(0);
|
|
104
|
-
dayDate.setMinutes(0);
|
|
105
|
-
dayDate.setSeconds(0);
|
|
106
|
-
dayDate.setMilliseconds(0);
|
|
107
|
-
const newDay: DayState = {
|
|
108
|
-
date: dayDate,
|
|
109
|
-
muted: dayDate.getMonth() !== date.getMonth(),
|
|
110
|
-
active: areDatesEqual(dayDate, $state.activeDate)
|
|
111
|
-
};
|
|
112
|
-
newDays.push(newDay);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return newDays;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function setValue(date: Date) {
|
|
119
|
-
$state.value = new ReactiveDate(date);
|
|
120
|
-
|
|
121
|
-
// Also set the active date so that the user knows where they are
|
|
122
|
-
setActiveDate(date);
|
|
123
|
-
|
|
124
|
-
if ($props.onchange) $props.onchange(value);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function setActiveDate(date: Date) {
|
|
128
|
-
$state.activeDate = new ReactiveDate(date);
|
|
129
|
-
|
|
130
|
-
// If the selected date is outside the visible date range, move the date range
|
|
131
|
-
if (date < visibleStartDate || date > visibleEndDate) {
|
|
132
|
-
refocus = true;
|
|
133
|
-
$state.visibleDate = new ReactiveDate(date);
|
|
134
|
-
if ($props.onchangedate) $props.onchangedate(date);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
$state.days.forEach((day) => {
|
|
138
|
-
const active = areDatesEqual(day.date, new Date(date));
|
|
139
|
-
if (day.setActive) {
|
|
140
|
-
day.setActive(active);
|
|
141
|
-
}
|
|
142
|
-
day.active = active;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function handleFocus(e: FocusEvent & { currentTarget: EventTarget & HTMLElement }) {
|
|
147
|
-
const el = e.currentTarget.getElementsByClassName("active")[0];
|
|
148
|
-
if (el && el.children[0] instanceof HTMLElement) {
|
|
149
|
-
el.children[0].focus();
|
|
150
|
-
e.preventDefault();
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function handlePrevMonth(e: Event) {
|
|
155
|
-
e.preventDefault();
|
|
156
|
-
$state.visibleDate.setMonth($state.visibleDate.getMonth() - 1);
|
|
157
|
-
if ($props.onchangedate) $props.onchangedate(visibleDate);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function handleNextMonth(e: Event) {
|
|
161
|
-
e.preventDefault();
|
|
162
|
-
$state.visibleDate.setMonth($state.visibleDate.getMonth() + 1);
|
|
163
|
-
if ($props.onchangedate) $props.onchangedate(visibleDate);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
async function handleDayClick(date: ReactiveDate) {
|
|
167
|
-
if (!$props.selectable) return;
|
|
168
|
-
|
|
169
|
-
setValue(date);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function handleKey(e: KeyboardEvent) {
|
|
173
|
-
if (!$props.selectable) return;
|
|
174
|
-
|
|
175
|
-
switch (e.key) {
|
|
176
|
-
case "Enter": {
|
|
177
|
-
e.preventDefault();
|
|
178
|
-
setValue($state.activeDate);
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
case "Esc":
|
|
182
|
-
case "Escape": {
|
|
183
|
-
e.preventDefault();
|
|
184
|
-
if ($props.onclose) $props.onclose();
|
|
185
|
-
break;
|
|
186
|
-
}
|
|
187
|
-
case "Left":
|
|
188
|
-
case "ArrowLeft": {
|
|
189
|
-
e.preventDefault();
|
|
190
|
-
// Move to the date one day before
|
|
191
|
-
const newDate = new Date($state.activeDate.getTime() - 1 * 86400000)
|
|
192
|
-
setActiveDate(newDate);
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
case "Up":
|
|
196
|
-
case "ArrowUp": {
|
|
197
|
-
e.preventDefault();
|
|
198
|
-
// Move to the date seven days before
|
|
199
|
-
const newDate = new Date($state.activeDate.getTime() - 7 * 86400000)
|
|
200
|
-
setActiveDate(newDate);
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
case "Right":
|
|
204
|
-
case "ArrowRight": {
|
|
205
|
-
e.preventDefault();
|
|
206
|
-
// Move to the date one day after
|
|
207
|
-
const newDate = new Date($state.activeDate.getTime() + 1 * 86400000)
|
|
208
|
-
setActiveDate(newDate);
|
|
209
|
-
break;
|
|
210
|
-
}
|
|
211
|
-
case "Down":
|
|
212
|
-
case "ArrowDown": {
|
|
213
|
-
e.preventDefault();
|
|
214
|
-
// Move to the date seven days after
|
|
215
|
-
const newDate = new Date($state.activeDate.getTime() + 7 * 86400000)
|
|
216
|
-
setActiveDate(newDate);
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
@render {
|
|
223
|
-
<div
|
|
224
|
-
{$props?.id}
|
|
225
|
-
class={["torp-calendar", $props?.class]}
|
|
226
|
-
{$props?.style}
|
|
227
|
-
&ref={container}
|
|
228
|
-
>
|
|
229
|
-
<div class={`torp-calendar-header ${$props?.class ?? ""}`.trim()}>
|
|
230
|
-
<button class={`torp-calendar-previous-trigger ${$props?.class ?? ""}`.trim()} onclick={handlePrevMonth}>
|
|
231
|
-
<slot name="prev-button">
|
|
232
|
-
<ChevronLeft />
|
|
233
|
-
</slot>
|
|
234
|
-
</button>
|
|
235
|
-
<span class={`torp-calendar-month-name ${$props?.class ?? ""}`.trim()}>
|
|
236
|
-
{monthNames[$state.visibleDate.getMonth()] + " " + $state.visibleDate.getFullYear()}
|
|
237
|
-
</span>
|
|
238
|
-
<button class={`torp-calendar-next-trigger ${$props?.class ?? ""}`.trim()} onclick={handleNextMonth}>
|
|
239
|
-
<slot name="next-button">
|
|
240
|
-
<ChevronRight />
|
|
241
|
-
</slot>
|
|
242
|
-
</button>
|
|
243
|
-
</div>
|
|
244
|
-
<div
|
|
245
|
-
class={["torp-calendar-grid", $props?.class]}
|
|
246
|
-
{$props?.style}
|
|
247
|
-
tabindex={$props.selectable ? 0 : -1}
|
|
248
|
-
onfocus={handleFocus}
|
|
249
|
-
onkeydown={handleKey}
|
|
250
|
-
>
|
|
251
|
-
@for (let index of [0, 1, 2, 3, 4, 5, 6]) {
|
|
252
|
-
<span>
|
|
253
|
-
{dayNames[(Math.abs($props.startOfWeek) + index) % 7].substring(0, 2)}
|
|
254
|
-
</span>
|
|
255
|
-
}
|
|
256
|
-
@for (let day of $state.days) {
|
|
257
|
-
@key = day.date;
|
|
258
|
-
<CalendarDay
|
|
259
|
-
{day.date}
|
|
260
|
-
{day.muted}
|
|
261
|
-
{day.active}
|
|
262
|
-
{$props.selectable}
|
|
263
|
-
events={$props.events.filter((ev) => areDatesEqual(new Date(ev.date), day.date))}
|
|
264
|
-
onclick={handleDayClick}
|
|
265
|
-
/>
|
|
266
|
-
}
|
|
267
|
-
</div>
|
|
268
|
-
</div>
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
@style {
|
|
272
|
-
.torp-calendar-grid {
|
|
273
|
-
display: grid;
|
|
274
|
-
grid-template-columns: repeat(7, 1fr);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|