@plexui/ui 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/dist/es/components/Accordion/Accordion.js +2 -2
- package/dist/es/components/Accordion/Accordion.js.map +1 -1
- package/dist/es/components/Accordion/index.js +1 -1
- package/dist/es/components/Alert/Alert.js +6 -6
- package/dist/es/components/Alert/Alert.js.map +1 -1
- package/dist/es/components/Alert/index.js +1 -1
- package/dist/es/components/Avatar/Avatar.js +12 -5
- package/dist/es/components/Avatar/Avatar.js.map +1 -1
- package/dist/es/components/Avatar/AvatarGroup.js +2 -2
- package/dist/es/components/Avatar/AvatarGroup.js.map +1 -1
- package/dist/es/components/Avatar/index.js +2 -2
- package/dist/es/components/Badge/index.js +3 -3
- package/dist/es/components/Badge/index.js.map +1 -1
- package/dist/es/components/Breadcrumb/Breadcrumb.js +34 -0
- package/dist/es/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/es/components/Breadcrumb/index.js +2 -0
- package/dist/es/components/Breadcrumb/index.js.map +1 -0
- package/dist/es/components/Button/Button.js +7 -7
- package/dist/es/components/Button/Button.js.map +1 -1
- package/dist/es/components/Button/CopyButton.js +25 -13
- package/dist/es/components/Button/CopyButton.js.map +1 -1
- package/dist/es/components/Button/index.js +2 -2
- package/dist/es/components/ButtonGroup/ButtonGroup.js +2 -2
- package/dist/es/components/ButtonGroup/ButtonGroup.js.map +1 -1
- package/dist/es/components/ButtonGroup/index.js +1 -1
- package/dist/es/components/Card/Card.js +4 -3
- package/dist/es/components/Card/Card.js.map +1 -1
- package/dist/es/components/Card/index.js +1 -1
- package/dist/es/components/Checkbox/Checkbox.js +12 -6
- package/dist/es/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/es/components/Checkbox/index.js +1 -1
- package/dist/es/components/CodeBlock/CodeBlock.js +25 -25
- package/dist/es/components/CodeBlock/CodeBlock.js.map +1 -1
- package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js +6 -4
- package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js.map +1 -1
- package/dist/es/components/CodeBlock/index.js +2 -2
- package/dist/es/components/DataTable/DataTable.js +108 -27
- package/dist/es/components/DataTable/DataTable.js.map +1 -1
- package/dist/es/components/DataTable/DataTableColumnHeader.js +2 -2
- package/dist/es/components/DataTable/DataTableColumnHeader.js.map +1 -1
- package/dist/es/components/DataTable/DataTablePagination.js +8 -4
- package/dist/es/components/DataTable/DataTablePagination.js.map +1 -1
- package/dist/es/components/DataTable/columnHelpers.js +3 -3
- package/dist/es/components/DataTable/index.js +4 -4
- package/dist/es/components/DateInput/DateInput.js +21 -13
- package/dist/es/components/DateInput/DateInput.js.map +1 -1
- package/dist/es/components/DateInput/index.js +1 -1
- package/dist/es/components/DatePicker/Calendar.js +136 -32
- package/dist/es/components/DatePicker/Calendar.js.map +1 -1
- package/dist/es/components/DatePicker/DatePicker.js +15 -11
- package/dist/es/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/es/components/DatePicker/index.js +1 -1
- package/dist/es/components/DateRangePicker/Calendar.js +125 -22
- package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
- package/dist/es/components/DateRangePicker/DateRangePicker.js +10 -9
- package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/es/components/DateRangePicker/Trigger.js +12 -9
- package/dist/es/components/DateRangePicker/Trigger.js.map +1 -1
- package/dist/es/components/DateRangePicker/index.js +2 -2
- package/dist/es/components/Dialog/Dialog.js +11 -6
- package/dist/es/components/Dialog/Dialog.js.map +1 -1
- package/dist/es/components/Dialog/index.js +1 -1
- package/dist/es/components/Dialog/index.js.map +1 -1
- package/dist/es/components/EmptyMessage/EmptyMessage.js +4 -4
- package/dist/es/components/EmptyMessage/EmptyMessage.js.map +1 -1
- package/dist/es/components/EmptyMessage/index.js +1 -1
- package/dist/es/components/Field/Field.js +22 -7
- package/dist/es/components/Field/Field.js.map +1 -1
- package/dist/es/components/Field/index.js +1 -1
- package/dist/es/components/FieldError/FieldError.js +4 -4
- package/dist/es/components/FieldError/FieldError.js.map +1 -1
- package/dist/es/components/FieldError/index.js +1 -1
- package/dist/es/components/FileUpload/FileUpload.js +12 -9
- package/dist/es/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/es/components/FileUpload/index.js +1 -1
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js +31 -4
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js.map +1 -1
- package/dist/es/components/FloatingLabelInput/index.js +1 -1
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js +28 -8
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js.map +1 -1
- package/dist/es/components/FloatingLabelSelect/index.js +1 -1
- package/dist/es/components/Icon/aliases.js +20 -20
- package/dist/es/components/Icon/index.js +653 -653
- package/dist/es/components/Image/Image.js +19 -7
- package/dist/es/components/Image/Image.js.map +1 -1
- package/dist/es/components/Image/index.js +1 -1
- package/dist/es/components/Indicator/CircularProgress.js +3 -3
- package/dist/es/components/Indicator/CircularProgress.js.map +1 -1
- package/dist/es/components/Indicator/LoadingDots.js +1 -1
- package/dist/es/components/Indicator/LoadingDots.js.map +1 -1
- package/dist/es/components/Indicator/LoadingIndicator.js +2 -2
- package/dist/es/components/Indicator/LoadingIndicator.js.map +1 -1
- package/dist/es/components/Indicator/index.js +3 -3
- package/dist/es/components/Input/Input.js +16 -5
- package/dist/es/components/Input/Input.js.map +1 -1
- package/dist/es/components/Input/index.js +1 -1
- package/dist/es/components/InputGroup/InputGroup.js +60 -0
- package/dist/es/components/InputGroup/InputGroup.js.map +1 -0
- package/dist/es/components/InputGroup/index.js +2 -0
- package/dist/es/components/InputGroup/index.js.map +1 -0
- package/dist/es/components/Kbd/Kbd.js +13 -0
- package/dist/es/components/Kbd/Kbd.js.map +1 -0
- package/dist/es/components/Kbd/index.js +2 -0
- package/dist/es/components/Kbd/index.js.map +1 -0
- package/dist/es/components/Label/Label.js +1 -1
- package/dist/es/components/Label/Label.js.map +1 -1
- package/dist/es/components/Label/index.js +1 -1
- package/dist/es/components/Markdown/Markdown.js +8 -8
- package/dist/es/components/Markdown/Markdown.js.map +1 -1
- package/dist/es/components/Markdown/directives.js +2 -2
- package/dist/es/components/Markdown/index.js +4 -5
- package/dist/es/components/Markdown/index.js.map +1 -1
- package/dist/es/components/MarkdownEditor/MarkdownEditor.js +35 -11
- package/dist/es/components/MarkdownEditor/MarkdownEditor.js.map +1 -1
- package/dist/es/components/MarkdownEditor/index.js +1 -1
- package/dist/es/components/Menu/Menu.js +26 -18
- package/dist/es/components/Menu/Menu.js.map +1 -1
- package/dist/es/components/Menu/index.js +1 -1
- package/dist/es/components/OTPInput/OTPInput.js +51 -34
- package/dist/es/components/OTPInput/OTPInput.js.map +1 -1
- package/dist/es/components/OTPInput/index.js +1 -1
- package/dist/es/components/PlexUIProvider/PlexUIProvider.js +3 -1
- package/dist/es/components/PlexUIProvider/PlexUIProvider.js.map +1 -1
- package/dist/es/components/PlexUIProvider/index.js +1 -1
- package/dist/es/components/PlexUIProvider/internal.js +1 -1
- package/dist/es/components/Popover/Popover.js +7 -7
- package/dist/es/components/Popover/Popover.js.map +1 -1
- package/dist/es/components/Popover/index.js +2 -3
- package/dist/es/components/Popover/index.js.map +1 -1
- package/dist/es/components/Popover/usePopoverController.js +2 -2
- package/dist/es/components/Progress/Progress.js +1 -1
- package/dist/es/components/Progress/Progress.js.map +1 -1
- package/dist/es/components/Progress/index.js +1 -1
- package/dist/es/components/ProgressSteps/ProgressSteps.js +6 -4
- package/dist/es/components/ProgressSteps/ProgressSteps.js.map +1 -1
- package/dist/es/components/ProgressSteps/index.js +1 -1
- package/dist/es/components/RadioGroup/RadioGroup.js +10 -6
- package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/es/components/RadioGroup/index.js +1 -1
- package/dist/es/components/SegmentedControl/index.js +1 -1
- package/dist/es/components/Select/Select.js +104 -67
- package/dist/es/components/Select/Select.js.map +1 -1
- package/dist/es/components/Select/index.js +1 -1
- package/dist/es/components/SelectControl/SelectControl.js +10 -5
- package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
- package/dist/es/components/SelectControl/index.js +1 -1
- package/dist/es/components/Separator/Separator.js +1 -1
- package/dist/es/components/Separator/Separator.js.map +1 -1
- package/dist/es/components/Separator/index.js +1 -1
- package/dist/es/components/ShimmerText/ShimmerText.js +1 -1
- package/dist/es/components/ShimmerText/ShimmerText.js.map +1 -1
- package/dist/es/components/ShimmerText/index.js +1 -1
- package/dist/es/components/Sidebar/Sidebar.js +37 -29
- package/dist/es/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/es/components/Sidebar/index.js +2 -2
- package/dist/es/components/Sidebar/useSidebarContext.js +17 -19
- package/dist/es/components/Sidebar/useSidebarContext.js.map +1 -1
- package/dist/es/components/Skeleton/index.js +1 -1
- package/dist/es/components/Skeleton/index.js.map +1 -1
- package/dist/es/components/Slider/Slider.js +48 -19
- package/dist/es/components/Slider/Slider.js.map +1 -1
- package/dist/es/components/Slider/index.js +1 -1
- package/dist/es/components/StatCard/StatCard.js +5 -5
- package/dist/es/components/StatCard/StatCard.js.map +1 -1
- package/dist/es/components/StatCard/index.js +1 -1
- package/dist/es/components/Switch/Switch.js +7 -3
- package/dist/es/components/Switch/Switch.js.map +1 -1
- package/dist/es/components/Switch/index.js +1 -1
- package/dist/es/components/Table/Table.js +1 -1
- package/dist/es/components/Table/Table.js.map +1 -1
- package/dist/es/components/Table/index.js +1 -1
- package/dist/es/components/Tabs/Tabs.js +154 -6
- package/dist/es/components/Tabs/Tabs.js.map +1 -1
- package/dist/es/components/Tabs/index.js +1 -1
- package/dist/es/components/Tabs/overflow.js +44 -0
- package/dist/es/components/Tabs/overflow.js.map +1 -0
- package/dist/es/components/TagInput/TagInput.js +47 -23
- package/dist/es/components/TagInput/TagInput.js.map +1 -1
- package/dist/es/components/TagInput/index.js +1 -1
- package/dist/es/components/TextLink/TextLink.js +16 -5
- package/dist/es/components/TextLink/TextLink.js.map +1 -1
- package/dist/es/components/TextLink/index.js +1 -1
- package/dist/es/components/Textarea/Textarea.js +4 -4
- package/dist/es/components/Textarea/Textarea.js.map +1 -1
- package/dist/es/components/Textarea/index.js +1 -1
- package/dist/es/components/Toast/Toaster.js +2 -2
- package/dist/es/components/Toast/Toaster.js.map +1 -1
- package/dist/es/components/Toast/index.js +1 -1
- package/dist/es/components/Tooltip/CopyTooltip.js +30 -9
- package/dist/es/components/Tooltip/CopyTooltip.js.map +1 -1
- package/dist/es/components/Tooltip/Tooltip.js +3 -3
- package/dist/es/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/es/components/Tooltip/index.js +2 -2
- package/dist/es/components/Transition/Animate.js +4 -4
- package/dist/es/components/Transition/Animate.js.map +1 -1
- package/dist/es/components/Transition/AnimateLayout.js +4 -4
- package/dist/es/components/Transition/AnimateLayout.js.map +1 -1
- package/dist/es/components/Transition/AnimateLayoutGroup.js +12 -8
- package/dist/es/components/Transition/AnimateLayoutGroup.js.map +1 -1
- package/dist/es/components/Transition/SlotTransitionGroup.js +4 -4
- package/dist/es/components/Transition/TransitionGroup.js +5 -5
- package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
- package/dist/es/components/Transition/getDisableAnimations.js +1 -1
- package/dist/es/components/Transition/index.js +5 -5
- package/dist/es/components/Transition/shared.js +7 -5
- package/dist/es/components/Transition/shared.js.map +1 -1
- package/dist/es/components/UIProvider/UIProvider.js +1 -1
- package/dist/es/components/UIProvider/index.js +1 -1
- package/dist/es/components/UIProvider/internal.js +1 -1
- package/dist/es/hooks/useAnimatedScrollTo.js +1 -1
- package/dist/es/hooks/useBreakpoints.js +8 -2
- package/dist/es/hooks/useBreakpoints.js.map +1 -1
- package/dist/es/hooks/useEscCloseStack.js +1 -1
- package/dist/es/hooks/usePrevious.js +7 -5
- package/dist/es/hooks/usePrevious.js.map +1 -1
- package/dist/es/hooks/useTextSelection.js +2 -2
- package/dist/es/hooks/useTrailingValue.js +1 -1
- package/dist/es/lib/constants.js +1 -1
- package/dist/es/lib/helpers.js +1 -1
- package/dist/es/lib/helpers.js.map +1 -1
- package/dist/es/lib/renderHelpers.js +15 -6
- package/dist/es/lib/renderHelpers.js.map +1 -1
- package/dist/es/lib/theme.js +16 -16
- package/dist/es/lib/theme.js.map +1 -1
- package/dist/es/lib/userAgent.js +3 -2
- package/dist/es/lib/userAgent.js.map +1 -1
- package/dist/es/styles/base.css +1 -102
- package/dist/es/styles/globals.css +1 -50
- package/dist/es/styles/index.css +1 -25
- package/dist/es/styles/katex.min.css +1 -1296
- package/dist/es/styles/tailwind-utilities.css +1 -1316
- package/dist/es/styles/variables-components.css +1 -626
- package/dist/es/styles/variables-primitive.css +1 -327
- package/dist/es/styles/variables-semantic.css +1 -609
- package/dist/es/styles/variables-tailwind-theme.css +1 -34
- package/dist/es/styles/variables-tokens-root.css +1 -41
- package/dist/es/types.js +1 -1
- package/dist/es/types.js.map +1 -1
- package/dist/es/vite/index.js +3 -53
- package/dist/es/vite/index.js.map +1 -1
- package/dist/types/components/Accordion/index.d.ts +1 -1
- package/dist/types/components/Alert/Alert.d.ts +8 -2
- package/dist/types/components/Alert/index.d.ts +1 -1
- package/dist/types/components/Avatar/Avatar.d.ts +1 -1
- package/dist/types/components/Avatar/index.d.ts +2 -2
- package/dist/types/components/Badge/index.d.ts +1 -1
- package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +34 -0
- package/dist/types/components/Breadcrumb/index.d.ts +1 -0
- package/dist/types/components/Button/Button.d.ts +3 -3
- package/dist/types/components/Button/CopyButton.d.ts +9 -4
- package/dist/types/components/Button/index.d.ts +2 -2
- package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +4 -3
- package/dist/types/components/ButtonGroup/index.d.ts +1 -1
- package/dist/types/components/Card/index.d.ts +1 -1
- package/dist/types/components/Checkbox/Checkbox.d.ts +3 -1
- package/dist/types/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/CodeBlock/index.d.ts +2 -2
- package/dist/types/components/DataTable/DataTable.d.ts +3 -2
- package/dist/types/components/DataTable/index.d.ts +4 -4
- package/dist/types/components/DateInput/DateInput.d.ts +1 -1
- package/dist/types/components/DateInput/index.d.ts +1 -1
- package/dist/types/components/DatePicker/DatePicker.d.ts +7 -6
- package/dist/types/components/DatePicker/context.d.ts +1 -1
- package/dist/types/components/DatePicker/index.d.ts +2 -2
- package/dist/types/components/DateRangePicker/Calendar.d.ts +1 -1
- package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +5 -5
- package/dist/types/components/DateRangePicker/context.d.ts +2 -2
- package/dist/types/components/DateRangePicker/index.d.ts +2 -2
- package/dist/types/components/Dialog/Dialog.d.ts +19 -1
- package/dist/types/components/Dialog/index.d.ts +1 -1
- package/dist/types/components/EmptyMessage/EmptyMessage.d.ts +15 -3
- package/dist/types/components/EmptyMessage/index.d.ts +1 -1
- package/dist/types/components/Field/Field.d.ts +14 -4
- package/dist/types/components/Field/index.d.ts +1 -1
- package/dist/types/components/FieldError/FieldError.d.ts +7 -1
- package/dist/types/components/FieldError/index.d.ts +1 -1
- package/dist/types/components/FileUpload/index.d.ts +1 -1
- package/dist/types/components/FloatingLabelInput/index.d.ts +1 -1
- package/dist/types/components/FloatingLabelSelect/index.d.ts +1 -1
- package/dist/types/components/Icon/aliases.d.ts +20 -20
- package/dist/types/components/Icon/index.d.ts +653 -653
- package/dist/types/components/Image/Image.d.ts +1 -1
- package/dist/types/components/Image/index.d.ts +1 -1
- package/dist/types/components/Indicator/index.d.ts +3 -3
- package/dist/types/components/Input/Input.d.ts +2 -2
- package/dist/types/components/Input/index.d.ts +1 -1
- package/dist/types/components/InputGroup/InputGroup.d.ts +78 -0
- package/dist/types/components/InputGroup/index.d.ts +1 -0
- package/dist/types/components/Kbd/Kbd.d.ts +20 -0
- package/dist/types/components/Kbd/index.d.ts +1 -0
- package/dist/types/components/Label/index.d.ts +1 -1
- package/dist/types/components/Markdown/Markdown.d.ts +1 -1
- package/dist/types/components/Markdown/index.d.ts +4 -4
- package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +6 -2
- package/dist/types/components/MarkdownEditor/index.d.ts +1 -1
- package/dist/types/components/Menu/Menu.d.ts +11 -3
- package/dist/types/components/Menu/index.d.ts +1 -1
- package/dist/types/components/OTPInput/index.d.ts +1 -1
- package/dist/types/components/PlexUIProvider/PlexUIProvider.d.ts +0 -11
- package/dist/types/components/PlexUIProvider/index.d.ts +1 -1
- package/dist/types/components/Popover/index.d.ts +2 -2
- package/dist/types/components/Progress/index.d.ts +1 -1
- package/dist/types/components/ProgressSteps/ProgressSteps.d.ts +1 -1
- package/dist/types/components/ProgressSteps/index.d.ts +1 -1
- package/dist/types/components/RadioGroup/RadioGroup.d.ts +3 -1
- package/dist/types/components/RadioGroup/index.d.ts +1 -1
- package/dist/types/components/SegmentedControl/index.d.ts +2 -2
- package/dist/types/components/Select/Select.d.ts +8 -1
- package/dist/types/components/Select/index.d.ts +1 -1
- package/dist/types/components/SelectControl/SelectControl.d.ts +1 -1
- package/dist/types/components/SelectControl/index.d.ts +1 -1
- package/dist/types/components/Separator/index.d.ts +1 -1
- package/dist/types/components/ShimmerText/index.d.ts +1 -1
- package/dist/types/components/Sidebar/Sidebar.d.ts +4 -8
- package/dist/types/components/Sidebar/index.d.ts +4 -4
- package/dist/types/components/Slider/Slider.d.ts +8 -0
- package/dist/types/components/Slider/index.d.ts +2 -2
- package/dist/types/components/StatCard/index.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts +1 -1
- package/dist/types/components/Table/index.d.ts +1 -1
- package/dist/types/components/Tabs/Tabs.d.ts +15 -2
- package/dist/types/components/Tabs/index.d.ts +2 -2
- package/dist/types/components/Tabs/overflow.d.ts +17 -0
- package/dist/types/components/TagInput/TagInput.d.ts +1 -1
- package/dist/types/components/TagInput/index.d.ts +1 -1
- package/dist/types/components/TextLink/index.d.ts +1 -1
- package/dist/types/components/Textarea/Textarea.d.ts +1 -1
- package/dist/types/components/Textarea/index.d.ts +1 -1
- package/dist/types/components/Toast/index.d.ts +1 -1
- package/dist/types/components/Tooltip/CopyTooltip.d.ts +6 -1
- package/dist/types/components/Tooltip/index.d.ts +2 -2
- package/dist/types/components/Transition/Animate.d.ts +2 -2
- package/dist/types/components/Transition/AnimateLayout.d.ts +2 -2
- package/dist/types/components/Transition/AnimateLayoutGroup.d.ts +2 -2
- package/dist/types/components/Transition/SlotTransitionGroup.d.ts +1 -1
- package/dist/types/components/Transition/TransitionGroup.d.ts +1 -1
- package/dist/types/components/Transition/index.d.ts +5 -5
- package/dist/types/components/UIProvider/index.d.ts +1 -1
- package/dist/types/global.d.ts +5 -1
- package/dist/types/lib/constants.d.ts +1 -1
- package/dist/types/lib/helpers.d.ts +4 -4
- package/dist/types/lib/theme.d.ts +1 -1
- package/dist/types/types.d.ts +2 -15
- package/dist/types/vite/index.d.ts +2 -55
- package/package.json +10 -18
- package/dist/es/components/Accordion/Accordion.module.css +0 -89
- package/dist/es/components/Alert/Alert.module.css +0 -187
- package/dist/es/components/Avatar/Avatar.module.css +0 -168
- package/dist/es/components/Avatar/AvatarGroup.module.css +0 -26
- package/dist/es/components/Badge/Badge.module.css +0 -196
- package/dist/es/components/Button/Button.module.css +0 -859
- package/dist/es/components/ButtonGroup/ButtonGroup.module.css +0 -159
- package/dist/es/components/Card/Card.module.css +0 -125
- package/dist/es/components/Checkbox/Checkbox.module.css +0 -198
- package/dist/es/components/CodeBlock/CodeBlock.module.css +0 -137
- package/dist/es/components/DataTable/DataTable.module.css +0 -108
- package/dist/es/components/DatePicker/Calendar.module.css +0 -271
- package/dist/es/components/DateRangePicker/Calendar.module.css +0 -295
- package/dist/es/components/DateRangePicker/Trigger.module.css +0 -25
- package/dist/es/components/Dialog/Dialog.module.css +0 -133
- package/dist/es/components/EmptyMessage/EmptyMessage.module.css +0 -82
- package/dist/es/components/Field/Field.module.css +0 -137
- package/dist/es/components/FieldError/FieldError.module.css +0 -22
- package/dist/es/components/FileUpload/FileUpload.module.css +0 -133
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +0 -220
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +0 -146
- package/dist/es/components/Image/Image.module.css +0 -9
- package/dist/es/components/Indicator/CircularProgress.module.css +0 -28
- package/dist/es/components/Indicator/LoadingDots.module.css +0 -35
- package/dist/es/components/Indicator/LoadingIndicator.module.css +0 -41
- package/dist/es/components/Input/Input.module.css +0 -507
- package/dist/es/components/Label/Label.module.css +0 -16
- package/dist/es/components/Markdown/Markdown.module.css +0 -233
- package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +0 -297
- package/dist/es/components/Menu/Menu.module.css +0 -377
- package/dist/es/components/OTPInput/OTPInput.module.css +0 -66
- package/dist/es/components/Popover/Popover.module.css +0 -82
- package/dist/es/components/Progress/Progress.module.css +0 -34
- package/dist/es/components/ProgressSteps/ProgressSteps.module.css +0 -246
- package/dist/es/components/RadioGroup/RadioGroup.module.css +0 -137
- package/dist/es/components/Select/Select.module.css +0 -310
- package/dist/es/components/SelectControl/SelectControl.module.css +0 -558
- package/dist/es/components/Separator/Separator.module.css +0 -16
- package/dist/es/components/ShimmerText/ShimmerText.module.css +0 -43
- package/dist/es/components/Sidebar/Sidebar.module.css +0 -909
- package/dist/es/components/Skeleton/Skeleton.module.css +0 -17
- package/dist/es/components/Slider/Slider.module.css +0 -203
- package/dist/es/components/StatCard/StatCard.module.css +0 -234
- package/dist/es/components/Switch/Switch.module.css +0 -121
- package/dist/es/components/Table/Table.module.css +0 -56
- package/dist/es/components/Tabs/Tabs.module.css +0 -672
- package/dist/es/components/TagInput/TagInput.module.css +0 -320
- package/dist/es/components/TextLink/TextLink.module.css +0 -50
- package/dist/es/components/Textarea/Textarea.module.css +0 -272
- package/dist/es/components/Toast/Toast.module.css +0 -84
- package/dist/es/components/Tooltip/Tooltip.module.css +0 -91
- package/dist/es/components/Transition/Animate.module.css +0 -54
- package/dist/es/components/Transition/AnimateLayout.module.css +0 -101
- package/dist/es/components/Transition/AnimateLayoutGroup.module.css +0 -72
- package/dist/es/components/Transition/TransitionGroup.module.css +0 -4
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import {} from "@tanstack/react-table";
|
|
4
|
-
import { Button } from "../Button";
|
|
5
|
-
import { ChevronLeftMd, ChevronRightMd } from "../Icon";
|
|
6
|
-
import s from "
|
|
4
|
+
import { Button } from "../Button/index.js";
|
|
5
|
+
import { ChevronLeftMd, ChevronRightMd } from "../Icon/index.js";
|
|
6
|
+
import s from "@plexui/styles/components/DataTable/DataTable.module.css";
|
|
7
|
+
const PAGE_SIZES = [10, 20, 50, 100];
|
|
7
8
|
export const DataTablePagination = ({ table }) => {
|
|
8
9
|
const totalRows = table.getFilteredRowModel().rows.length;
|
|
9
10
|
const { pageIndex, pageSize } = table.getState().pagination;
|
|
10
11
|
const from = pageIndex * pageSize + 1;
|
|
11
12
|
const to = Math.min((pageIndex + 1) * pageSize, totalRows);
|
|
12
|
-
|
|
13
|
+
// The table's initial and current page sizes are options too, so the select
|
|
14
|
+
// always shows the real page size and can go back to the initial one
|
|
15
|
+
const pageSizes = [...new Set([...PAGE_SIZES, table.initialState.pagination.pageSize, pageSize])].sort((a, b) => a - b);
|
|
16
|
+
return (_jsxs("div", { className: s.Pagination, children: [_jsxs("div", { className: s.PaginationLeft, children: [_jsx("span", { className: s.PaginationLabel, children: "Rows per page" }), _jsx("select", { "aria-label": "Rows per page", className: s.PaginationSelect, value: pageSize, onChange: (e) => table.setPageSize(Number(e.target.value)), children: pageSizes.map((size) => (_jsx("option", { value: size, children: size }, size))) })] }), _jsxs("div", { className: s.PaginationRight, children: [_jsx("span", { className: s.PaginationInfo, children: totalRows === 0 ? "0 results" : `${from}–${to} of ${totalRows}` }), _jsxs("div", { className: s.PaginationButtons, children: [_jsx(Button, { color: "secondary", variant: "outline", size: "sm", pill: false, uniform: true, disabled: !table.getCanPreviousPage(), onClick: () => table.previousPage(), "aria-label": "Previous page", children: _jsx(ChevronLeftMd, {}) }), _jsx(Button, { color: "secondary", variant: "outline", size: "sm", pill: false, uniform: true, disabled: !table.getCanNextPage(), onClick: () => table.nextPage(), "aria-label": "Next page", children: _jsx(ChevronRightMd, {}) })] })] })] }));
|
|
13
17
|
};
|
|
14
18
|
//# sourceMappingURL=DataTablePagination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTablePagination.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTablePagination.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAc,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"DataTablePagination.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTablePagination.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAc,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,CAAC,MAAM,0DAA0D,CAAA;AAMxE,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AAEpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAS,EAAE,KAAK,EAAmC,EAAE,EAAE;IACxF,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAA;IACzD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAA;IAC3D,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC1D,4EAA4E;IAC5E,qEAAqE;IACrE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACpG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAChB,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,UAAU,aAC1B,eAAK,SAAS,EAAE,CAAC,CAAC,cAAc,aAC9B,eAAM,SAAS,EAAE,CAAC,CAAC,eAAe,8BAAsB,EACxD,+BACa,eAAe,EAC1B,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAC7B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAEzD,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACvB,iBAAmB,KAAK,EAAE,IAAI,YAC3B,IAAI,IADM,IAAI,CAER,CACV,CAAC,GACK,IACL,EACN,eAAK,SAAS,EAAE,CAAC,CAAC,eAAe,aAC/B,eAAM,SAAS,EAAE,CAAC,CAAC,cAAc,YAC9B,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,SAAS,EAAE,GAC3D,EACP,eAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,aACjC,KAAC,MAAM,IACL,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,KAAK,EACX,OAAO,QACP,QAAQ,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,EACrC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,gBACxB,eAAe,YAE1B,KAAC,aAAa,KAAG,GACV,EACT,KAAC,MAAM,IACL,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,KAAK,EACX,OAAO,QACP,QAAQ,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,gBACpB,WAAW,YAEtB,KAAC,cAAc,KAAG,GACX,IACL,IACF,IACF,CACP,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { type Table } from \"@tanstack/react-table\"\nimport { Button } from \"../Button\"\nimport { ChevronLeftMd, ChevronRightMd } from \"../Icon\"\nimport s from \"@plexui/styles/components/DataTable/DataTable.module.css\"\n\nexport type DataTablePaginationProps<TData> = {\n table: Table<TData>\n}\n\nconst PAGE_SIZES = [10, 20, 50, 100]\n\nexport const DataTablePagination = <TData,>({ table }: DataTablePaginationProps<TData>) => {\n const totalRows = table.getFilteredRowModel().rows.length\n const { pageIndex, pageSize } = table.getState().pagination\n const from = pageIndex * pageSize + 1\n const to = Math.min((pageIndex + 1) * pageSize, totalRows)\n // The table's initial and current page sizes are options too, so the select\n // always shows the real page size and can go back to the initial one\n const pageSizes = [...new Set([...PAGE_SIZES, table.initialState.pagination.pageSize, pageSize])].sort(\n (a, b) => a - b,\n )\n\n return (\n <div className={s.Pagination}>\n <div className={s.PaginationLeft}>\n <span className={s.PaginationLabel}>Rows per page</span>\n <select\n aria-label=\"Rows per page\"\n className={s.PaginationSelect}\n value={pageSize}\n onChange={(e) => table.setPageSize(Number(e.target.value))}\n >\n {pageSizes.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n <div className={s.PaginationRight}>\n <span className={s.PaginationInfo}>\n {totalRows === 0 ? \"0 results\" : `${from}–${to} of ${totalRows}`}\n </span>\n <div className={s.PaginationButtons}>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"sm\"\n pill={false}\n uniform\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeftMd />\n </Button>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"sm\"\n pill={false}\n uniform\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRightMd />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { Badge } from "../Badge";
|
|
4
|
-
import { CopyTooltip } from "../Tooltip";
|
|
5
|
-
import { Tooltip } from "../Tooltip";
|
|
3
|
+
import { Badge } from "../Badge/index.js";
|
|
4
|
+
import { CopyTooltip } from "../Tooltip/index.js";
|
|
5
|
+
import { Tooltip } from "../Tooltip/index.js";
|
|
6
6
|
export function idCell(accessor) {
|
|
7
7
|
function IdCell({ row }) {
|
|
8
8
|
const value = accessor(row.original);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { DataTable } from "./DataTable";
|
|
2
|
-
export { DataTablePagination } from "./DataTablePagination";
|
|
3
|
-
export { DataTableColumnHeader } from "./DataTableColumnHeader";
|
|
4
|
-
export { idCell, dateTimeCell, statusCell, tooltipHeader } from "./columnHelpers";
|
|
1
|
+
export { DataTable } from "./DataTable.js";
|
|
2
|
+
export { DataTablePagination } from "./DataTablePagination.js";
|
|
3
|
+
export { DataTableColumnHeader } from "./DataTableColumnHeader.js";
|
|
4
|
+
export { idCell, dateTimeCell, statusCell, tooltipHeader } from "./columnHelpers.js";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -5,9 +5,9 @@ import { useMaskito } from "@maskito/react";
|
|
|
5
5
|
import { DateTime } from "luxon";
|
|
6
6
|
import { useEffect, useMemo, useState } from "react";
|
|
7
7
|
import { mergeRefs } from "react-merge-refs";
|
|
8
|
-
import { Input } from "../Input";
|
|
8
|
+
import { Input } from "../Input/index.js";
|
|
9
9
|
export const DateInput = (props) => {
|
|
10
|
-
const { value, onChange, mode = "dd/mm/yyyy", separator = ".", timeMode, dateTimeSeparator = ", ", timeStep = 0, min, max, clearable = false, placeholder, ref, ...inputProps } = props;
|
|
10
|
+
const { value, onChange, mode = "dd/mm/yyyy", separator = ".", timeMode, dateTimeSeparator = ", ", timeStep = 0, min, max, clearable = false, placeholder, onBlur, ref, ...inputProps } = props;
|
|
11
11
|
const hasTime = !!timeMode;
|
|
12
12
|
const dateParams = useMemo(() => ({
|
|
13
13
|
mode,
|
|
@@ -33,15 +33,17 @@ export const DateInput = (props) => {
|
|
|
33
33
|
: maskitoDateOptionsGenerator(dateParams), [hasTime, dateParams, dateTimeParams]);
|
|
34
34
|
const maskRef = useMaskito({ options: maskOptions });
|
|
35
35
|
const [inputValue, setInputValue] = useState("");
|
|
36
|
+
const format = (date) => {
|
|
37
|
+
if (!date)
|
|
38
|
+
return "";
|
|
39
|
+
return hasTime
|
|
40
|
+
? maskitoStringifyDateTime(date.toJSDate(), dateTimeParams)
|
|
41
|
+
: maskitoStringifyDate(date.toJSDate(), dateParams);
|
|
42
|
+
};
|
|
43
|
+
const parse = (str) => hasTime ? maskitoParseDateTime(str, dateTimeParams) : maskitoParseDate(str, dateParams);
|
|
36
44
|
const valueMsKey = value?.toMillis() ?? null;
|
|
37
45
|
useEffect(() => {
|
|
38
|
-
|
|
39
|
-
setInputValue("");
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
setInputValue(hasTime
|
|
43
|
-
? maskitoStringifyDateTime(value.toJSDate(), dateTimeParams)
|
|
44
|
-
: maskitoStringifyDate(value.toJSDate(), dateParams));
|
|
46
|
+
setInputValue(format(value));
|
|
45
47
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
48
|
}, [valueMsKey, hasTime, dateParams, dateTimeParams]);
|
|
47
49
|
const handleInput = (evt) => {
|
|
@@ -51,13 +53,19 @@ export const DateInput = (props) => {
|
|
|
51
53
|
onChange(null);
|
|
52
54
|
return;
|
|
53
55
|
}
|
|
54
|
-
const parsed =
|
|
55
|
-
? maskitoParseDateTime(str, dateTimeParams)
|
|
56
|
-
: maskitoParseDate(str, dateParams);
|
|
56
|
+
const parsed = parse(str);
|
|
57
57
|
if (parsed) {
|
|
58
58
|
onChange(DateTime.fromJSDate(parsed));
|
|
59
59
|
}
|
|
60
60
|
};
|
|
61
|
+
// Text that is not a complete date never reaches onChange, so leaving the
|
|
62
|
+
// field shows the value again instead of a date the value does not hold
|
|
63
|
+
const handleBlur = (evt) => {
|
|
64
|
+
onBlur?.(evt);
|
|
65
|
+
if (inputValue && !parse(inputValue)) {
|
|
66
|
+
setInputValue(format(value));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
61
69
|
const handleClear = () => {
|
|
62
70
|
setInputValue("");
|
|
63
71
|
onChange(null);
|
|
@@ -68,6 +76,6 @@ export const DateInput = (props) => {
|
|
|
68
76
|
return datePart;
|
|
69
77
|
return `${datePart}${dateTimeSeparator}${timeMode}`;
|
|
70
78
|
}, [mode, separator, hasTime, timeMode, dateTimeSeparator]);
|
|
71
|
-
return (_jsx(Input, { ...inputProps, ref: mergeRefs([maskRef, ref]), value: inputValue, onInput: handleInput, placeholder: placeholder ?? defaultPlaceholder, onClear: clearable ? handleClear : undefined }));
|
|
79
|
+
return (_jsx(Input, { ...inputProps, ref: mergeRefs([maskRef, ref]), value: inputValue, onInput: handleInput, onBlur: handleBlur, placeholder: placeholder ?? defaultPlaceholder, onClear: clearable ? handleClear : undefined }));
|
|
72
80
|
};
|
|
73
81
|
//# sourceMappingURL=DateInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateInput.js","sourceRoot":"","sources":["../../../../src/components/DateInput/DateInput.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GAKzB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAmB,MAAM,UAAU,CAAA;AAmBjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAqB,EAAE,EAAE;IACjD,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,IAAI,GAAG,YAAY,EACnB,SAAS,GAAG,GAAG,EACf,QAAQ,EACR,iBAAiB,GAAG,IAAI,EACxB,QAAQ,GAAG,CAAC,EACZ,GAAG,EACH,GAAG,EACH,SAAS,GAAG,KAAK,EACjB,WAAW,EACX,GAAG,EACH,GAAG,UAAU,EACd,GAAG,KAAK,CAAA;IAET,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAA;IAE1B,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,CAAC;QACL,IAAI;QACJ,SAAS;QACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC/C,CAAC;IACF,uDAAuD;IACvD,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CACpD,CAAA;IAED,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,SAAS;QACxB,QAAQ,EAAE,QAAQ,IAAI,OAAO;QAC7B,iBAAiB;QACjB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACxC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC/C,CAAC;IACF,uDAAuD;IACvD,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAC3F,CAAA;IAED,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CACH,OAAO;QACL,CAAC,CAAC,+BAA+B,CAAC,cAAc,CAAC;QACjD,CAAC,CAAC,2BAA2B,CAAC,UAAU,CAAC,EAC7C,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CACtC,CAAA;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;IAEpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEhD,MAAM,
|
|
1
|
+
{"version":3,"file":"DateInput.js","sourceRoot":"","sources":["../../../../src/components/DateInput/DateInput.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport {\n maskitoDateOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoParseDate,\n maskitoParseDateTime,\n maskitoStringifyDate,\n maskitoStringifyDateTime,\n type MaskitoDateMode,\n type MaskitoDateParams,\n type MaskitoDateTimeParams,\n type MaskitoTimeMode,\n} from \"@maskito/kit\"\nimport { useMaskito } from \"@maskito/react\"\nimport { DateTime } from \"luxon\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport { mergeRefs } from \"react-merge-refs\"\nimport { Input, type InputProps } from \"../Input\"\n\nexport type DateInputProps = {\n value: DateTime | null\n onChange: (value: DateTime | null) => void\n mode?: MaskitoDateMode\n separator?: string\n timeMode?: MaskitoTimeMode\n dateTimeSeparator?: string\n timeStep?: number\n min?: DateTime\n max?: DateTime\n clearable?: boolean\n ref?: React.Ref<HTMLInputElement | null>\n} & Omit<\n InputProps,\n \"value\" | \"defaultValue\" | \"onChange\" | \"onInput\" | \"onClear\" | \"ref\" | \"type\" | \"min\" | \"max\"\n>\n\nexport const DateInput = (props: DateInputProps) => {\n const {\n value,\n onChange,\n mode = \"dd/mm/yyyy\",\n separator = \".\",\n timeMode,\n dateTimeSeparator = \", \",\n timeStep = 0,\n min,\n max,\n clearable = false,\n placeholder,\n onBlur,\n ref,\n ...inputProps\n } = props\n\n const hasTime = !!timeMode\n\n const dateParams = useMemo<MaskitoDateParams>(\n () => ({\n mode,\n separator,\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, min?.toMillis(), max?.toMillis()],\n )\n\n const dateTimeParams = useMemo<MaskitoDateTimeParams>(\n () => ({\n dateMode: mode,\n dateSeparator: separator,\n timeMode: timeMode ?? \"HH:MM\",\n dateTimeSeparator,\n ...(timeStep ? { timeStep } : undefined),\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, timeMode, dateTimeSeparator, timeStep, min?.toMillis(), max?.toMillis()],\n )\n\n const maskOptions = useMemo(\n () =>\n hasTime\n ? maskitoDateTimeOptionsGenerator(dateTimeParams)\n : maskitoDateOptionsGenerator(dateParams),\n [hasTime, dateParams, dateTimeParams],\n )\n\n const maskRef = useMaskito({ options: maskOptions })\n\n const [inputValue, setInputValue] = useState(\"\")\n\n const format = (date: DateTime | null) => {\n if (!date) return \"\"\n return hasTime\n ? maskitoStringifyDateTime(date.toJSDate(), dateTimeParams)\n : maskitoStringifyDate(date.toJSDate(), dateParams)\n }\n\n const parse = (str: string) =>\n hasTime ? maskitoParseDateTime(str, dateTimeParams) : maskitoParseDate(str, dateParams)\n\n const valueMsKey = value?.toMillis() ?? null\n useEffect(() => {\n setInputValue(format(value))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueMsKey, hasTime, dateParams, dateTimeParams])\n\n const handleInput = (evt: React.FormEvent<HTMLInputElement>) => {\n const str = evt.currentTarget.value\n setInputValue(str)\n\n if (!str) {\n onChange(null)\n return\n }\n\n const parsed = parse(str)\n\n if (parsed) {\n onChange(DateTime.fromJSDate(parsed))\n }\n }\n\n // Text that is not a complete date never reaches onChange, so leaving the\n // field shows the value again instead of a date the value does not hold\n const handleBlur = (evt: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(evt)\n if (inputValue && !parse(inputValue)) {\n setInputValue(format(value))\n }\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange(null)\n }\n\n const defaultPlaceholder = useMemo(() => {\n const datePart = mode.replace(/\\//g, separator).toUpperCase()\n if (!hasTime) return datePart\n return `${datePart}${dateTimeSeparator}${timeMode}`\n }, [mode, separator, hasTime, timeMode, dateTimeSeparator])\n\n return (\n <Input\n {...inputProps}\n ref={mergeRefs([maskRef as unknown as React.Ref<HTMLInputElement>, ref])}\n value={inputValue}\n onInput={handleInput}\n onBlur={handleBlur}\n placeholder={placeholder ?? defaultPlaceholder}\n onClear={clearable ? handleClear : undefined}\n />\n )\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { DateInput } from "./DateInput";
|
|
1
|
+
export { DateInput } from "./DateInput.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -2,23 +2,54 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { DateTime, Interval } from "luxon";
|
|
4
4
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import
|
|
5
|
+
import { useStableCallback } from "../../hooks/useStableCallback.js";
|
|
6
|
+
import { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday, } from "../../lib/dateUtils.js";
|
|
7
|
+
import { waitForAnimationFrame } from "../../lib/helpers.js";
|
|
8
|
+
import { Button } from "../Button/index.js";
|
|
9
|
+
import { ChevronLeft, ChevronRight } from "../Icon/index.js";
|
|
10
|
+
import { usePopoverClose } from "../Popover/usePopoverController.js";
|
|
11
|
+
import { Select } from "../Select/index.js";
|
|
12
|
+
import { TransitionGroup } from "../Transition/index.js";
|
|
13
|
+
import s from "@plexui/styles/components/DatePicker/Calendar.module.css";
|
|
14
|
+
import { useDateContext } from "./context.js";
|
|
14
15
|
const CALENDAR_WIDTH_PX = 210;
|
|
15
16
|
const CALENDAR_GAP_PX = 32;
|
|
16
17
|
const STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX;
|
|
17
18
|
const SHORT_MONTH_NAMES = Array.from({ length: 12 }, (_, i) => DateTime.local(2024, i + 1, 1).monthShort);
|
|
19
|
+
// The day a grid key moves to: a day, a week, the Sunday or Saturday of the
|
|
20
|
+
// week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)
|
|
21
|
+
const getKeyTarget = (key, day) => {
|
|
22
|
+
switch (key) {
|
|
23
|
+
case "ArrowLeft":
|
|
24
|
+
return day.minus({ days: 1 });
|
|
25
|
+
case "ArrowRight":
|
|
26
|
+
return day.plus({ days: 1 });
|
|
27
|
+
case "ArrowUp":
|
|
28
|
+
return day.minus({ days: 7 });
|
|
29
|
+
case "ArrowDown":
|
|
30
|
+
return day.plus({ days: 7 });
|
|
31
|
+
case "Home":
|
|
32
|
+
return day.minus({ days: day.weekday % 7 });
|
|
33
|
+
case "End":
|
|
34
|
+
return day.plus({ days: 6 - (day.weekday % 7) });
|
|
35
|
+
case "PageUp":
|
|
36
|
+
return day.minus({ months: 1 });
|
|
37
|
+
case "PageDown":
|
|
38
|
+
return day.plus({ months: 1 });
|
|
39
|
+
default:
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// Whole-day bounds, as the day buttons' disabled state
|
|
44
|
+
const isDayWithinLimits = (day, min, max) => !(min && isBefore(day, min.startOf("day"))) && !(max && isAfter(day, max.endOf("day")));
|
|
45
|
+
const monthIndex = (date) => date.year * 12 + date.month;
|
|
18
46
|
export const DateCalendar = () => {
|
|
19
47
|
const { value, min, max, onChangeRef, captionLayout, showTime, yearRange } = useDateContext();
|
|
20
48
|
const closePopover = usePopoverClose();
|
|
21
49
|
const calendarContainerRef = useRef(null);
|
|
50
|
+
// The day to focus once a key has moved the view to its month. It lives
|
|
51
|
+
// here, outside the wrapper that the dropdown layout re-keys
|
|
52
|
+
const pendingFocusRef = useRef(null);
|
|
22
53
|
const [calendarSteps, setCalendarSteps] = useState(0);
|
|
23
54
|
const [forceRenderIncrement, setForceRenderIncrement] = useState(0);
|
|
24
55
|
const [calendarDate, setCalendarDate] = useState(() => value ?? DateTime.now());
|
|
@@ -53,9 +84,18 @@ export const DateCalendar = () => {
|
|
|
53
84
|
setCalendarDate((dt) => dt.minus({ months: 1 }));
|
|
54
85
|
}
|
|
55
86
|
};
|
|
87
|
+
// The calendar limits whole days; with a time picker the chosen time on a
|
|
88
|
+
// min or max day can still cross the bound, so clamp the full date-time
|
|
89
|
+
const clampToBounds = (dateTime) => {
|
|
90
|
+
if (min && dateTime.toMillis() < min.toMillis())
|
|
91
|
+
return min;
|
|
92
|
+
if (max && dateTime.toMillis() > max.toMillis())
|
|
93
|
+
return max;
|
|
94
|
+
return dateTime;
|
|
95
|
+
};
|
|
56
96
|
const handleDateSelect = (selectedDate) => {
|
|
57
97
|
if (showTime) {
|
|
58
|
-
onChangeRef.current(selectedDate.set({ hour: pendingHour, minute: pendingMinute }));
|
|
98
|
+
onChangeRef.current(clampToBounds(selectedDate.set({ hour: pendingHour, minute: pendingMinute })));
|
|
59
99
|
}
|
|
60
100
|
else {
|
|
61
101
|
onChangeRef.current(selectedDate);
|
|
@@ -63,10 +103,12 @@ export const DateCalendar = () => {
|
|
|
63
103
|
}
|
|
64
104
|
};
|
|
65
105
|
const handleTimeChange = (hour, minute) => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
106
|
+
const next = value ? clampToBounds(value.set({ hour, minute })) : null;
|
|
107
|
+
// Show the time that was actually applied, even when clamping left value unchanged
|
|
108
|
+
setPendingHour(next ? next.hour : hour);
|
|
109
|
+
setPendingMinute(next ? next.minute : minute);
|
|
110
|
+
if (next) {
|
|
111
|
+
onChangeRef.current(next);
|
|
70
112
|
}
|
|
71
113
|
};
|
|
72
114
|
const handleDropdownMonthChange = (month) => {
|
|
@@ -77,6 +119,66 @@ export const DateCalendar = () => {
|
|
|
77
119
|
setCalendarDate(DateTime.local(year, calendarDate.month, 1));
|
|
78
120
|
setForceRenderIncrement((c) => c + 1);
|
|
79
121
|
};
|
|
122
|
+
// Days are named by their full date; skip a calendar that is leaving
|
|
123
|
+
const focusDay = (day) => {
|
|
124
|
+
const label = day.toLocaleString(DateTime.DATE_HUGE);
|
|
125
|
+
const buttons = calendarContainerRef.current?.querySelectorAll(`button[aria-label="${label}"]`);
|
|
126
|
+
Array.from(buttons ?? [])
|
|
127
|
+
.find((button) => !button.closest("[data-exiting]"))
|
|
128
|
+
?.focus();
|
|
129
|
+
};
|
|
130
|
+
// A calendar that is leaving keeps the props it last rendered with, so its
|
|
131
|
+
// days reach the current state through a stable callback
|
|
132
|
+
const handleDayKeyDown = useStableCallback((event, day) => {
|
|
133
|
+
if (event.altKey || event.ctrlKey || event.metaKey) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// While a move waits for its month to render, the next key starts from
|
|
137
|
+
// the day it is moving to (key repeat), not the day that still has focus
|
|
138
|
+
const target = getKeyTarget(event.key, pendingFocusRef.current ?? day);
|
|
139
|
+
if (!target) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
// A disabled day keeps focus where it is
|
|
144
|
+
if (!isDayWithinLimits(target, min, max)) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const months = monthIndex(target) - monthIndex(calendarDate);
|
|
148
|
+
if (months === 0) {
|
|
149
|
+
pendingFocusRef.current = null;
|
|
150
|
+
focusDay(target);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// Step the view like the month buttons; a day within min/max keeps every step in bounds
|
|
154
|
+
if (months > 0 ? !canGoForward : !canGoBack) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
pendingFocusRef.current = target;
|
|
158
|
+
for (let step = 0; step < Math.abs(months); step++) {
|
|
159
|
+
if (months > 0) {
|
|
160
|
+
handleNext();
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
handlePrevious();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
// Focus a pending day once its month has rendered. New calendars mount
|
|
168
|
+
// after this render (TransitionGroup), so wait a frame like the height does
|
|
169
|
+
useEffect(() => {
|
|
170
|
+
if (!pendingFocusRef.current) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
return waitForAnimationFrame(() => {
|
|
174
|
+
const target = pendingFocusRef.current;
|
|
175
|
+
pendingFocusRef.current = null;
|
|
176
|
+
if (target) {
|
|
177
|
+
focusDay(target);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when the month changes
|
|
181
|
+
}, [calendarDate]);
|
|
80
182
|
// Force re-renders when `value` changes out of band from direct user-selection
|
|
81
183
|
useEffect(() => {
|
|
82
184
|
// No-op when value is empty
|
|
@@ -125,12 +227,12 @@ export const DateCalendar = () => {
|
|
|
125
227
|
}
|
|
126
228
|
});
|
|
127
229
|
}, [calendarDate]);
|
|
128
|
-
return (_jsxs("div", { className: s.CalendarWrapper, children: [_jsxs("div", { ref: calendarContainerRef, className: s.CalendarContainer, "data-dropdown": isDropdown ? "" : undefined, children: [_jsx("div", { className: s.Previous, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handlePrevious, disabled: !canGoBack, children: _jsx(ChevronLeft, {}) }) }), _jsx("div", { className: s.Next, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handleNext, disabled: !canGoForward, children: _jsx(ChevronRight, {}) }) }), isDropdown && (_jsx(DropdownCaption, { date: calendarDate, onMonthChange: handleDropdownMonthChange, onYearChange: handleDropdownYearChange, min: min, max: max, yearRange: yearRange })), _jsx("div", { className: s.CalendarRange, style: !isDropdown
|
|
230
|
+
return (_jsxs("div", { className: s.CalendarWrapper, children: [_jsxs("div", { ref: calendarContainerRef, className: s.CalendarContainer, "data-dropdown": isDropdown ? "" : undefined, children: [_jsx("div", { className: s.Previous, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handlePrevious, disabled: !canGoBack, "aria-label": "Previous month", children: _jsx(ChevronLeft, {}) }) }), _jsx("div", { className: s.Next, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handleNext, disabled: !canGoForward, "aria-label": "Next month", children: _jsx(ChevronRight, {}) }) }), isDropdown && (_jsx(DropdownCaption, { date: calendarDate, onMonthChange: handleDropdownMonthChange, onYearChange: handleDropdownYearChange, min: min, max: max, yearRange: yearRange })), _jsx("div", { className: s.CalendarRange, style: !isDropdown
|
|
129
231
|
? { transform: `translate(${calendarSteps * -1 * STEP_DISTANCE_PX}px, 0)` }
|
|
130
|
-
: undefined, children: !isDropdown ? (_jsx(TransitionGroup, { enterDuration: 400, exitDuration: 400, children: _jsx(CalendarView, { stepPosition: calendarSteps, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, hideMonthLabel: false }, calendarDate.toLocaleString({
|
|
232
|
+
: undefined, children: !isDropdown ? (_jsx(TransitionGroup, { enterDuration: 400, exitDuration: 400, children: _jsx(CalendarView, { stepPosition: calendarSteps, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, onDayKeyDown: handleDayKeyDown, hideMonthLabel: false }, calendarDate.toLocaleString({
|
|
131
233
|
month: "long",
|
|
132
234
|
year: "numeric",
|
|
133
|
-
})) })) : (_jsx(CalendarView, { stepPosition: 0, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, hideMonthLabel: true }, calendarDate.toLocaleString({
|
|
235
|
+
})) })) : (_jsx(CalendarView, { stepPosition: 0, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, onDayKeyDown: handleDayKeyDown, hideMonthLabel: true }, calendarDate.toLocaleString({
|
|
134
236
|
month: "long",
|
|
135
237
|
year: "numeric",
|
|
136
238
|
}))) })] }), showTime && (_jsx(TimeInput, { hour: pendingHour, minute: pendingMinute, onChange: handleTimeChange }))] }, `stable-view-${forceRenderIncrement}`));
|
|
@@ -173,6 +275,8 @@ const TimeInput = ({ hour, minute, onChange }) => {
|
|
|
173
275
|
setMinuteText(raw);
|
|
174
276
|
if (raw.length === 2) {
|
|
175
277
|
onChange(hour, Math.min(59, Number(raw)));
|
|
278
|
+
// Show the accepted value: the parent may clamp it to min/max
|
|
279
|
+
setMinuteText(null);
|
|
176
280
|
}
|
|
177
281
|
};
|
|
178
282
|
const handleMinuteBlur = (e) => {
|
|
@@ -181,32 +285,30 @@ const TimeInput = ({ hour, minute, onChange }) => {
|
|
|
181
285
|
onChange(hour, m);
|
|
182
286
|
setMinuteText(null);
|
|
183
287
|
};
|
|
288
|
+
// Arrow steps drop the draft text so the field shows the accepted value,
|
|
289
|
+
// which the parent may have clamped to min/max
|
|
184
290
|
const handleKeyDown = (e, type) => {
|
|
185
291
|
const step = e.shiftKey ? 10 : 1;
|
|
186
292
|
if (e.key === "ArrowUp") {
|
|
187
293
|
e.preventDefault();
|
|
188
294
|
if (type === "hour") {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
setHourText(String(h).padStart(2, "0"));
|
|
295
|
+
onChange((hour + step) % 24, minute);
|
|
296
|
+
setHourText(null);
|
|
192
297
|
}
|
|
193
298
|
else {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
setMinuteText(String(m).padStart(2, "0"));
|
|
299
|
+
onChange(hour, (minute + step) % 60);
|
|
300
|
+
setMinuteText(null);
|
|
197
301
|
}
|
|
198
302
|
}
|
|
199
303
|
else if (e.key === "ArrowDown") {
|
|
200
304
|
e.preventDefault();
|
|
201
305
|
if (type === "hour") {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
setHourText(String(h).padStart(2, "0"));
|
|
306
|
+
onChange((hour - step + 24) % 24, minute);
|
|
307
|
+
setHourText(null);
|
|
205
308
|
}
|
|
206
309
|
else {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
setMinuteText(String(m).padStart(2, "0"));
|
|
310
|
+
onChange(hour, (minute - step + 60) % 60);
|
|
311
|
+
setMinuteText(null);
|
|
210
312
|
}
|
|
211
313
|
}
|
|
212
314
|
};
|
|
@@ -219,7 +321,7 @@ const TimeInput = ({ hour, minute, onChange }) => {
|
|
|
219
321
|
}, onKeyDown: (e) => handleKeyDown(e, "minute"), maxLength: 2, "aria-label": "Minute" })] })] }));
|
|
220
322
|
};
|
|
221
323
|
const daysOfTheWeekLabels = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
|
|
222
|
-
const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition, hideMonthLabel = false, }) => {
|
|
324
|
+
const CalendarView = ({ date, selectedDate, min, max, onDateSelect, onDayKeyDown, stepPosition, hideMonthLabel = false, }) => {
|
|
223
325
|
// Lock position on mount and don't respond to changes
|
|
224
326
|
const [position] = useState(stepPosition);
|
|
225
327
|
const { startOfMonth, weeks, enabledInterval } = useMemo(() => {
|
|
@@ -229,7 +331,9 @@ const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition
|
|
|
229
331
|
const blankDays = new Array(daysBeforeMonthStart).fill(null);
|
|
230
332
|
const daysInMonth = getDaysOfMonth(monthStart);
|
|
231
333
|
const calendarCells = [...blankDays, ...daysInMonth];
|
|
232
|
-
|
|
334
|
+
// Cells are start-of-day values and Interval excludes its end, so widen the
|
|
335
|
+
// bounds to whole days: min/max days themselves stay selectable.
|
|
336
|
+
const enabledDateInterval = Interval.fromDateTimes((min || monthStart).startOf("day"), (max || endOfMonth).endOf("day"));
|
|
233
337
|
return {
|
|
234
338
|
startOfMonth: monthStart,
|
|
235
339
|
endOfMonth,
|
|
@@ -244,7 +348,7 @@ const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition
|
|
|
244
348
|
const enabled = enabledInterval.contains(d);
|
|
245
349
|
const isSelected = enabled && selectedDate && isSameDay(d, selectedDate);
|
|
246
350
|
const dayIsToday = isToday(d);
|
|
247
|
-
return (_jsx("div", { className: s.Day, "data-is-selected": isSelected ? "" : undefined, children: _jsxs("button", { type: "button", className: s.InteractiveDay, disabled: !enabled, onClick: () => d && onDateSelect?.(d), children: [d.day, dayIsToday && _jsx("span", { className: s.TodayDot })] }) }, dayIndex));
|
|
351
|
+
return (_jsx("div", { className: s.Day, "data-is-selected": isSelected ? "" : undefined, children: _jsxs("button", { type: "button", className: s.InteractiveDay, disabled: !enabled, "aria-label": d.toLocaleString(DateTime.DATE_HUGE), "aria-pressed": !!isSelected, "aria-current": dayIsToday ? "date" : undefined, onClick: () => d && onDateSelect?.(d), onKeyDown: (event) => d && onDayKeyDown?.(event, d), children: [d.day, dayIsToday && _jsx("span", { className: s.TodayDot })] }) }, dayIndex));
|
|
248
352
|
}) }, weekIndex)))] }));
|
|
249
353
|
};
|
|
250
354
|
//# sourceMappingURL=Calendar.js.map
|