@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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useLang } from "../config/context.js";
|
|
2
2
|
import { mergePartProps } from "../utils/props.js";
|
|
3
3
|
import { Select } from "../input/Select.js";
|
|
4
|
-
import { createVNode,
|
|
5
|
-
import { _component, bindable, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
4
|
+
import { createVNode, ref, watch } from "vue";
|
|
5
|
+
import { _component, bindable, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
6
6
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
7
7
|
//#region src/navigation/PageSizeSelect.tsx
|
|
8
8
|
/** 单选的 Select 属性 */
|
|
@@ -34,7 +34,7 @@ var PageSizeSelect = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
34
34
|
value.value = size;
|
|
35
35
|
onSizeChange.value?.(size);
|
|
36
36
|
});
|
|
37
|
-
return () => createVNode(Select,
|
|
37
|
+
return () => createVNode(Select, mergeJsxProps(mergePartProps({
|
|
38
38
|
items: options.value.map((size) => ({
|
|
39
39
|
value: String(size),
|
|
40
40
|
label: lang.pageSizeOption(size)
|
|
@@ -42,7 +42,7 @@ var PageSizeSelect = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
42
42
|
selectionMode: "single",
|
|
43
43
|
"aria-label": lang.pageSizeLabel,
|
|
44
44
|
size: "sm",
|
|
45
|
-
renderValue: () => createVNode("span", css.attrs(pageSizeSelectStyles.stack), [options.value.map((size) => createVNode("span",
|
|
45
|
+
renderValue: () => createVNode("span", css.attrs(pageSizeSelectStyles.stack), [options.value.map((size) => createVNode("span", mergeJsxProps({
|
|
46
46
|
"key": size,
|
|
47
47
|
"aria-hidden": size !== value.value || void 0
|
|
48
48
|
}, css.attrs(pageSizeSelectStyles.option, size !== value.value && pageSizeSelectStyles.hidden)), [lang.pageSizeOption(size)]))])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageSizeSelect.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_ref","_vtp_untrack","_createVNode","_mergeProps"],"sources":["../../src/navigation/PageSizeSelect.tsx"],"sourcesContent":["/**\n * 每页条数选择:分页的配套组件,与 Pagination 并排放(各自独立,按需组合;三样都要时用 PaginationBar)。选项文字取语言包(“20 条/页”)。\n *\n * <Flex gap=\"md\" align=\"center\">\n * <Pagination _page={page} total={total} pageSize={size} />\n * <PageSizeSelect _value={size} onSizeChange={() => (page = 1)} />\n * </Flex>\n *\n * 基于 Select:未声明的属性落到 Select 上(外壳用 propsRoot 等 Select 的部件),名称默认取语言包(每页条数)。\n * 按钮按最长的选项定宽:换条数时不变宽窄,下拉(与按钮同宽)里的选项也不被截断。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { Select, type SelectProps } from '../input/Select';\nimport { mergePartProps } from '../utils/props';\nimport type { SingleSelectionProps } from '../utils/data/selection';\n\n/** 单选的 Select 属性 */\ntype SingleSelectProps = Extract<SelectProps, SingleSelectionProps>;\n\n/** 未声明的属性落到 Select 上 */\nexport interface PageSizeSelectProps extends Omit<\n Partial<SelectProps>,\n '_value' | 'items' | 'selectionMode'\n> {\n /** 每页条数:父级写 _value={size} */\n _value?: number;\n /** 可选的条数,默认 [10, 20, 50, 100] */\n options?: readonly number[];\n /** 用户换了条数后调用(通常把页码回到第 1 页) */\n onSizeChange?: (size: number) => void;\n}\n\n/** PageSizeSelect 的样式:stack、option、hidden */\nexport const pageSizeSelectStyles = css.create({\n // 所有选项的文字叠在同一格,按最宽的那个撑开,只显示选中的\n stack: { display: 'inline-grid' },\n option: { gridArea: '1 / 1' },\n hidden: { visibility: 'hidden' },\n});\n\n/** 每页条数选择(Select) */\nexport const PageSizeSelect = _component(\n ({\n _value: value = _bindable(10),\n options = [10, 20, 50, 100],\n onSizeChange,\n ...rest\n }: PageSizeSelectProps) => {\n const lang = useLang();\n // Select 的值是字符串:本地一份,与数字的 value 互相同步\n let selected = _state(String(_untrack(value)));\n watch(\n () => value,\n (size) => (selected = String(size)),\n );\n watch(\n () => selected,\n (next) => {\n const size = Number(next);\n if (size === value) return;\n value = size;\n onSizeChange?.(size);\n },\n );\n\n return () => (\n <Select\n {...mergePartProps<SingleSelectProps>(\n {\n items: options.map((size) => ({\n value: String(size),\n label: lang.pageSizeOption(size),\n })),\n selectionMode: 'single',\n 'aria-label': lang.pageSizeLabel,\n size: 'sm',\n renderValue: () => (\n <span {...css.attrs(pageSizeSelectStyles.stack)}>\n {options.map((size) => (\n <span\n key={size}\n aria-hidden={size !== value || undefined}\n {...css.attrs(\n pageSizeSelectStyles.option,\n size !== value && pageSizeSelectStyles.hidden,\n )}\n >\n {lang.pageSizeOption(size)}\n </span>\n ))}\n </span>\n ),\n },\n rest,\n )}\n _value={selected}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,uBAAuB,IAAI,OAAO;CAE7C,OAAO,EAAE,SAAS,cAAc;CAChC,QAAQ,EAAE,UAAU,QAAQ;CAC5B,QAAQ,EAAE,YAAY,SAAS;AACjC,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAK2B;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,SAAA,QAAA,gBAJC,IAAE,KAAA,IAAA;CAAA,MAAA,UAAAC,aAAA,QAAA,iBAClB;EAAC;EAAI;EAAI;EAAI;CAAG,CAAC;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAExB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CAErB,IAAI,WAAQC,IAAU,OAAMC,cAAA,MAAA,KAAA,CAAgB,CAAC;CAC7C,YACE,MAAA,QACC,SAAU,SAAA,QAAW,OAAO,IAAI,CACnC;CACA,YACE,SAAA,QACC,SAAS;EACR,MAAM,OAAO,OAAO,IAAI;EACxB,IAAI,SAAI,MAAA,OAAY;EACpB,MAAA,QAAQ;EACR,aAAA,QAAe,IAAI;CACrB,CACF;CAEA,aAAOC,YAAA,QAAAC,
|
|
1
|
+
{"version":3,"file":"PageSizeSelect.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_ref","_vtp_untrack","_createVNode","_mergeProps"],"sources":["../../src/navigation/PageSizeSelect.tsx"],"sourcesContent":["/**\n * 每页条数选择:分页的配套组件,与 Pagination 并排放(各自独立,按需组合;三样都要时用 PaginationBar)。选项文字取语言包(“20 条/页”)。\n *\n * <Flex gap=\"md\" align=\"center\">\n * <Pagination _page={page} total={total} pageSize={size} />\n * <PageSizeSelect _value={size} onSizeChange={() => (page = 1)} />\n * </Flex>\n *\n * 基于 Select:未声明的属性落到 Select 上(外壳用 propsRoot 等 Select 的部件),名称默认取语言包(每页条数)。\n * 按钮按最长的选项定宽:换条数时不变宽窄,下拉(与按钮同宽)里的选项也不被截断。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { Select, type SelectProps } from '../input/Select';\nimport { mergePartProps } from '../utils/props';\nimport type { SingleSelectionProps } from '../utils/data/selection';\n\n/** 单选的 Select 属性 */\ntype SingleSelectProps = Extract<SelectProps, SingleSelectionProps>;\n\n/** 未声明的属性落到 Select 上 */\nexport interface PageSizeSelectProps extends Omit<\n Partial<SelectProps>,\n '_value' | 'items' | 'selectionMode'\n> {\n /** 每页条数:父级写 _value={size} */\n _value?: number;\n /** 可选的条数,默认 [10, 20, 50, 100] */\n options?: readonly number[];\n /** 用户换了条数后调用(通常把页码回到第 1 页) */\n onSizeChange?: (size: number) => void;\n}\n\n/** PageSizeSelect 的样式:stack、option、hidden */\nexport const pageSizeSelectStyles = css.create({\n // 所有选项的文字叠在同一格,按最宽的那个撑开,只显示选中的\n stack: { display: 'inline-grid' },\n option: { gridArea: '1 / 1' },\n hidden: { visibility: 'hidden' },\n});\n\n/** 每页条数选择(Select) */\nexport const PageSizeSelect = _component(\n ({\n _value: value = _bindable(10),\n options = [10, 20, 50, 100],\n onSizeChange,\n ...rest\n }: PageSizeSelectProps) => {\n const lang = useLang();\n // Select 的值是字符串:本地一份,与数字的 value 互相同步\n let selected = _state(String(_untrack(value)));\n watch(\n () => value,\n (size) => (selected = String(size)),\n );\n watch(\n () => selected,\n (next) => {\n const size = Number(next);\n if (size === value) return;\n value = size;\n onSizeChange?.(size);\n },\n );\n\n return () => (\n <Select\n {...mergePartProps<SingleSelectProps>(\n {\n items: options.map((size) => ({\n value: String(size),\n label: lang.pageSizeOption(size),\n })),\n selectionMode: 'single',\n 'aria-label': lang.pageSizeLabel,\n size: 'sm',\n renderValue: () => (\n <span {...css.attrs(pageSizeSelectStyles.stack)}>\n {options.map((size) => (\n <span\n key={size}\n aria-hidden={size !== value || undefined}\n {...css.attrs(\n pageSizeSelectStyles.option,\n size !== value && pageSizeSelectStyles.hidden,\n )}\n >\n {lang.pageSizeOption(size)}\n </span>\n ))}\n </span>\n ),\n },\n rest,\n )}\n _value={selected}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,uBAAuB,IAAI,OAAO;CAE7C,OAAO,EAAE,SAAS,cAAc;CAChC,QAAQ,EAAE,UAAU,QAAQ;CAC5B,QAAQ,EAAE,YAAY,SAAS;AACjC,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAK2B;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,SAAA,QAAA,gBAJC,IAAE,KAAA,IAAA;CAAA,MAAA,UAAAC,aAAA,QAAA,iBAClB;EAAC;EAAI;EAAI;EAAI;CAAG,CAAC;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAExB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CAErB,IAAI,WAAQC,IAAU,OAAMC,cAAA,MAAA,KAAA,CAAgB,CAAC;CAC7C,YACE,MAAA,QACC,SAAU,SAAA,QAAW,OAAO,IAAI,CACnC;CACA,YACE,SAAA,QACC,SAAS;EACR,MAAM,OAAO,OAAO,IAAI;EACxB,IAAI,SAAI,MAAA,OAAY;EACpB,MAAA,QAAQ;EACR,aAAA,QAAe,IAAI;CACrB,CACF;CAEA,aAAOC,YAAA,QAAAC,cAEC,eACF;EACE,OAAO,QAAA,MAAQ,KAAK,UAAU;GAC5B,OAAO,OAAO,IAAI;GAClB,OAAO,KAAK,eAAe,IAAI;EACjC,EAAE;EACF,eAAe;EACf,cAAc,KAAK;EACnB,MAAM;EACN,mBAAaD,YAAA,QACD,IAAI,MAAM,qBAAqB,KAAK,GAAC,CAC5C,QAAA,MAAQ,KAAK,SAAIA,YAAA,QAAAC,cAAA;GAAA,OAET;GAAI,eACI,SAAI,MAAA,SAAc,KAAA;EAAS,GACpC,IAAI,MACN,qBAAqB,QACrB,SAAI,MAAA,SAAc,qBAAqB,MACzC,CAAC,GAAA,CAEA,KAAK,eAAe,IAAI,CAAC,CAAA,CAE7B,CAAC,CAAA;CAGR,GACA,IACF,GAAC;EAAA,UAAA,SAAA;EAAA,mBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,SAAA,QAAA;CAAA,CAAA,GAAA,IAAA;AAIP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { clamp } from "../utils/data/number.js";
|
|
2
2
|
import { t } from "../config/theme/tokens.js";
|
|
3
3
|
import { useLang } from "../config/context.js";
|
|
4
|
-
import { mergeAttrs, mergePartProps, mergeProps
|
|
4
|
+
import { mergeAttrs, mergePartProps, mergeProps } from "../utils/props.js";
|
|
5
5
|
import { Icon } from "../base/Icon.js";
|
|
6
6
|
import { Button } from "../base/Button.js";
|
|
7
7
|
import { IconButton } from "../base/IconButton.js";
|
|
@@ -9,8 +9,8 @@ import { IconLinkButton } from "../base/IconLinkButton.js";
|
|
|
9
9
|
import { LinkButton } from "../base/LinkButton.js";
|
|
10
10
|
import { FlexList } from "../layout/Flex.js";
|
|
11
11
|
import { paginationItems } from "../utils/data/pagination.js";
|
|
12
|
-
import { computed, createVNode, isVNode
|
|
13
|
-
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
12
|
+
import { computed, createVNode, isVNode } 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 { ChevronLeft, ChevronRight, Ellipsis } from "@lucide/icons";
|
|
16
16
|
//#region src/navigation/Pagination.tsx
|
|
@@ -75,7 +75,7 @@ var Pagination = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
75
75
|
function pageButton(target) {
|
|
76
76
|
const isCurrent = target === current.value;
|
|
77
77
|
const own = typeof propsPage.value === "function" ? propsPage.value(target) : propsPage.value;
|
|
78
|
-
const shared = mergeProps
|
|
78
|
+
const shared = mergeProps({
|
|
79
79
|
sx: [paginationStyles.page, paginationStyles.tabular],
|
|
80
80
|
size: size.value,
|
|
81
81
|
variant: isCurrent ? "soft" : "ghost",
|
|
@@ -114,7 +114,7 @@ var Pagination = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
114
114
|
return () => createVNode("nav", mergeAttrs({
|
|
115
115
|
sx: paginationStyles.root,
|
|
116
116
|
"aria-label": lang.pagination
|
|
117
|
-
}, rest), [createVNode(FlexList,
|
|
117
|
+
}, rest), [createVNode(FlexList, mergeJsxProps(mergePartProps({
|
|
118
118
|
align: "center",
|
|
119
119
|
gap: "xs"
|
|
120
120
|
}, propsList.value), { "key": "__site0" }), {
|
|
@@ -125,7 +125,7 @@ var Pagination = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
125
125
|
pageCount: count.value,
|
|
126
126
|
siblings: siblings.value,
|
|
127
127
|
boundaries: boundaries.value
|
|
128
|
-
}).map((item) => createVNode("li",
|
|
128
|
+
}).map((item) => createVNode("li", mergeJsxProps({ "key": item }, mergeAttrs({}, propsItem.value)), [typeof item === "number" ? pageButton(item) : createVNode("span", mergeAttrs({ sx: paginationStyles.ellipsis }, propsEllipsis.value, { "aria-hidden": true }), [createVNode(Icon, { "icon": Ellipsis }, null)])])),
|
|
129
129
|
createVNode("li", mergeAttrs({}, propsItem.value), [stepButton(1)])
|
|
130
130
|
],
|
|
131
131
|
$stable: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","names":["_isVNode","_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","mergeProps","_createVNode","_mergeProps"],"sources":["../../src/navigation/Pagination.tsx"],"sourcesContent":["/**\n * 分页(nav > ul):上一页、页码、省略号、下一页,当前页带 aria-current=\"page\"。\n * 页码序列用 utils/data/pagination.ts(项数固定,翻页时按钮不跳动);按钮用 Button / IconButton,文案取语言包。\n *\n * <Pagination _page={page} total={320} pageSize={20} />\n * <Pagination page={page} pageCount={12} href={(n) => `/articles?page=${n}`} /> 渲染为链接(可分享、可被收录)\n */\nimport { ChevronLeft, ChevronRight, Ellipsis } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { Icon } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { IconLinkButton, type IconLinkButtonProps } from '../base/IconLinkButton';\nimport { LinkButton, type LinkButtonProps } from '../base/LinkButton';\nimport { useLang } from '../config/context';\nimport { paginationItems } from '../utils/data/pagination';\nimport { mergeAttrs, mergePartProps, mergeProps, type PartProps } from '../utils/props';\nimport type { TextSize } from '../utils/style/typography';\nimport { clamp } from '../utils/data/number';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 未声明的属性落到 nav 上;aria-label 默认取语言包(分页) */\nexport interface PaginationProps extends PartProps<'nav'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 总页数;不写时按 total 与 pageSize 算 */\n pageCount?: number;\n /** 总条数:给了就能算页数,showTotal 时显示“共 n 条” */\n total?: number;\n /** 每页条数,默认 10 */\n pageSize?: number;\n /** 当前页左右各显示几页,默认 1 */\n siblings?: number;\n /** 首尾各固定显示几页,默认 1 */\n boundaries?: number;\n /** 显示总条数(需要 total) */\n showTotal?: boolean;\n /** 给了就渲染为链接:每页的地址 */\n href?: (page: number) => string;\n /** 字号档位,按钮随之缩放,默认 sm */\n size?: TextSize;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 每一项(li,包着按钮或省略号)的部件属性 */\n propsItem?: PartProps<'li'>;\n /** 页码按钮的部件属性(按钮或链接按钮),可以按页计算 */\n propsPage?:\n | Partial<ButtonProps & LinkButtonProps>\n | ((page: number) => Partial<ButtonProps & LinkButtonProps>);\n /** 上一页、下一页按钮的部件属性(有 href 时是图标链接按钮) */\n propsStep?: Partial<IconButtonProps & IconLinkButtonProps>;\n /** 省略号的部件属性 */\n propsEllipsis?: PartProps<'span'>;\n /** 总条数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n}\n\n/** Pagination 的样式:root、list、page、ellipsis、total、tabular */\nexport const paginationStyles = css.create({\n root: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '_md' },\n // 页码按钮等宽,翻页时位置不晃\n page: { minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`, paddingInline: '_xs' },\n ellipsis: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n color: '_textMuted',\n },\n total: { color: '_textMuted' },\n tabular: { fontVariantNumeric: 'tabular-nums' },\n});\n\n/** 分页:上一页、页码、省略号、下一页 */\nexport const Pagination = _component(\n ({\n _page: page = _bindable(1),\n pageCount,\n total,\n pageSize = 10,\n siblings = 1,\n boundaries = 1,\n showTotal = false,\n href,\n size = 'sm',\n propsList,\n propsItem,\n propsPage,\n propsStep,\n propsEllipsis,\n propsTotal,\n ...rest\n }: PaginationProps) => {\n const lang = useLang();\n const count = _derived(Math.max(1, pageCount ?? Math.ceil((total ?? 0) / pageSize)));\n // 显示用的当前页:总数变少(筛选后)时父级的 page 可能超出范围,夹回去,不显示不存在的页\n const current = _derived(clamp(page, 1, count));\n\n function go(target: number) {\n page = clamp(target, 1, count);\n }\n\n /** 一个页码:当前页是实底,其余是 ghost;有 href 时是链接 */\n function pageButton(target: number) {\n const isCurrent = target === current;\n const own = typeof propsPage === 'function' ? propsPage(target) : propsPage;\n const shared = mergeProps<ButtonProps & LinkButtonProps>(\n {\n sx: [paginationStyles.page, paginationStyles.tabular],\n size,\n variant: isCurrent ? 'soft' : 'ghost',\n tone: isCurrent ? 'accent' : 'neutral',\n 'aria-label': lang.pageLabel(target),\n },\n own,\n { 'aria-current': isCurrent ? 'page' : undefined },\n );\n return href ? (\n <LinkButton\n {...mergePartProps<LinkButtonProps>(shared as LinkButtonProps, {\n href: href(target),\n onClick: () => go(target),\n })}\n >\n {target}\n </LinkButton>\n ) : (\n <Button\n {...mergePartProps<ButtonProps>(shared as ButtonProps, { onClick: () => go(target) })}\n >\n {target}\n </Button>\n );\n }\n\n /** 上一页、下一页:到头时不可用;有 href 时也是链接(rel=\"prev\" / \"next\"),与页码一样可分享 */\n function stepButton(direction: -1 | 1) {\n const target = current + direction;\n const disabled = target < 1 || target > count;\n const shared = {\n size,\n variant: 'ghost',\n tone: 'neutral',\n icon: direction < 0 ? ChevronLeft : ChevronRight,\n propsIcon: { flipInRtl: true },\n 'aria-label': direction < 0 ? lang.previousPage : lang.nextPage,\n } as const;\n return href ? (\n <IconLinkButton\n {...mergePartProps<IconLinkButtonProps>(\n { ...shared, href: href(disabled ? current : target) },\n propsStep,\n { disabled, rel: direction < 0 ? 'prev' : 'next', onClick: () => go(target) },\n )}\n />\n ) : (\n <IconButton\n {...mergePartProps<IconButtonProps>(shared, propsStep, {\n disabled,\n onClick: () => go(target),\n })}\n />\n );\n }\n\n return () => (\n <nav\n {...mergeAttrs<'nav'>({ sx: paginationStyles.root, 'aria-label': lang.pagination }, rest)}\n >\n <FlexList {...mergePartProps<FlexProps<'ul'>>({ align: 'center', gap: 'xs' }, propsList)}>\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(-1)}</li>\n {paginationItems({ page: current, pageCount: count, siblings, boundaries }).map(\n (item) => (\n <li key={item} {...mergeAttrs<'li'>({}, propsItem)}>\n {typeof item === 'number' ? (\n pageButton(item)\n ) : (\n <span\n {...mergeAttrs<'span'>({ sx: paginationStyles.ellipsis }, propsEllipsis, {\n 'aria-hidden': true,\n })}\n >\n <Icon icon={Ellipsis} />\n </span>\n )}\n </li>\n ),\n )}\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(1)}</li>\n </FlexList>\n {showTotal && total != null && (\n <span\n {...mergeAttrs<'span'>(\n { sx: [paginationStyles.total, paginationStyles.tabular] },\n propsTotal,\n )}\n >\n {lang.paginationTotal(total)}\n </span>\n )}\n </nav>\n );\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.js","names":["_isVNode","_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/navigation/Pagination.tsx"],"sourcesContent":["/**\n * 分页(nav > ul):上一页、页码、省略号、下一页,当前页带 aria-current=\"page\"。\n * 页码序列用 utils/data/pagination.ts(项数固定,翻页时按钮不跳动);按钮用 Button / IconButton,文案取语言包。\n *\n * <Pagination _page={page} total={320} pageSize={20} />\n * <Pagination page={page} pageCount={12} href={(n) => `/articles?page=${n}`} /> 渲染为链接(可分享、可被收录)\n */\nimport { ChevronLeft, ChevronRight, Ellipsis } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { Icon } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { IconLinkButton, type IconLinkButtonProps } from '../base/IconLinkButton';\nimport { LinkButton, type LinkButtonProps } from '../base/LinkButton';\nimport { useLang } from '../config/context';\nimport { paginationItems } from '../utils/data/pagination';\nimport { mergeAttrs, mergePartProps, mergeProps, type PartProps } from '../utils/props';\nimport type { TextSize } from '../utils/style/typography';\nimport { clamp } from '../utils/data/number';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 未声明的属性落到 nav 上;aria-label 默认取语言包(分页) */\nexport interface PaginationProps extends PartProps<'nav'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 总页数;不写时按 total 与 pageSize 算 */\n pageCount?: number;\n /** 总条数:给了就能算页数,showTotal 时显示“共 n 条” */\n total?: number;\n /** 每页条数,默认 10 */\n pageSize?: number;\n /** 当前页左右各显示几页,默认 1 */\n siblings?: number;\n /** 首尾各固定显示几页,默认 1 */\n boundaries?: number;\n /** 显示总条数(需要 total) */\n showTotal?: boolean;\n /** 给了就渲染为链接:每页的地址 */\n href?: (page: number) => string;\n /** 字号档位,按钮随之缩放,默认 sm */\n size?: TextSize;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 每一项(li,包着按钮或省略号)的部件属性 */\n propsItem?: PartProps<'li'>;\n /** 页码按钮的部件属性(按钮或链接按钮),可以按页计算 */\n propsPage?:\n | Partial<ButtonProps & LinkButtonProps>\n | ((page: number) => Partial<ButtonProps & LinkButtonProps>);\n /** 上一页、下一页按钮的部件属性(有 href 时是图标链接按钮) */\n propsStep?: Partial<IconButtonProps & IconLinkButtonProps>;\n /** 省略号的部件属性 */\n propsEllipsis?: PartProps<'span'>;\n /** 总条数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n}\n\n/** Pagination 的样式:root、list、page、ellipsis、total、tabular */\nexport const paginationStyles = css.create({\n root: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '_md' },\n // 页码按钮等宽,翻页时位置不晃\n page: { minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`, paddingInline: '_xs' },\n ellipsis: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n color: '_textMuted',\n },\n total: { color: '_textMuted' },\n tabular: { fontVariantNumeric: 'tabular-nums' },\n});\n\n/** 分页:上一页、页码、省略号、下一页 */\nexport const Pagination = _component(\n ({\n _page: page = _bindable(1),\n pageCount,\n total,\n pageSize = 10,\n siblings = 1,\n boundaries = 1,\n showTotal = false,\n href,\n size = 'sm',\n propsList,\n propsItem,\n propsPage,\n propsStep,\n propsEllipsis,\n propsTotal,\n ...rest\n }: PaginationProps) => {\n const lang = useLang();\n const count = _derived(Math.max(1, pageCount ?? Math.ceil((total ?? 0) / pageSize)));\n // 显示用的当前页:总数变少(筛选后)时父级的 page 可能超出范围,夹回去,不显示不存在的页\n const current = _derived(clamp(page, 1, count));\n\n function go(target: number) {\n page = clamp(target, 1, count);\n }\n\n /** 一个页码:当前页是实底,其余是 ghost;有 href 时是链接 */\n function pageButton(target: number) {\n const isCurrent = target === current;\n const own = typeof propsPage === 'function' ? propsPage(target) : propsPage;\n const shared = mergeProps<ButtonProps & LinkButtonProps>(\n {\n sx: [paginationStyles.page, paginationStyles.tabular],\n size,\n variant: isCurrent ? 'soft' : 'ghost',\n tone: isCurrent ? 'accent' : 'neutral',\n 'aria-label': lang.pageLabel(target),\n },\n own,\n { 'aria-current': isCurrent ? 'page' : undefined },\n );\n return href ? (\n <LinkButton\n {...mergePartProps<LinkButtonProps>(shared as LinkButtonProps, {\n href: href(target),\n onClick: () => go(target),\n })}\n >\n {target}\n </LinkButton>\n ) : (\n <Button\n {...mergePartProps<ButtonProps>(shared as ButtonProps, { onClick: () => go(target) })}\n >\n {target}\n </Button>\n );\n }\n\n /** 上一页、下一页:到头时不可用;有 href 时也是链接(rel=\"prev\" / \"next\"),与页码一样可分享 */\n function stepButton(direction: -1 | 1) {\n const target = current + direction;\n const disabled = target < 1 || target > count;\n const shared = {\n size,\n variant: 'ghost',\n tone: 'neutral',\n icon: direction < 0 ? ChevronLeft : ChevronRight,\n propsIcon: { flipInRtl: true },\n 'aria-label': direction < 0 ? lang.previousPage : lang.nextPage,\n } as const;\n return href ? (\n <IconLinkButton\n {...mergePartProps<IconLinkButtonProps>(\n { ...shared, href: href(disabled ? current : target) },\n propsStep,\n { disabled, rel: direction < 0 ? 'prev' : 'next', onClick: () => go(target) },\n )}\n />\n ) : (\n <IconButton\n {...mergePartProps<IconButtonProps>(shared, propsStep, {\n disabled,\n onClick: () => go(target),\n })}\n />\n );\n }\n\n return () => (\n <nav\n {...mergeAttrs<'nav'>({ sx: paginationStyles.root, 'aria-label': lang.pagination }, rest)}\n >\n <FlexList {...mergePartProps<FlexProps<'ul'>>({ align: 'center', gap: 'xs' }, propsList)}>\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(-1)}</li>\n {paginationItems({ page: current, pageCount: count, siblings, boundaries }).map(\n (item) => (\n <li key={item} {...mergeAttrs<'li'>({}, propsItem)}>\n {typeof item === 'number' ? (\n pageButton(item)\n ) : (\n <span\n {...mergeAttrs<'span'>({ sx: paginationStyles.ellipsis }, propsEllipsis, {\n 'aria-hidden': true,\n })}\n >\n <Icon icon={Ellipsis} />\n </span>\n )}\n </li>\n ),\n )}\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(1)}</li>\n </FlexList>\n {showTotal && total != null && (\n <span\n {...mergeAttrs<'span'>(\n { sx: [paginationStyles.total, paginationStyles.tabular] },\n propsTotal,\n )}\n >\n {lang.paginationTotal(total)}\n </span>\n )}\n </nav>\n );\n },\n);\n"],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ import { fontSizeStyles } from "../utils/style/typography.js";
|
|
|
5
5
|
import { PageJump } from "./PageJump.js";
|
|
6
6
|
import { PageSizeSelect } from "./PageSizeSelect.js";
|
|
7
7
|
import { Pagination } from "./Pagination.js";
|
|
8
|
-
import { computed, createVNode
|
|
9
|
-
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
8
|
+
import { computed, createVNode } from "vue";
|
|
9
|
+
import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
10
10
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
11
11
|
//#region src/navigation/PaginationBar.tsx
|
|
12
12
|
/** 当前页显示的是哪几条 */
|
|
@@ -80,17 +80,17 @@ var PaginationBar = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
80
80
|
return createVNode("span", mergeAttrs({ sx: paginationBarStyles.total }, propsTotal.value), [content]);
|
|
81
81
|
}
|
|
82
82
|
return () => createVNode("div", mergeAttrs({ sx: [paginationBarStyles.root, fontSizeStyles[size.value]] }, rest), [renderTotal(), createVNode("div", mergeAttrs({ sx: paginationBarStyles.controls }, propsControls.value), [
|
|
83
|
-
createVNode(Pagination,
|
|
83
|
+
createVNode(Pagination, mergeJsxProps(mergePartProps({ size: size.value }, propsPagination.value), {
|
|
84
84
|
"_page": page.value,
|
|
85
85
|
"onUpdate:_page": _cache[0] || (_cache[0] = ($event) => page.value = $event),
|
|
86
86
|
"total": total.value,
|
|
87
87
|
"pageSize": pageSize.value
|
|
88
88
|
}), null),
|
|
89
|
-
showSizeSelect.value && createVNode(PageSizeSelect,
|
|
89
|
+
showSizeSelect.value && createVNode(PageSizeSelect, mergeJsxProps(mergePartProps({ options: pageSizeOptions.value }, propsSizeSelect.value, { onSizeChange: () => page.value = 1 }), {
|
|
90
90
|
"_value": pageSize.value,
|
|
91
91
|
"onUpdate:_value": _cache[1] || (_cache[1] = ($event) => pageSize.value = $event)
|
|
92
92
|
}), null),
|
|
93
|
-
showJump.value && pageCount.value > 1 && createVNode(PageJump,
|
|
93
|
+
showJump.value && pageCount.value > 1 && createVNode(PageJump, mergeJsxProps(mergePartProps({
|
|
94
94
|
pageCount: pageCount.value,
|
|
95
95
|
size: size.value,
|
|
96
96
|
sx: paginationBarStyles.jump
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaginationBar.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/navigation/PaginationBar.tsx"],"sourcesContent":["/**\n * 分页栏:表格、列表下方的一整行,起始边是“第 1–20 条,共 320 条”,结束边是页码、每页条数、跳页。\n * 拼的是 Pagination、PageSizeSelect、PageJump,换每页条数时回到第 1 页。\n *\n * <PaginationBar _page={page} _pageSize={size} total={320} />\n * <PaginationBar _page={tasks.page} _pageSize={tasks.pageSize} total={tasks.total} /> 接 useTableQuery\n *\n * 占满所在的行;窄于 36em 时不显示跳页,窄于 24em 时总数单独一行。只要其中几样时用 showTotal / showSizeSelect / showJump 关掉,\n * 或者直接并排三个组件。\n *\n * 部件:Root(div)、Total(span)、Controls(div)、Pagination、SizeSelect(PageSizeSelect)、Jump(PageJump)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { clamp } from '../utils/data/number';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport { PageJump, type PageJumpProps } from './PageJump';\nimport { PageSizeSelect, type PageSizeSelectProps } from './PageSizeSelect';\nimport { Pagination, type PaginationProps } from './Pagination';\n\n/** 当前页显示的是哪几条 */\nexport interface PageRange {\n /** 第一条的序号,从 1 开始;没有数据时是 0 */\n from: number;\n /** 最后一条的序号 */\n to: number;\n /** 总条数 */\n total: number;\n}\n\n/** 未声明的属性落到外层 div 上;分页导航的名称用 propsPagination 的 aria-label */\nexport interface PaginationBarProps extends PartProps<'div'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 每页条数:父级写 _pageSize={x},默认 10 */\n _pageSize?: number;\n /** 总条数 */\n total: number;\n /** 每页条数的选项,默认 [10, 20, 50, 100] */\n pageSizeOptions?: readonly number[];\n /** 起始边的总数:默认 true(“第 1–20 条,共 320 条”),也可以给函数自己写 */\n showTotal?: boolean | ((range: PageRange) => VNodeChild);\n /** 每页条数选择,默认 true */\n showSizeSelect?: boolean;\n /** 跳页,默认 true(窄于 36em 时不显示) */\n showJump?: boolean;\n /** 字号档位,各部分随之缩放,默认 sm */\n size?: TextSize;\n /** 总数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n /** 结束边那一组(页码、条数、跳页)的部件属性 */\n propsControls?: PartProps<'div'>;\n /** 页码(Pagination)的部件属性 */\n propsPagination?: Partial<PaginationProps>;\n /** 每页条数(PageSizeSelect)的部件属性 */\n propsSizeSelect?: Partial<PageSizeSelectProps>;\n /** 跳页(PageJump)的部件属性 */\n propsJump?: Partial<PageJumpProps>;\n}\n\n/** PaginationBar 的样式:root、total、controls、jump */\nexport const paginationBarStyles = css.create({\n // 按自己的宽度决定显示什么:放在侧栏、卡片里时也合适\n root: {\n containerType: 'inline-size',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n rowGap: '_sm',\n columnGap: '_md',\n },\n total: {\n flexBasis: { default: 'auto', '@container (max-width: 24em)': '100%' },\n color: '_textMuted',\n fontVariantNumeric: 'tabular-nums',\n },\n controls: {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n rowGap: '_sm',\n columnGap: '_md',\n marginInlineStart: 'auto',\n },\n jump: { display: { default: 'inline-flex', '@container (max-width: 36em)': 'none' } },\n});\n\n/** 分页栏:总数、页码、每页条数、跳页 */\nexport const PaginationBar = _component(\n ({\n _page: page = _bindable(1),\n _pageSize: pageSize = _bindable(10),\n total,\n pageSizeOptions,\n showTotal = true,\n showSizeSelect = true,\n showJump = true,\n size = 'sm',\n propsTotal,\n propsControls,\n propsPagination,\n propsSizeSelect,\n propsJump,\n ...rest\n }: PaginationBarProps) => {\n const lang = useLang();\n const pageCount = _derived(Math.max(1, Math.ceil(total / pageSize)));\n // 总数变少(筛选后)时父级的 page 可能超出范围:显示时夹回去,同 Pagination\n const range = _derived.by((): PageRange => {\n const current = clamp(page, 1, pageCount);\n return total === 0\n ? { from: 0, to: 0, total }\n : {\n from: (current - 1) * pageSize + 1,\n to: Math.min(current * pageSize, total),\n total,\n };\n });\n\n function renderTotal() {\n if (!showTotal) return null;\n const content =\n typeof showTotal === 'function'\n ? showTotal(range)\n : range.total === 0\n ? lang.paginationTotal(0)\n : lang.paginationRange(range.from, range.to, range.total);\n return (\n <span {...mergeAttrs<'span'>({ sx: paginationBarStyles.total }, propsTotal)}>\n {content}\n </span>\n );\n }\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [paginationBarStyles.root, fontSizeStyles[size]] }, rest)}>\n {renderTotal()}\n <div {...mergeAttrs<'div'>({ sx: paginationBarStyles.controls }, propsControls)}>\n <Pagination\n {...mergePartProps<PaginationProps>({ size }, propsPagination)}\n _page={page}\n total={total}\n pageSize={pageSize}\n />\n {showSizeSelect && (\n <PageSizeSelect\n {...mergePartProps<PageSizeSelectProps>(\n { options: pageSizeOptions },\n propsSizeSelect,\n { onSizeChange: () => (page = 1) },\n )}\n _value={pageSize}\n />\n )}\n {showJump && pageCount > 1 && (\n <PageJump\n {...mergePartProps<PageJumpProps>(\n { pageCount, size, sx: paginationBarStyles.jump },\n propsJump,\n )}\n _page={page}\n />\n )}\n </div>\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;AAgEA,IAAa,sBAAsB,IAAI,OAAO;CAE5C,MAAM;EACJ,eAAe;EACf,SAAS;EACT,UAAU;EACV,YAAY;EACZ,gBAAgB;EAChB,QAAQ;EACR,WAAW;CACb;CACA,OAAO;EACL,WAAW;GAAE,SAAS;GAAQ,gCAAgC;EAAO;EACrE,OAAO;EACP,oBAAoB;CACtB;CACA,UAAU;EACR,SAAS;EACT,UAAU;EACV,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,mBAAmB;CACrB;CACA,MAAM,EAAE,SAAS;EAAE,SAAS;EAAe,gCAAgC;CAAO,EAAE;AACtF,CAAC;;AAGD,IAAa,gBAAgB,0BAC3B,QAAA,SAe0B;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,OAAAA,SAAA,QAAA,eAdA,GAAC,KAAA,IAAA;CAAA,MAAA,WAAAA,SAAA,QAAA,mBACO,IAAE,KAAA,IAAA;CAAA,MAAA,QAAAC,aAAA,QAAA,OAAA;CAAA,MAAA,kBAAAA,aAAA,QAAA,iBAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,aAGtB,IAAI;CAAA,MAAA,iBAAAA,aAAA,QAAA,kBACC,IAAI;CAAA,MAAA,WAAAA,aAAA,QAAA,YACV,IAAI;CAAA,MAAA,OAAAA,aAAA,QAAA,QACR,IAAI;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,gBAAAA,aAAA,QAAA,eAAA;CAAA,MAAA,kBAAAA,aAAA,QAAA,iBAAA;CAAA,MAAA,kBAAAA,aAAA,QAAA,iBAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAMR,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CACrB,MAAM,YAASC,eAAY,KAAK,IAAI,GAAG,KAAK,KAAK,MAAA,QAAA,SAAA,KAAgB,CAAC,CAAC;CAEnE,MAAM,QAAKA,eAAgC;EACzC,MAAM,UAAU,MAAK,KAAA,OAAO,GAAC,UAAA,KAAW;EACxC,OAAO,MAAA,UAAU,IACb;GAAE,MAAM;GAAG,IAAI;GAAG,OAAK,MAAA;EAAC,IACxB;GACE,OAAO,UAAU,KAAC,SAAA,QAAe;GACjC,IAAI,KAAK,IAAI,UAAO,SAAA,OAAW,MAAA,KAAO;GACtC,OAAK,MAAA;EACP;CACN,CAAC;CAED,SAAS,cAAc;EACrB,IAAI,CAAA,UAAA,OAAY,OAAO;EACvB,MAAM,UACJ,OAAA,UAAA,UAAqB,aACjB,UAAA,MAAA,MAAA,KAAe,IACf,MAAA,MAAM,UAAU,IACd,KAAK,gBAAgB,CAAC,IACtB,KAAK,gBAAgB,MAAA,MAAM,MAAM,MAAA,MAAM,IAAI,MAAA,MAAM,KAAK;EAC9D,OAAAC,YAAA,QACY,WAAmB,EAAE,IAAI,oBAAoB,MAAM,GAAC,WAAA,KAAY,GAAC,CACxE,OAAO,CAAA;CAGd;CAEA,aAAOA,YAAA,OACI,WAAkB,EAAE,IAAI,CAAC,oBAAoB,MAAM,eAAc,KAAA,MAAM,EAAE,GAAG,IAAI,GAAC,CACvF,YAAY,GAACA,YAAA,OACL,WAAkB,EAAE,IAAI,oBAAoB,SAAS,GAAC,cAAA,KAAe,GAAC;EAAAA,YAAA,YAAAC,
|
|
1
|
+
{"version":3,"file":"PaginationBar.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/navigation/PaginationBar.tsx"],"sourcesContent":["/**\n * 分页栏:表格、列表下方的一整行,起始边是“第 1–20 条,共 320 条”,结束边是页码、每页条数、跳页。\n * 拼的是 Pagination、PageSizeSelect、PageJump,换每页条数时回到第 1 页。\n *\n * <PaginationBar _page={page} _pageSize={size} total={320} />\n * <PaginationBar _page={tasks.page} _pageSize={tasks.pageSize} total={tasks.total} /> 接 useTableQuery\n *\n * 占满所在的行;窄于 36em 时不显示跳页,窄于 24em 时总数单独一行。只要其中几样时用 showTotal / showSizeSelect / showJump 关掉,\n * 或者直接并排三个组件。\n *\n * 部件:Root(div)、Total(span)、Controls(div)、Pagination、SizeSelect(PageSizeSelect)、Jump(PageJump)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { clamp } from '../utils/data/number';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport { PageJump, type PageJumpProps } from './PageJump';\nimport { PageSizeSelect, type PageSizeSelectProps } from './PageSizeSelect';\nimport { Pagination, type PaginationProps } from './Pagination';\n\n/** 当前页显示的是哪几条 */\nexport interface PageRange {\n /** 第一条的序号,从 1 开始;没有数据时是 0 */\n from: number;\n /** 最后一条的序号 */\n to: number;\n /** 总条数 */\n total: number;\n}\n\n/** 未声明的属性落到外层 div 上;分页导航的名称用 propsPagination 的 aria-label */\nexport interface PaginationBarProps extends PartProps<'div'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 每页条数:父级写 _pageSize={x},默认 10 */\n _pageSize?: number;\n /** 总条数 */\n total: number;\n /** 每页条数的选项,默认 [10, 20, 50, 100] */\n pageSizeOptions?: readonly number[];\n /** 起始边的总数:默认 true(“第 1–20 条,共 320 条”),也可以给函数自己写 */\n showTotal?: boolean | ((range: PageRange) => VNodeChild);\n /** 每页条数选择,默认 true */\n showSizeSelect?: boolean;\n /** 跳页,默认 true(窄于 36em 时不显示) */\n showJump?: boolean;\n /** 字号档位,各部分随之缩放,默认 sm */\n size?: TextSize;\n /** 总数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n /** 结束边那一组(页码、条数、跳页)的部件属性 */\n propsControls?: PartProps<'div'>;\n /** 页码(Pagination)的部件属性 */\n propsPagination?: Partial<PaginationProps>;\n /** 每页条数(PageSizeSelect)的部件属性 */\n propsSizeSelect?: Partial<PageSizeSelectProps>;\n /** 跳页(PageJump)的部件属性 */\n propsJump?: Partial<PageJumpProps>;\n}\n\n/** PaginationBar 的样式:root、total、controls、jump */\nexport const paginationBarStyles = css.create({\n // 按自己的宽度决定显示什么:放在侧栏、卡片里时也合适\n root: {\n containerType: 'inline-size',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n rowGap: '_sm',\n columnGap: '_md',\n },\n total: {\n flexBasis: { default: 'auto', '@container (max-width: 24em)': '100%' },\n color: '_textMuted',\n fontVariantNumeric: 'tabular-nums',\n },\n controls: {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n rowGap: '_sm',\n columnGap: '_md',\n marginInlineStart: 'auto',\n },\n jump: { display: { default: 'inline-flex', '@container (max-width: 36em)': 'none' } },\n});\n\n/** 分页栏:总数、页码、每页条数、跳页 */\nexport const PaginationBar = _component(\n ({\n _page: page = _bindable(1),\n _pageSize: pageSize = _bindable(10),\n total,\n pageSizeOptions,\n showTotal = true,\n showSizeSelect = true,\n showJump = true,\n size = 'sm',\n propsTotal,\n propsControls,\n propsPagination,\n propsSizeSelect,\n propsJump,\n ...rest\n }: PaginationBarProps) => {\n const lang = useLang();\n const pageCount = _derived(Math.max(1, Math.ceil(total / pageSize)));\n // 总数变少(筛选后)时父级的 page 可能超出范围:显示时夹回去,同 Pagination\n const range = _derived.by((): PageRange => {\n const current = clamp(page, 1, pageCount);\n return total === 0\n ? { from: 0, to: 0, total }\n : {\n from: (current - 1) * pageSize + 1,\n to: Math.min(current * pageSize, total),\n total,\n };\n });\n\n function renderTotal() {\n if (!showTotal) return null;\n const content =\n typeof showTotal === 'function'\n ? showTotal(range)\n : range.total === 0\n ? lang.paginationTotal(0)\n : lang.paginationRange(range.from, range.to, range.total);\n return (\n <span {...mergeAttrs<'span'>({ sx: paginationBarStyles.total }, propsTotal)}>\n {content}\n </span>\n );\n }\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [paginationBarStyles.root, fontSizeStyles[size]] }, rest)}>\n {renderTotal()}\n <div {...mergeAttrs<'div'>({ sx: paginationBarStyles.controls }, propsControls)}>\n <Pagination\n {...mergePartProps<PaginationProps>({ size }, propsPagination)}\n _page={page}\n total={total}\n pageSize={pageSize}\n />\n {showSizeSelect && (\n <PageSizeSelect\n {...mergePartProps<PageSizeSelectProps>(\n { options: pageSizeOptions },\n propsSizeSelect,\n { onSizeChange: () => (page = 1) },\n )}\n _value={pageSize}\n />\n )}\n {showJump && pageCount > 1 && (\n <PageJump\n {...mergePartProps<PageJumpProps>(\n { pageCount, size, sx: paginationBarStyles.jump },\n propsJump,\n )}\n _page={page}\n />\n )}\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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"}
|
package/dist/navigation/Steps.js
CHANGED
|
@@ -9,8 +9,8 @@ import { ButtonBase } from "../base/ButtonBase.js";
|
|
|
9
9
|
import { useRouterLink } from "../utils/dom/link.js";
|
|
10
10
|
import { statusIcons } from "../utils/style/tone-styles.js";
|
|
11
11
|
import { FlexOrderedList } from "../layout/Flex.js";
|
|
12
|
-
import { createVNode, isVNode
|
|
13
|
-
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
12
|
+
import { createVNode, isVNode } 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 { Check } from "@lucide/icons";
|
|
16
16
|
//#region src/navigation/Steps.tsx
|
|
@@ -146,7 +146,7 @@ var Steps = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
146
146
|
return () => {
|
|
147
147
|
let _slot2;
|
|
148
148
|
const vertical = orientation.value === "vertical";
|
|
149
|
-
return createVNode(FlexOrderedList,
|
|
149
|
+
return createVNode(FlexOrderedList, mergeJsxProps(mergePartProps({
|
|
150
150
|
direction: vertical ? "column" : "row",
|
|
151
151
|
gap: vertical ? "lg" : "sm",
|
|
152
152
|
sx: size.value && fontSizeStyles[size.value]
|
|
@@ -161,7 +161,7 @@ var Steps = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
161
161
|
const reachable = state === "complete" && !item.disabled;
|
|
162
162
|
const link = reachable && item.href != null;
|
|
163
163
|
const button = reachable && !link && navigable.value;
|
|
164
|
-
return createVNode("li",
|
|
164
|
+
return createVNode("li", mergeJsxProps({ "key": item.key ?? index }, mergeAttrs({ sx: [stepsStyles.item, vertical && stepsStyles.itemVertical] }, own, { "aria-current": state === "current" ? "step" : void 0 }), { "data-state": state }), [link ? createVNode("a", mergeAttrs({ sx: [
|
|
165
165
|
stepsStyles.trigger,
|
|
166
166
|
stepsStyles.link,
|
|
167
167
|
focusRingStyles.visible
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Steps.js","names":["_isVNode","_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/navigation/Steps.tsx"],"sourcesContent":["/**\n * 步骤条(ol):多步流程里的位置(下单、注册、配置向导、任务的流转)。当前步骤带 aria-current=\"step\",\n * 已完成的步骤显示对勾(Lucide 的 Check),出错的步骤显示警示图标;已完成、未开始、出错另有读屏文字,不只靠颜色。\n *\n * <Steps current={1} items={[{ title: '填写信息' }, { title: '确认订单' }, { title: '完成' }]} />\n * <Steps _current={step} items={items} navigable /> 已完成的步骤可以点回去\n * <Steps current={2} items={[{ title: '概览', href: '/task/1' }, …]} /> 已完成的步骤是链接\n *\n * 每一步的状态默认按 current 推出(之前已完成、当前、之后未开始),item 的 status 可以改:出错的一步、非线性的流程。\n */\nimport { Check } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { ButtonBase, type ButtonBaseProps } from '../base/ButtonBase';\nimport { Icon, type IconData } from '../base/Icon';\nimport { VisuallyHidden } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { useRouterLink } from '../utils/dom/link';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { statusIcons } from '../utils/style/tone-styles';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport { FlexOrderedList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 步骤条方向 */\nexport interface StepsOrientations {\n /** 横排(默认) */\n horizontal: unknown;\n /** 竖排:步骤多、说明长时;步骤之间有竖的连接线 */\n vertical: unknown;\n}\n\n/** 步骤的状态 */\nexport interface StepStates {\n /** 已完成:对勾、品牌色 */\n complete: unknown;\n /** 当前:aria-current=\"step\" */\n current: unknown;\n /** 未开始 */\n upcoming: unknown;\n /** 出错:警示图标、危险色 */\n error: unknown;\n}\n\n/** 步骤的状态:已完成、当前、未开始、出错 */\nexport type StepState = keyof StepStates;\n\n/** 一个步骤 */\nexport interface StepItem {\n /** 唯一的 key;不写时用位置 */\n key?: string;\n /** 标题 */\n title: VNodeChild;\n /** 说明(标题下面的小字) */\n description?: VNodeChild;\n /** 代替序号的图标;已完成时仍显示对勾,出错时仍显示警示图标 */\n icon?: IconData;\n /** 状态;不写时按 current 推出 */\n status?: StepState;\n /** 地址:已完成的这一步渲染成链接(走路由适配),点了跳过去 */\n href?: string;\n /** 不可点回(即使已完成、有 href 或 navigable) */\n disabled?: boolean;\n}\n\n/** 未声明的属性落到 ol 上;aria-label 是步骤条的名称 */\nexport interface StepsProps extends PartProps<'ol'> {\n /** 步骤 */\n items: readonly StepItem[];\n /** 当前步骤的序号,从 0 开始:父级可以写 _current={x},配合 navigable 点回已完成的步骤 */\n _current?: number;\n /** 方向,默认 horizontal */\n orientation?: keyof StepsOrientations;\n /** 字号档位:圆圈、文字随之缩放;不写时继承上下文字号 */\n size?: TextSize;\n /** 已完成的步骤可以点击回去:点了写回 current */\n navigable?: boolean;\n /** 每个步骤(li)的部件属性,可以按项计算 */\n propsItem?: PartProps<'li'> | ((item: StepItem, index: number) => PartProps<'li'>);\n /** 序号圆圈的部件属性 */\n propsIndicator?: PartProps<'span'>;\n /** 可点回的步骤外层(按钮,或有 href 时的链接)的部件属性 */\n propsTrigger?: Partial<ButtonBaseProps> & PartProps<'a'>;\n /** 文字区(标题与说明的容器)的部件属性 */\n propsText?: PartProps<'span'>;\n /** 标题的部件属性 */\n propsTitle?: PartProps<'span'>;\n /** 说明的部件属性 */\n propsDescription?: PartProps<'span'>;\n /** 步骤之间连接线的部件属性 */\n propsConnector?: PartProps<'span'>;\n}\n\n/** Steps 的样式:item、itemVertical、trigger、link、indicator、text、title、description、connector 等 */\nexport const stepsStyles = css.create({\n item: {\n display: 'flex',\n flexGrow: 1,\n flexBasis: 0,\n alignItems: 'flex-start',\n gap: '_sm',\n minWidth: 0,\n },\n // 竖排:高度随内容,连接线相对这一项定位\n itemVertical: { flexGrow: 0, flexBasis: 'auto', position: 'relative' },\n // 可点回的步骤:整块是按钮或链接\n // 去掉按钮默认外观、焦点环、波纹由 ButtonBase 给出\n trigger: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '_sm',\n borderRadius: '_sm',\n textAlign: 'start',\n },\n link: { color: 'inherit', textDecorationLine: 'none' },\n indicator: {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n width: '2em',\n height: '2em',\n borderWidth: '_xs',\n borderStyle: 'solid',\n borderRadius: '_full',\n // 用 em 而不是 _sm(默认字号下 13 / 14 ≈ 0.93):随 size 缩放\n fontSize: '0.93em',\n fontWeight: '_semibold',\n // 走到下一步时圆圈换色、连接线变色都过渡,不是一下跳过去\n transition: `background-color ${t.durations.md} ${t.easings.standard}, border-color ${t.durations.md} ${t.easings.standard}, color ${t.durations.md} ${t.easings.standard}`,\n },\n text: { display: 'grid', gap: '_xs', paddingTop: '0.3em', minWidth: 0 },\n title: { fontWeight: '_medium' },\n description: { color: '_textMuted', fontSize: '0.93em' },\n // 步骤之间的连接线:横排在标题右侧延伸\n connector: {\n flexGrow: 1,\n alignSelf: 'center',\n minWidth: '_space.lg',\n height: '_borderWidths.xs',\n backgroundColor: '_border',\n transition: `background-color ${t.durations.md} ${t.easings.standard}`,\n },\n // 竖排:从圆圈下面一直连到下一步的圆圈(圆圈宽 2 × 0.93em,中线在 0.93em)\n connectorVertical: {\n position: 'absolute',\n insetInlineStart: '0.93em',\n insetBlockStart: `calc(1.86em + ${t.space.xs})`,\n insetBlockEnd: `calc(-1 * ${t.space.lg} + ${t.space.xs})`,\n width: '_borderWidths.xs',\n height: 'auto',\n minWidth: 0,\n // 两端都定了位置时按 align-self 对齐:横排的 center 会让空的 span 缩成 0 高,这里要拉伸\n alignSelf: 'stretch',\n marginInlineStart: `calc(${t.borderWidths.xs} / -2)`,\n },\n connectorDone: { backgroundColor: '_accent' },\n});\n\n/** Steps 的样式:complete、current、upcoming、error */\nexport const stepsStateStyles = css.create({\n complete: { borderColor: '_accent', backgroundColor: '_accent', color: '_accentContrast' },\n current: { borderColor: '_accent', color: '_accentText' },\n upcoming: { borderColor: '_border', color: '_textMuted' },\n error: { borderColor: '_danger', backgroundColor: '_dangerSoft', color: '_dangerText' },\n});\n\n/** 步骤条:已完成、当前、未开始、出错;已完成的步骤可以点回去或是链接 */\nexport const Steps = _component(\n ({\n items,\n _current: current = _bindable(0),\n orientation = 'horizontal',\n size,\n navigable = false,\n propsItem,\n propsIndicator,\n propsTrigger,\n propsText,\n propsTitle,\n propsDescription,\n propsConnector,\n ...rest\n }: StepsProps) => {\n const lang = useLang();\n const router = useRouterLink();\n return () => {\n const vertical = orientation === 'vertical';\n return (\n <FlexOrderedList\n {...mergePartProps<FlexProps<'ol'>>(\n {\n direction: vertical ? 'column' : 'row',\n gap: vertical ? 'lg' : 'sm',\n sx: size && fontSizeStyles[size],\n },\n rest,\n )}\n data-orientation={orientation}\n >\n {items.map((item, index) => {\n const state: StepState =\n item.status ??\n (index < current ? 'complete' : index === current ? 'current' : 'upcoming');\n const own = typeof propsItem === 'function' ? propsItem(item, index) : propsItem;\n const content = [\n <span\n {...mergeAttrs<'span'>({ sx: stepsStyles.indicator }, propsIndicator, {\n sx: stepsStateStyles[state],\n 'aria-hidden': true,\n })}\n >\n {state === 'complete' ? (\n <Icon icon={Check} />\n ) : state === 'error' ? (\n <Icon icon={statusIcons.danger} />\n ) : item.icon ? (\n <Icon icon={item.icon} />\n ) : (\n index + 1\n )}\n </span>,\n <span {...mergeAttrs<'span'>({ sx: stepsStyles.text }, propsText)}>\n <span {...mergeAttrs<'span'>({ sx: stepsStyles.title }, propsTitle)}>\n {item.title}\n {/* 当前步骤由 aria-current 念出,其余的状态补一句文字:不只靠颜色与图标 */}\n {state !== 'current' && <VisuallyHidden>{lang.stepState(state)}</VisuallyHidden>}\n </span>\n {item.description != null && (\n <span {...mergeAttrs<'span'>({ sx: stepsStyles.description }, propsDescription)}>\n {item.description}\n </span>\n )}\n </span>,\n ];\n const reachable = state === 'complete' && !item.disabled;\n const link = reachable && item.href != null;\n const button = reachable && !link && navigable;\n return (\n <li\n key={item.key ?? index}\n {...mergeAttrs<'li'>(\n { sx: [stepsStyles.item, vertical && stepsStyles.itemVertical] },\n own,\n { 'aria-current': state === 'current' ? 'step' : undefined },\n )}\n data-state={state}\n >\n {link ? (\n <a\n {...mergeAttrs<'a'>(\n { sx: [stepsStyles.trigger, stepsStyles.link, focusRingStyles.visible] },\n propsTrigger,\n {\n href: router.href(item.href!),\n onClick: (event: MouseEvent) => router.onClick(event, item.href!),\n },\n )}\n >\n {content}\n </a>\n ) : button ? (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>({ sx: stepsStyles.trigger }, propsTrigger, {\n onClick: () => (current = index),\n })}\n >\n {content}\n </ButtonBase>\n ) : (\n content\n )}\n {index < items.length - 1 && (\n <span\n {...mergeAttrs<'span'>(\n { sx: [stepsStyles.connector, vertical && stepsStyles.connectorVertical] },\n propsConnector,\n {\n sx: state === 'complete' && stepsStyles.connectorDone,\n 'aria-hidden': true,\n },\n )}\n />\n )}\n </li>\n );\n })}\n </FlexOrderedList>\n );\n };\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Steps.js","names":["_isVNode","_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/navigation/Steps.tsx"],"sourcesContent":["/**\n * 步骤条(ol):多步流程里的位置(下单、注册、配置向导、任务的流转)。当前步骤带 aria-current=\"step\",\n * 已完成的步骤显示对勾(Lucide 的 Check),出错的步骤显示警示图标;已完成、未开始、出错另有读屏文字,不只靠颜色。\n *\n * <Steps current={1} items={[{ title: '填写信息' }, { title: '确认订单' }, { title: '完成' }]} />\n * <Steps _current={step} items={items} navigable /> 已完成的步骤可以点回去\n * <Steps current={2} items={[{ title: '概览', href: '/task/1' }, …]} /> 已完成的步骤是链接\n *\n * 每一步的状态默认按 current 推出(之前已完成、当前、之后未开始),item 的 status 可以改:出错的一步、非线性的流程。\n */\nimport { Check } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { ButtonBase, type ButtonBaseProps } from '../base/ButtonBase';\nimport { Icon, type IconData } from '../base/Icon';\nimport { VisuallyHidden } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { useRouterLink } from '../utils/dom/link';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { statusIcons } from '../utils/style/tone-styles';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport { FlexOrderedList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 步骤条方向 */\nexport interface StepsOrientations {\n /** 横排(默认) */\n horizontal: unknown;\n /** 竖排:步骤多、说明长时;步骤之间有竖的连接线 */\n vertical: unknown;\n}\n\n/** 步骤的状态 */\nexport interface StepStates {\n /** 已完成:对勾、品牌色 */\n complete: unknown;\n /** 当前:aria-current=\"step\" */\n current: unknown;\n /** 未开始 */\n upcoming: unknown;\n /** 出错:警示图标、危险色 */\n error: unknown;\n}\n\n/** 步骤的状态:已完成、当前、未开始、出错 */\nexport type StepState = keyof StepStates;\n\n/** 一个步骤 */\nexport interface StepItem {\n /** 唯一的 key;不写时用位置 */\n key?: string;\n /** 标题 */\n title: VNodeChild;\n /** 说明(标题下面的小字) */\n description?: VNodeChild;\n /** 代替序号的图标;已完成时仍显示对勾,出错时仍显示警示图标 */\n icon?: IconData;\n /** 状态;不写时按 current 推出 */\n status?: StepState;\n /** 地址:已完成的这一步渲染成链接(走路由适配),点了跳过去 */\n href?: string;\n /** 不可点回(即使已完成、有 href 或 navigable) */\n disabled?: boolean;\n}\n\n/** 未声明的属性落到 ol 上;aria-label 是步骤条的名称 */\nexport interface StepsProps extends PartProps<'ol'> {\n /** 步骤 */\n items: readonly StepItem[];\n /** 当前步骤的序号,从 0 开始:父级可以写 _current={x},配合 navigable 点回已完成的步骤 */\n _current?: number;\n /** 方向,默认 horizontal */\n orientation?: keyof StepsOrientations;\n /** 字号档位:圆圈、文字随之缩放;不写时继承上下文字号 */\n size?: TextSize;\n /** 已完成的步骤可以点击回去:点了写回 current */\n navigable?: boolean;\n /** 每个步骤(li)的部件属性,可以按项计算 */\n propsItem?: PartProps<'li'> | ((item: StepItem, index: number) => PartProps<'li'>);\n /** 序号圆圈的部件属性 */\n propsIndicator?: PartProps<'span'>;\n /** 可点回的步骤外层(按钮,或有 href 时的链接)的部件属性 */\n propsTrigger?: Partial<ButtonBaseProps> & PartProps<'a'>;\n /** 文字区(标题与说明的容器)的部件属性 */\n propsText?: PartProps<'span'>;\n /** 标题的部件属性 */\n propsTitle?: PartProps<'span'>;\n /** 说明的部件属性 */\n propsDescription?: PartProps<'span'>;\n /** 步骤之间连接线的部件属性 */\n propsConnector?: PartProps<'span'>;\n}\n\n/** Steps 的样式:item、itemVertical、trigger、link、indicator、text、title、description、connector 等 */\nexport const stepsStyles = css.create({\n item: {\n display: 'flex',\n flexGrow: 1,\n flexBasis: 0,\n alignItems: 'flex-start',\n gap: '_sm',\n minWidth: 0,\n },\n // 竖排:高度随内容,连接线相对这一项定位\n itemVertical: { flexGrow: 0, flexBasis: 'auto', position: 'relative' },\n // 可点回的步骤:整块是按钮或链接\n // 去掉按钮默认外观、焦点环、波纹由 ButtonBase 给出\n trigger: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '_sm',\n borderRadius: '_sm',\n textAlign: 'start',\n },\n link: { color: 'inherit', textDecorationLine: 'none' },\n indicator: {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n width: '2em',\n height: '2em',\n borderWidth: '_xs',\n borderStyle: 'solid',\n borderRadius: '_full',\n // 用 em 而不是 _sm(默认字号下 13 / 14 ≈ 0.93):随 size 缩放\n fontSize: '0.93em',\n fontWeight: '_semibold',\n // 走到下一步时圆圈换色、连接线变色都过渡,不是一下跳过去\n transition: `background-color ${t.durations.md} ${t.easings.standard}, border-color ${t.durations.md} ${t.easings.standard}, color ${t.durations.md} ${t.easings.standard}`,\n },\n text: { display: 'grid', gap: '_xs', paddingTop: '0.3em', minWidth: 0 },\n title: { fontWeight: '_medium' },\n description: { color: '_textMuted', fontSize: '0.93em' },\n // 步骤之间的连接线:横排在标题右侧延伸\n connector: {\n flexGrow: 1,\n alignSelf: 'center',\n minWidth: '_space.lg',\n height: '_borderWidths.xs',\n backgroundColor: '_border',\n transition: `background-color ${t.durations.md} ${t.easings.standard}`,\n },\n // 竖排:从圆圈下面一直连到下一步的圆圈(圆圈宽 2 × 0.93em,中线在 0.93em)\n connectorVertical: {\n position: 'absolute',\n insetInlineStart: '0.93em',\n insetBlockStart: `calc(1.86em + ${t.space.xs})`,\n insetBlockEnd: `calc(-1 * ${t.space.lg} + ${t.space.xs})`,\n width: '_borderWidths.xs',\n height: 'auto',\n minWidth: 0,\n // 两端都定了位置时按 align-self 对齐:横排的 center 会让空的 span 缩成 0 高,这里要拉伸\n alignSelf: 'stretch',\n marginInlineStart: `calc(${t.borderWidths.xs} / -2)`,\n },\n connectorDone: { backgroundColor: '_accent' },\n});\n\n/** Steps 的样式:complete、current、upcoming、error */\nexport const stepsStateStyles = css.create({\n complete: { borderColor: '_accent', backgroundColor: '_accent', color: '_accentContrast' },\n current: { borderColor: '_accent', color: '_accentText' },\n upcoming: { borderColor: '_border', color: '_textMuted' },\n error: { borderColor: '_danger', backgroundColor: '_dangerSoft', color: '_dangerText' },\n});\n\n/** 步骤条:已完成、当前、未开始、出错;已完成的步骤可以点回去或是链接 */\nexport const Steps = _component(\n ({\n items,\n _current: current = _bindable(0),\n orientation = 'horizontal',\n size,\n navigable = false,\n propsItem,\n propsIndicator,\n propsTrigger,\n propsText,\n propsTitle,\n propsDescription,\n propsConnector,\n ...rest\n }: StepsProps) => {\n const lang = useLang();\n const router = useRouterLink();\n return () => {\n const vertical = orientation === 'vertical';\n return (\n <FlexOrderedList\n {...mergePartProps<FlexProps<'ol'>>(\n {\n direction: vertical ? 'column' : 'row',\n gap: vertical ? 'lg' : 'sm',\n sx: size && fontSizeStyles[size],\n },\n rest,\n )}\n data-orientation={orientation}\n >\n {items.map((item, index) => {\n const state: StepState =\n item.status ??\n (index < current ? 'complete' : index === current ? 'current' : 'upcoming');\n const own = typeof propsItem === 'function' ? propsItem(item, index) : propsItem;\n const content = [\n <span\n {...mergeAttrs<'span'>({ sx: stepsStyles.indicator }, propsIndicator, {\n sx: stepsStateStyles[state],\n 'aria-hidden': true,\n })}\n >\n {state === 'complete' ? (\n <Icon icon={Check} />\n ) : state === 'error' ? (\n <Icon icon={statusIcons.danger} />\n ) : item.icon ? (\n <Icon icon={item.icon} />\n ) : (\n index + 1\n )}\n </span>,\n <span {...mergeAttrs<'span'>({ sx: stepsStyles.text }, propsText)}>\n <span {...mergeAttrs<'span'>({ sx: stepsStyles.title }, propsTitle)}>\n {item.title}\n {/* 当前步骤由 aria-current 念出,其余的状态补一句文字:不只靠颜色与图标 */}\n {state !== 'current' && <VisuallyHidden>{lang.stepState(state)}</VisuallyHidden>}\n </span>\n {item.description != null && (\n <span {...mergeAttrs<'span'>({ sx: stepsStyles.description }, propsDescription)}>\n {item.description}\n </span>\n )}\n </span>,\n ];\n const reachable = state === 'complete' && !item.disabled;\n const link = reachable && item.href != null;\n const button = reachable && !link && navigable;\n return (\n <li\n key={item.key ?? index}\n {...mergeAttrs<'li'>(\n { sx: [stepsStyles.item, vertical && stepsStyles.itemVertical] },\n own,\n { 'aria-current': state === 'current' ? 'step' : undefined },\n )}\n data-state={state}\n >\n {link ? (\n <a\n {...mergeAttrs<'a'>(\n { sx: [stepsStyles.trigger, stepsStyles.link, focusRingStyles.visible] },\n propsTrigger,\n {\n href: router.href(item.href!),\n onClick: (event: MouseEvent) => router.onClick(event, item.href!),\n },\n )}\n >\n {content}\n </a>\n ) : button ? (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>({ sx: stepsStyles.trigger }, propsTrigger, {\n onClick: () => (current = index),\n })}\n >\n {content}\n </ButtonBase>\n ) : (\n content\n )}\n {index < items.length - 1 && (\n <span\n {...mergeAttrs<'span'>(\n { sx: [stepsStyles.connector, vertical && stepsStyles.connectorVertical] },\n propsConnector,\n {\n sx: state === 'complete' && stepsStyles.connectorDone,\n 'aria-hidden': true,\n },\n )}\n />\n )}\n </li>\n );\n })}\n </FlexOrderedList>\n );\n };\n },\n);\n"],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ import { Text as Text$1 } from "../base/Text.js";
|
|
|
7
7
|
import { FlexList } from "../layout/Flex.js";
|
|
8
8
|
import { useScrollSpy } from "../utils/dom/scroll-spy.js";
|
|
9
9
|
import { useActiveIndicator } from "../utils/motion/active-indicator.js";
|
|
10
|
-
import { createVNode,
|
|
11
|
-
import { _component, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
10
|
+
import { createVNode, shallowRef, useId } from "vue";
|
|
11
|
+
import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
12
12
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
13
13
|
//#region src/navigation/TableOfContents.tsx
|
|
14
14
|
/** 未声明的属性落到 nav 上;原生的 title 属性(悬停提示)让给目录的标题 */
|
|
@@ -77,18 +77,18 @@ var TableOfContents = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
77
77
|
axis: "vertical",
|
|
78
78
|
value: current.value
|
|
79
79
|
}));
|
|
80
|
-
return () => createVNode("nav", mergeAttrs({}, rest, { "aria-labelledby": titleId }), [createVNode(Text$1,
|
|
80
|
+
return () => createVNode("nav", mergeAttrs({}, rest, { "aria-labelledby": titleId }), [createVNode(Text$1, mergeJsxProps(mergePartProps({
|
|
81
81
|
sx: tableOfContentsStyles.title,
|
|
82
82
|
size: "sm",
|
|
83
83
|
weight: "semibold"
|
|
84
84
|
}, propsTitle.value, { id: titleId }), { "key": "__site0" }), {
|
|
85
85
|
default: () => [title.value ?? lang.tableOfContents],
|
|
86
86
|
$stable: true
|
|
87
|
-
}), createVNode(FlexList,
|
|
87
|
+
}), createVNode(FlexList, mergeJsxProps(mergePartProps({
|
|
88
88
|
sx: tableOfContentsStyles.list,
|
|
89
89
|
direction: "column"
|
|
90
90
|
}, propsList.value, { ref: (value) => list.value = toElement(value) }), { "key": "__site1" }), {
|
|
91
|
-
default: () => [current.value !== void 0 && createVNode("span",
|
|
91
|
+
default: () => [current.value !== void 0 && createVNode("span", mergeJsxProps(mergeAttrs({ sx: tableOfContentsStyles.indicator }), {
|
|
92
92
|
"ref": indicator,
|
|
93
93
|
"aria-hidden": "true"
|
|
94
94
|
}), null), items.value.map((item) => createVNode("li", { "key": item.id }, [createVNode("a", mergeAttrs({ sx: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableOfContents.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_createVNode","Text","_mergeProps"],"sources":["../../src/navigation/TableOfContents.tsx"],"sourcesContent":["/**\n * 本页目录:列出页面的各节标题,滚动时高亮正在读的一节(useScrollSpy),侧边的指示条滑过去(useActiveIndicator)。\n *\n * <TableOfContents items={[{ id: 'install', label: '安装', level: 2 }, …]} />\n *\n * 目录项可以手写,也可以在页面渲染后用 collectHeadings(article) 从带 id 的标题收集。\n * 链接是普通的页内锚点(#install):标题的 scroll-margin 让开粘性顶栏(layoutVars.stickyOffset)。\n * 当前节的链接带 aria-current=\"location\"。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { Text, type TextProps } from '../base/Text';\nimport { useLang } from '../config/context';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { toElement } from '../utils/dom/element';\nimport { useScrollSpy, type HeadingEntry } from '../utils/dom/scroll-spy';\nimport { useActiveIndicator } from '../utils/motion/active-indicator';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { t } from '../config/theme/tokens';\n\n/** 未声明的属性落到 nav 上;原生的 title 属性(悬停提示)让给目录的标题 */\nexport interface TableOfContentsProps extends PartProps<'nav', 'aria-labelledby' | 'title'> {\n /** 目录项:标题的 id、文字与级别(2 级起,每深一级多缩进一档) */\n items: readonly HeadingEntry[];\n /** 目录的标题,同时是导航的名称;默认取语言包(本页目录) */\n title?: VNodeChild;\n /** 页面在哪个容器里滚动;不写时是窗口 */\n scrollRoot?: HTMLElement | null;\n /** 标题的部件属性 */\n propsTitle?: Partial<TextProps>;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 链接的部件属性 */\n propsLink?: PartProps<'a'>;\n}\n\n/** TableOfContents 的样式:title、list、indicator、link、current */\nexport const tableOfContentsStyles = css.create({\n title: { display: 'block', marginBlockEnd: '_sm' },\n // 指示条按链接的 offsetTop 定位:列表是它的定位容器\n list: {\n position: 'relative',\n borderInlineStartWidth: '_xs',\n borderInlineStartStyle: 'solid',\n borderInlineStartColor: '_border',\n },\n indicator: {\n position: 'absolute',\n insetBlockStart: 0,\n insetInlineStart: 0,\n // 盖住列表左边的细线\n marginInlineStart: `calc(-1 * ${t.borderWidths.xs})`,\n width: '_borderWidths.sm',\n borderRadius: '_full',\n backgroundColor: '_accent',\n },\n link: {\n display: 'block',\n paddingBlock: '_xs',\n paddingInlineEnd: '_xs',\n borderRadius: '_xs',\n color: { default: '_textMuted', ':hover': '_text' },\n fontSize: '_sm',\n lineHeight: '_snug',\n textDecoration: 'none',\n transition: `color ${t.durations.sm} ${t.easings.standard}`,\n },\n current: { color: { default: '_accentText', ':hover': '_accentText' } },\n // 按级别缩进:2 级贴着细线留一档,往下每级多一档\n indent: (level: number) => ({ paddingInlineStart: `calc(${Math.max(level - 1, 1)} * 0.75em)` }),\n});\n\n/** 本页目录(nav):滚动时高亮当前节 */\nexport const TableOfContents = _component(\n ({\n items,\n title,\n scrollRoot,\n propsTitle,\n propsList,\n propsLink,\n ...rest\n }: TableOfContentsProps) => {\n const lang = useLang();\n const titleId = useId();\n let list = _state.raw<HTMLElement | null>(null);\n let indicator = _state.raw<HTMLElement | null>(null);\n const current = useScrollSpy(() => ({\n ids: items.map((item) => item.id),\n root: scrollRoot,\n }));\n useActiveIndicator(() => ({\n container: list,\n indicator,\n active: '[aria-current=\"location\"]',\n axis: 'vertical',\n value: current.value,\n }));\n\n return () => (\n <nav {...mergeAttrs<'nav'>({}, rest, { 'aria-labelledby': titleId })}>\n <Text\n {...mergePartProps<TextProps>(\n { sx: tableOfContentsStyles.title, size: 'sm', weight: 'semibold' },\n propsTitle,\n { id: titleId },\n )}\n >\n {title ?? lang.tableOfContents}\n </Text>\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>(\n { sx: tableOfContentsStyles.list, direction: 'column' },\n propsList,\n { ref: (value: unknown) => (list = toElement(value)) },\n )}\n >\n {current.value !== undefined && (\n <span\n {...mergeAttrs<'span'>({ sx: tableOfContentsStyles.indicator })}\n ref={_toRef(indicator)}\n aria-hidden=\"true\"\n />\n )}\n {items.map((item) => (\n <li key={item.id}>\n <a\n {...mergeAttrs<'a'>(\n {\n sx: [\n tableOfContentsStyles.link,\n tableOfContentsStyles.indent(item.level),\n current.value === item.id && tableOfContentsStyles.current,\n focusRingStyles.visible,\n ],\n },\n propsLink,\n {\n href: `#${item.id}`,\n 'aria-current': current.value === item.id ? 'location' : undefined,\n },\n )}\n >\n {item.label}\n </a>\n </li>\n ))}\n </FlexList>\n </nav>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;AAuCA,IAAa,wBAAwB,IAAI,OAAO;CAC9C,OAAO;EAAE,SAAS;EAAS,gBAAgB;CAAM;CAEjD,MAAM;EACJ,UAAU;EACV,wBAAwB;EACxB,wBAAwB;EACxB,wBAAwB;CAC1B;CACA,WAAW;EACT,UAAU;EACV,iBAAiB;EACjB,kBAAkB;EAElB,mBAAmB,aAAa,EAAE,aAAa,GAAE;EACjD,OAAO;EACP,cAAc;EACd,iBAAiB;CACnB;CACA,MAAM;EACJ,SAAS;EACT,cAAc;EACd,kBAAkB;EAClB,cAAc;EACd,OAAO;GAAE,SAAS;GAAc,UAAU;EAAQ;EAClD,UAAU;EACV,YAAY;EACZ,gBAAgB;EAChB,YAAY,SAAS,EAAE,UAAU,GAAE,GAAI,EAAE,QAAQ;CACnD;CACA,SAAS,EAAE,OAAO;EAAE,SAAS;EAAe,UAAU;CAAc,EAAE;CAEtE,SAAS,WAAmB,EAAE,oBAAoB,QAAQ,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAC,YAAa;AAC/F,CAAC;;AAGD,IAAa,kBAAkB,0BAC7B,QAAA,SAQ4B;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MADvB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CACrB,MAAM,UAAU,MAAM;CACtB,IAAI,OAAIC,WAAkC,IAAI;CAC9C,IAAI,YAASA,WAAkC,IAAI;CACnD,MAAM,UAAU,oBAAoB;EAClC,KAAK,MAAA,MAAM,KAAK,SAAS,KAAK,EAAE;EAChC,MAAI,WAAA;CACN,EAAE;CACF,0BAA0B;EACxB,WAAS,KAAA;EACT,WAAS,UAAA;EACT,QAAQ;EACR,MAAM;EACN,OAAO,QAAQ;CACjB,EAAE;CAEF,aAAOC,YAAA,OACI,WAAkB,CAAC,GAAG,MAAM,EAAE,mBAAmB,QAAQ,CAAC,GAAC,CAAAA,YAAAC,QAAAC,
|
|
1
|
+
{"version":3,"file":"TableOfContents.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_createVNode","Text","_mergeProps"],"sources":["../../src/navigation/TableOfContents.tsx"],"sourcesContent":["/**\n * 本页目录:列出页面的各节标题,滚动时高亮正在读的一节(useScrollSpy),侧边的指示条滑过去(useActiveIndicator)。\n *\n * <TableOfContents items={[{ id: 'install', label: '安装', level: 2 }, …]} />\n *\n * 目录项可以手写,也可以在页面渲染后用 collectHeadings(article) 从带 id 的标题收集。\n * 链接是普通的页内锚点(#install):标题的 scroll-margin 让开粘性顶栏(layoutVars.stickyOffset)。\n * 当前节的链接带 aria-current=\"location\"。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { Text, type TextProps } from '../base/Text';\nimport { useLang } from '../config/context';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { toElement } from '../utils/dom/element';\nimport { useScrollSpy, type HeadingEntry } from '../utils/dom/scroll-spy';\nimport { useActiveIndicator } from '../utils/motion/active-indicator';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { t } from '../config/theme/tokens';\n\n/** 未声明的属性落到 nav 上;原生的 title 属性(悬停提示)让给目录的标题 */\nexport interface TableOfContentsProps extends PartProps<'nav', 'aria-labelledby' | 'title'> {\n /** 目录项:标题的 id、文字与级别(2 级起,每深一级多缩进一档) */\n items: readonly HeadingEntry[];\n /** 目录的标题,同时是导航的名称;默认取语言包(本页目录) */\n title?: VNodeChild;\n /** 页面在哪个容器里滚动;不写时是窗口 */\n scrollRoot?: HTMLElement | null;\n /** 标题的部件属性 */\n propsTitle?: Partial<TextProps>;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 链接的部件属性 */\n propsLink?: PartProps<'a'>;\n}\n\n/** TableOfContents 的样式:title、list、indicator、link、current */\nexport const tableOfContentsStyles = css.create({\n title: { display: 'block', marginBlockEnd: '_sm' },\n // 指示条按链接的 offsetTop 定位:列表是它的定位容器\n list: {\n position: 'relative',\n borderInlineStartWidth: '_xs',\n borderInlineStartStyle: 'solid',\n borderInlineStartColor: '_border',\n },\n indicator: {\n position: 'absolute',\n insetBlockStart: 0,\n insetInlineStart: 0,\n // 盖住列表左边的细线\n marginInlineStart: `calc(-1 * ${t.borderWidths.xs})`,\n width: '_borderWidths.sm',\n borderRadius: '_full',\n backgroundColor: '_accent',\n },\n link: {\n display: 'block',\n paddingBlock: '_xs',\n paddingInlineEnd: '_xs',\n borderRadius: '_xs',\n color: { default: '_textMuted', ':hover': '_text' },\n fontSize: '_sm',\n lineHeight: '_snug',\n textDecoration: 'none',\n transition: `color ${t.durations.sm} ${t.easings.standard}`,\n },\n current: { color: { default: '_accentText', ':hover': '_accentText' } },\n // 按级别缩进:2 级贴着细线留一档,往下每级多一档\n indent: (level: number) => ({ paddingInlineStart: `calc(${Math.max(level - 1, 1)} * 0.75em)` }),\n});\n\n/** 本页目录(nav):滚动时高亮当前节 */\nexport const TableOfContents = _component(\n ({\n items,\n title,\n scrollRoot,\n propsTitle,\n propsList,\n propsLink,\n ...rest\n }: TableOfContentsProps) => {\n const lang = useLang();\n const titleId = useId();\n let list = _state.raw<HTMLElement | null>(null);\n let indicator = _state.raw<HTMLElement | null>(null);\n const current = useScrollSpy(() => ({\n ids: items.map((item) => item.id),\n root: scrollRoot,\n }));\n useActiveIndicator(() => ({\n container: list,\n indicator,\n active: '[aria-current=\"location\"]',\n axis: 'vertical',\n value: current.value,\n }));\n\n return () => (\n <nav {...mergeAttrs<'nav'>({}, rest, { 'aria-labelledby': titleId })}>\n <Text\n {...mergePartProps<TextProps>(\n { sx: tableOfContentsStyles.title, size: 'sm', weight: 'semibold' },\n propsTitle,\n { id: titleId },\n )}\n >\n {title ?? lang.tableOfContents}\n </Text>\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>(\n { sx: tableOfContentsStyles.list, direction: 'column' },\n propsList,\n { ref: (value: unknown) => (list = toElement(value)) },\n )}\n >\n {current.value !== undefined && (\n <span\n {...mergeAttrs<'span'>({ sx: tableOfContentsStyles.indicator })}\n ref={_toRef(indicator)}\n aria-hidden=\"true\"\n />\n )}\n {items.map((item) => (\n <li key={item.id}>\n <a\n {...mergeAttrs<'a'>(\n {\n sx: [\n tableOfContentsStyles.link,\n tableOfContentsStyles.indent(item.level),\n current.value === item.id && tableOfContentsStyles.current,\n focusRingStyles.visible,\n ],\n },\n propsLink,\n {\n href: `#${item.id}`,\n 'aria-current': current.value === item.id ? 'location' : undefined,\n },\n )}\n >\n {item.label}\n </a>\n </li>\n ))}\n </FlexList>\n </nav>\n );\n },\n);\n"],"mappings":"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"}
|
package/dist/navigation/Tabs.js
CHANGED
|
@@ -17,8 +17,8 @@ import { plainText } from "../utils/data/text.js";
|
|
|
17
17
|
import { rovingFocus } from "../utils/dom/roving-focus.js";
|
|
18
18
|
import { Menu as Menu$1, MenuRadioGroup, MenuRadioItem } from "../overlay/Menu.js";
|
|
19
19
|
import { useActiveIndicator } from "../utils/motion/active-indicator.js";
|
|
20
|
-
import { computed, createVNode, isVNode,
|
|
21
|
-
import { _component, bindable, childrenProp, createContext, effect, forwardChildren, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
20
|
+
import { computed, createVNode, isVNode, nextTick, onBeforeUnmount, ref, shallowRef, useId, watch } from "vue";
|
|
21
|
+
import { _component, bindable, childrenProp, createContext, effect, forwardChildren, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
22
22
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
23
23
|
import { ChevronDown, ChevronLeft, ChevronRight, Plus, X } from "@lucide/icons";
|
|
24
24
|
//#region src/navigation/Tabs.tsx
|
|
@@ -139,7 +139,7 @@ var Tabs = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
139
139
|
if (current.value !== void 0) document.getElementById(tabId(current.value))?.focus();
|
|
140
140
|
})
|
|
141
141
|
});
|
|
142
|
-
return () => createVNode("div",
|
|
142
|
+
return () => createVNode("div", mergeJsxProps(mergeAttrs({ sx: [
|
|
143
143
|
tabsStyles.root,
|
|
144
144
|
orientation.value === "vertical" && tabsStyles.vertical,
|
|
145
145
|
appearance().size && fontSizeStyles[appearance().size]
|
|
@@ -345,7 +345,7 @@ var TabList = /*#__PURE__*/ _component((_props2, _ctx2) => {
|
|
|
345
345
|
label: tabs.label(value)
|
|
346
346
|
}));
|
|
347
347
|
return createVNode(Menu$1, {
|
|
348
|
-
"trigger": _cache[0] || (_cache[0] = (props) => createVNode(IconButton,
|
|
348
|
+
"trigger": _cache[0] || (_cache[0] = (props) => createVNode(IconButton, mergeJsxProps(props, {
|
|
349
349
|
"icon": ChevronDown,
|
|
350
350
|
"size": "sm",
|
|
351
351
|
"variant": "ghost",
|
|
@@ -537,7 +537,7 @@ var Tab = /*#__PURE__*/ _component((_props3, _ctx3) => {
|
|
|
537
537
|
orientation: tabs.orientation,
|
|
538
538
|
closable: !!onClose.value
|
|
539
539
|
});
|
|
540
|
-
const tab = createVNode(ButtonBase,
|
|
540
|
+
const tab = createVNode(ButtonBase, mergeJsxProps(mergePartProps({
|
|
541
541
|
...styles.root,
|
|
542
542
|
ripple: tabs.ripple
|
|
543
543
|
}, rest, {
|
|
@@ -561,7 +561,7 @@ var Tab = /*#__PURE__*/ _component((_props3, _ctx3) => {
|
|
|
561
561
|
"data-dragging": tabs.dragging === value.value || void 0
|
|
562
562
|
}), _isSlot(_slot2 = forwardChildren(_props3)) ? _slot2 : { default: () => [_slot2] });
|
|
563
563
|
if (!onClose.value) return tab;
|
|
564
|
-
return createVNode("span",
|
|
564
|
+
return createVNode("span", mergeJsxProps({ "role": "presentation" }, mergeAttrs(styles.closeWrapper)), [tab, createVNode(IconButton, mergePartProps({
|
|
565
565
|
icon: X,
|
|
566
566
|
size: "xs",
|
|
567
567
|
variant: "ghost",
|
|
@@ -606,7 +606,7 @@ var TabPanel = /*#__PURE__*/ _component((_props4, _ctx4) => {
|
|
|
606
606
|
const showContent = useLazyContent(() => tabs.value === value.value, () => tabs.lazy);
|
|
607
607
|
return () => {
|
|
608
608
|
const selected = tabs.value === value.value;
|
|
609
|
-
return createVNode("div",
|
|
609
|
+
return createVNode("div", mergeJsxProps(mergeAttrs({
|
|
610
610
|
sx: [tabPanelStyles.root, focusRingStyles.visible],
|
|
611
611
|
tabindex: 0
|
|
612
612
|
}, rest, {
|