@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
package/dist/charts/single.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { useDetachedRender } from "../overlay/detached.js";
|
|
1
2
|
import { chartDuration, createChartInstances, uniqueHighlightFilter, usePlotSeen } from "./frame.js";
|
|
2
|
-
import {
|
|
3
|
+
import { useId } from "vue";
|
|
3
4
|
import { effect } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
4
5
|
import { SingleContainer, Tooltip } from "@unovis/ts";
|
|
5
6
|
//#region src/charts/single.tsx
|
|
@@ -21,12 +22,12 @@ function useSingleChart(read) {
|
|
|
21
22
|
const id = useId();
|
|
22
23
|
const instances = createChartInstances();
|
|
23
24
|
let tooltipElement;
|
|
25
|
+
const renderDetached = useDetachedRender();
|
|
24
26
|
let container;
|
|
25
27
|
let containerElement;
|
|
26
28
|
const seen = usePlotSeen(() => read().element);
|
|
27
29
|
effect(() => () => {
|
|
28
30
|
container?.destroy();
|
|
29
|
-
if (tooltipElement) render(null, tooltipElement);
|
|
30
31
|
});
|
|
31
32
|
effect(() => {
|
|
32
33
|
const { element, ready, tooltip, build } = read();
|
|
@@ -55,7 +56,7 @@ function useSingleChart(read) {
|
|
|
55
56
|
});
|
|
56
57
|
return { tooltip(content) {
|
|
57
58
|
tooltipElement ??= document.createElement("div");
|
|
58
|
-
|
|
59
|
+
renderDetached(content, tooltipElement);
|
|
59
60
|
return tooltipElement;
|
|
60
61
|
} };
|
|
61
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single.js","names":[],"sources":["../../src/charts/single.tsx"],"sourcesContent":["/**\n * 单容器图表(环形图、桑基图、弦图)共用的绘制过程:Unovis 的 SingleContainer 只建一次,数据与配置变化时 update,\n * 卸载时 destroy;绘图区换了元素(加载、空状态之后重新出现)时容器连同组件、提示框一起重建。\n * 提示框按选择器触发,内容用 Vue 渲染进同一个元素交给 Unovis 定位。在组件 setup 里调用。\n *\n * const chart = useSingleChart(() => ({\n * element: plot, ready: !loading && rows.length > 0, tooltip,\n * build: (instance) => ({ component: …, data: rows, triggers: { [Donut.selectors.segment]: (d) => chart.tooltip(…) } }),\n * }));\n */\nimport { SingleContainer, Tooltip, type ComponentCore } from '@unovis/ts';\nimport {
|
|
1
|
+
{"version":3,"file":"single.js","names":[],"sources":["../../src/charts/single.tsx"],"sourcesContent":["/**\n * 单容器图表(环形图、桑基图、弦图)共用的绘制过程:Unovis 的 SingleContainer 只建一次,数据与配置变化时 update,\n * 卸载时 destroy;绘图区换了元素(加载、空状态之后重新出现)时容器连同组件、提示框一起重建。\n * 提示框按选择器触发,内容用 Vue 渲染进同一个元素交给 Unovis 定位。在组件 setup 里调用。\n *\n * const chart = useSingleChart(() => ({\n * element: plot, ready: !loading && rows.length > 0, tooltip,\n * build: (instance) => ({ component: …, data: rows, triggers: { [Donut.selectors.segment]: (d) => chart.tooltip(…) } }),\n * }));\n */\nimport { SingleContainer, Tooltip, type ComponentCore } from '@unovis/ts';\nimport { useId, type VNode } from 'vue';\nimport { useDetachedRender } from '../overlay/detached';\nimport { chartDuration, createChartInstances, uniqueHighlightFilter, usePlotSeen } from './frame';\n\n/** 一次绘制要的东西 */\nexport interface SingleChartBuild<D> {\n /** 配置好的组件 */\n component: ComponentCore<D>;\n /** 交给组件的数据 */\n data: D;\n /** 提示框:选择器 → 悬停的数据 → 内容(Unovis 的 Tooltip triggers) */\n triggers?: NonNullable<Tooltip['config']['triggers']>;\n /** 每次画完之后(容器的 onRenderComplete):组件要在画好之后调整的(地图的标签避让) */\n onRender?: () => void;\n}\n\n/** useSingleChart 每次读取的状态 */\nexport interface SingleChartState<D> {\n /** 绘图区元素 */\n element: HTMLElement | null;\n /** 可以画了:不在加载中、有数据 */\n ready: boolean;\n /** 显示提示框 */\n tooltip: boolean;\n /** 配置组件:instance 取跨渲染保留的实例(第一次调用时创建) */\n build: (instance: <C>(key: string, create: () => C) => C) => SingleChartBuild<D>;\n}\n\n/** useSingleChart 的返回值 */\nexport interface SingleChart {\n /** 提示框的内容渲染进同一个元素,交给 Unovis 定位 */\n tooltip(content: VNode): HTMLElement;\n}\n\n/** 单容器图表的绘制 */\nexport function useSingleChart<D>(read: () => SingleChartState<D>): SingleChart {\n const id = useId();\n const instances = createChartInstances();\n let tooltipElement: HTMLElement | undefined;\n // 提示框的内容渲染进 Unovis 管的元素:带上调用处的主题与语言,组件卸载时一起卸载\n const renderDetached = useDetachedRender();\n let container: SingleContainer<D> | undefined;\n let containerElement: HTMLElement | undefined;\n const seen = usePlotSeen(() => read().element);\n\n _effect(() => () => {\n container?.destroy();\n });\n _effect(() => {\n const { element, ready, tooltip, build } = read();\n if (!element || !ready || !seen()) return;\n // 绘图区换了元素:旧容器连同组件、提示框一起销毁,实例表清空后重新创建\n if (container && containerElement !== element) {\n container.destroy();\n container = undefined;\n instances.reset();\n }\n const { component, data, triggers, onRender } = build(instances.get);\n const tooltipBox = instances.get('tooltip', () => new Tooltip());\n tooltipBox.setConfig({ triggers: triggers ?? {} });\n const config = {\n component,\n tooltip: tooltip ? tooltipBox : undefined,\n ariaLabel: null,\n duration: chartDuration(element),\n onRenderComplete: onRender,\n };\n if (container) container.update(config, undefined, data);\n else {\n container = new SingleContainer<D>(element, config, data);\n containerElement = element;\n uniqueHighlightFilter(element, `${id}-highlight`);\n }\n });\n\n return {\n tooltip(content) {\n tooltipElement ??= document.createElement('div');\n renderDetached(content, tooltipElement);\n return tooltipElement;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA8CA,SAAgB,eAAkB,MAA8C;CAC9E,MAAM,KAAK,MAAM;CACjB,MAAM,YAAY,qBAAqB;CACvC,IAAI;CAEJ,MAAM,iBAAiB,kBAAkB;CACzC,IAAI;CACJ,IAAI;CACJ,MAAM,OAAO,kBAAkB,KAAK,CAAC,CAAC,OAAO;CAE7C,mBAAoB;EAClB,WAAW,QAAQ;CACrB,CAAC;CACD,aAAc;EACZ,MAAM,EAAE,SAAS,OAAO,SAAS,UAAU,KAAK;EAChD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,GAAG;EAEnC,IAAI,aAAa,qBAAqB,SAAS;GAC7C,UAAU,QAAQ;GAClB,YAAY,KAAA;GACZ,UAAU,MAAM;EAClB;EACA,MAAM,EAAE,WAAW,MAAM,UAAU,aAAa,MAAM,UAAU,GAAG;EACnE,MAAM,aAAa,UAAU,IAAI,iBAAiB,IAAI,QAAQ,CAAC;EAC/D,WAAW,UAAU,EAAE,UAAU,YAAY,CAAC,EAAE,CAAC;EACjD,MAAM,SAAS;GACb;GACA,SAAS,UAAU,aAAa,KAAA;GAChC,WAAW;GACX,UAAU,cAAc,OAAO;GAC/B,kBAAkB;EACpB;EACA,IAAI,WAAW,UAAU,OAAO,QAAQ,KAAA,GAAW,IAAI;OAClD;GACH,YAAY,IAAI,gBAAmB,SAAS,QAAQ,IAAI;GACxD,mBAAmB;GACnB,sBAAsB,SAAS,GAAG,GAAE,WAAY;EAClD;CACF,CAAC;CAED,OAAO,EACL,QAAQ,SAAS;EACf,mBAAmB,SAAS,cAAc,KAAK;EAC/C,eAAe,SAAS,cAAc;EACtC,OAAO;CACT,EACF;AACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Extension } from '@codemirror/state';
|
|
2
|
+
import { type PartProps } from '../utils/props';
|
|
3
|
+
import { type CodeEditorHandle } from './editor';
|
|
4
|
+
/** CodeEditor 的属性 */
|
|
5
|
+
export interface CodeEditorProps extends PartProps<'div'> {
|
|
6
|
+
/** 代码:父级写 _value={x} 双向绑定 */
|
|
7
|
+
_value?: string;
|
|
8
|
+
/** 编辑区的无障碍名称 */
|
|
9
|
+
'aria-label': string;
|
|
10
|
+
/** 语言扩展(CodeMirror 的 json()、java()……);不给时是 TSX。只在挂载时读 */
|
|
11
|
+
language?: Extension;
|
|
12
|
+
/** 只读:能选中、复制、搜索,不能改 */
|
|
13
|
+
readonly?: boolean;
|
|
14
|
+
/** 编辑器建好了:拿到 CodeMirror 的视图,做撤销、读选区这类更细的操作 */
|
|
15
|
+
onReady?: (editor: CodeEditorHandle) => void;
|
|
16
|
+
}
|
|
17
|
+
/** 代码编辑器:语法高亮、括号匹配、缩进、搜索,颜色跟随主题 */
|
|
18
|
+
export declare const CodeEditor: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<CodeEditorProps>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useConfig } from "../config/context.js";
|
|
2
|
+
import { mergeAttrs } from "../utils/props.js";
|
|
3
|
+
import { inputRecipe } from "../input/control.js";
|
|
4
|
+
import { createEditor } from "./editor.js";
|
|
5
|
+
import { createVNode, onBeforeUnmount, onMounted, shallowRef, watch } from "vue";
|
|
6
|
+
import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
7
|
+
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
8
|
+
//#region src/code-editor/CodeEditor.tsx
|
|
9
|
+
var styles = css.create({ root: {
|
|
10
|
+
display: "block",
|
|
11
|
+
height: "20rem",
|
|
12
|
+
paddingInline: 0,
|
|
13
|
+
overflow: "hidden"
|
|
14
|
+
} });
|
|
15
|
+
/** CodeEditor 的属性 */
|
|
16
|
+
/** 代码编辑器:语法高亮、括号匹配、缩进、搜索,颜色跟随主题 */
|
|
17
|
+
var CodeEditor = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
18
|
+
const value = bindable(_props, "_value", () => "", _ctx.emit);
|
|
19
|
+
const label = readonlyProp(_props, "ariaLabel");
|
|
20
|
+
const language = readonlyProp(_props, "language");
|
|
21
|
+
const readonly = readonlyProp(_props, "readonly");
|
|
22
|
+
const onReady = readonlyProp(_props, "onReady");
|
|
23
|
+
const rest = restProps(_props, _ctx, true);
|
|
24
|
+
const config = useConfig();
|
|
25
|
+
let host = shallowRef(null);
|
|
26
|
+
let editor;
|
|
27
|
+
const isDark = () => config.theme.colorScheme === "dark";
|
|
28
|
+
onMounted(() => {
|
|
29
|
+
editor = createEditor(host.value, {
|
|
30
|
+
code: value.value,
|
|
31
|
+
dark: isDark(),
|
|
32
|
+
label: label.value,
|
|
33
|
+
language: language.value,
|
|
34
|
+
readonly: readonly.value,
|
|
35
|
+
onChange: (code) => value.value = code
|
|
36
|
+
});
|
|
37
|
+
onReady.value?.(editor);
|
|
38
|
+
});
|
|
39
|
+
onBeforeUnmount(() => editor?.destroy());
|
|
40
|
+
watch(() => value.value, (code) => editor?.setCode(code));
|
|
41
|
+
watch(isDark, (dark) => editor?.setDark(dark));
|
|
42
|
+
return () => createVNode("div", mergeAttrs({ sx: [inputRecipe().root, styles.root] }, rest, { ref: host }), null);
|
|
43
|
+
}, {
|
|
44
|
+
name: "CodeEditor",
|
|
45
|
+
props: [
|
|
46
|
+
"_value",
|
|
47
|
+
"onUpdate:_value",
|
|
48
|
+
"ariaLabel",
|
|
49
|
+
"language",
|
|
50
|
+
"readonly",
|
|
51
|
+
"onReady"
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
//#endregion
|
|
55
|
+
export { CodeEditor };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=CodeEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_createVNode"],"sources":["../../src/code-editor/CodeEditor.tsx"],"sourcesContent":["/**\n * 代码编辑器组件:外壳与输入框相同(边框、悬停、焦点环),里面是 CodeMirror(editor.ts)。\n * CodeMirror 只在这个子路径里:页面用到编辑器时才随子路径加载,组件库主入口不带它。\n *\n * <CodeEditor _value={code} aria-label=\"代码\" sx={styles.editor} />\n * <CodeEditor _value={manifest} language={json()} aria-label=\"字段清单\" onReady={(editor) => …} />\n *\n * 高度由使用方给(sx),默认 20rem;未声明的属性落到外壳上。颜色、字体取主题 token,跟着主题变。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { Extension } from '@codemirror/state';\nimport { useConfig } from '../config/context';\nimport { inputRecipe } from '../input/control';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { onBeforeUnmount, onMounted, watch } from 'vue';\nimport { createEditor, type CodeEditorHandle } from './editor';\n\nconst styles = css.create({\n // 输入框外壳是一行的 inline-flex:改成整块,内边距交给 CodeMirror\n root: {\n display: 'block',\n height: '20rem',\n paddingInline: 0,\n overflow: 'hidden',\n },\n});\n\n/** CodeEditor 的属性 */\nexport interface CodeEditorProps extends PartProps<'div'> {\n /** 代码:父级写 _value={x} 双向绑定 */\n _value?: string;\n /** 编辑区的无障碍名称 */\n 'aria-label': string;\n /** 语言扩展(CodeMirror 的 json()、java()……);不给时是 TSX。只在挂载时读 */\n language?: Extension;\n /** 只读:能选中、复制、搜索,不能改 */\n readonly?: boolean;\n /** 编辑器建好了:拿到 CodeMirror 的视图,做撤销、读选区这类更细的操作 */\n onReady?: (editor: CodeEditorHandle) => void;\n}\n\n/** 代码编辑器:语法高亮、括号匹配、缩进、搜索,颜色跟随主题 */\nexport const CodeEditor = _component(\n ({\n _value: value = _bindable(''),\n 'aria-label': label,\n language,\n readonly,\n onReady,\n ...rest\n }: CodeEditorProps) => {\n const config = useConfig();\n let host = _state.raw<HTMLElement | null>(null);\n let editor: CodeEditorHandle | undefined;\n const isDark = () => config.theme.colorScheme === 'dark';\n\n onMounted(() => {\n editor = createEditor(host!, {\n code: value,\n dark: isDark(),\n label,\n language,\n readonly,\n onChange: (code) => (value = code),\n });\n onReady?.(editor);\n });\n onBeforeUnmount(() => editor?.destroy());\n watch(\n () => value,\n (code) => editor?.setCode(code),\n );\n watch(isDark, (dark) => editor?.setDark(dark));\n\n return () => (\n <div\n {...mergeAttrs<'div'>({ sx: [inputRecipe().root, styles.root] }, rest, {\n ref: _toRef(host),\n })}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;AAkBA,IAAM,SAAS,IAAI,OAAO,EAExB,MAAM;CACJ,SAAS;CACT,QAAQ;CACR,eAAe;CACf,UAAU;AACZ,EACF,CAAC;;;AAiBD,IAAa,aAAa,0BACxB,QAAA,SAOuB;CAAA,MAAA,QAAAA,SAAA,QAAA,gBANK,IAAE,KAAA,IAAA;CAAA,MAAA,QAAAC,aAAA,QAAA,WAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,UAAAA,aAAA,QAAA,SAAA;CAAA,MAKzB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,SAAS,UAAU;CACzB,IAAI,OAAIC,WAAkC,IAAI;CAC9C,IAAI;CACJ,MAAM,eAAe,OAAO,MAAM,gBAAgB;CAElD,gBAAgB;EACd,SAAS,aAAY,KAAA,OAAQ;GAC3B,MAAI,MAAA;GACJ,MAAM,OAAO;GACb,OAAK,MAAA;GACL,UAAQ,SAAA;GACR,UAAQ,SAAA;GACR,WAAW,SAAU,MAAA,QAAQ;EAC/B,CAAC;EACD,QAAA,QAAU,MAAM;CAClB,CAAC;CACD,sBAAsB,QAAQ,QAAQ,CAAC;CACvC,YACE,MAAA,QACC,SAAS,QAAQ,QAAQ,IAAI,CAChC;CACA,MAAM,SAAS,SAAS,QAAQ,QAAQ,IAAI,CAAC;CAE7C,aAAOC,YAAA,OAEC,WAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,OAAO,IAAI,EAAE,GAAG,MAAM,EACrE,KAAG,KACL,CAAC,GAAC,IAAA;AAGR,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Extension } from '@codemirror/state';
|
|
2
|
+
import { EditorView } from '@codemirror/view';
|
|
3
|
+
/** 一处修改:把 [from, to) 换成 insert */
|
|
4
|
+
export interface CodeChange {
|
|
5
|
+
/** 开始位置(字符偏移,含) */
|
|
6
|
+
readonly from: number;
|
|
7
|
+
/** 结束位置(不含);等于 from 时是插入 */
|
|
8
|
+
readonly to: number;
|
|
9
|
+
/** 换上的文字;空串是删除 */
|
|
10
|
+
readonly insert: string;
|
|
11
|
+
}
|
|
12
|
+
/** 编辑器实例的操作 */
|
|
13
|
+
export interface CodeEditorHandle {
|
|
14
|
+
/** CodeMirror 的视图:读状态(view.state)、派发修改、做撤销等更细的操作 */
|
|
15
|
+
readonly view: EditorView;
|
|
16
|
+
/** 换掉全部代码(与当前内容相同时什么都不做) */
|
|
17
|
+
setCode(code: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* 改几段代码(位置都按改之前的),当作用户的修改:进撤销历史、回传 onChange。
|
|
20
|
+
* 默认单独成一步撤销(可视化编辑器的一次操作);merge 为 true 时像打字一样,与紧挨着的上一次修改合成一步(属性面板里逐字输入)
|
|
21
|
+
*/
|
|
22
|
+
edit(changes: readonly CodeChange[], options?: {
|
|
23
|
+
merge?: boolean;
|
|
24
|
+
}): void;
|
|
25
|
+
/** 撤销一步;没有可撤销的时返回 false */
|
|
26
|
+
undo(): boolean;
|
|
27
|
+
/** 重做一步;没有可重做的时返回 false */
|
|
28
|
+
redo(): boolean;
|
|
29
|
+
/** 光标移到第几行第几列(都从 1 起,超出时取最近的)、滚进视野并聚焦:编译错误列表点一条跳过去 */
|
|
30
|
+
goTo(line: number, column?: number): void;
|
|
31
|
+
/** 跟随站点主题的明暗 */
|
|
32
|
+
setDark(dark: boolean): void;
|
|
33
|
+
/** 拆掉编辑器(组件卸载时) */
|
|
34
|
+
destroy(): void;
|
|
35
|
+
}
|
|
36
|
+
/** createEditor 的选项 */
|
|
37
|
+
export interface CodeEditorOptions {
|
|
38
|
+
/** 初始代码 */
|
|
39
|
+
code: string;
|
|
40
|
+
/** 当前是不是暗色主题 */
|
|
41
|
+
dark: boolean;
|
|
42
|
+
/** 编辑区的无障碍名称 */
|
|
43
|
+
label: string;
|
|
44
|
+
/** 语言扩展;不给时是 TSX */
|
|
45
|
+
language?: Extension;
|
|
46
|
+
/** 只读:能选中、复制、搜索,不能改 */
|
|
47
|
+
readonly?: boolean;
|
|
48
|
+
/** 用户改了代码 */
|
|
49
|
+
onChange: (code: string) => void;
|
|
50
|
+
}
|
|
51
|
+
/** 在 parent 里创建编辑器 */
|
|
52
|
+
export declare function createEditor(parent: HTMLElement, { code, dark, label, language, readonly, onChange }: CodeEditorOptions): CodeEditorHandle;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { colors, fontSizes, fonts, radii } from "../config/theme/tokens.js";
|
|
2
|
+
import { autocompletion, closeBrackets, closeBracketsKeymap, completionKeymap } from "@codemirror/autocomplete";
|
|
3
|
+
import { defaultKeymap, history, historyKeymap, indentWithTab, isolateHistory, redo, temporarilySetTabFocusMode, undo } from "@codemirror/commands";
|
|
4
|
+
import { javascript } from "@codemirror/lang-javascript";
|
|
5
|
+
import { HighlightStyle, bracketMatching, foldGutter, foldKeymap, indentOnInput, syntaxHighlighting } from "@codemirror/language";
|
|
6
|
+
import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
|
|
7
|
+
import { Annotation, Compartment, EditorState, Transaction } from "@codemirror/state";
|
|
8
|
+
import { EditorView, drawSelection, highlightActiveLine, highlightActiveLineGutter, keymap, lineNumbers } from "@codemirror/view";
|
|
9
|
+
import { tags } from "@lezer/highlight";
|
|
10
|
+
//#region src/code-editor/editor.ts
|
|
11
|
+
/**
|
|
12
|
+
* 代码编辑器的内核:CodeMirror 6。CodeEditor.tsx 挂载时建一个;不用 Vue 时也可以直接调 createEditor。
|
|
13
|
+
* 语言由使用方传(CodeMirror 的语言扩展,如 json()、java()),默认 TSX。
|
|
14
|
+
*
|
|
15
|
+
* 颜色、字体全部取主题 token(colors.code* 与 Shiki 代码块同一套),切换主题、主题编辑器调色都跟着变;
|
|
16
|
+
* 明暗只影响 CodeMirror 自带的少量默认样式,用 Compartment 切换。
|
|
17
|
+
* Tab 用来缩进;按 Esc 后再按 Tab 才把焦点移出编辑器(CodeMirror 的 tab-focus 模式),键盘用户不会被困住。
|
|
18
|
+
*/
|
|
19
|
+
var c = (token) => String(token);
|
|
20
|
+
/** 标记 setCode 发起的修改:不当作用户编辑回传 */
|
|
21
|
+
var external = Annotation.define();
|
|
22
|
+
var highlightStyle = HighlightStyle.define([
|
|
23
|
+
{
|
|
24
|
+
tag: [
|
|
25
|
+
tags.keyword,
|
|
26
|
+
tags.modifier,
|
|
27
|
+
tags.operatorKeyword,
|
|
28
|
+
tags.self
|
|
29
|
+
],
|
|
30
|
+
color: c(colors.codeKeyword)
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
tag: [
|
|
34
|
+
tags.string,
|
|
35
|
+
tags.special(tags.string),
|
|
36
|
+
tags.regexp
|
|
37
|
+
],
|
|
38
|
+
color: c(colors.codeString)
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
tag: [
|
|
42
|
+
tags.number,
|
|
43
|
+
tags.bool,
|
|
44
|
+
tags.null,
|
|
45
|
+
tags.atom
|
|
46
|
+
],
|
|
47
|
+
color: c(colors.codeNumber)
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],
|
|
51
|
+
color: c(colors.codeFunction)
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
tag: [
|
|
55
|
+
tags.typeName,
|
|
56
|
+
tags.className,
|
|
57
|
+
tags.namespace
|
|
58
|
+
],
|
|
59
|
+
color: c(colors.codeType)
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
tag: tags.comment,
|
|
63
|
+
color: c(colors.codeComment),
|
|
64
|
+
fontStyle: "italic"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
tag: [tags.punctuation, tags.angleBracket],
|
|
68
|
+
color: c(colors.codeComment)
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
tag: tags.tagName,
|
|
72
|
+
color: c(colors.codeTag)
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
tag: tags.attributeName,
|
|
76
|
+
color: c(colors.codeAttribute)
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
tag: tags.invalid,
|
|
80
|
+
color: c(colors.dangerText)
|
|
81
|
+
}
|
|
82
|
+
]);
|
|
83
|
+
var theme = EditorView.theme({
|
|
84
|
+
"&": {
|
|
85
|
+
height: "100%",
|
|
86
|
+
color: c(colors.text),
|
|
87
|
+
backgroundColor: c(colors.surface),
|
|
88
|
+
fontSize: c(fontSizes.sm)
|
|
89
|
+
},
|
|
90
|
+
"&.cm-focused": { outline: "none" },
|
|
91
|
+
".cm-scroller": {
|
|
92
|
+
fontFamily: c(fonts.mono),
|
|
93
|
+
lineHeight: "1.6",
|
|
94
|
+
scrollbarWidth: "thin",
|
|
95
|
+
scrollbarColor: `color-mix(in srgb, ${c(colors.textMuted)} 50%, transparent) transparent`
|
|
96
|
+
},
|
|
97
|
+
".cm-content": {
|
|
98
|
+
caretColor: c(colors.text),
|
|
99
|
+
paddingBlock: "12px"
|
|
100
|
+
},
|
|
101
|
+
".cm-cursor, .cm-dropCursor": { borderLeftColor: c(colors.text) },
|
|
102
|
+
"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { backgroundColor: c(colors.selection) },
|
|
103
|
+
".cm-activeLine": { backgroundColor: c(colors.surfaceMuted) },
|
|
104
|
+
".cm-gutters": {
|
|
105
|
+
color: c(colors.codeComment),
|
|
106
|
+
backgroundColor: c(colors.surface),
|
|
107
|
+
border: "none"
|
|
108
|
+
},
|
|
109
|
+
".cm-activeLineGutter": {
|
|
110
|
+
color: c(colors.text),
|
|
111
|
+
backgroundColor: c(colors.surfaceMuted)
|
|
112
|
+
},
|
|
113
|
+
"&.cm-focused .cm-matchingBracket": {
|
|
114
|
+
backgroundColor: c(colors.accentSoft),
|
|
115
|
+
outline: `1px solid ${c(colors.accentBorder)}`
|
|
116
|
+
},
|
|
117
|
+
".cm-selectionMatch, .cm-searchMatch": { backgroundColor: c(colors.highlight) },
|
|
118
|
+
".cm-tooltip": {
|
|
119
|
+
color: c(colors.text),
|
|
120
|
+
backgroundColor: c(colors.surfaceRaised),
|
|
121
|
+
border: `1px solid ${c(colors.border)}`,
|
|
122
|
+
borderRadius: c(radii.md),
|
|
123
|
+
overflow: "hidden"
|
|
124
|
+
},
|
|
125
|
+
".cm-tooltip-autocomplete > ul": { fontFamily: c(fonts.mono) },
|
|
126
|
+
".cm-tooltip-autocomplete > ul > li[aria-selected]": {
|
|
127
|
+
color: c(colors.text),
|
|
128
|
+
backgroundColor: c(colors.accentSoft)
|
|
129
|
+
},
|
|
130
|
+
".cm-panels": {
|
|
131
|
+
color: c(colors.text),
|
|
132
|
+
backgroundColor: c(colors.surfaceMuted)
|
|
133
|
+
},
|
|
134
|
+
".cm-panels-bottom": { borderTop: `1px solid ${c(colors.border)}` }
|
|
135
|
+
});
|
|
136
|
+
/** 在 parent 里创建编辑器 */
|
|
137
|
+
function createEditor(parent, { code, dark, label, language, readonly, onChange }) {
|
|
138
|
+
const darkMode = new Compartment();
|
|
139
|
+
const view = new EditorView({
|
|
140
|
+
parent,
|
|
141
|
+
state: EditorState.create({
|
|
142
|
+
doc: code,
|
|
143
|
+
extensions: [
|
|
144
|
+
lineNumbers(),
|
|
145
|
+
highlightActiveLineGutter(),
|
|
146
|
+
foldGutter(),
|
|
147
|
+
history(),
|
|
148
|
+
drawSelection(),
|
|
149
|
+
indentOnInput(),
|
|
150
|
+
bracketMatching(),
|
|
151
|
+
closeBrackets(),
|
|
152
|
+
autocompletion(),
|
|
153
|
+
highlightActiveLine(),
|
|
154
|
+
highlightSelectionMatches(),
|
|
155
|
+
language ?? javascript({
|
|
156
|
+
jsx: true,
|
|
157
|
+
typescript: true
|
|
158
|
+
}),
|
|
159
|
+
EditorState.readOnly.of(readonly === true),
|
|
160
|
+
syntaxHighlighting(highlightStyle),
|
|
161
|
+
EditorState.tabSize.of(2),
|
|
162
|
+
theme,
|
|
163
|
+
darkMode.of(EditorView.darkTheme.of(dark)),
|
|
164
|
+
EditorView.contentAttributes.of({ "aria-label": label }),
|
|
165
|
+
keymap.of([
|
|
166
|
+
...closeBracketsKeymap,
|
|
167
|
+
...completionKeymap,
|
|
168
|
+
...searchKeymap,
|
|
169
|
+
...foldKeymap,
|
|
170
|
+
...historyKeymap,
|
|
171
|
+
...defaultKeymap,
|
|
172
|
+
{
|
|
173
|
+
key: "Escape",
|
|
174
|
+
run: temporarilySetTabFocusMode
|
|
175
|
+
},
|
|
176
|
+
indentWithTab
|
|
177
|
+
]),
|
|
178
|
+
EditorView.updateListener.of((update) => {
|
|
179
|
+
if (update.docChanged && update.transactions.some((tr) => !tr.annotation(external))) onChange(update.state.doc.toString());
|
|
180
|
+
})
|
|
181
|
+
]
|
|
182
|
+
})
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
view,
|
|
186
|
+
setCode(next) {
|
|
187
|
+
if (next === view.state.doc.toString()) return;
|
|
188
|
+
view.dispatch({
|
|
189
|
+
changes: {
|
|
190
|
+
from: 0,
|
|
191
|
+
to: view.state.doc.length,
|
|
192
|
+
insert: next
|
|
193
|
+
},
|
|
194
|
+
annotations: external.of(true)
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
edit(changes, { merge = false } = {}) {
|
|
198
|
+
if (changes.length === 0) return;
|
|
199
|
+
view.dispatch({
|
|
200
|
+
changes: [...changes],
|
|
201
|
+
annotations: merge ? Transaction.userEvent.of("input.type") : isolateHistory.of("full")
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
undo: () => undo(view),
|
|
205
|
+
redo: () => redo(view),
|
|
206
|
+
goTo(line, column = 1) {
|
|
207
|
+
const doc = view.state.doc;
|
|
208
|
+
const target = doc.line(Math.min(Math.max(line, 1), doc.lines));
|
|
209
|
+
const pos = target.from + Math.min(Math.max(column - 1, 0), target.length);
|
|
210
|
+
view.dispatch({
|
|
211
|
+
selection: { anchor: pos },
|
|
212
|
+
effects: EditorView.scrollIntoView(pos, { y: "center" })
|
|
213
|
+
});
|
|
214
|
+
view.focus();
|
|
215
|
+
},
|
|
216
|
+
setDark(next) {
|
|
217
|
+
view.dispatch({ effects: darkMode.reconfigure(EditorView.darkTheme.of(next)) });
|
|
218
|
+
},
|
|
219
|
+
destroy: () => view.destroy()
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
//#endregion
|
|
223
|
+
export { createEditor };
|
|
224
|
+
|
|
225
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","names":[],"sources":["../../src/code-editor/editor.ts"],"sourcesContent":["/**\n * 代码编辑器的内核:CodeMirror 6。CodeEditor.tsx 挂载时建一个;不用 Vue 时也可以直接调 createEditor。\n * 语言由使用方传(CodeMirror 的语言扩展,如 json()、java()),默认 TSX。\n *\n * 颜色、字体全部取主题 token(colors.code* 与 Shiki 代码块同一套),切换主题、主题编辑器调色都跟着变;\n * 明暗只影响 CodeMirror 自带的少量默认样式,用 Compartment 切换。\n * Tab 用来缩进;按 Esc 后再按 Tab 才把焦点移出编辑器(CodeMirror 的 tab-focus 模式),键盘用户不会被困住。\n */\nimport {\n autocompletion,\n closeBrackets,\n closeBracketsKeymap,\n completionKeymap,\n} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n isolateHistory,\n redo,\n temporarilySetTabFocusMode,\n undo,\n} from '@codemirror/commands';\nimport { javascript } from '@codemirror/lang-javascript';\nimport {\n bracketMatching,\n foldGutter,\n foldKeymap,\n HighlightStyle,\n indentOnInput,\n syntaxHighlighting,\n} from '@codemirror/language';\nimport { highlightSelectionMatches, searchKeymap } from '@codemirror/search';\nimport {\n Annotation,\n Compartment,\n EditorState,\n Transaction,\n type Extension,\n} from '@codemirror/state';\nimport {\n drawSelection,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n keymap,\n lineNumbers,\n} from '@codemirror/view';\nimport { tags } from '@lezer/highlight';\nimport { colors, fonts, fontSizes, radii } from '../config/theme/tokens';\n\n// token 在运行时是 var(--哈希) 字符串\nconst c = (token: unknown) => String(token);\n\n/** 标记 setCode 发起的修改:不当作用户编辑回传 */\nconst external = Annotation.define<boolean>();\n\nconst highlightStyle = HighlightStyle.define([\n {\n tag: [tags.keyword, tags.modifier, tags.operatorKeyword, tags.self],\n color: c(colors.codeKeyword),\n },\n { tag: [tags.string, tags.special(tags.string), tags.regexp], color: c(colors.codeString) },\n { tag: [tags.number, tags.bool, tags.null, tags.atom], color: c(colors.codeNumber) },\n {\n tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],\n color: c(colors.codeFunction),\n },\n { tag: [tags.typeName, tags.className, tags.namespace], color: c(colors.codeType) },\n { tag: tags.comment, color: c(colors.codeComment), fontStyle: 'italic' },\n { tag: [tags.punctuation, tags.angleBracket], color: c(colors.codeComment) },\n { tag: tags.tagName, color: c(colors.codeTag) },\n { tag: tags.attributeName, color: c(colors.codeAttribute) },\n { tag: tags.invalid, color: c(colors.dangerText) },\n]);\n\nconst theme = EditorView.theme({\n '&': {\n height: '100%',\n color: c(colors.text),\n backgroundColor: c(colors.surface),\n fontSize: c(fontSizes.sm),\n },\n // 外框(CodeEditor)画焦点环\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n fontFamily: c(fonts.mono),\n lineHeight: '1.6',\n // CodeMirror 自己管滚动,套不了 ScrollArea:原生滚动条改细,滑块取浮层滚动条(scrollAreaBarStyles.thumb)的颜色,外观一致\n scrollbarWidth: 'thin',\n scrollbarColor: `color-mix(in srgb, ${c(colors.textMuted)} 50%, transparent) transparent`,\n },\n '.cm-content': { caretColor: c(colors.text), paddingBlock: '12px' },\n '.cm-cursor, .cm-dropCursor': { borderLeftColor: c(colors.text) },\n '&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection':\n { backgroundColor: c(colors.selection) },\n '.cm-activeLine': { backgroundColor: c(colors.surfaceMuted) },\n // 行号与 CodeBlock 的同色:textPlaceholder 在编辑器底色上不到 4.5:1\n '.cm-gutters': {\n color: c(colors.codeComment),\n backgroundColor: c(colors.surface),\n border: 'none',\n },\n '.cm-activeLineGutter': { color: c(colors.text), backgroundColor: c(colors.surfaceMuted) },\n '&.cm-focused .cm-matchingBracket': {\n backgroundColor: c(colors.accentSoft),\n outline: `1px solid ${c(colors.accentBorder)}`,\n },\n '.cm-selectionMatch, .cm-searchMatch': { backgroundColor: c(colors.highlight) },\n '.cm-tooltip': {\n color: c(colors.text),\n backgroundColor: c(colors.surfaceRaised),\n border: `1px solid ${c(colors.border)}`,\n borderRadius: c(radii.md),\n overflow: 'hidden',\n },\n '.cm-tooltip-autocomplete > ul': { fontFamily: c(fonts.mono) },\n '.cm-tooltip-autocomplete > ul > li[aria-selected]': {\n color: c(colors.text),\n backgroundColor: c(colors.accentSoft),\n },\n '.cm-panels': { color: c(colors.text), backgroundColor: c(colors.surfaceMuted) },\n '.cm-panels-bottom': { borderTop: `1px solid ${c(colors.border)}` },\n});\n\n/** 一处修改:把 [from, to) 换成 insert */\nexport interface CodeChange {\n /** 开始位置(字符偏移,含) */\n readonly from: number;\n /** 结束位置(不含);等于 from 时是插入 */\n readonly to: number;\n /** 换上的文字;空串是删除 */\n readonly insert: string;\n}\n\n/** 编辑器实例的操作 */\nexport interface CodeEditorHandle {\n /** CodeMirror 的视图:读状态(view.state)、派发修改、做撤销等更细的操作 */\n readonly view: EditorView;\n /** 换掉全部代码(与当前内容相同时什么都不做) */\n setCode(code: string): void;\n /**\n * 改几段代码(位置都按改之前的),当作用户的修改:进撤销历史、回传 onChange。\n * 默认单独成一步撤销(可视化编辑器的一次操作);merge 为 true 时像打字一样,与紧挨着的上一次修改合成一步(属性面板里逐字输入)\n */\n edit(changes: readonly CodeChange[], options?: { merge?: boolean }): void;\n /** 撤销一步;没有可撤销的时返回 false */\n undo(): boolean;\n /** 重做一步;没有可重做的时返回 false */\n redo(): boolean;\n /** 光标移到第几行第几列(都从 1 起,超出时取最近的)、滚进视野并聚焦:编译错误列表点一条跳过去 */\n goTo(line: number, column?: number): void;\n /** 跟随站点主题的明暗 */\n setDark(dark: boolean): void;\n /** 拆掉编辑器(组件卸载时) */\n destroy(): void;\n}\n\n/** createEditor 的选项 */\nexport interface CodeEditorOptions {\n /** 初始代码 */\n code: string;\n /** 当前是不是暗色主题 */\n dark: boolean;\n /** 编辑区的无障碍名称 */\n label: string;\n /** 语言扩展;不给时是 TSX */\n language?: Extension;\n /** 只读:能选中、复制、搜索,不能改 */\n readonly?: boolean;\n /** 用户改了代码 */\n onChange: (code: string) => void;\n}\n\n/** 在 parent 里创建编辑器 */\nexport function createEditor(\n parent: HTMLElement,\n { code, dark, label, language, readonly, onChange }: CodeEditorOptions,\n): CodeEditorHandle {\n const darkMode = new Compartment();\n const view = new EditorView({\n parent,\n state: EditorState.create({\n doc: code,\n extensions: [\n lineNumbers(),\n highlightActiveLineGutter(),\n foldGutter(),\n history(),\n drawSelection(),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n autocompletion(),\n highlightActiveLine(),\n highlightSelectionMatches(),\n language ?? javascript({ jsx: true, typescript: true }),\n EditorState.readOnly.of(readonly === true),\n syntaxHighlighting(highlightStyle),\n EditorState.tabSize.of(2),\n theme,\n darkMode.of(EditorView.darkTheme.of(dark)),\n EditorView.contentAttributes.of({ 'aria-label': label }),\n keymap.of([\n ...closeBracketsKeymap,\n ...completionKeymap,\n ...searchKeymap,\n ...foldKeymap,\n ...historyKeymap,\n ...defaultKeymap,\n // 补全、搜索面板没有接住的 Esc:下一次 Tab 移出焦点\n { key: 'Escape', run: temporarilySetTabFocusMode },\n indentWithTab,\n ]),\n EditorView.updateListener.of((update) => {\n if (update.docChanged && update.transactions.some((tr) => !tr.annotation(external)))\n onChange(update.state.doc.toString());\n }),\n ],\n }),\n });\n return {\n view,\n setCode(next) {\n if (next === view.state.doc.toString()) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: next },\n annotations: external.of(true),\n });\n },\n edit(changes, { merge = false } = {}) {\n if (changes.length === 0) return;\n view.dispatch({\n changes: [...changes],\n annotations: merge ? Transaction.userEvent.of('input.type') : isolateHistory.of('full'),\n });\n },\n undo: () => undo(view),\n redo: () => redo(view),\n goTo(line, column = 1) {\n const doc = view.state.doc;\n const target = doc.line(Math.min(Math.max(line, 1), doc.lines));\n const pos = target.from + Math.min(Math.max(column - 1, 0), target.length);\n view.dispatch({\n selection: { anchor: pos },\n effects: EditorView.scrollIntoView(pos, { y: 'center' }),\n });\n view.focus();\n },\n setDark(next) {\n view.dispatch({ effects: darkMode.reconfigure(EditorView.darkTheme.of(next)) });\n },\n destroy: () => view.destroy(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码编辑器(子路径 `@zerodep-dev/vue-tsx-pro-ui/code-editor`):CodeMirror 6,颜色、字体取主题 token;Esc 后 Tab 移出焦点。
|
|
3
|
+
* 依赖可选的 peer:@codemirror/*(autocomplete、commands、lang-javascript、language、search、state、view)与 @lezer/highlight,用到时安装。
|
|
4
|
+
*
|
|
5
|
+
* import { CodeEditor } from '@zerodep-dev/vue-tsx-pro-ui/code-editor';
|
|
6
|
+
* <CodeEditor _value={source} aria-label="表单源码" />
|
|
7
|
+
*/
|
|
8
|
+
export { CodeEditor, type CodeEditorProps } from './CodeEditor';
|
|
9
|
+
export { createEditor, type CodeChange, type CodeEditorHandle, type CodeEditorOptions, } from './editor';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
|
|
2
2
|
import type { VNodeChild } from 'vue';
|
|
3
|
-
import { type Highlighter, type TextMatcher, type UiRouter } from './context';
|
|
3
|
+
import { type Highlighter, type TextMatcher, type UiPermissions, type UiRouter } from './context';
|
|
4
4
|
import { type ComponentDefaults } from './defaults';
|
|
5
5
|
import { type ComponentStyles } from './styles';
|
|
6
6
|
import { type Lang } from './lang/lang';
|
|
@@ -23,6 +23,8 @@ export interface ProviderProps {
|
|
|
23
23
|
styles?: ComponentStyles;
|
|
24
24
|
/** 路由适配;不写时沿用上层配置 */
|
|
25
25
|
router?: UiRouter;
|
|
26
|
+
/** 权限判断;不写时沿用上层配置 */
|
|
27
|
+
permissions?: UiPermissions;
|
|
26
28
|
/** 请求客户端;不写时沿用上层配置 */
|
|
27
29
|
http?: HttpClient;
|
|
28
30
|
/** 工作日历;不写时沿用上层配置 */
|
package/dist/config/Provider.js
CHANGED
|
@@ -4,8 +4,8 @@ import { mergeStyles } from "./styles.js";
|
|
|
4
4
|
import { resolveTheme, themeAttrs } from "./theme/theme.js";
|
|
5
5
|
import { usePrefersDark } from "../utils/dom/media-query.js";
|
|
6
6
|
import { defineLang } from "./lang/lang.js";
|
|
7
|
-
import { computed, createVNode
|
|
8
|
-
import { _component, childrenProp, readonlyProp } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
7
|
+
import { computed, createVNode } from "vue";
|
|
8
|
+
import { _component, childrenProp, mergeJsxProps, readonlyProp } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
9
9
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
10
10
|
//#region src/config/Provider.tsx
|
|
11
11
|
/** 局部配置;都不写时只是透明的容器,沿用上层配置 */
|
|
@@ -31,6 +31,7 @@ var Provider = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
31
31
|
const defaults = readonlyProp(_props, "defaults");
|
|
32
32
|
const styles = readonlyProp(_props, "styles");
|
|
33
33
|
const router = readonlyProp(_props, "router");
|
|
34
|
+
const permissions = readonlyProp(_props, "permissions");
|
|
34
35
|
const http = readonlyProp(_props, "http");
|
|
35
36
|
const workCalendar = readonlyProp(_props, "workCalendar");
|
|
36
37
|
const ripple = readonlyProp(_props, "ripple");
|
|
@@ -63,6 +64,9 @@ var Provider = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
63
64
|
get router() {
|
|
64
65
|
return router.value ?? parent.router;
|
|
65
66
|
},
|
|
67
|
+
get permissions() {
|
|
68
|
+
return permissions.value ?? parent.permissions;
|
|
69
|
+
},
|
|
66
70
|
get http() {
|
|
67
71
|
return http.value ?? parent.http;
|
|
68
72
|
},
|
|
@@ -73,7 +77,7 @@ var Provider = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
73
77
|
return ripple.value ?? parent.ripple;
|
|
74
78
|
}
|
|
75
79
|
});
|
|
76
|
-
return () => createVNode("div",
|
|
80
|
+
return () => createVNode("div", mergeJsxProps(theme.value ? themeAttrs(currentTheme.value) : {}, css.attrs(providerStyles.root, theme.value != null && providerStyles.themed), {
|
|
77
81
|
"lang": currentLang.value.code,
|
|
78
82
|
"dir": currentLang.value.direction
|
|
79
83
|
}), [children.value]);
|
|
@@ -87,6 +91,7 @@ var Provider = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
87
91
|
"defaults",
|
|
88
92
|
"styles",
|
|
89
93
|
"router",
|
|
94
|
+
"permissions",
|
|
90
95
|
"http",
|
|
91
96
|
"workCalendar",
|
|
92
97
|
"ripple"
|
|
@@ -100,7 +105,7 @@ var Provider = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
100
105
|
var ConfigScope = /*#__PURE__*/ _component((_props2, _ctx2) => {
|
|
101
106
|
const children = childrenProp(_props2);
|
|
102
107
|
const config = useConfig();
|
|
103
|
-
return () => createVNode("div",
|
|
108
|
+
return () => createVNode("div", mergeJsxProps(themeAttrs(config.theme), css.attrs(providerStyles.root, providerStyles.themed), {
|
|
104
109
|
"lang": config.lang.code,
|
|
105
110
|
"dir": config.lang.direction
|
|
106
111
|
}), [children.value]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Provider.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/config/Provider.tsx"],"sourcesContent":["import { _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 {\n ConfigContext,\n useConfig,\n type Highlighter,\n type TextMatcher,\n type UiRouter,\n} from './context';\nimport { mergeDefaults, type ComponentDefaults } from './defaults';\nimport { mergeStyles, type ComponentStyles } from './styles';\nimport { defineLang, type Lang } from './lang/lang';\nimport { usePrefersDark } from '../utils/dom/media-query';\nimport type { WorkCalendar } from '../utils/data/workdays';\nimport type { HttpClient } from '../utils/request/http';\nimport { resolveTheme, themeAttrs, type ThemeInput } from './theme/theme';\n\n/** 局部配置;都不写时只是透明的容器,沿用上层配置 */\nexport interface ProviderProps {\n /** 主题;不写时沿用上层配置 */\n theme?: ThemeInput;\n /** 语言;只写要改的字段,其余沿用上层配置 */\n lang?: Partial<Lang>;\n /** 代码高亮器(CodeBlock 用);不写时沿用上层配置 */\n highlighter?: Highlighter;\n /** 额外的文字匹配(拼音);不写时沿用上层配置 */\n textMatcher?: TextMatcher;\n /** 组件默认值:按组件逐个与上层合并,只写要改的 */\n defaults?: ComponentDefaults;\n /** 组件的主题定制:追加在上层的定制之后(见 styles.ts) */\n styles?: ComponentStyles;\n /** 路由适配;不写时沿用上层配置 */\n router?: UiRouter;\n /** 请求客户端;不写时沿用上层配置 */\n http?: HttpClient;\n /** 工作日历;不写时沿用上层配置 */\n workCalendar?: WorkCalendar;\n /** 波纹效果的开关;不写时沿用上层配置 */\n ripple?: boolean;\n children?: VNodeChild;\n}\n\n/** Provider 的样式:root、themed */\nexport const providerStyles = css.create({\n // 不产生盒子,不影响布局;主题变量与文字样式照常由子元素继承\n root: { display: 'contents' },\n themed: {\n color: '_text',\n fontFamily: '_sans',\n fontSize: '_md',\n lineHeight: '_normal',\n },\n});\n\n/**\n * 局部配置主题与语言,可以嵌套:内层只写要改的部分,其余继承外层。\n * 应用级配置见 createUi。\n */\nexport const Provider = _component(\n ({\n theme,\n lang,\n highlighter,\n textMatcher,\n defaults,\n styles,\n router,\n http,\n workCalendar,\n ripple,\n children,\n }: ProviderProps) => {\n const parent = useConfig();\n const prefersDark = usePrefersDark();\n const currentTheme = _derived(theme ? resolveTheme(theme, prefersDark.value) : parent.theme);\n const currentLang = _derived(lang ? defineLang(parent.lang, lang) : parent.lang);\n const currentDefaults = _derived(mergeDefaults(parent.defaults, defaults));\n const currentStyles = _derived(mergeStyles(parent.styles, styles));\n ConfigContext.provide({\n get theme() {\n return currentTheme;\n },\n get lang() {\n return currentLang;\n },\n get highlighter() {\n return highlighter ?? parent.highlighter;\n },\n get textMatcher() {\n return textMatcher ?? parent.textMatcher;\n },\n get defaults() {\n return currentDefaults;\n },\n get styles() {\n return currentStyles;\n },\n get router() {\n return router ?? parent.router;\n },\n get http() {\n return http ?? parent.http;\n },\n get workCalendar() {\n return workCalendar ?? parent.workCalendar;\n },\n get ripple() {\n return ripple ?? parent.ripple;\n },\n });\n\n return () => (\n <div\n {...(theme ? themeAttrs(currentTheme) : {})}\n {...css.attrs(providerStyles.root, theme != null && providerStyles.themed)}\n lang={currentLang.code}\n dir={currentLang.direction}\n >\n {children}\n </div>\n );\n },\n);\n\n/** ConfigScope 的 props */\nexport interface ConfigScopeProps {\n children?: VNodeChild;\n}\n\n/**\n * 给移出 Provider 的内容(Teleport 到 body 的 Toaster 等)重新带上当前的主题、语言与文字方向:\n * 主题变量、lang、dir 都挂在 Provider 的元素上,传送出去的元素不再是它的后代。\n */\nexport const ConfigScope = _component(({ children }: ConfigScopeProps) => {\n const config = useConfig();\n return () => (\n <div\n {...themeAttrs(config.theme)}\n {...css.attrs(providerStyles.root, providerStyles.themed)}\n lang={config.lang.code}\n dir={config.lang.direction}\n >\n {children}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Provider.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/config/Provider.tsx"],"sourcesContent":["import { _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 {\n ConfigContext,\n useConfig,\n type Highlighter,\n type TextMatcher,\n type UiPermissions,\n type UiRouter,\n} from './context';\nimport { mergeDefaults, type ComponentDefaults } from './defaults';\nimport { mergeStyles, type ComponentStyles } from './styles';\nimport { defineLang, type Lang } from './lang/lang';\nimport { usePrefersDark } from '../utils/dom/media-query';\nimport type { WorkCalendar } from '../utils/data/workdays';\nimport type { HttpClient } from '../utils/request/http';\nimport { resolveTheme, themeAttrs, type ThemeInput } from './theme/theme';\n\n/** 局部配置;都不写时只是透明的容器,沿用上层配置 */\nexport interface ProviderProps {\n /** 主题;不写时沿用上层配置 */\n theme?: ThemeInput;\n /** 语言;只写要改的字段,其余沿用上层配置 */\n lang?: Partial<Lang>;\n /** 代码高亮器(CodeBlock 用);不写时沿用上层配置 */\n highlighter?: Highlighter;\n /** 额外的文字匹配(拼音);不写时沿用上层配置 */\n textMatcher?: TextMatcher;\n /** 组件默认值:按组件逐个与上层合并,只写要改的 */\n defaults?: ComponentDefaults;\n /** 组件的主题定制:追加在上层的定制之后(见 styles.ts) */\n styles?: ComponentStyles;\n /** 路由适配;不写时沿用上层配置 */\n router?: UiRouter;\n /** 权限判断;不写时沿用上层配置 */\n permissions?: UiPermissions;\n /** 请求客户端;不写时沿用上层配置 */\n http?: HttpClient;\n /** 工作日历;不写时沿用上层配置 */\n workCalendar?: WorkCalendar;\n /** 波纹效果的开关;不写时沿用上层配置 */\n ripple?: boolean;\n children?: VNodeChild;\n}\n\n/** Provider 的样式:root、themed */\nexport const providerStyles = css.create({\n // 不产生盒子,不影响布局;主题变量与文字样式照常由子元素继承\n root: { display: 'contents' },\n themed: {\n color: '_text',\n fontFamily: '_sans',\n fontSize: '_md',\n lineHeight: '_normal',\n },\n});\n\n/**\n * 局部配置主题与语言,可以嵌套:内层只写要改的部分,其余继承外层。\n * 应用级配置见 createUi。\n */\nexport const Provider = _component(\n ({\n theme,\n lang,\n highlighter,\n textMatcher,\n defaults,\n styles,\n router,\n permissions,\n http,\n workCalendar,\n ripple,\n children,\n }: ProviderProps) => {\n const parent = useConfig();\n const prefersDark = usePrefersDark();\n const currentTheme = _derived(theme ? resolveTheme(theme, prefersDark.value) : parent.theme);\n const currentLang = _derived(lang ? defineLang(parent.lang, lang) : parent.lang);\n const currentDefaults = _derived(mergeDefaults(parent.defaults, defaults));\n const currentStyles = _derived(mergeStyles(parent.styles, styles));\n ConfigContext.provide({\n get theme() {\n return currentTheme;\n },\n get lang() {\n return currentLang;\n },\n get highlighter() {\n return highlighter ?? parent.highlighter;\n },\n get textMatcher() {\n return textMatcher ?? parent.textMatcher;\n },\n get defaults() {\n return currentDefaults;\n },\n get styles() {\n return currentStyles;\n },\n get router() {\n return router ?? parent.router;\n },\n get permissions() {\n return permissions ?? parent.permissions;\n },\n get http() {\n return http ?? parent.http;\n },\n get workCalendar() {\n return workCalendar ?? parent.workCalendar;\n },\n get ripple() {\n return ripple ?? parent.ripple;\n },\n });\n\n return () => (\n <div\n {...(theme ? themeAttrs(currentTheme) : {})}\n {...css.attrs(providerStyles.root, theme != null && providerStyles.themed)}\n lang={currentLang.code}\n dir={currentLang.direction}\n >\n {children}\n </div>\n );\n },\n);\n\n/** ConfigScope 的 props */\nexport interface ConfigScopeProps {\n children?: VNodeChild;\n}\n\n/**\n * 给移出 Provider 的内容(Teleport 到 body 的 Toaster 等)重新带上当前的主题、语言与文字方向:\n * 主题变量、lang、dir 都挂在 Provider 的元素上,传送出去的元素不再是它的后代。\n */\nexport const ConfigScope = _component(({ children }: ConfigScopeProps) => {\n const config = useConfig();\n return () => (\n <div\n {...themeAttrs(config.theme)}\n {...css.attrs(providerStyles.root, providerStyles.themed)}\n lang={config.lang.code}\n dir={config.lang.direction}\n >\n {children}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;AA+CA,IAAa,iBAAiB,IAAI,OAAO;CAEvC,MAAM,EAAE,SAAS,WAAW;CAC5B,QAAQ;EACN,OAAO;EACP,YAAY;EACZ,UAAU;EACV,YAAY;CACd;AACF,CAAC;;;;;AAMD,IAAa,WAAW,0BACtB,QAAA,SAaqB;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,WAAAC,aAAA,MAAA;CACnB,MAAM,SAAS,UAAU;CACzB,MAAM,cAAc,eAAe;CACnC,MAAM,eAAYC,eAAY,MAAA,QAAQ,aAAY,MAAA,OAAQ,YAAY,KAAK,IAAI,OAAO,KAAK;CAC3F,MAAM,cAAWA,eAAY,KAAA,QAAO,WAAW,OAAO,MAAI,KAAA,KAAM,IAAI,OAAO,IAAI;CAC/E,MAAM,kBAAeA,eAAY,cAAc,OAAO,UAAQ,SAAA,KAAU,CAAC;CACzE,MAAM,gBAAaA,eAAY,YAAY,OAAO,QAAM,OAAA,KAAQ,CAAC;CACjE,cAAc,QAAQ;EACpB,IAAI,QAAQ;GACV,OAAA,aAAA;EACF;EACA,IAAI,OAAO;GACT,OAAA,YAAA;EACF;EACA,IAAI,cAAc;GAChB,OAAO,YAAA,SAAe,OAAO;EAC/B;EACA,IAAI,cAAc;GAChB,OAAO,YAAA,SAAe,OAAO;EAC/B;EACA,IAAI,WAAW;GACb,OAAA,gBAAA;EACF;EACA,IAAI,SAAS;GACX,OAAA,cAAA;EACF;EACA,IAAI,SAAS;GACX,OAAO,OAAA,SAAU,OAAO;EAC1B;EACA,IAAI,cAAc;GAChB,OAAO,YAAA,SAAe,OAAO;EAC/B;EACA,IAAI,OAAO;GACT,OAAO,KAAA,SAAQ,OAAO;EACxB;EACA,IAAI,eAAe;GACjB,OAAO,aAAA,SAAgB,OAAO;EAChC;EACA,IAAI,SAAS;GACX,OAAO,OAAA,SAAU,OAAO;EAC1B;CACF,CAAC;CAED,aAAOC,YAAA,OAAAC,cAEE,MAAA,QAAQ,WAAU,aAAA,KAAa,IAAI,CAAC,GACrC,IAAI,MAAM,eAAe,MAAM,MAAA,SAAS,QAAQ,eAAe,MAAM,GAAC;EAAA,QACpE,YAAA,MAAY;EAAI,OACjB,YAAA,MAAY;CAAS,CAAA,GAAA,CAAA,SAAA,KAAA,CAAA;AAKhC,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH;;;;;;AAWA,IAAa,cAAc,0BAAW,SAAA,UAAoC;CAAA,MAAA,WAAAH,aAAA,OAAA;CACxE,MAAM,SAAS,UAAU;CACzB,aAAOE,YAAA,OAAAC,cAEC,WAAW,OAAO,KAAK,GACvB,IAAI,MAAM,eAAe,MAAM,eAAe,MAAM,GAAC;EAAA,QACnD,OAAO,KAAK;EAAI,OACjB,OAAO,KAAK;CAAS,CAAA,GAAA,CAAA,SAAA,KAAA,CAAA;AAKhC,GAAC,EAAA,MAAA,cAAA,CAAA"}
|
package/dist/config/context.d.ts
CHANGED
|
@@ -45,6 +45,14 @@ export interface UiRouter {
|
|
|
45
45
|
*/
|
|
46
46
|
replaceQuery?: (patch: QueryPatch) => void;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* 权限判断:用户有没有这个权限点。组件库不知道权限从哪来(后端返回的权限点、角色…),由应用接入:
|
|
50
|
+
*
|
|
51
|
+
* createUi({ permissions: (permission) => access.can(permission) })
|
|
52
|
+
*
|
|
53
|
+
* 在渲染时调用,读响应式状态就能跟随变化(登录、退出、换角色后界面随之更新)。用 Can、useCan 控制界面。
|
|
54
|
+
*/
|
|
55
|
+
export type UiPermissions = (permission: string) => boolean;
|
|
48
56
|
/** 地址里的查询参数:同名多个时是数组;只写了键(?flag)时是空字符串 */
|
|
49
57
|
export type QueryValues = Readonly<Record<string, string | readonly string[]>>;
|
|
50
58
|
/** 要改的查询参数:undefined 是删掉 */
|
|
@@ -65,6 +73,8 @@ export interface UiConfig {
|
|
|
65
73
|
readonly styles: StyleLayers;
|
|
66
74
|
/** 路由适配;没有时链接就是普通的页面跳转 */
|
|
67
75
|
readonly router?: UiRouter;
|
|
76
|
+
/** 权限判断;没有时 useCan、Can 一律放行 */
|
|
77
|
+
readonly permissions?: UiPermissions;
|
|
68
78
|
/** 请求客户端(远程选项、上传、列表查询用);没有时 useHttp 给一个默认的 createHttpClient() */
|
|
69
79
|
readonly http?: HttpClient;
|
|
70
80
|
/** 工作日历(时限、剩余工作日用);没有时只按周末算 */
|
|
@@ -88,3 +98,11 @@ export declare function useLang(): Lang;
|
|
|
88
98
|
* 在 setup 里调用,返回的函数在渲染、计算里调用(读到最新的语言与配置)
|
|
89
99
|
*/
|
|
90
100
|
export declare function useTextMatcher(): () => TextMatcher;
|
|
101
|
+
/**
|
|
102
|
+
* 当前配置下的权限判断(在 setup 里调用):返回 can(权限点),给数组时有其中任意一个就算有。
|
|
103
|
+
* createUi / Provider 没给 permissions 时一律放行(没有权限体系的应用不受影响)。返回的函数在渲染、计算里调用才跟随变化。
|
|
104
|
+
*
|
|
105
|
+
* const can = useCan();
|
|
106
|
+
* <Button disabled={!can('cost:project:add')}>新建</Button>
|
|
107
|
+
*/
|
|
108
|
+
export declare function useCan(): (permission: string | readonly string[]) => boolean;
|
package/dist/config/context.js
CHANGED
|
@@ -52,7 +52,22 @@ function useTextMatcher() {
|
|
|
52
52
|
return extra ? (text, query) => builtin(text, query) || extra(text, query) : builtin;
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* 当前配置下的权限判断(在 setup 里调用):返回 can(权限点),给数组时有其中任意一个就算有。
|
|
57
|
+
* createUi / Provider 没给 permissions 时一律放行(没有权限体系的应用不受影响)。返回的函数在渲染、计算里调用才跟随变化。
|
|
58
|
+
*
|
|
59
|
+
* const can = useCan();
|
|
60
|
+
* <Button disabled={!can('cost:project:add')}>新建</Button>
|
|
61
|
+
*/
|
|
62
|
+
function useCan() {
|
|
63
|
+
const config = useConfig();
|
|
64
|
+
return (permission) => {
|
|
65
|
+
const has = config.permissions;
|
|
66
|
+
if (!has) return true;
|
|
67
|
+
return typeof permission === "string" ? has(permission) : permission.some((item) => has(item));
|
|
68
|
+
};
|
|
69
|
+
}
|
|
55
70
|
//#endregion
|
|
56
|
-
export { ConfigContext, defaultConfig, useConfig, useLang, useTextMatcher };
|
|
71
|
+
export { ConfigContext, defaultConfig, useCan, useConfig, useLang, useTextMatcher };
|
|
57
72
|
|
|
58
73
|
//# sourceMappingURL=context.js.map
|