@zerodep-dev/vue-tsx-pro-ui 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base/Badge.js +3 -3
- package/dist/base/Badge.js.map +1 -1
- package/dist/base/Can.d.ts +12 -0
- package/dist/base/Can.js +20 -0
- package/dist/base/Can.js.map +1 -0
- package/dist/base/ClientOnly.d.ts +10 -0
- package/dist/base/ClientOnly.js +18 -0
- package/dist/base/ClientOnly.js.map +1 -0
- package/dist/base/CloseButton.js +3 -3
- package/dist/base/CloseButton.js.map +1 -1
- package/dist/base/CodeBlock.js +5 -5
- package/dist/base/CodeBlock.js.map +1 -1
- package/dist/base/CopyButton.js +3 -3
- package/dist/base/CopyButton.js.map +1 -1
- package/dist/base/Icon.js +3 -3
- package/dist/base/Icon.js.map +1 -1
- package/dist/base/Indicator.js +3 -3
- package/dist/base/Indicator.js.map +1 -1
- package/dist/base/StatusDot.js +3 -3
- package/dist/base/StatusDot.js.map +1 -1
- package/dist/base/Tag.js +5 -5
- package/dist/base/Tag.js.map +1 -1
- package/dist/base/button-core.js +4 -4
- package/dist/base/button-core.js.map +1 -1
- package/dist/charts/AreaChart.js +3 -3
- package/dist/charts/AreaChart.js.map +1 -1
- package/dist/charts/BarChart.js +3 -3
- package/dist/charts/BarChart.js.map +1 -1
- package/dist/charts/ChordChart.js +3 -3
- package/dist/charts/ChordChart.js.map +1 -1
- package/dist/charts/ComboChart.js +3 -3
- package/dist/charts/ComboChart.js.map +1 -1
- package/dist/charts/DonutChart.js +3 -3
- package/dist/charts/DonutChart.js.map +1 -1
- package/dist/charts/FunnelChart.js +5 -5
- package/dist/charts/FunnelChart.js.map +1 -1
- package/dist/charts/GraphChart.js +3 -3
- package/dist/charts/GraphChart.js.map +1 -1
- package/dist/charts/LineChart.js +3 -3
- package/dist/charts/LineChart.js.map +1 -1
- package/dist/charts/MapChart.js +7 -7
- package/dist/charts/MapChart.js.map +1 -1
- package/dist/charts/RadarChart.js +16 -15
- package/dist/charts/RadarChart.js.map +1 -1
- package/dist/charts/SankeyChart.js +3 -3
- package/dist/charts/SankeyChart.js.map +1 -1
- package/dist/charts/ScatterChart.js +3 -3
- package/dist/charts/ScatterChart.js.map +1 -1
- package/dist/charts/TimelineChart.js +6 -5
- package/dist/charts/TimelineChart.js.map +1 -1
- package/dist/charts/TreemapChart.js +3 -3
- package/dist/charts/TreemapChart.js.map +1 -1
- package/dist/charts/WaterfallChart.js +3 -3
- package/dist/charts/WaterfallChart.js.map +1 -1
- package/dist/charts/XYChart.js +9 -7
- package/dist/charts/XYChart.js.map +1 -1
- package/dist/charts/frame.js +10 -8
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/single.js +4 -3
- package/dist/charts/single.js.map +1 -1
- package/dist/code-editor/CodeEditor.d.ts +18 -0
- package/dist/code-editor/CodeEditor.js +57 -0
- package/dist/code-editor/CodeEditor.js.map +1 -0
- package/dist/code-editor/editor.d.ts +52 -0
- package/dist/code-editor/editor.js +225 -0
- package/dist/code-editor/editor.js.map +1 -0
- package/dist/code-editor/index.d.ts +9 -0
- package/dist/code-editor/index.js +3 -0
- package/dist/config/Provider.d.ts +3 -1
- package/dist/config/Provider.js +9 -4
- package/dist/config/Provider.js.map +1 -1
- package/dist/config/context.d.ts +18 -0
- package/dist/config/context.js +16 -1
- package/dist/config/context.js.map +1 -1
- package/dist/config/createUi.d.ts +20 -3
- package/dist/config/createUi.js +80 -49
- package/dist/config/createUi.js.map +1 -1
- package/dist/config/lang/en-US.js +21 -3
- package/dist/config/lang/en-US.js.map +1 -1
- package/dist/config/lang/format.d.ts +2 -1
- package/dist/config/lang/format.js +9 -2
- package/dist/config/lang/format.js.map +1 -1
- package/dist/config/lang/lang.d.ts +19 -6
- package/dist/config/lang/lang.js +11 -2
- package/dist/config/lang/lang.js.map +1 -1
- package/dist/config/lang/zh-CN.js +21 -3
- package/dist/config/lang/zh-CN.js.map +1 -1
- package/dist/config/layout/preference.d.ts +43 -0
- package/dist/config/layout/preference.js +108 -0
- package/dist/config/layout/preference.js.map +1 -0
- package/dist/date/Calendar.js +3 -3
- package/dist/date/Calendar.js.map +1 -1
- package/dist/date/CalendarBoard.js +9 -9
- package/dist/date/CalendarBoard.js.map +1 -1
- package/dist/date/CalendarView.js +7 -7
- package/dist/date/CalendarView.js.map +1 -1
- package/dist/date/DateField.js +3 -3
- package/dist/date/DateField.js.map +1 -1
- package/dist/date/DatePicker.js +5 -5
- package/dist/date/DatePicker.js.map +1 -1
- package/dist/date/DateRangePicker.js +5 -5
- package/dist/date/DateRangePicker.js.map +1 -1
- package/dist/date/DateSegmentGroup.js +5 -5
- package/dist/date/DateSegmentGroup.js.map +1 -1
- package/dist/date/QuarterCalendar.js +6 -6
- package/dist/date/QuarterCalendar.js.map +1 -1
- package/dist/date/RangeCalendar.js +3 -3
- package/dist/date/RangeCalendar.js.map +1 -1
- package/dist/date/SegmentedField.js +3 -3
- package/dist/date/SegmentedField.js.map +1 -1
- package/dist/date/TimeField.js +3 -3
- package/dist/date/TimeField.js.map +1 -1
- package/dist/date/TimePicker.js +4 -4
- package/dist/date/TimePicker.js.map +1 -1
- package/dist/date/date-segments.js +1 -1
- package/dist/date/date-segments.js.map +1 -1
- package/dist/date/picker-popover.js +3 -2
- package/dist/date/picker-popover.js.map +1 -1
- package/dist/diagram/Diagram.js +12 -12
- package/dist/diagram/Diagram.js.map +1 -1
- package/dist/diagram/DiagramLanes.js +3 -3
- package/dist/diagram/DiagramLanes.js.map +1 -1
- package/dist/diagram/DiagramMinimap.js +4 -4
- package/dist/diagram/DiagramMinimap.js.map +1 -1
- package/dist/diagram/index.d.ts +2 -1
- package/dist/diagram/index.js +2 -1
- package/dist/diagram/layout.d.ts +57 -0
- package/dist/diagram/layout.js +50 -0
- package/dist/diagram/layout.js.map +1 -0
- package/dist/display/Accordion.js +6 -6
- package/dist/display/Accordion.js.map +1 -1
- package/dist/display/AnimatedNumber.js +4 -4
- package/dist/display/AnimatedNumber.js.map +1 -1
- package/dist/display/Avatar.js +4 -4
- package/dist/display/Avatar.js.map +1 -1
- package/dist/display/Checklist.js +7 -7
- package/dist/display/Checklist.js.map +1 -1
- package/dist/display/Collapse.js +8 -5
- package/dist/display/Collapse.js.map +1 -1
- package/dist/display/Collapsible.js +3 -3
- package/dist/display/Collapsible.js.map +1 -1
- package/dist/display/Descriptions.js +5 -5
- package/dist/display/Descriptions.js.map +1 -1
- package/dist/display/Ellipsis.js +3 -3
- package/dist/display/Ellipsis.js.map +1 -1
- package/dist/display/FieldCompare.js +4 -4
- package/dist/display/FieldCompare.js.map +1 -1
- package/dist/display/Gauge.js +11 -11
- package/dist/display/Gauge.js.map +1 -1
- package/dist/display/Image.js +4 -4
- package/dist/display/Image.js.map +1 -1
- package/dist/display/Marquee.js +3 -3
- package/dist/display/Marquee.js.map +1 -1
- package/dist/display/ProportionBar.js +4 -4
- package/dist/display/ProportionBar.js.map +1 -1
- package/dist/display/Sortable.js +4 -4
- package/dist/display/Sortable.js.map +1 -1
- package/dist/display/Sparkline.js +6 -6
- package/dist/display/Sparkline.js.map +1 -1
- package/dist/display/Stat.js +3 -3
- package/dist/display/Stat.js.map +1 -1
- package/dist/display/Timeline.js +7 -7
- package/dist/display/Timeline.js.map +1 -1
- package/dist/display/Tree.js +10 -10
- package/dist/display/Tree.js.map +1 -1
- package/dist/display/VirtualList.js +7 -7
- package/dist/display/VirtualList.js.map +1 -1
- package/dist/display/Watermark.js +3 -3
- package/dist/display/Watermark.js.map +1 -1
- package/dist/docs-kit/CodeGroup.js +5 -5
- package/dist/docs-kit/CodeGroup.js.map +1 -1
- package/dist/docs-kit/CodePreview.js +6 -6
- package/dist/docs-kit/CodePreview.js.map +1 -1
- package/dist/docs-kit/PropsTable.js +4 -4
- package/dist/docs-kit/PropsTable.js.map +1 -1
- package/dist/feedback/Alert.js +5 -5
- package/dist/feedback/Alert.js.map +1 -1
- package/dist/feedback/Banner.js +5 -5
- package/dist/feedback/Banner.js.map +1 -1
- package/dist/feedback/Empty.js +4 -4
- package/dist/feedback/Empty.js.map +1 -1
- package/dist/feedback/LoadingBar.js +20 -13
- package/dist/feedback/LoadingBar.js.map +1 -1
- package/dist/feedback/LoadingOverlay.js +3 -3
- package/dist/feedback/LoadingOverlay.js.map +1 -1
- package/dist/feedback/Progress.js +14 -14
- package/dist/feedback/Progress.js.map +1 -1
- package/dist/feedback/Result.js +4 -4
- package/dist/feedback/Result.js.map +1 -1
- package/dist/feedback/SkeletonText.js +3 -3
- package/dist/feedback/SkeletonText.js.map +1 -1
- package/dist/feedback/Toast.js +6 -6
- package/dist/feedback/Toast.js.map +1 -1
- package/dist/form/Field.d.ts +7 -0
- package/dist/form/Field.js +20 -9
- package/dist/form/Field.js.map +1 -1
- package/dist/form/Form.js +3 -3
- package/dist/form/Form.js.map +1 -1
- package/dist/form/FormErrorSummary.js +3 -3
- package/dist/form/FormErrorSummary.js.map +1 -1
- package/dist/form/FormSection.js +6 -6
- package/dist/form/FormSection.js.map +1 -1
- package/dist/form/useForm.d.ts +4 -1
- package/dist/form/useForm.js +35 -13
- package/dist/form/useForm.js.map +1 -1
- package/dist/index.d.ts +18 -10
- package/dist/index.js +17 -9
- package/dist/input/Autocomplete.js +3 -3
- package/dist/input/Autocomplete.js.map +1 -1
- package/dist/input/Cascader.js +7 -7
- package/dist/input/Cascader.js.map +1 -1
- package/dist/input/CharacterCount.js +3 -3
- package/dist/input/CharacterCount.js.map +1 -1
- package/dist/input/Checkbox.js +5 -5
- package/dist/input/Checkbox.js.map +1 -1
- package/dist/input/ColorField.js +4 -4
- package/dist/input/ColorField.js.map +1 -1
- package/dist/input/Combobox.js +5 -5
- package/dist/input/Combobox.js.map +1 -1
- package/dist/input/ConditionBuilder.js +15 -14
- package/dist/input/ConditionBuilder.js.map +1 -1
- package/dist/input/FileDrop.js +3 -3
- package/dist/input/FileDrop.js.map +1 -1
- package/dist/input/Listbox.js +9 -9
- package/dist/input/Listbox.js.map +1 -1
- package/dist/input/Mentions.js +4 -4
- package/dist/input/Mentions.js.map +1 -1
- package/dist/input/NumberField.js +3 -3
- package/dist/input/NumberField.js.map +1 -1
- package/dist/input/NumberRangeField.js +5 -5
- package/dist/input/NumberRangeField.js.map +1 -1
- package/dist/input/OtpField.js +5 -5
- package/dist/input/OtpField.js.map +1 -1
- package/dist/input/PeoplePicker.js +6 -6
- package/dist/input/PeoplePicker.js.map +1 -1
- package/dist/input/PeoplePickerPanel.js +15 -15
- package/dist/input/PeoplePickerPanel.js.map +1 -1
- package/dist/input/Radio.js +4 -4
- package/dist/input/Radio.js.map +1 -1
- package/dist/input/Rating.js +5 -5
- package/dist/input/Rating.js.map +1 -1
- package/dist/input/Select.js +5 -5
- package/dist/input/Select.js.map +1 -1
- package/dist/input/SelectedTags.js +4 -4
- package/dist/input/SelectedTags.js.map +1 -1
- package/dist/input/Slider.js +6 -6
- package/dist/input/Slider.js.map +1 -1
- package/dist/input/Switch.js +3 -3
- package/dist/input/Switch.js.map +1 -1
- package/dist/input/TagsInput.js +5 -5
- package/dist/input/TagsInput.js.map +1 -1
- package/dist/input/TextField.js +5 -5
- package/dist/input/TextField.js.map +1 -1
- package/dist/input/Textarea.js +4 -4
- package/dist/input/Textarea.js.map +1 -1
- package/dist/input/ToggleGroup.js +4 -4
- package/dist/input/ToggleGroup.js.map +1 -1
- package/dist/input/Transfer.js +8 -8
- package/dist/input/Transfer.js.map +1 -1
- package/dist/input/TreeSelect.js +7 -7
- package/dist/input/TreeSelect.js.map +1 -1
- package/dist/input/Upload.js +10 -9
- package/dist/input/Upload.js.map +1 -1
- package/dist/input/condition.d.ts +1 -1
- package/dist/input/condition.js +32 -14
- package/dist/input/condition.js.map +1 -1
- package/dist/input/people.d.ts +15 -14
- package/dist/input/people.js +5 -5
- package/dist/input/people.js.map +1 -1
- package/dist/input/remote-items.d.ts +4 -2
- package/dist/input/remote-items.js +7 -2
- package/dist/input/remote-items.js.map +1 -1
- package/dist/layout/Affix.js +4 -4
- package/dist/layout/Affix.js.map +1 -1
- package/dist/layout/ResizeHandle.d.ts +6 -2
- package/dist/layout/ResizeHandle.js +32 -9
- package/dist/layout/ResizeHandle.js.map +1 -1
- package/dist/layout/ScrollArea.js +3 -3
- package/dist/layout/ScrollArea.js.map +1 -1
- package/dist/layout/Separator.js +3 -3
- package/dist/layout/Separator.js.map +1 -1
- package/dist/layout/Splitter.js +3 -3
- package/dist/layout/Splitter.js.map +1 -1
- package/dist/layout/ViewportFill.d.ts +2 -2
- package/dist/layout/ViewportFill.js +4 -4
- package/dist/layout/ViewportFill.js.map +1 -1
- package/dist/navigation/Breadcrumbs.js +4 -4
- package/dist/navigation/Breadcrumbs.js.map +1 -1
- package/dist/navigation/NavBar.js +6 -6
- package/dist/navigation/NavBar.js.map +1 -1
- package/dist/navigation/NavList.d.ts +1 -0
- package/dist/navigation/NavList.js +20 -12
- package/dist/navigation/NavList.js.map +1 -1
- package/dist/navigation/NavMenu.d.ts +27 -0
- package/dist/navigation/NavMenu.js +54 -0
- package/dist/navigation/NavMenu.js.map +1 -0
- package/dist/navigation/PageJump.js +3 -3
- package/dist/navigation/PageJump.js.map +1 -1
- package/dist/navigation/PageSizeSelect.js +4 -4
- package/dist/navigation/PageSizeSelect.js.map +1 -1
- package/dist/navigation/Pagination.js +6 -6
- package/dist/navigation/Pagination.js.map +1 -1
- package/dist/navigation/PaginationBar.js +5 -5
- package/dist/navigation/PaginationBar.js.map +1 -1
- package/dist/navigation/Steps.js +4 -4
- package/dist/navigation/Steps.js.map +1 -1
- package/dist/navigation/TableOfContents.js +5 -5
- package/dist/navigation/TableOfContents.js.map +1 -1
- package/dist/navigation/Tabs.js +7 -7
- package/dist/navigation/Tabs.js.map +1 -1
- package/dist/navigation/Toolbar.js +3 -3
- package/dist/navigation/Toolbar.js.map +1 -1
- package/dist/overlay/AlertDialog.js +4 -4
- package/dist/overlay/AlertDialog.js.map +1 -1
- package/dist/overlay/CommandPalette.js +4 -4
- package/dist/overlay/CommandPalette.js.map +1 -1
- package/dist/overlay/ContextMenu.js +3 -3
- package/dist/overlay/ContextMenu.js.map +1 -1
- package/dist/overlay/Dialog.js +4 -4
- package/dist/overlay/Dialog.js.map +1 -1
- package/dist/overlay/Drawer.js +5 -5
- package/dist/overlay/Drawer.js.map +1 -1
- package/dist/overlay/HoverCard.js +5 -3
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Lightbox.js +5 -5
- package/dist/overlay/Lightbox.js.map +1 -1
- package/dist/overlay/Menu.js +7 -7
- package/dist/overlay/Menu.js.map +1 -1
- package/dist/overlay/ModalCore.js +9 -9
- package/dist/overlay/ModalCore.js.map +1 -1
- package/dist/overlay/Popconfirm.js +6 -6
- package/dist/overlay/Popconfirm.js.map +1 -1
- package/dist/overlay/Popover.js +5 -3
- package/dist/overlay/Popover.js.map +1 -1
- package/dist/overlay/Tooltip.js +5 -3
- package/dist/overlay/Tooltip.js.map +1 -1
- package/dist/overlay/Tour.js +8 -8
- package/dist/overlay/Tour.js.map +1 -1
- package/dist/overlay/detached.d.ts +2 -0
- package/dist/overlay/detached.js +73 -42
- package/dist/overlay/detached.js.map +1 -1
- package/dist/patterns/ActionBar.js +3 -3
- package/dist/patterns/ActionBar.js.map +1 -1
- package/dist/patterns/AppShell.d.ts +28 -1
- package/dist/patterns/AppShell.js +158 -52
- package/dist/patterns/AppShell.js.map +1 -1
- package/dist/patterns/AuthLayout.d.ts +28 -0
- package/dist/patterns/AuthLayout.js +77 -0
- package/dist/patterns/AuthLayout.js.map +1 -0
- package/dist/patterns/CommentThread.js +9 -9
- package/dist/patterns/CommentThread.js.map +1 -1
- package/dist/patterns/DataImport.js +4 -4
- package/dist/patterns/DataImport.js.map +1 -1
- package/dist/patterns/DeadlineBadge.js +3 -3
- package/dist/patterns/DeadlineBadge.js.map +1 -1
- package/dist/patterns/FilterBar.d.ts +11 -1
- package/dist/patterns/FilterBar.js +39 -10
- package/dist/patterns/FilterBar.js.map +1 -1
- package/dist/patterns/FormDialog.d.ts +18 -0
- package/dist/patterns/FormDialog.js +46 -0
- package/dist/patterns/FormDialog.js.map +1 -0
- package/dist/patterns/KanbanBoard.js +8 -8
- package/dist/patterns/KanbanBoard.js.map +1 -1
- package/dist/patterns/LayoutSwitcher.d.ts +12 -0
- package/dist/patterns/LayoutSwitcher.js +79 -0
- package/dist/patterns/LayoutSwitcher.js.map +1 -0
- package/dist/patterns/NotificationCenter.js +8 -8
- package/dist/patterns/NotificationCenter.js.map +1 -1
- package/dist/patterns/PageTabs.d.ts +12 -7
- package/dist/patterns/PageTabs.js +41 -29
- package/dist/patterns/PageTabs.js.map +1 -1
- package/dist/patterns/QueryTable.d.ts +10 -1
- package/dist/patterns/QueryTable.js +128 -68
- package/dist/patterns/QueryTable.js.map +1 -1
- package/dist/patterns/SlideCaptcha.d.ts +80 -0
- package/dist/patterns/SlideCaptcha.js +354 -0
- package/dist/patterns/SlideCaptcha.js.map +1 -0
- package/dist/patterns/StepsForm.js +7 -7
- package/dist/patterns/StepsForm.js.map +1 -1
- package/dist/patterns/ThemeSwitcher.js +3 -3
- package/dist/patterns/ThemeSwitcher.js.map +1 -1
- package/dist/patterns/index.d.ts +7 -3
- package/dist/patterns/index.js +5 -1
- package/dist/patterns/messages.d.ts +39 -1
- package/dist/patterns/messages.js +40 -2
- package/dist/patterns/messages.js.map +1 -1
- package/dist/table/ColumnHeaderActions.js +3 -3
- package/dist/table/ColumnHeaderActions.js.map +1 -1
- package/dist/table/ColumnResizer.js +3 -3
- package/dist/table/ColumnResizer.js.map +1 -1
- package/dist/table/ColumnSettings.js +5 -5
- package/dist/table/ColumnSettings.js.map +1 -1
- package/dist/table/ColumnTable.js +8 -8
- package/dist/table/ColumnTable.js.map +1 -1
- package/dist/table/DataTable.js +8 -8
- package/dist/table/DataTable.js.map +1 -1
- package/dist/table/DataTableView.js +21 -21
- package/dist/table/DataTableView.js.map +1 -1
- package/dist/table/PivotTable.js +3 -3
- package/dist/table/PivotTable.js.map +1 -1
- package/dist/table/SelectionBar.js +4 -4
- package/dist/table/SelectionBar.js.map +1 -1
- package/dist/table/TreeDataTable.js +5 -5
- package/dist/table/TreeDataTable.js.map +1 -1
- package/dist/theme-customize/ThemeCustomizer.js +7 -6
- package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
- package/dist/theme-customize/ThemeThumbnail.js +3 -3
- package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
- package/dist/three/background/AuroraBackground.js +3 -3
- package/dist/three/background/AuroraBackground.js.map +1 -1
- package/dist/three/background/MeshGradient.js +3 -3
- package/dist/three/background/MeshGradient.js.map +1 -1
- package/dist/three/background/ShaderBackground.js +3 -3
- package/dist/three/background/ShaderBackground.js.map +1 -1
- package/dist/three/core/EffectSurface.js +3 -3
- package/dist/three/core/EffectSurface.js.map +1 -1
- package/dist/three/core/ThreeCanvas.js +4 -4
- package/dist/three/core/ThreeCanvas.js.map +1 -1
- package/dist/three/effects/Confetti.js +3 -3
- package/dist/three/effects/Confetti.js.map +1 -1
- package/dist/three/effects/ParticleField.js +3 -3
- package/dist/three/effects/ParticleField.js.map +1 -1
- package/dist/three/effects/WaveGrid.js +3 -3
- package/dist/three/effects/WaveGrid.js.map +1 -1
- package/dist/three/globe/Globe.js +3 -3
- package/dist/three/globe/Globe.js.map +1 -1
- package/dist/three/model/ModelViewer.js +3 -3
- package/dist/three/model/ModelViewer.js.map +1 -1
- package/dist/utils/data/clone.d.ts +8 -0
- package/dist/utils/data/clone.js +21 -0
- package/dist/utils/data/clone.js.map +1 -0
- package/dist/utils/data/date.d.ts +10 -0
- package/dist/utils/data/date.js +13 -1
- package/dist/utils/data/date.js.map +1 -1
- package/dist/utils/data/number.d.ts +5 -0
- package/dist/utils/data/number.js +8 -1
- package/dist/utils/data/number.js.map +1 -1
- package/dist/utils/data/numeric.d.ts +7 -0
- package/dist/utils/data/numeric.js +46 -1
- package/dist/utils/data/numeric.js.map +1 -1
- package/dist/utils/dom/download.d.ts +8 -1
- package/dist/utils/dom/download.js +19 -2
- package/dist/utils/dom/download.js.map +1 -1
- package/dist/utils/dom/element.d.ts +3 -1
- package/dist/utils/dom/element.js +8 -4
- package/dist/utils/dom/element.js.map +1 -1
- package/dist/utils/dom/fullscreen.d.ts +1 -1
- package/dist/utils/dom/fullscreen.js +12 -8
- package/dist/utils/dom/fullscreen.js.map +1 -1
- package/dist/utils/dom/mounted.d.ts +7 -0
- package/dist/utils/dom/mounted.js +16 -0
- package/dist/utils/dom/mounted.js.map +1 -0
- package/dist/utils/dom/overflow.js +2 -1
- package/dist/utils/dom/overflow.js.map +1 -1
- package/dist/utils/dom/pan-zoom.js +2 -1
- package/dist/utils/dom/pan-zoom.js.map +1 -1
- package/dist/utils/props.js +3 -13
- package/dist/utils/props.js.map +1 -1
- package/dist/utils/request/error-message.d.ts +17 -0
- package/dist/utils/request/error-message.js +50 -0
- package/dist/utils/request/error-message.js.map +1 -0
- package/dist/utils/request/http.d.ts +80 -4
- package/dist/utils/request/http.js +121 -24
- package/dist/utils/request/http.js.map +1 -1
- package/dist/utils/request/use-autosave.d.ts +35 -0
- package/dist/utils/request/use-autosave.js +69 -0
- package/dist/utils/request/use-autosave.js.map +1 -0
- package/dist/utils/request/use-request.js +4 -2
- package/dist/utils/request/use-request.js.map +1 -1
- package/package.json +57 -4
|
@@ -13,8 +13,8 @@ import { isSameDate, monthGrid, weekdayNames } from "../utils/data/date.js";
|
|
|
13
13
|
import { useFormat } from "../config/lang/format.js";
|
|
14
14
|
import { handleCalendarKeydown, useCalendarState } from "./calendar-state.js";
|
|
15
15
|
import { toDateLimits, useDateLocale } from "./date-locale.js";
|
|
16
|
-
import { computed, createVNode, isVNode,
|
|
17
|
-
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
16
|
+
import { computed, createVNode, isVNode, nextTick, shallowRef, useId, watch } from "vue";
|
|
17
|
+
import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
18
18
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
19
19
|
import { ChevronLeft, ChevronRight } from "@lucide/icons";
|
|
20
20
|
import { isWeekend } from "@internationalized/date";
|
|
@@ -269,7 +269,7 @@ var CalendarBoard = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
269
269
|
const shown = list.slice(0, Math.max(0, maxEvents.value));
|
|
270
270
|
const own = typeof propsCell.value === "function" ? propsCell.value(iso) : propsCell.value;
|
|
271
271
|
const label = format.date(day, { dateStyle: "full" });
|
|
272
|
-
return createVNode("td",
|
|
272
|
+
return createVNode("td", mergeJsxProps({ "key": iso }, mergeAttrs({ sx: [
|
|
273
273
|
calendarBoardStyles.cell,
|
|
274
274
|
dayState.weekend && calendarBoardStyles.weekend,
|
|
275
275
|
state.outside && calendarBoardStyles.outside,
|
|
@@ -286,7 +286,7 @@ var CalendarBoard = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
286
286
|
"data-today": state.today || void 0,
|
|
287
287
|
"data-outside": state.outside || void 0
|
|
288
288
|
}), [
|
|
289
|
-
createVNode("div", css.attrs(calendarBoardStyles.dayHead), [createVNode("button",
|
|
289
|
+
createVNode("div", css.attrs(calendarBoardStyles.dayHead), [createVNode("button", mergeJsxProps({
|
|
290
290
|
"type": "button",
|
|
291
291
|
"tabindex": state.focused && !state.outside ? 0 : -1,
|
|
292
292
|
"aria-label": [state.today ? lang.calendarToday(label) : label, list.length > 0 ? lang.calendarBoardCount(list.length) : null].filter(Boolean).join(","),
|
|
@@ -302,7 +302,7 @@ var CalendarBoard = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
302
302
|
if (!state.focused) calendar.focus(day);
|
|
303
303
|
}
|
|
304
304
|
}), [locale.dayNumber(day)]), getDayNote.value && createVNode("span", css.attrs(calendarBoardStyles.note), [getDayNote.value(iso)])]),
|
|
305
|
-
shown.length > 0 && createVNode("ul", css.attrs(calendarBoardStyles.events), [shown.map((event, index) => createVNode("li", { "key": getEventKey.value?.(event) ?? index }, [renderEvent.value ? renderEvent.value(event, iso) : createVNode("span", css.attrs(calendarBoardStyles.event, statusToneSx("soft", getEventTone.value?.(event) ?? "accent")), [getEventLabel.value?.(event) ?? ""])])), list.length > shown.length && createVNode("li", null, [createVNode("button",
|
|
305
|
+
shown.length > 0 && createVNode("ul", css.attrs(calendarBoardStyles.events), [shown.map((event, index) => createVNode("li", { "key": getEventKey.value?.(event) ?? index }, [renderEvent.value ? renderEvent.value(event, iso) : createVNode("span", css.attrs(calendarBoardStyles.event, statusToneSx("soft", getEventTone.value?.(event) ?? "accent")), [getEventLabel.value?.(event) ?? ""])])), list.length > shown.length && createVNode("li", null, [createVNode("button", mergeJsxProps({ "type": "button" }, css.attrs(buttonBaseStyles.root, interactionTransitions.colors, calendarBoardStyles.more, focusRingStyles.tight), { "onClick": (event) => {
|
|
306
306
|
event.stopPropagation();
|
|
307
307
|
calendar.activate(day);
|
|
308
308
|
} }), [lang.calendarBoardMore(list.length - shown.length)])])]),
|
|
@@ -328,9 +328,9 @@ var CalendarBoard = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
328
328
|
role: "group"
|
|
329
329
|
}), [
|
|
330
330
|
createVNode("div", css.attrs(calendarBoardStyles.header), [
|
|
331
|
-
createVNode("span",
|
|
331
|
+
createVNode("span", mergeJsxProps({ "id": titleId }, css.attrs(calendarBoardStyles.title)), [title]),
|
|
332
332
|
toolbar.value,
|
|
333
|
-
createVNode(Button,
|
|
333
|
+
createVNode(Button, mergeJsxProps(mergePartProps({
|
|
334
334
|
size: "sm",
|
|
335
335
|
variant: "soft",
|
|
336
336
|
tone: "neutral"
|
|
@@ -358,12 +358,12 @@ var CalendarBoard = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
358
358
|
"onClick": _cache[3] || (_cache[3] = () => calendar.turnPage(1))
|
|
359
359
|
}, null)
|
|
360
360
|
]),
|
|
361
|
-
createVNode("table",
|
|
361
|
+
createVNode("table", mergeJsxProps(css.attrs(calendarBoardStyles.grid), {
|
|
362
362
|
"role": "grid",
|
|
363
363
|
"aria-labelledby": titleId,
|
|
364
364
|
"onKeydown": onKeydown,
|
|
365
365
|
"onPointerleave": _cache[4] || (_cache[4] = () => calendar.hover(null))
|
|
366
|
-
}), [createVNode("thead", null, [createVNode("tr", null, [names.map((name) => createVNode("th",
|
|
366
|
+
}), [createVNode("thead", null, [createVNode("tr", null, [names.map((name) => createVNode("th", mergeJsxProps({
|
|
367
367
|
"key": name,
|
|
368
368
|
"scope": "col"
|
|
369
369
|
}, css.attrs(calendarBoardStyles.weekday)), [name]))])]), createVNode("tbody", null, [weeks.map((week) => createVNode("tr", { "key": week[0].toString() }, [week.map((day) => renderCell(day, page))]))])]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarBoard.js","names":["_isVNode","_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/date/CalendarBoard.tsx"],"sourcesContent":["/**\n * 整页的月历(日历看板):一个月铺满一页,每天一个大格子,格子里放日程、排班、节假日这类按天的内容。\n * 参考 Ant Design Calendar 的 fullscreen、Google 日历的月视图。要在输入框里选日期用 DatePicker,小日历用 Calendar。\n *\n * <CalendarBoard\n * events={meetings}\n * getEventDate={(meeting) => meeting.date}\n * getEventLabel={(meeting) => meeting.title}\n * _value={day}\n * aria-label=\"会议日程\"\n * />\n *\n * - 数据按天放进格子:getEventDate 是哪一天(带时间的取日期),getEventEnd 给了时跨天的每一天都有它;\n * 每天最多显示 maxEvents 条,其余收成“还有 N 项”(点了选中那一天,由页面在旁边列出全部)。\n * renderEvent 自定义一条的显示(默认是带色调的一行文字),renderDay 往格子里加别的内容(排班、价格),\n * getDayNote 是日期旁边的小字(节假日、“休”“班”、农历)。\n * - 键盘与 Calendar 一致(同一个 useCalendarState):每天的日期数字是一个按钮,焦点在当前日期上,\n * ←→ 一天、↑↓ 一周、Page Up / Down 一个月、Home / End 到这周两端,Enter / 空格选中;读屏念完整日期与有几项日程。\n * 格子里的日程可以是链接、按钮,Tab 照常进去。\n * - 页头:标题(翻页时播报)、toolbar(筛选、视图切换)、“今天”、上个月 / 下个月;month 可以双向绑定(翻页写回)。\n *\n * 部件:Root(div,role=\"group\")、Header、Title、Today、Previous、Next、Grid(table)、Weekday、Cell(td)、\n * DayButton(日期数字)、Note、Events(ul)、Event、More。\n */\nimport { ChevronLeft, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { isWeekend, type CalendarDate } from '@internationalized/date';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, watch, type VNodeChild } from 'vue';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { IconButton } from '../base/IconButton';\nimport { VisuallyHidden } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { useFormat } from '../config/lang/format';\nimport { t } from '../config/theme/tokens';\nimport { isSameDate, monthGrid, weekdayNames } from '../utils/data/date';\nimport { isRtl } from '../utils/dom/direction';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { statusToneSx, type StatusTone } from '../utils/style/tone-styles';\nimport { interactionTransitions } from '../utils/style/transitions';\nimport { handleCalendarKeydown, useCalendarState } from './calendar-state';\nimport { toDateLimits, useDateLocale, type DateLimitProps } from './date-locale';\n\n/** 一天的状态:renderDay、getDayNote 之外的自定义内容用 */\nexport interface CalendarBoardDayState {\n /** 今天 */\n today: boolean;\n /** 补齐的上个月、下个月的日子 */\n outside: boolean;\n /** 选中的那一天 */\n selected: boolean;\n /** 周六、周日(按语言) */\n weekend: boolean;\n /** 不可选(范围外、不可选的日期) */\n disabled: boolean;\n}\n\n/** 未声明的属性落到根元素上;aria-label 是整个月历的名称 */\nexport interface CalendarBoardProps<T = unknown> extends PartProps<'div', 'role'>, DateLimitProps {\n /** 选中的那一天(ISO 日期):父级写 _value={day};没有时 null */\n _value?: string | null;\n /** 显示哪个月('YYYY-MM'):父级可写 _month={m},翻页时写回;不写时从选中的那天(或今天)开始 */\n _month?: string;\n /** 一周的第一天,0 是周日;不写时按语言 */\n firstDayOfWeek?: number;\n /** 按天放的数据:日程、排班、提醒 */\n events?: readonly T[];\n /** 数据在哪一天(ISO 日期;带时间的取日期部分) */\n getEventDate?: (event: T) => string;\n /** 跨天的数据在哪一天结束(含);不写时只在 getEventDate 那一天 */\n getEventEnd?: (event: T) => string;\n /** 数据的 key;不写时用它在 events 里的位置 */\n getEventKey?: (event: T) => string;\n /** 默认显示的文字 */\n getEventLabel?: (event: T) => string;\n /** 默认显示的色调,默认 accent */\n getEventTone?: (event: T) => StatusTone;\n /** 自定义一条数据的显示 */\n renderEvent?: (event: T, date: string) => VNodeChild;\n /** 每天最多显示几条,其余收成“还有 N 项”,默认 3 */\n maxEvents?: number;\n /** 日期旁边的小字(节假日、“休”“班”、农历) */\n getDayNote?: (date: string) => VNodeChild;\n /** 往格子里加别的内容(排班、价格),放在日程下面 */\n renderDay?: (date: string, state: CalendarBoardDayState) => VNodeChild;\n /** 页头右边的内容(筛选、视图切换) */\n toolbar?: VNodeChild;\n /** 只读:能翻页、移动焦点,不能选 */\n readonly?: boolean;\n /** “今天”按钮的部件属性 */\n propsToday?: Partial<ButtonProps>;\n /** 每格(td)的部件属性,可以按日期给 */\n propsCell?: PartProps<'td', 'role' | 'aria-selected'> | ((date: string) => PartProps<'td'>);\n}\n\n/** CalendarBoard 的样式 */\nexport const calendarBoardStyles = css.create({\n root: { display: 'flex', flexDirection: 'column', gap: '_sm', minWidth: 0 },\n header: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '_sm' },\n title: { fontSize: '_lg', fontWeight: '_semibold', marginInlineEnd: 'auto' },\n grid: {\n width: '_full',\n tableLayout: 'fixed',\n borderCollapse: 'collapse',\n borderSpacing: 0,\n },\n weekday: {\n paddingBlock: '_xs',\n paddingInline: '_sm',\n color: '_textMuted',\n fontWeight: '_normal',\n fontSize: '_sm',\n textAlign: 'start',\n },\n cell: {\n height: '7em',\n padding: '_xs',\n verticalAlign: 'top',\n borderWidth: '_xs',\n borderStyle: 'solid',\n borderColor: '_borderMuted',\n cursor: 'pointer',\n transition: `background-color ${t.durations.sm} ${t.easings.standard}`,\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n weekend: { backgroundColor: { default: '_surfaceMuted', ':hover': '_fillHover' } },\n outside: { color: '_textMuted' },\n selected: {\n backgroundColor: { default: '_accentSoft', ':hover': '_accentSoftHover' },\n boxShadow: `inset 0 0 0 ${t.borderWidths.sm} ${t.colors.accentBorder}`,\n },\n disabled: { cursor: 'not-allowed', opacity: '_disabled' },\n // 只读:格子不像能点\n readonly: { cursor: 'default' },\n dayHead: { display: 'flex', alignItems: 'center', gap: '_xs', minWidth: 0 },\n // 日期数字:可聚焦的按钮,焦点环画在它上面\n day: {\n display: 'inline-grid',\n placeItems: 'center',\n flexShrink: 0,\n minWidth: '1.75em',\n height: '1.75em',\n paddingInline: '_xs',\n borderRadius: '_full',\n fontVariantNumeric: 'tabular-nums',\n fontWeight: '_medium',\n },\n today: { backgroundColor: '_accent', color: '_accentContrast' },\n note: {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '_xs',\n color: '_textMuted',\n },\n events: {\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n marginBlock: '_xs',\n marginInline: 0,\n padding: 0,\n listStyle: 'none',\n },\n event: {\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n paddingInline: '_xs',\n borderRadius: '_sm',\n fontSize: '_xs',\n lineHeight: '1.6',\n },\n more: {\n paddingInline: '_xs',\n borderRadius: '_sm',\n fontSize: '_xs',\n color: '_textMuted',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n});\n\n/** 整页的月历:每天一个大格子,放日程、排班、节假日 */\nexport const CalendarBoard = _component(\n <T,>({\n _value: value = _bindable<string | null>(null),\n _month: month = _bindable<string | undefined>(undefined),\n firstDayOfWeek,\n min,\n max,\n isDateUnavailable,\n events = [],\n getEventDate,\n getEventEnd,\n getEventKey,\n getEventLabel,\n getEventTone,\n renderEvent,\n maxEvents = 3,\n getDayNote,\n renderDay,\n toolbar,\n readonly = false,\n propsToday,\n propsCell,\n ...rest\n }: CalendarBoardProps<T>) => {\n const lang = useLang();\n const format = useFormat();\n const locale = useDateLocale(() => ({ firstDayOfWeek }));\n const titleId = useId();\n let root = _state.raw<HTMLElement | null>(null);\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n const selected = _derived.by(() => {\n const day = locale.fromValue(value);\n return day ? [day] : [];\n });\n const calendar = useCalendarState({\n mode: () => 'single',\n selected: () => selected,\n onChange: ([day]) => {\n value = locale.toIso(day!);\n },\n today: () => locale.today(),\n limits: () => limits,\n week: () => locale.week,\n readonly: () => readonly,\n defaultFocused: () => (month ? locale.fromValue(`${month}-01`) : null),\n });\n\n // 翻页写回 month;父级改了 month 时翻过去\n watch(\n () => calendar.page.toString().slice(0, 7),\n (page) => {\n if (month !== undefined && month !== page) month = page;\n },\n );\n watch(\n () => month,\n (next) => {\n const target = next ? locale.fromValue(`${next}-01`) : null;\n if (target && !isSameDate(target, calendar.page, 'month')) calendar.focus(target);\n },\n );\n\n /** 按天分好的数据:ISO 日期 → 那天的数据(跨天的每一天都有) */\n const byDay = _derived.by(() => {\n const map = new Map<string, T[]>();\n if (!getEventDate) return map;\n for (const event of events) {\n const first = locale.fromValue(getEventDate(event).slice(0, 10));\n if (!first) continue;\n const last = getEventEnd ? locale.fromValue(getEventEnd(event).slice(0, 10)) : null;\n // 跨天的最多铺 366 天,数据错了(结束早于开始、跨好几年)也不会卡住\n for (let day = first, count = 0; count < 366; day = day.add({ days: 1 }), count++) {\n const key = locale.toIso(day);\n map.set(key, [...(map.get(key) ?? []), event]);\n if (!last || day.compare(last) >= 0) break;\n }\n }\n return map;\n });\n\n function onKeydown(event: KeyboardEvent) {\n // 格子里的日程(链接、按钮)自己处理按键\n if (!(event.target as Element).matches('[data-day]')) return;\n if (!handleCalendarKeydown(calendar, event, !!root && isRtl(root))) return;\n event.preventDefault();\n void nextTick(() => root?.querySelector<HTMLElement>('[data-day][data-focused]')?.focus());\n }\n\n /** 点格子的空白处:选中那一天(点里面的链接、按钮时照常) */\n function onCellClick(event: MouseEvent, day: CalendarDate) {\n if ((event.target as Element).closest('a, button, input, [role=\"button\"]')) return;\n calendar.activate(day);\n }\n\n function renderCell(day: CalendarDate, page: CalendarDate) {\n const iso = locale.toIso(day);\n const state = calendar.cell(day, page);\n const dayState: CalendarBoardDayState = {\n today: state.today,\n outside: state.outside,\n selected: state.selected,\n weekend: isWeekend(day, locale.locale),\n disabled: state.disabled,\n };\n const list = byDay.get(iso) ?? [];\n const shown = list.slice(0, Math.max(0, maxEvents));\n const own = typeof propsCell === 'function' ? propsCell(iso) : propsCell;\n const label = format.date(day, { dateStyle: 'full' });\n return (\n <td\n key={iso}\n {...mergeAttrs<'td'>(\n {\n sx: [\n calendarBoardStyles.cell,\n dayState.weekend && calendarBoardStyles.weekend,\n state.outside && calendarBoardStyles.outside,\n state.selected && calendarBoardStyles.selected,\n state.disabled && calendarBoardStyles.disabled,\n readonly && calendarBoardStyles.readonly,\n ],\n },\n own,\n {\n role: 'gridcell',\n 'aria-selected': state.selected,\n onClick: (event: MouseEvent) => onCellClick(event, day),\n onPointerenter: () => calendar.hover(day),\n },\n )}\n data-date={iso}\n data-today={state.today || undefined}\n data-outside={state.outside || undefined}\n >\n <div {...css.attrs(calendarBoardStyles.dayHead)}>\n <button\n type=\"button\"\n tabindex={state.focused && !state.outside ? 0 : -1}\n aria-label={[\n state.today ? lang.calendarToday(label) : label,\n list.length > 0 ? lang.calendarBoardCount(list.length) : null,\n ]\n .filter(Boolean)\n .join(',')}\n aria-disabled={state.disabled || undefined}\n {...css.attrs(\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarBoardStyles.day,\n focusRingStyles.tight,\n state.today && calendarBoardStyles.today,\n )}\n data-day=\"\"\n data-focused={(state.focused && !state.outside) || undefined}\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n if (!state.disabled) calendar.activate(day);\n }}\n onFocus={() => {\n if (!state.focused) calendar.focus(day);\n }}\n >\n {locale.dayNumber(day)}\n </button>\n {getDayNote && <span {...css.attrs(calendarBoardStyles.note)}>{getDayNote(iso)}</span>}\n </div>\n {shown.length > 0 && (\n <ul {...css.attrs(calendarBoardStyles.events)}>\n {shown.map((event, index) => (\n <li key={getEventKey?.(event) ?? index}>\n {renderEvent ? (\n renderEvent(event, iso)\n ) : (\n <span\n {...css.attrs(\n calendarBoardStyles.event,\n statusToneSx('soft', getEventTone?.(event) ?? 'accent'),\n )}\n >\n {getEventLabel?.(event) ?? ''}\n </span>\n )}\n </li>\n ))}\n {list.length > shown.length && (\n <li>\n <button\n type=\"button\"\n {...css.attrs(\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarBoardStyles.more,\n focusRingStyles.tight,\n )}\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n calendar.activate(day);\n }}\n >\n {lang.calendarBoardMore(list.length - shown.length)}\n </button>\n </li>\n )}\n </ul>\n )}\n {renderDay?.(iso, dayState)}\n </td>\n );\n }\n\n return () => {\n const page = calendar.page;\n const title = format.date(page, { year: 'numeric', month: 'long' });\n const weeks = monthGrid(page, { ...locale.week, fixedWeeks: false });\n const names = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'short',\n });\n return (\n <div\n {...mergeAttrs<'div'>({ sx: calendarBoardStyles.root }, rest, {\n ref: _toRef(root),\n role: 'group',\n })}\n >\n <div {...css.attrs(calendarBoardStyles.header)}>\n <span id={titleId} {...css.attrs(calendarBoardStyles.title)}>\n {title}\n </span>\n {toolbar}\n <Button\n {...mergePartProps<ButtonProps>(\n { size: 'sm', variant: 'soft', tone: 'neutral' },\n propsToday,\n {\n onClick: () => {\n calendar.focus(locale.today());\n void nextTick(() =>\n root?.querySelector<HTMLElement>('[data-day][data-focused]')?.focus(),\n );\n },\n },\n )}\n >\n {lang.dateRangePreset.today}\n </Button>\n <IconButton\n icon={ChevronLeft}\n aria-label={lang.calendarPreviousMonth}\n propsIcon={{ flipInRtl: true }}\n size=\"sm\"\n disabled={!calendar.canTurnPage(-1)}\n onClick={() => calendar.turnPage(-1)}\n />\n <IconButton\n icon={ChevronRight}\n aria-label={lang.calendarNextMonth}\n propsIcon={{ flipInRtl: true }}\n size=\"sm\"\n disabled={!calendar.canTurnPage(1)}\n onClick={() => calendar.turnPage(1)}\n />\n </div>\n <table\n {...css.attrs(calendarBoardStyles.grid)}\n role=\"grid\"\n aria-labelledby={titleId}\n onKeydown={onKeydown}\n onPointerleave={() => calendar.hover(null)}\n >\n <thead>\n <tr>\n {names.map((name) => (\n <th key={name} scope=\"col\" {...css.attrs(calendarBoardStyles.weekday)}>\n {name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toString()}>{week.map((day) => renderCell(day, page))}</tr>\n ))}\n </tbody>\n </table>\n {/* 翻页时播报新的月份 */}\n <VisuallyHidden aria-live=\"polite\">{title}</VisuallyHidden>\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CalendarBoard.js","names":["_isVNode","_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/date/CalendarBoard.tsx"],"sourcesContent":["/**\n * 整页的月历(日历看板):一个月铺满一页,每天一个大格子,格子里放日程、排班、节假日这类按天的内容。\n * 参考 Ant Design Calendar 的 fullscreen、Google 日历的月视图。要在输入框里选日期用 DatePicker,小日历用 Calendar。\n *\n * <CalendarBoard\n * events={meetings}\n * getEventDate={(meeting) => meeting.date}\n * getEventLabel={(meeting) => meeting.title}\n * _value={day}\n * aria-label=\"会议日程\"\n * />\n *\n * - 数据按天放进格子:getEventDate 是哪一天(带时间的取日期),getEventEnd 给了时跨天的每一天都有它;\n * 每天最多显示 maxEvents 条,其余收成“还有 N 项”(点了选中那一天,由页面在旁边列出全部)。\n * renderEvent 自定义一条的显示(默认是带色调的一行文字),renderDay 往格子里加别的内容(排班、价格),\n * getDayNote 是日期旁边的小字(节假日、“休”“班”、农历)。\n * - 键盘与 Calendar 一致(同一个 useCalendarState):每天的日期数字是一个按钮,焦点在当前日期上,\n * ←→ 一天、↑↓ 一周、Page Up / Down 一个月、Home / End 到这周两端,Enter / 空格选中;读屏念完整日期与有几项日程。\n * 格子里的日程可以是链接、按钮,Tab 照常进去。\n * - 页头:标题(翻页时播报)、toolbar(筛选、视图切换)、“今天”、上个月 / 下个月;month 可以双向绑定(翻页写回)。\n *\n * 部件:Root(div,role=\"group\")、Header、Title、Today、Previous、Next、Grid(table)、Weekday、Cell(td)、\n * DayButton(日期数字)、Note、Events(ul)、Event、More。\n */\nimport { ChevronLeft, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { isWeekend, type CalendarDate } from '@internationalized/date';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, watch, type VNodeChild } from 'vue';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { IconButton } from '../base/IconButton';\nimport { VisuallyHidden } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { useFormat } from '../config/lang/format';\nimport { t } from '../config/theme/tokens';\nimport { isSameDate, monthGrid, weekdayNames } from '../utils/data/date';\nimport { isRtl } from '../utils/dom/direction';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { statusToneSx, type StatusTone } from '../utils/style/tone-styles';\nimport { interactionTransitions } from '../utils/style/transitions';\nimport { handleCalendarKeydown, useCalendarState } from './calendar-state';\nimport { toDateLimits, useDateLocale, type DateLimitProps } from './date-locale';\n\n/** 一天的状态:renderDay、getDayNote 之外的自定义内容用 */\nexport interface CalendarBoardDayState {\n /** 今天 */\n today: boolean;\n /** 补齐的上个月、下个月的日子 */\n outside: boolean;\n /** 选中的那一天 */\n selected: boolean;\n /** 周六、周日(按语言) */\n weekend: boolean;\n /** 不可选(范围外、不可选的日期) */\n disabled: boolean;\n}\n\n/** 未声明的属性落到根元素上;aria-label 是整个月历的名称 */\nexport interface CalendarBoardProps<T = unknown> extends PartProps<'div', 'role'>, DateLimitProps {\n /** 选中的那一天(ISO 日期):父级写 _value={day};没有时 null */\n _value?: string | null;\n /** 显示哪个月('YYYY-MM'):父级可写 _month={m},翻页时写回;不写时从选中的那天(或今天)开始 */\n _month?: string;\n /** 一周的第一天,0 是周日;不写时按语言 */\n firstDayOfWeek?: number;\n /** 按天放的数据:日程、排班、提醒 */\n events?: readonly T[];\n /** 数据在哪一天(ISO 日期;带时间的取日期部分) */\n getEventDate?: (event: T) => string;\n /** 跨天的数据在哪一天结束(含);不写时只在 getEventDate 那一天 */\n getEventEnd?: (event: T) => string;\n /** 数据的 key;不写时用它在 events 里的位置 */\n getEventKey?: (event: T) => string;\n /** 默认显示的文字 */\n getEventLabel?: (event: T) => string;\n /** 默认显示的色调,默认 accent */\n getEventTone?: (event: T) => StatusTone;\n /** 自定义一条数据的显示 */\n renderEvent?: (event: T, date: string) => VNodeChild;\n /** 每天最多显示几条,其余收成“还有 N 项”,默认 3 */\n maxEvents?: number;\n /** 日期旁边的小字(节假日、“休”“班”、农历) */\n getDayNote?: (date: string) => VNodeChild;\n /** 往格子里加别的内容(排班、价格),放在日程下面 */\n renderDay?: (date: string, state: CalendarBoardDayState) => VNodeChild;\n /** 页头右边的内容(筛选、视图切换) */\n toolbar?: VNodeChild;\n /** 只读:能翻页、移动焦点,不能选 */\n readonly?: boolean;\n /** “今天”按钮的部件属性 */\n propsToday?: Partial<ButtonProps>;\n /** 每格(td)的部件属性,可以按日期给 */\n propsCell?: PartProps<'td', 'role' | 'aria-selected'> | ((date: string) => PartProps<'td'>);\n}\n\n/** CalendarBoard 的样式 */\nexport const calendarBoardStyles = css.create({\n root: { display: 'flex', flexDirection: 'column', gap: '_sm', minWidth: 0 },\n header: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '_sm' },\n title: { fontSize: '_lg', fontWeight: '_semibold', marginInlineEnd: 'auto' },\n grid: {\n width: '_full',\n tableLayout: 'fixed',\n borderCollapse: 'collapse',\n borderSpacing: 0,\n },\n weekday: {\n paddingBlock: '_xs',\n paddingInline: '_sm',\n color: '_textMuted',\n fontWeight: '_normal',\n fontSize: '_sm',\n textAlign: 'start',\n },\n cell: {\n height: '7em',\n padding: '_xs',\n verticalAlign: 'top',\n borderWidth: '_xs',\n borderStyle: 'solid',\n borderColor: '_borderMuted',\n cursor: 'pointer',\n transition: `background-color ${t.durations.sm} ${t.easings.standard}`,\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n weekend: { backgroundColor: { default: '_surfaceMuted', ':hover': '_fillHover' } },\n outside: { color: '_textMuted' },\n selected: {\n backgroundColor: { default: '_accentSoft', ':hover': '_accentSoftHover' },\n boxShadow: `inset 0 0 0 ${t.borderWidths.sm} ${t.colors.accentBorder}`,\n },\n disabled: { cursor: 'not-allowed', opacity: '_disabled' },\n // 只读:格子不像能点\n readonly: { cursor: 'default' },\n dayHead: { display: 'flex', alignItems: 'center', gap: '_xs', minWidth: 0 },\n // 日期数字:可聚焦的按钮,焦点环画在它上面\n day: {\n display: 'inline-grid',\n placeItems: 'center',\n flexShrink: 0,\n minWidth: '1.75em',\n height: '1.75em',\n paddingInline: '_xs',\n borderRadius: '_full',\n fontVariantNumeric: 'tabular-nums',\n fontWeight: '_medium',\n },\n today: { backgroundColor: '_accent', color: '_accentContrast' },\n note: {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '_xs',\n color: '_textMuted',\n },\n events: {\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n marginBlock: '_xs',\n marginInline: 0,\n padding: 0,\n listStyle: 'none',\n },\n event: {\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n paddingInline: '_xs',\n borderRadius: '_sm',\n fontSize: '_xs',\n lineHeight: '1.6',\n },\n more: {\n paddingInline: '_xs',\n borderRadius: '_sm',\n fontSize: '_xs',\n color: '_textMuted',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n});\n\n/** 整页的月历:每天一个大格子,放日程、排班、节假日 */\nexport const CalendarBoard = _component(\n <T,>({\n _value: value = _bindable<string | null>(null),\n _month: month = _bindable<string | undefined>(undefined),\n firstDayOfWeek,\n min,\n max,\n isDateUnavailable,\n events = [],\n getEventDate,\n getEventEnd,\n getEventKey,\n getEventLabel,\n getEventTone,\n renderEvent,\n maxEvents = 3,\n getDayNote,\n renderDay,\n toolbar,\n readonly = false,\n propsToday,\n propsCell,\n ...rest\n }: CalendarBoardProps<T>) => {\n const lang = useLang();\n const format = useFormat();\n const locale = useDateLocale(() => ({ firstDayOfWeek }));\n const titleId = useId();\n let root = _state.raw<HTMLElement | null>(null);\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n const selected = _derived.by(() => {\n const day = locale.fromValue(value);\n return day ? [day] : [];\n });\n const calendar = useCalendarState({\n mode: () => 'single',\n selected: () => selected,\n onChange: ([day]) => {\n value = locale.toIso(day!);\n },\n today: () => locale.today(),\n limits: () => limits,\n week: () => locale.week,\n readonly: () => readonly,\n defaultFocused: () => (month ? locale.fromValue(`${month}-01`) : null),\n });\n\n // 翻页写回 month;父级改了 month 时翻过去\n watch(\n () => calendar.page.toString().slice(0, 7),\n (page) => {\n if (month !== undefined && month !== page) month = page;\n },\n );\n watch(\n () => month,\n (next) => {\n const target = next ? locale.fromValue(`${next}-01`) : null;\n if (target && !isSameDate(target, calendar.page, 'month')) calendar.focus(target);\n },\n );\n\n /** 按天分好的数据:ISO 日期 → 那天的数据(跨天的每一天都有) */\n const byDay = _derived.by(() => {\n const map = new Map<string, T[]>();\n if (!getEventDate) return map;\n for (const event of events) {\n const first = locale.fromValue(getEventDate(event).slice(0, 10));\n if (!first) continue;\n const last = getEventEnd ? locale.fromValue(getEventEnd(event).slice(0, 10)) : null;\n // 跨天的最多铺 366 天,数据错了(结束早于开始、跨好几年)也不会卡住\n for (let day = first, count = 0; count < 366; day = day.add({ days: 1 }), count++) {\n const key = locale.toIso(day);\n map.set(key, [...(map.get(key) ?? []), event]);\n if (!last || day.compare(last) >= 0) break;\n }\n }\n return map;\n });\n\n function onKeydown(event: KeyboardEvent) {\n // 格子里的日程(链接、按钮)自己处理按键\n if (!(event.target as Element).matches('[data-day]')) return;\n if (!handleCalendarKeydown(calendar, event, !!root && isRtl(root))) return;\n event.preventDefault();\n void nextTick(() => root?.querySelector<HTMLElement>('[data-day][data-focused]')?.focus());\n }\n\n /** 点格子的空白处:选中那一天(点里面的链接、按钮时照常) */\n function onCellClick(event: MouseEvent, day: CalendarDate) {\n if ((event.target as Element).closest('a, button, input, [role=\"button\"]')) return;\n calendar.activate(day);\n }\n\n function renderCell(day: CalendarDate, page: CalendarDate) {\n const iso = locale.toIso(day);\n const state = calendar.cell(day, page);\n const dayState: CalendarBoardDayState = {\n today: state.today,\n outside: state.outside,\n selected: state.selected,\n weekend: isWeekend(day, locale.locale),\n disabled: state.disabled,\n };\n const list = byDay.get(iso) ?? [];\n const shown = list.slice(0, Math.max(0, maxEvents));\n const own = typeof propsCell === 'function' ? propsCell(iso) : propsCell;\n const label = format.date(day, { dateStyle: 'full' });\n return (\n <td\n key={iso}\n {...mergeAttrs<'td'>(\n {\n sx: [\n calendarBoardStyles.cell,\n dayState.weekend && calendarBoardStyles.weekend,\n state.outside && calendarBoardStyles.outside,\n state.selected && calendarBoardStyles.selected,\n state.disabled && calendarBoardStyles.disabled,\n readonly && calendarBoardStyles.readonly,\n ],\n },\n own,\n {\n role: 'gridcell',\n 'aria-selected': state.selected,\n onClick: (event: MouseEvent) => onCellClick(event, day),\n onPointerenter: () => calendar.hover(day),\n },\n )}\n data-date={iso}\n data-today={state.today || undefined}\n data-outside={state.outside || undefined}\n >\n <div {...css.attrs(calendarBoardStyles.dayHead)}>\n <button\n type=\"button\"\n tabindex={state.focused && !state.outside ? 0 : -1}\n aria-label={[\n state.today ? lang.calendarToday(label) : label,\n list.length > 0 ? lang.calendarBoardCount(list.length) : null,\n ]\n .filter(Boolean)\n .join(',')}\n aria-disabled={state.disabled || undefined}\n {...css.attrs(\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarBoardStyles.day,\n focusRingStyles.tight,\n state.today && calendarBoardStyles.today,\n )}\n data-day=\"\"\n data-focused={(state.focused && !state.outside) || undefined}\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n if (!state.disabled) calendar.activate(day);\n }}\n onFocus={() => {\n if (!state.focused) calendar.focus(day);\n }}\n >\n {locale.dayNumber(day)}\n </button>\n {getDayNote && <span {...css.attrs(calendarBoardStyles.note)}>{getDayNote(iso)}</span>}\n </div>\n {shown.length > 0 && (\n <ul {...css.attrs(calendarBoardStyles.events)}>\n {shown.map((event, index) => (\n <li key={getEventKey?.(event) ?? index}>\n {renderEvent ? (\n renderEvent(event, iso)\n ) : (\n <span\n {...css.attrs(\n calendarBoardStyles.event,\n statusToneSx('soft', getEventTone?.(event) ?? 'accent'),\n )}\n >\n {getEventLabel?.(event) ?? ''}\n </span>\n )}\n </li>\n ))}\n {list.length > shown.length && (\n <li>\n <button\n type=\"button\"\n {...css.attrs(\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarBoardStyles.more,\n focusRingStyles.tight,\n )}\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n calendar.activate(day);\n }}\n >\n {lang.calendarBoardMore(list.length - shown.length)}\n </button>\n </li>\n )}\n </ul>\n )}\n {renderDay?.(iso, dayState)}\n </td>\n );\n }\n\n return () => {\n const page = calendar.page;\n const title = format.date(page, { year: 'numeric', month: 'long' });\n const weeks = monthGrid(page, { ...locale.week, fixedWeeks: false });\n const names = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'short',\n });\n return (\n <div\n {...mergeAttrs<'div'>({ sx: calendarBoardStyles.root }, rest, {\n ref: _toRef(root),\n role: 'group',\n })}\n >\n <div {...css.attrs(calendarBoardStyles.header)}>\n <span id={titleId} {...css.attrs(calendarBoardStyles.title)}>\n {title}\n </span>\n {toolbar}\n <Button\n {...mergePartProps<ButtonProps>(\n { size: 'sm', variant: 'soft', tone: 'neutral' },\n propsToday,\n {\n onClick: () => {\n calendar.focus(locale.today());\n void nextTick(() =>\n root?.querySelector<HTMLElement>('[data-day][data-focused]')?.focus(),\n );\n },\n },\n )}\n >\n {lang.dateRangePreset.today}\n </Button>\n <IconButton\n icon={ChevronLeft}\n aria-label={lang.calendarPreviousMonth}\n propsIcon={{ flipInRtl: true }}\n size=\"sm\"\n disabled={!calendar.canTurnPage(-1)}\n onClick={() => calendar.turnPage(-1)}\n />\n <IconButton\n icon={ChevronRight}\n aria-label={lang.calendarNextMonth}\n propsIcon={{ flipInRtl: true }}\n size=\"sm\"\n disabled={!calendar.canTurnPage(1)}\n onClick={() => calendar.turnPage(1)}\n />\n </div>\n <table\n {...css.attrs(calendarBoardStyles.grid)}\n role=\"grid\"\n aria-labelledby={titleId}\n onKeydown={onKeydown}\n onPointerleave={() => calendar.hover(null)}\n >\n <thead>\n <tr>\n {names.map((name) => (\n <th key={name} scope=\"col\" {...css.attrs(calendarBoardStyles.weekday)}>\n {name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toString()}>{week.map((day) => renderCell(day, page))}</tr>\n ))}\n </tbody>\n </table>\n {/* 翻页时播报新的月份 */}\n <VisuallyHidden aria-live=\"polite\">{title}</VisuallyHidden>\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
|
|
@@ -12,8 +12,8 @@ import { monthGrid, monthsOfYear, weekOfYear, weekdayNames, yearsOfDecade } from
|
|
|
12
12
|
import { useFormat } from "../config/lang/format.js";
|
|
13
13
|
import { handleCalendarKeydown } from "./calendar-state.js";
|
|
14
14
|
import { useDateLocale } from "./date-locale.js";
|
|
15
|
-
import { createVNode, isVNode,
|
|
16
|
-
import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
15
|
+
import { createVNode, isVNode, nextTick, shallowRef, useId } from "vue";
|
|
16
|
+
import { _component, childrenProp, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
17
17
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
18
18
|
import { ChevronLeft, ChevronRight } from "@lucide/icons";
|
|
19
19
|
//#region src/date/CalendarView.tsx
|
|
@@ -253,7 +253,7 @@ var CalendarView = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
253
253
|
const range = calendar.value.mode === "range";
|
|
254
254
|
const ends = range && (state.rangeStart || state.rangeEnd);
|
|
255
255
|
const marked = range ? ends : state.selected;
|
|
256
|
-
return createVNode("td",
|
|
256
|
+
return createVNode("td", mergeJsxProps({ "key": iso }, mergeAttrs({ sx: [
|
|
257
257
|
calendarStyles.cell,
|
|
258
258
|
state.inRange && calendarStyles.inRange,
|
|
259
259
|
state.rangeStart && calendarStyles.rangeStart,
|
|
@@ -320,14 +320,14 @@ var CalendarView = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
320
320
|
firstDayOfWeek: locale.week.firstDayOfWeek,
|
|
321
321
|
format: "long"
|
|
322
322
|
});
|
|
323
|
-
return createVNode("table", gridAttrs(title(month)), [createVNode("thead", { "aria-hidden": "true" }, [createVNode("tr", null, [showWeekNumbers.value && createVNode("th", mergeAttrs({ sx: calendarStyles.weekNumber }, propsWeekNumber.value, { scope: "col" }), [lang.calendarWeek]), names.map((name, index) => createVNode("th",
|
|
323
|
+
return createVNode("table", gridAttrs(title(month)), [createVNode("thead", { "aria-hidden": "true" }, [createVNode("tr", null, [showWeekNumbers.value && createVNode("th", mergeAttrs({ sx: calendarStyles.weekNumber }, propsWeekNumber.value, { scope: "col" }), [lang.calendarWeek]), names.map((name, index) => createVNode("th", mergeJsxProps({ "key": index }, mergeAttrs({
|
|
324
324
|
sx: calendarStyles.weekday,
|
|
325
325
|
title: longNames[index]
|
|
326
326
|
}, propsWeekday.value, { scope: "col" })), [name]))])]), createVNode("tbody", null, [weeks.map((week) => createVNode("tr", { "key": week[0].toString() }, [showWeekNumbers.value && createVNode("th", mergeAttrs({ sx: calendarStyles.weekNumber }, propsWeekNumber.value, {
|
|
327
327
|
"aria-label": lang.calendarWeekNumber(weekOfYear(week[0], locale.week)),
|
|
328
328
|
scope: "row"
|
|
329
329
|
}), [weekOfYear(week[0], locale.week)]), week.map((date) => {
|
|
330
|
-
if (date.month !== month.month && !single) return createVNode("td",
|
|
330
|
+
if (date.month !== month.month && !single) return createVNode("td", mergeJsxProps({ "key": date.toString() }, css.attrs(calendarStyles.cell)), null);
|
|
331
331
|
return cell(date, month, format.date(date, { dateStyle: "full" }), children.value ? children.value(locale.toIso(date), calendar.value.cell(date, month)) : locale.dayNumber(date), children.value ? "custom" : "day");
|
|
332
332
|
})]))])]);
|
|
333
333
|
}
|
|
@@ -363,7 +363,7 @@ var CalendarView = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
363
363
|
onClick: () => calendar.value.turnPage(1)
|
|
364
364
|
}), null);
|
|
365
365
|
const spacer = createVNode("span", css.attrs(calendarStyles.spacer), null);
|
|
366
|
-
return createVNode("div",
|
|
366
|
+
return createVNode("div", mergeJsxProps(mergeAttrs({ sx: [calendarStyles.root, size.value && fontSizeStyles[size.value]] }, rest, {
|
|
367
367
|
ref: root,
|
|
368
368
|
role: "group"
|
|
369
369
|
}), {
|
|
@@ -372,7 +372,7 @@ var CalendarView = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
372
372
|
}), [
|
|
373
373
|
createVNode("div", mergeAttrs({ sx: calendarStyles.months }, propsMonths.value), [months.map((month, index) => {
|
|
374
374
|
const label = title(month);
|
|
375
|
-
return createVNode("div",
|
|
375
|
+
return createVNode("div", mergeJsxProps({ "key": month.toString() }, css.attrs(calendarStyles.month)), [createVNode("div", mergeAttrs({ sx: calendarStyles.header }, propsHeader.value), [
|
|
376
376
|
index === 0 ? previous : spacer,
|
|
377
377
|
coarser && !disabled.value ? createVNode("button", mergeAttrs({ sx: [
|
|
378
378
|
buttonBaseStyles.root,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarView.js","names":["_isVNode","_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/date/CalendarView.tsx"],"sourcesContent":["/**\n * 日历的界面(WAI-ARIA 的日期网格):页头(上一页、标题、下一页)、并排的月份网格、月份视图与年份视图、页脚。\n * 状态由调用方的 useCalendarState 给(同 ListboxView 与 useListState 的分工):Calendar、RangeCalendar、各种日期选择器共用。\n *\n * const calendar = useCalendarState({ … });\n * <CalendarView calendar={calendar} showWeekNumbers>{(date, cell) => …}</CalendarView>\n *\n * - 每个月一张 table role=\"grid\",日期格是 td role=\"gridcell\"(aria-selected)里的按钮;焦点日期那一格 tabindex=0,\n * 键盘移动后焦点跟过去(handleCalendarKeydown);读屏念的完整日期(今天、星期)由 Intl 生成;\n * - 标题按钮切到月份视图、再切到年份视图(不比选择的粒度更细);翻页时用 aria-live 播报新的月份;\n * - 并排几个月时只显示本月的日期(补齐的上下月留空,不重复出现);只有一个月时补齐的日期变淡、可以点。\n *\n * 部件:Root、Header、Previous、Next(IconButton)、Heading(标题按钮)、Months(并排的月份)、Grid(table)、\n * Weekday(星期表头)、WeekNumber(周数)、Cell(td)、CellButton(日期 / 月份 / 年份按钮)、Footer。\n */\nimport { ChevronLeft, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, type VNodeChild } from 'vue';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { VisuallyHidden, visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { useFormat } from '../config/lang/format';\nimport {\n monthGrid,\n monthsOfYear,\n weekdayNames,\n weekOfYear,\n yearsOfDecade,\n} from '../utils/data/date';\nimport { isRtl } from '../utils/dom/direction';\nimport { hasContent, dataAttrs, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { interactionTransitions } from '../utils/style/transitions';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport {\n handleCalendarKeydown,\n type CalendarCellState,\n type CalendarState,\n} from './calendar-state';\nimport { useDateLocale } from './date-locale';\nimport { useLang } from '../config/context';\nimport type { CalendarDate } from '@internationalized/date';\nimport { t } from '../config/theme/tokens';\n\n/** 角色由组件管理 */\nexport type CalendarViewManaged = 'role';\n\n/** 按项给的部件属性:固定的对象,或按这一格的日期(ISO)与状态返回 */\nexport type CalendarItemProps<P> = P | ((date: string, cell: CalendarCellState) => P);\n\n/** 日历界面的外观与内容选项:Calendar、RangeCalendar、日期选择器原样转交 */\nexport interface CalendarViewOptions {\n /** 字号档位,格子随之缩放;不写时继承上下文字号 */\n size?: TextSize;\n /** 在每行前显示一年里的第几周 */\n showWeekNumbers?: boolean;\n /** 总是 6 行(翻页时高度不跳),默认 true */\n fixedWeeks?: boolean;\n /** 不可用:不能翻页、不能选 */\n disabled?: boolean;\n /**\n * 自定义日期格的内容(价格、标记点):拿到日期(ISO)与这一格的状态;不写时是日期数字。\n * 读屏先念完整日期再念这里的文字:日期数字这类重复的部分可以加 aria-hidden\n */\n children?: (date: string, cell: CalendarCellState) => VNodeChild;\n /** 页脚:今天、清除这类按钮 */\n footer?: VNodeChild;\n /** 页头的部件属性 */\n propsHeader?: PartProps<'div'>;\n /** 上一页按钮的部件属性 */\n propsPrevious?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 下一页按钮的部件属性 */\n propsNext?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 标题按钮的部件属性 */\n propsHeading?: PartProps<'button', 'type' | 'aria-label'>;\n /** 并排月份那一层的部件属性 */\n propsMonths?: PartProps<'div'>;\n /** 每张网格(table)的部件属性 */\n propsGrid?: PartProps<'table', 'role' | 'aria-label' | 'aria-multiselectable'>;\n /** 星期表头的部件属性 */\n propsWeekday?: PartProps<'th', 'scope'>;\n /** 周数的部件属性 */\n propsWeekNumber?: PartProps<'th', 'scope' | 'aria-label'>;\n /** 每格(td)的部件属性 */\n propsCell?: CalendarItemProps<PartProps<'td', 'role' | 'aria-selected' | 'aria-disabled'>>;\n /** 每格里按钮的部件属性 */\n propsCellButton?: CalendarItemProps<\n PartProps<'button', 'type' | 'tabindex' | 'disabled' | 'aria-label' | 'aria-disabled'>\n >;\n /** 页脚的部件属性 */\n propsFooter?: PartProps<'div'>;\n}\n\n/** 未声明的属性落到根元素上(aria-label 等) */\nexport interface CalendarViewProps\n extends PartProps<'div', CalendarViewManaged>, CalendarViewOptions {\n /** 日历状态(useCalendarState) */\n calendar: CalendarState;\n /** 一周的第一天(0 表示周日),与 useCalendarState 的 week 一致;不写时取语言配置 */\n firstDayOfWeek?: number;\n}\n\n/** CalendarView 的样式:root、months、month、header、heading、grid、weekday、cell、button 等 */\nexport const calendarStyles = css.create({\n root: {\n display: 'inline-flex',\n flexDirection: 'column',\n gap: '_sm',\n color: '_text',\n lineHeight: '_normal',\n userSelect: 'none',\n },\n months: { display: 'flex', flexWrap: 'wrap', alignItems: 'flex-start', gap: '_xl' },\n month: { display: 'flex', flexDirection: 'column', gap: '_xs' },\n header: {\n display: 'grid',\n gridTemplateColumns: `max(${t.sizes.control}, ${t.sizes.minTarget}) 1fr max(${t.sizes.control}, ${t.sizes.minTarget})`,\n alignItems: 'center',\n gap: '_xs',\n },\n // 占住按钮的位置:并排几个月时中间的月没有翻页按钮,标题仍居中\n spacer: { width: `max(${t.sizes.control}, ${t.sizes.minTarget})` },\n heading: {\n display: 'inline-flex',\n alignItems: 'center',\n justifySelf: 'center',\n minHeight: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n paddingInline: '_sm',\n borderRadius: '_md',\n fontWeight: '_semibold',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n headingStatic: {\n cursor: 'default',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n grid: { borderCollapse: 'collapse', borderSpacing: 0 },\n // 月份、年份视图:一行 3 格,与日期网格同宽\n periodGrid: { width: `calc(7 * max(2.25em, ${t.sizes.minTarget}))` },\n weekday: {\n paddingBlock: '_xs',\n paddingInline: 0,\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n weekNumber: {\n paddingInlineEnd: '_xs',\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n cell: { padding: 0, textAlign: 'center' },\n // 区间的底色画在 td 上,相邻的格连成一条;两端与每行的首尾是圆的\n inRange: {\n backgroundColor: '_accentSoft',\n borderStartStartRadius: { default: 0, ':first-of-type': '_md' },\n borderEndStartRadius: { default: 0, ':first-of-type': '_md' },\n borderStartEndRadius: { default: 0, ':last-of-type': '_md' },\n borderEndEndRadius: { default: 0, ':last-of-type': '_md' },\n },\n rangeStart: { borderStartStartRadius: '_md', borderEndStartRadius: '_md' },\n rangeEnd: { borderStartEndRadius: '_md', borderEndEndRadius: '_md' },\n button: {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: `max(2.25em, ${t.sizes.minTarget})`,\n height: `max(2.25em, ${t.sizes.minTarget})`,\n borderRadius: '_md',\n fontVariantNumeric: 'tabular-nums',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n periodButton: { width: '_full', height: `max(3em, ${t.sizes.minTarget})` },\n outside: { color: '_textMuted' },\n today: {\n fontWeight: '_semibold',\n boxShadow: `inset 0 0 0 ${t.borderWidths.xs} ${t.colors.accentBorder}`,\n },\n selected: {\n backgroundColor: { default: '_accent', ':hover': '_accentHover' },\n color: '_accentContrast',\n boxShadow: 'none',\n },\n // 区间中间的格:按钮透明,底色是 td 的那一条\n middle: {\n backgroundColor: { default: 'transparent', ':hover': '_accentSoftHover' },\n color: '_accentText',\n },\n unavailable: { color: '_textMuted', textDecorationLine: 'line-through' },\n disabled: {\n opacity: '_disabled',\n cursor: 'not-allowed',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n footer: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: '_sm' },\n});\n\n/** 网格行列:月份、年份视图一行 3 格 */\nconst chunk = <T,>(items: readonly T[], size: number) =>\n Array.from({ length: Math.ceil(items.length / size) }, (_, row) =>\n items.slice(row * size, row * size + size),\n );\n\nconst resolve = <P,>(\n props: CalendarItemProps<P> | undefined,\n date: string,\n cell: CalendarCellState,\n) =>\n typeof props === 'function'\n ? (props as (date: string, cell: CalendarCellState) => P)(date, cell)\n : props;\n\n/** 日历的界面:页头、月份网格(或月份、年份视图)、页脚 */\nexport const CalendarView = _component(\n ({\n calendar,\n firstDayOfWeek,\n size,\n showWeekNumbers = false,\n fixedWeeks = true,\n disabled = false,\n children,\n footer,\n propsHeader,\n propsPrevious,\n propsNext,\n propsHeading,\n propsMonths,\n propsGrid,\n propsWeekday,\n propsWeekNumber,\n propsCell,\n propsCellButton,\n propsFooter,\n ...rest\n }: CalendarViewProps) => {\n const format = useFormat();\n const locale = useDateLocale(() => ({ firstDayOfWeek }));\n const lang = useLang();\n const id = useId();\n const hintId = `${id}-hint`;\n let root = _state.raw<HTMLElement | null>(null);\n\n /** 键盘移动后把焦点交给新的焦点格(翻页、换视图后它是新渲染的) */\n function onKeydown(event: KeyboardEvent) {\n if (disabled || !root) return;\n if (!handleCalendarKeydown(calendar, event, isRtl(root))) return;\n event.preventDefault();\n void nextTick(() => root?.querySelector<HTMLElement>('[data-focused]')?.focus());\n }\n\n const title = (date: CalendarDate) => {\n if (calendar.view === 'day') return format.date(date, { year: 'numeric', month: 'long' });\n if (calendar.view === 'month') return format.date(date, { year: 'numeric' });\n const end = date.add({ years: 9 });\n return `${format.date(date, { year: 'numeric' })} – ${format.date(end, { year: 'numeric' })}`;\n };\n\n /**\n * 一格:td + 按钮;label 是读屏念的完整日期,content 是格子里显示的。\n * 读屏名称来自按钮里的文字而不是 aria-label:自定义内容(如房价)跟在完整日期后面一起念,\n * 名称总包含看得见的文字(中文日期里“20”不是单独的词,写成 aria-label 时对不上);\n * 默认内容只是日期数字,不重复念。kind 为 period 时是月份、年份格\n */\n function cell(\n date: CalendarDate,\n month: CalendarDate | undefined,\n label: string,\n content: VNodeChild,\n kind: 'day' | 'custom' | 'period' = 'day',\n ) {\n const period = kind === 'period';\n const state = calendar.cell(date, month);\n const iso = locale.toIso(date);\n const off = disabled || state.disabled;\n const range = calendar.mode === 'range';\n const ends = range && (state.rangeStart || state.rangeEnd);\n const marked = range ? ends : state.selected;\n return (\n <td\n key={iso}\n {...mergeAttrs<'td'>(\n {\n sx: [\n calendarStyles.cell,\n state.inRange && calendarStyles.inRange,\n state.rangeStart && calendarStyles.rangeStart,\n state.rangeEnd && calendarStyles.rangeEnd,\n ],\n },\n resolve(propsCell, iso, state),\n {\n role: 'gridcell',\n 'aria-selected': state.selected,\n 'aria-disabled': off || undefined,\n ...dataAttrs({ 'data-in-range': state.inRange || undefined }),\n },\n )}\n >\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.button,\n period && calendarStyles.periodButton,\n focusRingStyles.tight,\n state.outside && calendarStyles.outside,\n state.today && calendarStyles.today,\n state.unavailable && calendarStyles.unavailable,\n state.inRange && !ends && calendarStyles.middle,\n marked && calendarStyles.selected,\n off && calendarStyles.disabled,\n ],\n 'aria-describedby': calendar.anchor ? hintId : undefined,\n },\n resolve(propsCellButton, iso, state),\n {\n type: 'button',\n tabindex: state.focused && !state.outside ? 0 : -1,\n 'aria-disabled': off || undefined,\n onClick: () => {\n if (!off) calendar.activate(date);\n },\n // 点击、程序聚焦到别的格子时,键盘从这一格接着走\n onFocus: () => {\n if (!state.focused) calendar.focus(date);\n },\n onPointerenter: () => calendar.hover(date),\n // 写在受管层而不是 JSX 上:元素上只有一处展开,不用再经 Vue 的 mergeProps(每页几百格)\n ...dataAttrs({\n 'data-date': iso,\n 'data-focused': (state.focused && !state.outside) || undefined,\n 'data-selected': state.selected || undefined,\n 'data-today': state.today || undefined,\n 'data-outside': state.outside || undefined,\n 'data-unavailable': state.unavailable || undefined,\n 'data-disabled': off || undefined,\n }),\n },\n )}\n >\n {/* 每格一个:直接用样式,不多建几百个组件实例 */}\n <span {...css.attrs(visuallyHiddenStyles.hidden)}>\n {state.today ? lang.calendarToday(label) : label}\n </span>\n {kind === 'custom' ? content : <span aria-hidden=\"true\">{content}</span>}\n </button>\n </td>\n );\n }\n\n const gridAttrs = (label: string) =>\n mergeAttrs<'table'>(\n {\n sx: [calendarStyles.grid, calendar.view !== 'day' && calendarStyles.periodGrid],\n },\n propsGrid,\n {\n 'aria-label': label,\n role: 'grid',\n 'aria-multiselectable': calendar.mode !== 'single' || undefined,\n onKeydown,\n onPointerleave: () => calendar.hover(null),\n },\n );\n\n function dayGrid(month: CalendarDate, single: boolean) {\n const weeks = monthGrid(month, { ...locale.week, fixedWeeks });\n const names = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'narrow',\n });\n const longNames = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'long',\n });\n return (\n <table {...gridAttrs(title(month))}>\n <thead aria-hidden=\"true\">\n <tr>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n scope: 'col',\n })}\n >\n {lang.calendarWeek}\n </th>\n )}\n {names.map((name, index) => (\n <th\n key={index}\n {...mergeAttrs<'th'>(\n { sx: calendarStyles.weekday, title: longNames[index] },\n propsWeekday,\n {\n scope: 'col',\n },\n )}\n >\n {name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toString()}>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n 'aria-label': lang.calendarWeekNumber(weekOfYear(week[0]!, locale.week)),\n scope: 'row',\n })}\n >\n {weekOfYear(week[0]!, locale.week)}\n </th>\n )}\n {week.map((date) => {\n const outside = date.month !== month.month;\n // 并排几个月时补齐的日期留空:同一天不在两张网格里重复出现\n if (outside && !single)\n return <td key={date.toString()} {...css.attrs(calendarStyles.cell)} />;\n return cell(\n date,\n month,\n format.date(date, { dateStyle: 'full' }),\n children\n ? children(locale.toIso(date), calendar.cell(date, month))\n : locale.dayNumber(date),\n children ? 'custom' : 'day',\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n function periodGrid() {\n const page = calendar.page;\n const month = calendar.view === 'month';\n const items = month ? monthsOfYear(page) : yearsOfDecade(page);\n return (\n <table {...gridAttrs(title(page))}>\n <tbody>\n {chunk(items, 3).map((row) => (\n <tr key={row[0]!.toString()}>\n {row.map((date) =>\n cell(\n date,\n undefined,\n month\n ? format.date(date, { year: 'numeric', month: 'long' })\n : format.date(date, { year: 'numeric' }),\n month\n ? format.date(date, { month: 'short' })\n : format.date(date, { year: 'numeric' }),\n 'period',\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n return () => {\n const view = calendar.view;\n const months = calendar.months;\n const coarser = view === 'day' ? 'month' : view === 'month' ? 'year' : undefined;\n const [previousLabel, nextLabel] =\n view === 'day'\n ? [lang.calendarPreviousMonth, lang.calendarNextMonth]\n : view === 'month'\n ? [lang.calendarPreviousYear, lang.calendarNextYear]\n : [lang.calendarPreviousDecade, lang.calendarNextDecade];\n const previous = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronLeft, 'aria-label': previousLabel, propsIcon: { flipInRtl: true } },\n propsPrevious,\n {\n disabled: disabled || !calendar.canTurnPage(-1),\n onClick: () => calendar.turnPage(-1),\n },\n )}\n />\n );\n const next = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronRight, 'aria-label': nextLabel, propsIcon: { flipInRtl: true } },\n propsNext,\n { disabled: disabled || !calendar.canTurnPage(1), onClick: () => calendar.turnPage(1) },\n )}\n />\n );\n const spacer = <span {...css.attrs(calendarStyles.spacer)} />;\n return (\n <div\n {...mergeAttrs<'div'>({ sx: [calendarStyles.root, size && fontSizeStyles[size]] }, rest, {\n ref: _toRef(root),\n role: 'group',\n })}\n data-view={view}\n data-disabled={disabled || undefined}\n >\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.months }, propsMonths)}>\n {months.map((month, index) => {\n const label = title(month);\n return (\n <div key={month.toString()} {...css.attrs(calendarStyles.month)}>\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.header }, propsHeader)}>\n {index === 0 ? previous : spacer}\n {coarser && !disabled ? (\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.heading,\n focusRingStyles.visible,\n ],\n },\n propsHeading,\n {\n 'aria-label':\n coarser === 'month'\n ? lang.calendarChooseMonth(label)\n : lang.calendarChooseYear(label),\n type: 'button',\n onClick: () => calendar.setView(coarser),\n },\n )}\n >\n {label}\n </button>\n ) : (\n // 已经是最粗的视图(或不可用):标题只是文字\n <span {...css.attrs(calendarStyles.heading, calendarStyles.headingStatic)}>\n {label}\n </span>\n )}\n {index === months.length - 1 ? next : spacer}\n </div>\n {view === 'day' ? dayGrid(month, months.length === 1) : periodGrid()}\n </div>\n );\n })}\n </div>\n {/* 翻页、换视图时播报新的标题;不放在标题按钮上,免得聚焦按钮时重复念 */}\n <VisuallyHidden aria-live=\"polite\">{months.map(title).join(',')}</VisuallyHidden>\n {calendar.anchor && <VisuallyHidden id={hintId}>{lang.calendarPickEnd}</VisuallyHidden>}\n {hasContent(footer) && (\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.footer }, propsFooter)}>{footer}</div>\n )}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CalendarView.js","names":["_isVNode","_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/date/CalendarView.tsx"],"sourcesContent":["/**\n * 日历的界面(WAI-ARIA 的日期网格):页头(上一页、标题、下一页)、并排的月份网格、月份视图与年份视图、页脚。\n * 状态由调用方的 useCalendarState 给(同 ListboxView 与 useListState 的分工):Calendar、RangeCalendar、各种日期选择器共用。\n *\n * const calendar = useCalendarState({ … });\n * <CalendarView calendar={calendar} showWeekNumbers>{(date, cell) => …}</CalendarView>\n *\n * - 每个月一张 table role=\"grid\",日期格是 td role=\"gridcell\"(aria-selected)里的按钮;焦点日期那一格 tabindex=0,\n * 键盘移动后焦点跟过去(handleCalendarKeydown);读屏念的完整日期(今天、星期)由 Intl 生成;\n * - 标题按钮切到月份视图、再切到年份视图(不比选择的粒度更细);翻页时用 aria-live 播报新的月份;\n * - 并排几个月时只显示本月的日期(补齐的上下月留空,不重复出现);只有一个月时补齐的日期变淡、可以点。\n *\n * 部件:Root、Header、Previous、Next(IconButton)、Heading(标题按钮)、Months(并排的月份)、Grid(table)、\n * Weekday(星期表头)、WeekNumber(周数)、Cell(td)、CellButton(日期 / 月份 / 年份按钮)、Footer。\n */\nimport { ChevronLeft, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, type VNodeChild } from 'vue';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { VisuallyHidden, visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { useFormat } from '../config/lang/format';\nimport {\n monthGrid,\n monthsOfYear,\n weekdayNames,\n weekOfYear,\n yearsOfDecade,\n} from '../utils/data/date';\nimport { isRtl } from '../utils/dom/direction';\nimport { hasContent, dataAttrs, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { interactionTransitions } from '../utils/style/transitions';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport {\n handleCalendarKeydown,\n type CalendarCellState,\n type CalendarState,\n} from './calendar-state';\nimport { useDateLocale } from './date-locale';\nimport { useLang } from '../config/context';\nimport type { CalendarDate } from '@internationalized/date';\nimport { t } from '../config/theme/tokens';\n\n/** 角色由组件管理 */\nexport type CalendarViewManaged = 'role';\n\n/** 按项给的部件属性:固定的对象,或按这一格的日期(ISO)与状态返回 */\nexport type CalendarItemProps<P> = P | ((date: string, cell: CalendarCellState) => P);\n\n/** 日历界面的外观与内容选项:Calendar、RangeCalendar、日期选择器原样转交 */\nexport interface CalendarViewOptions {\n /** 字号档位,格子随之缩放;不写时继承上下文字号 */\n size?: TextSize;\n /** 在每行前显示一年里的第几周 */\n showWeekNumbers?: boolean;\n /** 总是 6 行(翻页时高度不跳),默认 true */\n fixedWeeks?: boolean;\n /** 不可用:不能翻页、不能选 */\n disabled?: boolean;\n /**\n * 自定义日期格的内容(价格、标记点):拿到日期(ISO)与这一格的状态;不写时是日期数字。\n * 读屏先念完整日期再念这里的文字:日期数字这类重复的部分可以加 aria-hidden\n */\n children?: (date: string, cell: CalendarCellState) => VNodeChild;\n /** 页脚:今天、清除这类按钮 */\n footer?: VNodeChild;\n /** 页头的部件属性 */\n propsHeader?: PartProps<'div'>;\n /** 上一页按钮的部件属性 */\n propsPrevious?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 下一页按钮的部件属性 */\n propsNext?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 标题按钮的部件属性 */\n propsHeading?: PartProps<'button', 'type' | 'aria-label'>;\n /** 并排月份那一层的部件属性 */\n propsMonths?: PartProps<'div'>;\n /** 每张网格(table)的部件属性 */\n propsGrid?: PartProps<'table', 'role' | 'aria-label' | 'aria-multiselectable'>;\n /** 星期表头的部件属性 */\n propsWeekday?: PartProps<'th', 'scope'>;\n /** 周数的部件属性 */\n propsWeekNumber?: PartProps<'th', 'scope' | 'aria-label'>;\n /** 每格(td)的部件属性 */\n propsCell?: CalendarItemProps<PartProps<'td', 'role' | 'aria-selected' | 'aria-disabled'>>;\n /** 每格里按钮的部件属性 */\n propsCellButton?: CalendarItemProps<\n PartProps<'button', 'type' | 'tabindex' | 'disabled' | 'aria-label' | 'aria-disabled'>\n >;\n /** 页脚的部件属性 */\n propsFooter?: PartProps<'div'>;\n}\n\n/** 未声明的属性落到根元素上(aria-label 等) */\nexport interface CalendarViewProps\n extends PartProps<'div', CalendarViewManaged>, CalendarViewOptions {\n /** 日历状态(useCalendarState) */\n calendar: CalendarState;\n /** 一周的第一天(0 表示周日),与 useCalendarState 的 week 一致;不写时取语言配置 */\n firstDayOfWeek?: number;\n}\n\n/** CalendarView 的样式:root、months、month、header、heading、grid、weekday、cell、button 等 */\nexport const calendarStyles = css.create({\n root: {\n display: 'inline-flex',\n flexDirection: 'column',\n gap: '_sm',\n color: '_text',\n lineHeight: '_normal',\n userSelect: 'none',\n },\n months: { display: 'flex', flexWrap: 'wrap', alignItems: 'flex-start', gap: '_xl' },\n month: { display: 'flex', flexDirection: 'column', gap: '_xs' },\n header: {\n display: 'grid',\n gridTemplateColumns: `max(${t.sizes.control}, ${t.sizes.minTarget}) 1fr max(${t.sizes.control}, ${t.sizes.minTarget})`,\n alignItems: 'center',\n gap: '_xs',\n },\n // 占住按钮的位置:并排几个月时中间的月没有翻页按钮,标题仍居中\n spacer: { width: `max(${t.sizes.control}, ${t.sizes.minTarget})` },\n heading: {\n display: 'inline-flex',\n alignItems: 'center',\n justifySelf: 'center',\n minHeight: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n paddingInline: '_sm',\n borderRadius: '_md',\n fontWeight: '_semibold',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n headingStatic: {\n cursor: 'default',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n grid: { borderCollapse: 'collapse', borderSpacing: 0 },\n // 月份、年份视图:一行 3 格,与日期网格同宽\n periodGrid: { width: `calc(7 * max(2.25em, ${t.sizes.minTarget}))` },\n weekday: {\n paddingBlock: '_xs',\n paddingInline: 0,\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n weekNumber: {\n paddingInlineEnd: '_xs',\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n cell: { padding: 0, textAlign: 'center' },\n // 区间的底色画在 td 上,相邻的格连成一条;两端与每行的首尾是圆的\n inRange: {\n backgroundColor: '_accentSoft',\n borderStartStartRadius: { default: 0, ':first-of-type': '_md' },\n borderEndStartRadius: { default: 0, ':first-of-type': '_md' },\n borderStartEndRadius: { default: 0, ':last-of-type': '_md' },\n borderEndEndRadius: { default: 0, ':last-of-type': '_md' },\n },\n rangeStart: { borderStartStartRadius: '_md', borderEndStartRadius: '_md' },\n rangeEnd: { borderStartEndRadius: '_md', borderEndEndRadius: '_md' },\n button: {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: `max(2.25em, ${t.sizes.minTarget})`,\n height: `max(2.25em, ${t.sizes.minTarget})`,\n borderRadius: '_md',\n fontVariantNumeric: 'tabular-nums',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n periodButton: { width: '_full', height: `max(3em, ${t.sizes.minTarget})` },\n outside: { color: '_textMuted' },\n today: {\n fontWeight: '_semibold',\n boxShadow: `inset 0 0 0 ${t.borderWidths.xs} ${t.colors.accentBorder}`,\n },\n selected: {\n backgroundColor: { default: '_accent', ':hover': '_accentHover' },\n color: '_accentContrast',\n boxShadow: 'none',\n },\n // 区间中间的格:按钮透明,底色是 td 的那一条\n middle: {\n backgroundColor: { default: 'transparent', ':hover': '_accentSoftHover' },\n color: '_accentText',\n },\n unavailable: { color: '_textMuted', textDecorationLine: 'line-through' },\n disabled: {\n opacity: '_disabled',\n cursor: 'not-allowed',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n footer: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: '_sm' },\n});\n\n/** 网格行列:月份、年份视图一行 3 格 */\nconst chunk = <T,>(items: readonly T[], size: number) =>\n Array.from({ length: Math.ceil(items.length / size) }, (_, row) =>\n items.slice(row * size, row * size + size),\n );\n\nconst resolve = <P,>(\n props: CalendarItemProps<P> | undefined,\n date: string,\n cell: CalendarCellState,\n) =>\n typeof props === 'function'\n ? (props as (date: string, cell: CalendarCellState) => P)(date, cell)\n : props;\n\n/** 日历的界面:页头、月份网格(或月份、年份视图)、页脚 */\nexport const CalendarView = _component(\n ({\n calendar,\n firstDayOfWeek,\n size,\n showWeekNumbers = false,\n fixedWeeks = true,\n disabled = false,\n children,\n footer,\n propsHeader,\n propsPrevious,\n propsNext,\n propsHeading,\n propsMonths,\n propsGrid,\n propsWeekday,\n propsWeekNumber,\n propsCell,\n propsCellButton,\n propsFooter,\n ...rest\n }: CalendarViewProps) => {\n const format = useFormat();\n const locale = useDateLocale(() => ({ firstDayOfWeek }));\n const lang = useLang();\n const id = useId();\n const hintId = `${id}-hint`;\n let root = _state.raw<HTMLElement | null>(null);\n\n /** 键盘移动后把焦点交给新的焦点格(翻页、换视图后它是新渲染的) */\n function onKeydown(event: KeyboardEvent) {\n if (disabled || !root) return;\n if (!handleCalendarKeydown(calendar, event, isRtl(root))) return;\n event.preventDefault();\n void nextTick(() => root?.querySelector<HTMLElement>('[data-focused]')?.focus());\n }\n\n const title = (date: CalendarDate) => {\n if (calendar.view === 'day') return format.date(date, { year: 'numeric', month: 'long' });\n if (calendar.view === 'month') return format.date(date, { year: 'numeric' });\n const end = date.add({ years: 9 });\n return `${format.date(date, { year: 'numeric' })} – ${format.date(end, { year: 'numeric' })}`;\n };\n\n /**\n * 一格:td + 按钮;label 是读屏念的完整日期,content 是格子里显示的。\n * 读屏名称来自按钮里的文字而不是 aria-label:自定义内容(如房价)跟在完整日期后面一起念,\n * 名称总包含看得见的文字(中文日期里“20”不是单独的词,写成 aria-label 时对不上);\n * 默认内容只是日期数字,不重复念。kind 为 period 时是月份、年份格\n */\n function cell(\n date: CalendarDate,\n month: CalendarDate | undefined,\n label: string,\n content: VNodeChild,\n kind: 'day' | 'custom' | 'period' = 'day',\n ) {\n const period = kind === 'period';\n const state = calendar.cell(date, month);\n const iso = locale.toIso(date);\n const off = disabled || state.disabled;\n const range = calendar.mode === 'range';\n const ends = range && (state.rangeStart || state.rangeEnd);\n const marked = range ? ends : state.selected;\n return (\n <td\n key={iso}\n {...mergeAttrs<'td'>(\n {\n sx: [\n calendarStyles.cell,\n state.inRange && calendarStyles.inRange,\n state.rangeStart && calendarStyles.rangeStart,\n state.rangeEnd && calendarStyles.rangeEnd,\n ],\n },\n resolve(propsCell, iso, state),\n {\n role: 'gridcell',\n 'aria-selected': state.selected,\n 'aria-disabled': off || undefined,\n ...dataAttrs({ 'data-in-range': state.inRange || undefined }),\n },\n )}\n >\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.button,\n period && calendarStyles.periodButton,\n focusRingStyles.tight,\n state.outside && calendarStyles.outside,\n state.today && calendarStyles.today,\n state.unavailable && calendarStyles.unavailable,\n state.inRange && !ends && calendarStyles.middle,\n marked && calendarStyles.selected,\n off && calendarStyles.disabled,\n ],\n 'aria-describedby': calendar.anchor ? hintId : undefined,\n },\n resolve(propsCellButton, iso, state),\n {\n type: 'button',\n tabindex: state.focused && !state.outside ? 0 : -1,\n 'aria-disabled': off || undefined,\n onClick: () => {\n if (!off) calendar.activate(date);\n },\n // 点击、程序聚焦到别的格子时,键盘从这一格接着走\n onFocus: () => {\n if (!state.focused) calendar.focus(date);\n },\n onPointerenter: () => calendar.hover(date),\n // 写在受管层而不是 JSX 上:元素上只有一处展开,不用再经 Vue 的 mergeProps(每页几百格)\n ...dataAttrs({\n 'data-date': iso,\n 'data-focused': (state.focused && !state.outside) || undefined,\n 'data-selected': state.selected || undefined,\n 'data-today': state.today || undefined,\n 'data-outside': state.outside || undefined,\n 'data-unavailable': state.unavailable || undefined,\n 'data-disabled': off || undefined,\n }),\n },\n )}\n >\n {/* 每格一个:直接用样式,不多建几百个组件实例 */}\n <span {...css.attrs(visuallyHiddenStyles.hidden)}>\n {state.today ? lang.calendarToday(label) : label}\n </span>\n {kind === 'custom' ? content : <span aria-hidden=\"true\">{content}</span>}\n </button>\n </td>\n );\n }\n\n const gridAttrs = (label: string) =>\n mergeAttrs<'table'>(\n {\n sx: [calendarStyles.grid, calendar.view !== 'day' && calendarStyles.periodGrid],\n },\n propsGrid,\n {\n 'aria-label': label,\n role: 'grid',\n 'aria-multiselectable': calendar.mode !== 'single' || undefined,\n onKeydown,\n onPointerleave: () => calendar.hover(null),\n },\n );\n\n function dayGrid(month: CalendarDate, single: boolean) {\n const weeks = monthGrid(month, { ...locale.week, fixedWeeks });\n const names = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'narrow',\n });\n const longNames = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'long',\n });\n return (\n <table {...gridAttrs(title(month))}>\n <thead aria-hidden=\"true\">\n <tr>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n scope: 'col',\n })}\n >\n {lang.calendarWeek}\n </th>\n )}\n {names.map((name, index) => (\n <th\n key={index}\n {...mergeAttrs<'th'>(\n { sx: calendarStyles.weekday, title: longNames[index] },\n propsWeekday,\n {\n scope: 'col',\n },\n )}\n >\n {name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toString()}>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n 'aria-label': lang.calendarWeekNumber(weekOfYear(week[0]!, locale.week)),\n scope: 'row',\n })}\n >\n {weekOfYear(week[0]!, locale.week)}\n </th>\n )}\n {week.map((date) => {\n const outside = date.month !== month.month;\n // 并排几个月时补齐的日期留空:同一天不在两张网格里重复出现\n if (outside && !single)\n return <td key={date.toString()} {...css.attrs(calendarStyles.cell)} />;\n return cell(\n date,\n month,\n format.date(date, { dateStyle: 'full' }),\n children\n ? children(locale.toIso(date), calendar.cell(date, month))\n : locale.dayNumber(date),\n children ? 'custom' : 'day',\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n function periodGrid() {\n const page = calendar.page;\n const month = calendar.view === 'month';\n const items = month ? monthsOfYear(page) : yearsOfDecade(page);\n return (\n <table {...gridAttrs(title(page))}>\n <tbody>\n {chunk(items, 3).map((row) => (\n <tr key={row[0]!.toString()}>\n {row.map((date) =>\n cell(\n date,\n undefined,\n month\n ? format.date(date, { year: 'numeric', month: 'long' })\n : format.date(date, { year: 'numeric' }),\n month\n ? format.date(date, { month: 'short' })\n : format.date(date, { year: 'numeric' }),\n 'period',\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n return () => {\n const view = calendar.view;\n const months = calendar.months;\n const coarser = view === 'day' ? 'month' : view === 'month' ? 'year' : undefined;\n const [previousLabel, nextLabel] =\n view === 'day'\n ? [lang.calendarPreviousMonth, lang.calendarNextMonth]\n : view === 'month'\n ? [lang.calendarPreviousYear, lang.calendarNextYear]\n : [lang.calendarPreviousDecade, lang.calendarNextDecade];\n const previous = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronLeft, 'aria-label': previousLabel, propsIcon: { flipInRtl: true } },\n propsPrevious,\n {\n disabled: disabled || !calendar.canTurnPage(-1),\n onClick: () => calendar.turnPage(-1),\n },\n )}\n />\n );\n const next = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronRight, 'aria-label': nextLabel, propsIcon: { flipInRtl: true } },\n propsNext,\n { disabled: disabled || !calendar.canTurnPage(1), onClick: () => calendar.turnPage(1) },\n )}\n />\n );\n const spacer = <span {...css.attrs(calendarStyles.spacer)} />;\n return (\n <div\n {...mergeAttrs<'div'>({ sx: [calendarStyles.root, size && fontSizeStyles[size]] }, rest, {\n ref: _toRef(root),\n role: 'group',\n })}\n data-view={view}\n data-disabled={disabled || undefined}\n >\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.months }, propsMonths)}>\n {months.map((month, index) => {\n const label = title(month);\n return (\n <div key={month.toString()} {...css.attrs(calendarStyles.month)}>\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.header }, propsHeader)}>\n {index === 0 ? previous : spacer}\n {coarser && !disabled ? (\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.heading,\n focusRingStyles.visible,\n ],\n },\n propsHeading,\n {\n 'aria-label':\n coarser === 'month'\n ? lang.calendarChooseMonth(label)\n : lang.calendarChooseYear(label),\n type: 'button',\n onClick: () => calendar.setView(coarser),\n },\n )}\n >\n {label}\n </button>\n ) : (\n // 已经是最粗的视图(或不可用):标题只是文字\n <span {...css.attrs(calendarStyles.heading, calendarStyles.headingStatic)}>\n {label}\n </span>\n )}\n {index === months.length - 1 ? next : spacer}\n </div>\n {view === 'day' ? dayGrid(month, months.length === 1) : periodGrid()}\n </div>\n );\n })}\n </div>\n {/* 翻页、换视图时播报新的标题;不放在标题按钮上,免得聚焦按钮时重复念 */}\n <VisuallyHidden aria-live=\"polite\">{months.map(title).join(',')}</VisuallyHidden>\n {calendar.anchor && <VisuallyHidden id={hintId}>{lang.calendarPickEnd}</VisuallyHidden>}\n {hasContent(footer) && (\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.footer }, propsFooter)}>{footer}</div>\n )}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
|
package/dist/date/DateField.js
CHANGED
|
@@ -2,8 +2,8 @@ import { compareDates, fullIsoDay, lastIsoDay, parseIsoDate, parseIsoDateTime, p
|
|
|
2
2
|
import { toDateLimits, useDateLocale } from "./date-locale.js";
|
|
3
3
|
import { segmentFields } from "./date-segments.js";
|
|
4
4
|
import { SegmentedField } from "./SegmentedField.js";
|
|
5
|
-
import { computed, createVNode
|
|
6
|
-
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
5
|
+
import { computed, createVNode } from "vue";
|
|
6
|
+
import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
7
7
|
import { toCalendar, toCalendarDateTime } from "@internationalized/date";
|
|
8
8
|
//#region src/date/DateField.tsx
|
|
9
9
|
/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */
|
|
@@ -99,7 +99,7 @@ var DateField = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
99
99
|
lastLike = value.value ?? lastLike;
|
|
100
100
|
value.value = next == null ? null : isoToValue(next, lastLike, granularity.value, valueType.value);
|
|
101
101
|
}
|
|
102
|
-
return () => createVNode(SegmentedField,
|
|
102
|
+
return () => createVNode(SegmentedField, mergeJsxProps(rest, {
|
|
103
103
|
"onUpdate:_value": write,
|
|
104
104
|
"_value": iso.value,
|
|
105
105
|
"fields": segmentFields(granularity.value),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateField.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/date/DateField.tsx"],"sourcesContent":["/**\n * 日期输入框:分段输入年、月、日(不带弹层),段的顺序按语言(zh-CN 年/月/日,en-US 月/日/年)。\n * 参考 React Aria DateField、原生 input type=\"date\"。要弹出日历用 DatePicker。\n *\n * <Field label=\"生日\"><DateField _value={birthday} max={today} /></Field>\n * <DateField granularity=\"minute\" _value={at} aria-label=\"开始时间\" /> // '2026-10-20T14:30'\n * <DateField granularity=\"month\" _value={month} aria-label=\"账期\" /> // '2026-10'\n *\n * 值是 ISO 字符串,形式随 granularity:year 'YYYY'、month 'YYYY-MM'、day 'YYYY-MM-DD',\n * hour / minute / second 是日期加时间 'YYYY-MM-DDTHH:mm[:ss]'(同原生 datetime-local);\n * 也可以是 DateValue,写回时保持同一种类型(ZonedDateTime 的时区、CalendarDateTime 没显示的时间不丢)。\n * 值在 min–max 之外、是不可选的日期或时刻(isTimeUnavailable)时显示出错(aria-invalid),值照样写回,由表单校验决定能不能提交。\n *\n * 键盘:数字逐段输入(满了自动跳段),↑↓ 加减,Page Up / Down 大步,Home / End 最小 / 最大,\n * Backspace 删一位(删空回到上一段),←→ 与 Tab 换段。部件见 SegmentedField。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport {\n toCalendar,\n toCalendarDateTime,\n type CalendarDate,\n type CalendarDateTime,\n type Time,\n} from '@internationalized/date';\nimport {\n compareDates,\n fullIsoDay,\n lastIsoDay,\n parseIsoDate,\n parseIsoDateTime,\n parseIsoTime,\n toIsoDate,\n toIsoDateTime,\n toIsoQuarter,\n toIsoTime,\n toIsoWeek,\n type DateLimits,\n type DateUnit,\n} from '../utils/data/date';\nimport {\n toDateLimits,\n useDateLocale,\n type DateInput,\n type DateLocale,\n type DateLimitProps,\n type DateValueTypes,\n} from './date-locale';\nimport { segmentFields, type DateFieldGranularity } from './date-segments';\nimport { SegmentedField, type SegmentedFieldOptions } from './SegmentedField';\n\n/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */\nexport interface DateFieldProps<V extends DateInput = string>\n extends SegmentedFieldOptions, DateLimitProps {\n /** 值:ISO 字符串(形式随 granularity)或 DateValue,写回时保持同一种类型;父级写 _value={x};没填全时 null */\n _value?: V | null;\n /** 精确到哪一段,默认 day;到 hour / minute / second 时是日期加时间 */\n granularity?: DateFieldGranularity;\n /** 值为空、推不出类型时写回哪一种,默认 iso(字符串);dateValue 写 CalendarDate(带时间时 CalendarDateTime) */\n valueType?: keyof DateValueTypes;\n /**\n * 带时间时不可选的时刻(午休、非营业时间):键入时显示出错。参数是 'HH:mm'、同一时刻的 Time 与那一天的 ISO 日期,\n * 周末与平日可以不一样:`(_, time, date) => time.hour < 9 || time.hour >= (isWeekend(…) ? 12 : 18)`\n */\n isTimeUnavailable?: (time: string, value: Time, date: string) => boolean;\n}\n\n/** 粒度 → 日历的粒度:年、月照搬,到日及以下都按日(选日期、比较范围) */\nexport const dateUnitOf = (granularity: DateFieldGranularity): DateUnit =>\n granularity === 'year' || granularity === 'month' ? granularity : 'day';\n\n/** 精确到时、分、秒:值是日期加时间 */\nexport const isTimeGranularity = (granularity: DateFieldGranularity) =>\n granularity === 'hour' || granularity === 'minute' || granularity === 'second';\n\n/** ISO 日期时间统一到秒('2026-10-20T14:30' → '2026-10-20T14:30:00'),去掉时区后缀:按字符串比较就是按时间先后 */\nconst toSeconds = (iso: string) => (iso.length >= 19 ? iso.slice(0, 19) : `${iso.slice(0, 16)}:00`);\n\n/**\n * 带时间的 min / max → 比较用的 ISO 日期时间;只给了日期(或不带时间的 granularity)时为 null,\n * 那一整天都可选,只按日期比较\n */\nfunction timeBound(limit: DateInput | undefined, granularity: DateFieldGranularity) {\n if (limit == null || !isTimeGranularity(granularity)) return null;\n if (typeof limit === 'string') return limit.includes('T') ? toSeconds(limit) : null;\n return 'hour' in limit ? toSeconds(valueToIso(limit, granularity)) : null;\n}\n\n/**\n * 这一段(年、季度、月、周、日,按值的形式)能不能选:整段都在 min–max 之外,或(按日选时)是不可选的日期。\n * DateField、DatePicker 的快捷选项与“今天”、DateRangePicker 的两端共用\n */\nexport function isPeriodDisabled(\n iso: string,\n granularity: DateFieldGranularity,\n limits: DateLimits,\n locale: DateLocale,\n): boolean {\n const start = locale.fromValue(fullIsoDay(iso));\n const end = locale.fromValue(lastIsoDay(iso));\n if (start == null || end == null) return false;\n if (limits.max != null && compareDates(start, limits.max) > 0) return true;\n if (limits.min != null && compareDates(end, limits.min) < 0) return true;\n const byDay = granularity === 'day' || isTimeGranularity(granularity);\n return byDay && (limits.isUnavailable?.(start) ?? false);\n}\n\n/** 值 → 分段输入用的 ISO 字符串(形式随 granularity) */\nexport function valueToIso(value: DateInput, granularity: DateFieldGranularity): string {\n if (typeof value === 'string') return value;\n if (isTimeGranularity(granularity)) {\n return toIsoDateTime(toCalendarDateTime(value), granularity === 'second');\n }\n if (granularity === 'quarter') return toIsoQuarter(value);\n if (granularity === 'week') return toIsoWeek(value);\n const day = toIsoDate(value);\n return granularity === 'year' ? day.slice(0, 4) : granularity === 'month' ? day.slice(0, 7) : day;\n}\n\n/** 分段输入填好的 ISO 字符串 → 和 like 同一种类型的值 */\nexport function isoToValue(\n iso: string,\n like: DateInput | undefined,\n granularity: DateFieldGranularity,\n valueType: keyof DateValueTypes = 'iso',\n): DateInput {\n if (typeof like === 'string' || (like == null && valueType === 'iso')) return iso;\n const parsed: CalendarDate | CalendarDateTime = isTimeGranularity(granularity)\n ? parseIsoDateTime(iso)!\n : parseIsoDate(fullIsoDay(iso))!;\n if (like == null) return parsed;\n const converted = toCalendar(parsed, like.calendar);\n if (!('hour' in like)) return converted;\n const { era, year, month, day } = converted;\n if (!('hour' in converted)) return like.set({ era, year, month, day });\n const { hour, minute, second } = converted;\n return like.set({ era, year, month, day, hour, minute, second });\n}\n\n/** 日期输入框:分段输入 */\nexport const DateField = _component(\n <V extends DateInput>({\n _value: value = _bindable<V | null>(null),\n granularity = 'day',\n valueType,\n min,\n max,\n isDateUnavailable,\n isTimeUnavailable,\n ...rest\n }: DateFieldProps<V>) => {\n const locale = useDateLocale();\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n // 先按日期比较(含不可选的日期);min / max 带时间时,同一天里再比时分秒\n const outOfRange = (iso: string) => {\n if (isPeriodDisabled(iso, granularity, limits, locale)) return true;\n const low = timeBound(min, granularity);\n const high = timeBound(max, granularity);\n const at = isTimeGranularity(granularity) ? toSeconds(iso) : '';\n if ((low != null && at < low) || (high != null && at > high)) return true;\n const time = isTimeGranularity(granularity) ? parseIsoTime(iso.slice(11)) : null;\n return (\n time != null && (isTimeUnavailable?.(toIsoTime(time), time, iso.slice(0, 10)) ?? false)\n );\n };\n const iso = _derived(value == null ? null : valueToIso(value, granularity));\n // 值清空后再填:仍按清空前的类型写回\n let lastLike: V | undefined;\n function write(next: string | null) {\n lastLike = value ?? lastLike;\n value = next == null ? null : (isoToValue(next, lastLike, granularity, valueType) as V);\n }\n return () => (\n <SegmentedField\n {...rest}\n onUpdate:_value={write}\n _value={iso}\n fields={segmentFields(granularity)}\n outOfRange={outOfRange}\n />\n );\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DateField.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/date/DateField.tsx"],"sourcesContent":["/**\n * 日期输入框:分段输入年、月、日(不带弹层),段的顺序按语言(zh-CN 年/月/日,en-US 月/日/年)。\n * 参考 React Aria DateField、原生 input type=\"date\"。要弹出日历用 DatePicker。\n *\n * <Field label=\"生日\"><DateField _value={birthday} max={today} /></Field>\n * <DateField granularity=\"minute\" _value={at} aria-label=\"开始时间\" /> // '2026-10-20T14:30'\n * <DateField granularity=\"month\" _value={month} aria-label=\"账期\" /> // '2026-10'\n *\n * 值是 ISO 字符串,形式随 granularity:year 'YYYY'、month 'YYYY-MM'、day 'YYYY-MM-DD',\n * hour / minute / second 是日期加时间 'YYYY-MM-DDTHH:mm[:ss]'(同原生 datetime-local);\n * 也可以是 DateValue,写回时保持同一种类型(ZonedDateTime 的时区、CalendarDateTime 没显示的时间不丢)。\n * 值在 min–max 之外、是不可选的日期或时刻(isTimeUnavailable)时显示出错(aria-invalid),值照样写回,由表单校验决定能不能提交。\n *\n * 键盘:数字逐段输入(满了自动跳段),↑↓ 加减,Page Up / Down 大步,Home / End 最小 / 最大,\n * Backspace 删一位(删空回到上一段),←→ 与 Tab 换段。部件见 SegmentedField。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport {\n toCalendar,\n toCalendarDateTime,\n type CalendarDate,\n type CalendarDateTime,\n type Time,\n} from '@internationalized/date';\nimport {\n compareDates,\n fullIsoDay,\n lastIsoDay,\n parseIsoDate,\n parseIsoDateTime,\n parseIsoTime,\n toIsoDate,\n toIsoDateTime,\n toIsoQuarter,\n toIsoTime,\n toIsoWeek,\n type DateLimits,\n type DateUnit,\n} from '../utils/data/date';\nimport {\n toDateLimits,\n useDateLocale,\n type DateInput,\n type DateLocale,\n type DateLimitProps,\n type DateValueTypes,\n} from './date-locale';\nimport { segmentFields, type DateFieldGranularity } from './date-segments';\nimport { SegmentedField, type SegmentedFieldOptions } from './SegmentedField';\n\n/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */\nexport interface DateFieldProps<V extends DateInput = string>\n extends SegmentedFieldOptions, DateLimitProps {\n /** 值:ISO 字符串(形式随 granularity)或 DateValue,写回时保持同一种类型;父级写 _value={x};没填全时 null */\n _value?: V | null;\n /** 精确到哪一段,默认 day;到 hour / minute / second 时是日期加时间 */\n granularity?: DateFieldGranularity;\n /** 值为空、推不出类型时写回哪一种,默认 iso(字符串);dateValue 写 CalendarDate(带时间时 CalendarDateTime) */\n valueType?: keyof DateValueTypes;\n /**\n * 带时间时不可选的时刻(午休、非营业时间):键入时显示出错。参数是 'HH:mm'、同一时刻的 Time 与那一天的 ISO 日期,\n * 周末与平日可以不一样:`(_, time, date) => time.hour < 9 || time.hour >= (isWeekend(…) ? 12 : 18)`\n */\n isTimeUnavailable?: (time: string, value: Time, date: string) => boolean;\n}\n\n/** 粒度 → 日历的粒度:年、月照搬,到日及以下都按日(选日期、比较范围) */\nexport const dateUnitOf = (granularity: DateFieldGranularity): DateUnit =>\n granularity === 'year' || granularity === 'month' ? granularity : 'day';\n\n/** 精确到时、分、秒:值是日期加时间 */\nexport const isTimeGranularity = (granularity: DateFieldGranularity) =>\n granularity === 'hour' || granularity === 'minute' || granularity === 'second';\n\n/** ISO 日期时间统一到秒('2026-10-20T14:30' → '2026-10-20T14:30:00'),去掉时区后缀:按字符串比较就是按时间先后 */\nconst toSeconds = (iso: string) => (iso.length >= 19 ? iso.slice(0, 19) : `${iso.slice(0, 16)}:00`);\n\n/**\n * 带时间的 min / max → 比较用的 ISO 日期时间;只给了日期(或不带时间的 granularity)时为 null,\n * 那一整天都可选,只按日期比较\n */\nfunction timeBound(limit: DateInput | undefined, granularity: DateFieldGranularity) {\n if (limit == null || !isTimeGranularity(granularity)) return null;\n if (typeof limit === 'string') return limit.includes('T') ? toSeconds(limit) : null;\n return 'hour' in limit ? toSeconds(valueToIso(limit, granularity)) : null;\n}\n\n/**\n * 这一段(年、季度、月、周、日,按值的形式)能不能选:整段都在 min–max 之外,或(按日选时)是不可选的日期。\n * DateField、DatePicker 的快捷选项与“今天”、DateRangePicker 的两端共用\n */\nexport function isPeriodDisabled(\n iso: string,\n granularity: DateFieldGranularity,\n limits: DateLimits,\n locale: DateLocale,\n): boolean {\n const start = locale.fromValue(fullIsoDay(iso));\n const end = locale.fromValue(lastIsoDay(iso));\n if (start == null || end == null) return false;\n if (limits.max != null && compareDates(start, limits.max) > 0) return true;\n if (limits.min != null && compareDates(end, limits.min) < 0) return true;\n const byDay = granularity === 'day' || isTimeGranularity(granularity);\n return byDay && (limits.isUnavailable?.(start) ?? false);\n}\n\n/** 值 → 分段输入用的 ISO 字符串(形式随 granularity) */\nexport function valueToIso(value: DateInput, granularity: DateFieldGranularity): string {\n if (typeof value === 'string') return value;\n if (isTimeGranularity(granularity)) {\n return toIsoDateTime(toCalendarDateTime(value), granularity === 'second');\n }\n if (granularity === 'quarter') return toIsoQuarter(value);\n if (granularity === 'week') return toIsoWeek(value);\n const day = toIsoDate(value);\n return granularity === 'year' ? day.slice(0, 4) : granularity === 'month' ? day.slice(0, 7) : day;\n}\n\n/** 分段输入填好的 ISO 字符串 → 和 like 同一种类型的值 */\nexport function isoToValue(\n iso: string,\n like: DateInput | undefined,\n granularity: DateFieldGranularity,\n valueType: keyof DateValueTypes = 'iso',\n): DateInput {\n if (typeof like === 'string' || (like == null && valueType === 'iso')) return iso;\n const parsed: CalendarDate | CalendarDateTime = isTimeGranularity(granularity)\n ? parseIsoDateTime(iso)!\n : parseIsoDate(fullIsoDay(iso))!;\n if (like == null) return parsed;\n const converted = toCalendar(parsed, like.calendar);\n if (!('hour' in like)) return converted;\n const { era, year, month, day } = converted;\n if (!('hour' in converted)) return like.set({ era, year, month, day });\n const { hour, minute, second } = converted;\n return like.set({ era, year, month, day, hour, minute, second });\n}\n\n/** 日期输入框:分段输入 */\nexport const DateField = _component(\n <V extends DateInput>({\n _value: value = _bindable<V | null>(null),\n granularity = 'day',\n valueType,\n min,\n max,\n isDateUnavailable,\n isTimeUnavailable,\n ...rest\n }: DateFieldProps<V>) => {\n const locale = useDateLocale();\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n // 先按日期比较(含不可选的日期);min / max 带时间时,同一天里再比时分秒\n const outOfRange = (iso: string) => {\n if (isPeriodDisabled(iso, granularity, limits, locale)) return true;\n const low = timeBound(min, granularity);\n const high = timeBound(max, granularity);\n const at = isTimeGranularity(granularity) ? toSeconds(iso) : '';\n if ((low != null && at < low) || (high != null && at > high)) return true;\n const time = isTimeGranularity(granularity) ? parseIsoTime(iso.slice(11)) : null;\n return (\n time != null && (isTimeUnavailable?.(toIsoTime(time), time, iso.slice(0, 10)) ?? false)\n );\n };\n const iso = _derived(value == null ? null : valueToIso(value, granularity));\n // 值清空后再填:仍按清空前的类型写回\n let lastLike: V | undefined;\n function write(next: string | null) {\n lastLike = value ?? lastLike;\n value = next == null ? null : (isoToValue(next, lastLike, granularity, valueType) as V);\n }\n return () => (\n <SegmentedField\n {...rest}\n onUpdate:_value={write}\n _value={iso}\n fields={segmentFields(granularity)}\n outOfRange={outOfRange}\n />\n );\n },\n);\n"],"mappings":"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"}
|
package/dist/date/DatePicker.js
CHANGED
|
@@ -9,8 +9,8 @@ import { Calendar } from "./Calendar.js";
|
|
|
9
9
|
import { DateField, dateUnitOf, isPeriodDisabled, isTimeGranularity, isoToValue, valueToIso } from "./DateField.js";
|
|
10
10
|
import { QuarterCalendar } from "./QuarterCalendar.js";
|
|
11
11
|
import { focusCalendar, renderPickerPresets, usePickerPopover } from "./picker-popover.js";
|
|
12
|
-
import { Fragment, computed, createVNode
|
|
13
|
-
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
12
|
+
import { Fragment, computed, createVNode } from "vue";
|
|
13
|
+
import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
14
14
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
15
15
|
import { CalendarDays } from "@lucide/icons";
|
|
16
16
|
import { toCalendarDateTime } from "@internationalized/date";
|
|
@@ -171,7 +171,7 @@ var DatePicker = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
171
171
|
setOpen(false, "select", event);
|
|
172
172
|
if (hasTime()) picker.anchor?.querySelector("[data-type=\"hour\"]")?.focus();
|
|
173
173
|
}
|
|
174
|
-
return () => createVNode(Fragment, null, [createVNode(DateField,
|
|
174
|
+
return () => createVNode(Fragment, null, [createVNode(DateField, mergeJsxProps(rest, {
|
|
175
175
|
"_value": value.value,
|
|
176
176
|
"onUpdate:_value": _cache[0] || (_cache[0] = ($event) => value.value = $event),
|
|
177
177
|
"granularity": granularity.value,
|
|
@@ -209,7 +209,7 @@ var DatePicker = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
209
209
|
"max": max.value,
|
|
210
210
|
"aria-label": lang.datePickerOpen,
|
|
211
211
|
"onPick": _cache[2] || (_cache[2] = () => picked())
|
|
212
|
-
}, null) : createVNode(Calendar,
|
|
212
|
+
}, null) : createVNode(Calendar, mergeJsxProps(propsCalendar.value, {
|
|
213
213
|
"onUpdate:_value": _cache[3] || (_cache[3] = (day) => pickDay(day)),
|
|
214
214
|
"_value": calendarValue.value,
|
|
215
215
|
"granularity": dateUnitOf(granularity.value),
|
|
@@ -222,7 +222,7 @@ var DatePicker = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
222
222
|
firstDayOfWeek: 1,
|
|
223
223
|
showWeekNumbers: true,
|
|
224
224
|
propsCellButton: weekCellButton
|
|
225
|
-
}, { "onPick": _cache[4] || (_cache[4] = () => picked()) }), null), showToday.value && createVNode("div", css.attrs(datePickerStyles.footer), [createVNode(Button,
|
|
225
|
+
}, { "onPick": _cache[4] || (_cache[4] = () => picked()) }), null), showToday.value && createVNode("div", css.attrs(datePickerStyles.footer), [createVNode(Button, mergeJsxProps(mergePartProps({
|
|
226
226
|
size: "sm",
|
|
227
227
|
variant: "ghost"
|
|
228
228
|
}, propsToday.value, {
|