@zerodep-dev/vue-tsx-pro-ui 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +32 -2
- package/dist/base/Badge.d.ts +28 -0
- package/dist/base/Badge.js +72 -0
- package/dist/base/Badge.js.map +1 -0
- package/dist/base/Blockquote.d.ts +13 -0
- package/dist/base/Blockquote.js +26 -0
- package/dist/base/Blockquote.js.map +1 -0
- package/dist/base/Button.d.ts +18 -0
- package/dist/base/Button.js +86 -0
- package/dist/base/Button.js.map +1 -0
- package/dist/base/ButtonBase.d.ts +21 -0
- package/dist/base/ButtonBase.js +51 -0
- package/dist/base/ButtonBase.js.map +1 -0
- package/dist/base/ButtonGroup.d.ts +24 -0
- package/dist/base/ButtonGroup.js +52 -0
- package/dist/base/ButtonGroup.js.map +1 -0
- package/dist/base/CloseButton.d.ts +15 -0
- package/dist/base/CloseButton.js +38 -0
- package/dist/base/CloseButton.js.map +1 -0
- package/dist/base/Code.d.ts +13 -0
- package/dist/base/Code.js +27 -0
- package/dist/base/Code.js.map +1 -0
- package/dist/base/CodeBlock.d.ts +89 -0
- package/dist/base/CodeBlock.js +265 -0
- package/dist/base/CodeBlock.js.map +1 -0
- package/dist/base/CopyButton.d.ts +40 -0
- package/dist/base/CopyButton.js +113 -0
- package/dist/base/CopyButton.js.map +1 -0
- package/dist/base/Heading.d.ts +49 -0
- package/dist/base/Heading.js +122 -0
- package/dist/base/Heading.js.map +1 -0
- package/dist/base/Icon.d.ts +48 -0
- package/dist/base/Icon.js +110 -0
- package/dist/base/Icon.js.map +1 -0
- package/dist/base/IconButton.d.ts +34 -0
- package/dist/base/IconButton.js +81 -0
- package/dist/base/IconButton.js.map +1 -0
- package/dist/base/IconLinkButton.d.ts +34 -0
- package/dist/base/IconLinkButton.js +81 -0
- package/dist/base/IconLinkButton.js.map +1 -0
- package/dist/base/Indicator.d.ts +126 -0
- package/dist/base/Indicator.js +158 -0
- package/dist/base/Indicator.js.map +1 -0
- package/dist/base/Kbd.d.ts +13 -0
- package/dist/base/Kbd.js +34 -0
- package/dist/base/Kbd.js.map +1 -0
- package/dist/base/Link.d.ts +61 -0
- package/dist/base/Link.js +114 -0
- package/dist/base/Link.js.map +1 -0
- package/dist/base/LinkButton.d.ts +18 -0
- package/dist/base/LinkButton.js +109 -0
- package/dist/base/LinkButton.js.map +1 -0
- package/dist/base/List.d.ts +61 -0
- package/dist/base/List.js +116 -0
- package/dist/base/List.js.map +1 -0
- package/dist/base/Mark.d.ts +13 -0
- package/dist/base/Mark.js +23 -0
- package/dist/base/Mark.js.map +1 -0
- package/dist/base/Spinner.d.ts +20 -0
- package/dist/base/Spinner.js +59 -0
- package/dist/base/Spinner.js.map +1 -0
- package/dist/base/StatusDot.d.ts +48 -0
- package/dist/base/StatusDot.js +62 -0
- package/dist/base/StatusDot.js.map +1 -0
- package/dist/base/Tag.d.ts +29 -0
- package/dist/base/Tag.js +92 -0
- package/dist/base/Tag.js.map +1 -0
- package/dist/base/Text.d.ts +57 -0
- package/dist/base/Text.js +74 -0
- package/dist/base/Text.js.map +1 -0
- package/dist/base/VisuallyHidden.d.ts +13 -0
- package/dist/base/VisuallyHidden.js +28 -0
- package/dist/base/VisuallyHidden.js.map +1 -0
- package/dist/base/badge-styles.d.ts +57 -0
- package/dist/base/badge-styles.js +329 -0
- package/dist/base/badge-styles.js.map +1 -0
- package/dist/base/button-core.d.ts +191 -0
- package/dist/base/button-core.js +660 -0
- package/dist/base/button-core.js.map +1 -0
- package/dist/charts/AreaChart.d.ts +18 -0
- package/dist/charts/AreaChart.js +90 -0
- package/dist/charts/AreaChart.js.map +1 -0
- package/dist/charts/BarChart.d.ts +19 -0
- package/dist/charts/BarChart.js +88 -0
- package/dist/charts/BarChart.js.map +1 -0
- package/dist/charts/ChordChart.d.ts +48 -0
- package/dist/charts/ChordChart.js +149 -0
- package/dist/charts/ChordChart.js.map +1 -0
- package/dist/charts/ComboChart.d.ts +30 -0
- package/dist/charts/ComboChart.js +157 -0
- package/dist/charts/ComboChart.js.map +1 -0
- package/dist/charts/DonutChart.d.ts +65 -0
- package/dist/charts/DonutChart.js +162 -0
- package/dist/charts/DonutChart.js.map +1 -0
- package/dist/charts/FunnelChart.d.ts +69 -0
- package/dist/charts/FunnelChart.js +181 -0
- package/dist/charts/FunnelChart.js.map +1 -0
- package/dist/charts/GraphChart.d.ts +135 -0
- package/dist/charts/GraphChart.js +274 -0
- package/dist/charts/GraphChart.js.map +1 -0
- package/dist/charts/LineChart.d.ts +50 -0
- package/dist/charts/LineChart.js +94 -0
- package/dist/charts/LineChart.js.map +1 -0
- package/dist/charts/MapChart.d.ts +167 -0
- package/dist/charts/MapChart.js +627 -0
- package/dist/charts/MapChart.js.map +1 -0
- package/dist/charts/RadarChart.d.ts +60 -0
- package/dist/charts/RadarChart.js +224 -0
- package/dist/charts/RadarChart.js.map +1 -0
- package/dist/charts/SankeyChart.d.ts +57 -0
- package/dist/charts/SankeyChart.js +150 -0
- package/dist/charts/SankeyChart.js.map +1 -0
- package/dist/charts/ScatterChart.d.ts +18 -0
- package/dist/charts/ScatterChart.js +82 -0
- package/dist/charts/ScatterChart.js.map +1 -0
- package/dist/charts/TimelineChart.d.ts +71 -0
- package/dist/charts/TimelineChart.js +267 -0
- package/dist/charts/TimelineChart.js.map +1 -0
- package/dist/charts/TreemapChart.d.ts +40 -0
- package/dist/charts/TreemapChart.js +155 -0
- package/dist/charts/TreemapChart.js.map +1 -0
- package/dist/charts/WaterfallChart.d.ts +61 -0
- package/dist/charts/WaterfallChart.js +167 -0
- package/dist/charts/WaterfallChart.js.map +1 -0
- package/dist/charts/XYChart.d.ts +206 -0
- package/dist/charts/XYChart.js +520 -0
- package/dist/charts/XYChart.js.map +1 -0
- package/dist/charts/axis-ticks.d.ts +23 -0
- package/dist/charts/axis-ticks.js +59 -0
- package/dist/charts/axis-ticks.js.map +1 -0
- package/dist/charts/export.d.ts +17 -0
- package/dist/charts/export.js +65 -0
- package/dist/charts/export.js.map +1 -0
- package/dist/charts/flow.d.ts +53 -0
- package/dist/charts/flow.js +29 -0
- package/dist/charts/flow.js.map +1 -0
- package/dist/charts/frame.d.ts +147 -0
- package/dist/charts/frame.js +358 -0
- package/dist/charts/frame.js.map +1 -0
- package/dist/charts/index.d.ts +30 -0
- package/dist/charts/index.js +24 -0
- package/dist/charts/label-layout.d.ts +59 -0
- package/dist/charts/label-layout.js +64 -0
- package/dist/charts/label-layout.js.map +1 -0
- package/dist/charts/series.d.ts +36 -0
- package/dist/charts/series.js +60 -0
- package/dist/charts/series.js.map +1 -0
- package/dist/charts/single.d.ts +41 -0
- package/dist/charts/single.js +65 -0
- package/dist/charts/single.js.map +1 -0
- package/dist/config/Provider.d.ts +52 -0
- package/dist/config/Provider.js +111 -0
- package/dist/config/Provider.js.map +1 -0
- package/dist/config/context.d.ts +90 -0
- package/dist/config/context.js +58 -0
- package/dist/config/context.js.map +1 -0
- package/dist/config/createUi.d.ts +52 -0
- package/dist/config/createUi.js +96 -0
- package/dist/config/createUi.js.map +1 -0
- package/dist/config/defaults.d.ts +71 -0
- package/dist/config/defaults.js +45 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/lang/en-US.d.ts +3 -0
- package/dist/config/lang/en-US.js +386 -0
- package/dist/config/lang/en-US.js.map +1 -0
- package/dist/config/lang/format.d.ts +50 -0
- package/dist/config/lang/format.js +113 -0
- package/dist/config/lang/format.js.map +1 -0
- package/dist/config/lang/lang.d.ts +653 -0
- package/dist/config/lang/lang.js +22 -0
- package/dist/config/lang/lang.js.map +1 -0
- package/dist/config/lang/messages.d.ts +12 -0
- package/dist/config/lang/messages.js +36 -0
- package/dist/config/lang/messages.js.map +1 -0
- package/dist/config/lang/zh-CN.d.ts +3 -0
- package/dist/config/lang/zh-CN.js +386 -0
- package/dist/config/lang/zh-CN.js.map +1 -0
- package/dist/config/pinyin.d.ts +3 -0
- package/dist/config/pinyin.js +26 -0
- package/dist/config/pinyin.js.map +1 -0
- package/dist/config/query-state.d.ts +61 -0
- package/dist/config/query-state.js +113 -0
- package/dist/config/query-state.js.map +1 -0
- package/dist/config/shiki.d.ts +13 -0
- package/dist/config/shiki.js +97 -0
- package/dist/config/shiki.js.map +1 -0
- package/dist/config/styles.d.ts +108 -0
- package/dist/config/styles.js +59 -0
- package/dist/config/styles.js.map +1 -0
- package/dist/config/theme/boot.d.ts +97 -0
- package/dist/config/theme/boot.js +90 -0
- package/dist/config/theme/boot.js.map +1 -0
- package/dist/config/theme/builtin.d.ts +21 -0
- package/dist/config/theme/builtin.js +58 -0
- package/dist/config/theme/builtin.js.map +1 -0
- package/dist/config/theme/coffee.d.ts +84 -0
- package/dist/config/theme/coffee.js +102 -0
- package/dist/config/theme/coffee.js.map +1 -0
- package/dist/config/theme/cyberpunk.d.ts +110 -0
- package/dist/config/theme/cyberpunk.js +125 -0
- package/dist/config/theme/cyberpunk.js.map +1 -0
- package/dist/config/theme/dark.d.ts +90 -0
- package/dist/config/theme/dark.js +106 -0
- package/dist/config/theme/dark.js.map +1 -0
- package/dist/config/theme/festive.d.ts +93 -0
- package/dist/config/theme/festive.js +110 -0
- package/dist/config/theme/festive.js.map +1 -0
- package/dist/config/theme/forest.d.ts +93 -0
- package/dist/config/theme/forest.js +109 -0
- package/dist/config/theme/forest.js.map +1 -0
- package/dist/config/theme/high-contrast.d.ts +103 -0
- package/dist/config/theme/high-contrast.js +119 -0
- package/dist/config/theme/high-contrast.js.map +1 -0
- package/dist/config/theme/lemon.d.ts +103 -0
- package/dist/config/theme/lemon.js +119 -0
- package/dist/config/theme/lemon.js.map +1 -0
- package/dist/config/theme/light.d.ts +107 -0
- package/dist/config/theme/light.js +122 -0
- package/dist/config/theme/light.js.map +1 -0
- package/dist/config/theme/midnight.d.ts +86 -0
- package/dist/config/theme/midnight.js +103 -0
- package/dist/config/theme/midnight.js.map +1 -0
- package/dist/config/theme/ocean.d.ts +103 -0
- package/dist/config/theme/ocean.js +119 -0
- package/dist/config/theme/ocean.js.map +1 -0
- package/dist/config/theme/paper.d.ts +101 -0
- package/dist/config/theme/paper.js +117 -0
- package/dist/config/theme/paper.js.map +1 -0
- package/dist/config/theme/preference.d.ts +34 -0
- package/dist/config/theme/preference.js +67 -0
- package/dist/config/theme/preference.js.map +1 -0
- package/dist/config/theme/sakura.d.ts +103 -0
- package/dist/config/theme/sakura.js +119 -0
- package/dist/config/theme/sakura.js.map +1 -0
- package/dist/config/theme/theme.d.ts +59 -0
- package/dist/config/theme/theme.js +68 -0
- package/dist/config/theme/theme.js.map +1 -0
- package/dist/config/theme/token-names.d.ts +1897 -0
- package/dist/config/theme/tokens.d.ts +833 -0
- package/dist/config/theme/tokens.js +480 -0
- package/dist/config/theme/tokens.js.map +1 -0
- package/dist/config/vue-router.d.ts +67 -0
- package/dist/config/vue-router.js +143 -0
- package/dist/config/vue-router.js.map +1 -0
- package/dist/date/Calendar.d.ts +36 -0
- package/dist/date/Calendar.js +83 -0
- package/dist/date/Calendar.js.map +1 -0
- package/dist/date/CalendarBoard.d.ts +79 -0
- package/dist/date/CalendarBoard.js +403 -0
- package/dist/date/CalendarBoard.js.map +1 -0
- package/dist/date/CalendarView.d.ts +86 -0
- package/dist/date/CalendarView.js +427 -0
- package/dist/date/CalendarView.js.map +1 -0
- package/dist/date/Countdown.d.ts +45 -0
- package/dist/date/Countdown.js +75 -0
- package/dist/date/Countdown.js.map +1 -0
- package/dist/date/DateField.d.ts +34 -0
- package/dist/date/DateField.js +124 -0
- package/dist/date/DateField.js.map +1 -0
- package/dist/date/DatePicker.d.ts +41 -0
- package/dist/date/DatePicker.js +272 -0
- package/dist/date/DatePicker.js.map +1 -0
- package/dist/date/DateRangePicker.d.ts +71 -0
- package/dist/date/DateRangePicker.js +411 -0
- package/dist/date/DateRangePicker.js.map +1 -0
- package/dist/date/DateSegmentGroup.d.ts +38 -0
- package/dist/date/DateSegmentGroup.js +176 -0
- package/dist/date/DateSegmentGroup.js.map +1 -0
- package/dist/date/DateTime.d.ts +21 -0
- package/dist/date/DateTime.js +39 -0
- package/dist/date/DateTime.js.map +1 -0
- package/dist/date/QuarterCalendar.d.ts +22 -0
- package/dist/date/QuarterCalendar.js +231 -0
- package/dist/date/QuarterCalendar.js.map +1 -0
- package/dist/date/RangeCalendar.d.ts +24 -0
- package/dist/date/RangeCalendar.js +89 -0
- package/dist/date/RangeCalendar.js.map +1 -0
- package/dist/date/RelativeTime.d.ts +16 -0
- package/dist/date/RelativeTime.js +61 -0
- package/dist/date/RelativeTime.js.map +1 -0
- package/dist/date/SegmentedField.d.ts +60 -0
- package/dist/date/SegmentedField.js +175 -0
- package/dist/date/SegmentedField.js.map +1 -0
- package/dist/date/TimeField.d.ts +36 -0
- package/dist/date/TimeField.js +56 -0
- package/dist/date/TimeField.js.map +1 -0
- package/dist/date/TimePicker.d.ts +25 -0
- package/dist/date/TimePicker.js +206 -0
- package/dist/date/TimePicker.js.map +1 -0
- package/dist/date/calendar-state.d.ts +119 -0
- package/dist/date/calendar-state.js +267 -0
- package/dist/date/calendar-state.js.map +1 -0
- package/dist/date/clock.d.ts +11 -0
- package/dist/date/clock.js +37 -0
- package/dist/date/clock.js.map +1 -0
- package/dist/date/date-locale.d.ts +67 -0
- package/dist/date/date-locale.js +89 -0
- package/dist/date/date-locale.js.map +1 -0
- package/dist/date/date-segments.d.ts +132 -0
- package/dist/date/date-segments.js +410 -0
- package/dist/date/date-segments.js.map +1 -0
- package/dist/date/picker-popover.d.ts +88 -0
- package/dist/date/picker-popover.js +126 -0
- package/dist/date/picker-popover.js.map +1 -0
- package/dist/diagram/Diagram.d.ts +223 -0
- package/dist/diagram/Diagram.js +1121 -0
- package/dist/diagram/Diagram.js.map +1 -0
- package/dist/diagram/DiagramControls.d.ts +35 -0
- package/dist/diagram/DiagramControls.js +114 -0
- package/dist/diagram/DiagramControls.js.map +1 -0
- package/dist/diagram/DiagramLanes.d.ts +49 -0
- package/dist/diagram/DiagramLanes.js +92 -0
- package/dist/diagram/DiagramLanes.js.map +1 -0
- package/dist/diagram/DiagramMinimap.d.ts +39 -0
- package/dist/diagram/DiagramMinimap.js +133 -0
- package/dist/diagram/DiagramMinimap.js.map +1 -0
- package/dist/diagram/DiagramNode.d.ts +65 -0
- package/dist/diagram/DiagramNode.js +142 -0
- package/dist/diagram/DiagramNode.js.map +1 -0
- package/dist/diagram/controller.d.ts +68 -0
- package/dist/diagram/controller.js +117 -0
- package/dist/diagram/controller.js.map +1 -0
- package/dist/diagram/export.d.ts +14 -0
- package/dist/diagram/export.js +115 -0
- package/dist/diagram/export.js.map +1 -0
- package/dist/diagram/geometry.d.ts +65 -0
- package/dist/diagram/geometry.js +219 -0
- package/dist/diagram/geometry.js.map +1 -0
- package/dist/diagram/index.d.ts +19 -0
- package/dist/diagram/index.js +11 -0
- package/dist/diagram/messages.d.ts +28 -0
- package/dist/diagram/messages.js +30 -0
- package/dist/diagram/messages.js.map +1 -0
- package/dist/diagram/route.d.ts +81 -0
- package/dist/diagram/route.js +327 -0
- package/dist/diagram/route.js.map +1 -0
- package/dist/display/Accordion.d.ts +71 -0
- package/dist/display/Accordion.js +219 -0
- package/dist/display/Accordion.js.map +1 -0
- package/dist/display/AnimatedNumber.d.ts +44 -0
- package/dist/display/AnimatedNumber.js +97 -0
- package/dist/display/AnimatedNumber.js.map +1 -0
- package/dist/display/Avatar.d.ts +74 -0
- package/dist/display/Avatar.js +158 -0
- package/dist/display/Avatar.js.map +1 -0
- package/dist/display/AvatarGroup.d.ts +29 -0
- package/dist/display/AvatarGroup.js +67 -0
- package/dist/display/AvatarGroup.js.map +1 -0
- package/dist/display/Card.d.ts +219 -0
- package/dist/display/Card.js +319 -0
- package/dist/display/Card.js.map +1 -0
- package/dist/display/Checklist.d.ts +93 -0
- package/dist/display/Checklist.js +260 -0
- package/dist/display/Checklist.js.map +1 -0
- package/dist/display/Collapse.d.ts +24 -0
- package/dist/display/Collapse.js +65 -0
- package/dist/display/Collapse.js.map +1 -0
- package/dist/display/Collapsible.d.ts +12 -0
- package/dist/display/Collapsible.js +41 -0
- package/dist/display/Collapsible.js.map +1 -0
- package/dist/display/Descriptions.d.ts +88 -0
- package/dist/display/Descriptions.js +185 -0
- package/dist/display/Descriptions.js.map +1 -0
- package/dist/display/Ellipsis.d.ts +29 -0
- package/dist/display/Ellipsis.js +111 -0
- package/dist/display/Ellipsis.js.map +1 -0
- package/dist/display/FieldCompare.d.ts +58 -0
- package/dist/display/FieldCompare.js +205 -0
- package/dist/display/FieldCompare.js.map +1 -0
- package/dist/display/Gauge.d.ts +60 -0
- package/dist/display/Gauge.js +215 -0
- package/dist/display/Gauge.js.map +1 -0
- package/dist/display/Image.d.ts +87 -0
- package/dist/display/Image.js +212 -0
- package/dist/display/Image.js.map +1 -0
- package/dist/display/ItemList.d.ts +69 -0
- package/dist/display/ItemList.js +147 -0
- package/dist/display/ItemList.js.map +1 -0
- package/dist/display/Marquee.d.ts +59 -0
- package/dist/display/Marquee.js +155 -0
- package/dist/display/Marquee.js.map +1 -0
- package/dist/display/ProportionBar.d.ts +55 -0
- package/dist/display/ProportionBar.js +99 -0
- package/dist/display/ProportionBar.js.map +1 -0
- package/dist/display/Sortable.d.ts +43 -0
- package/dist/display/Sortable.js +163 -0
- package/dist/display/Sortable.js.map +1 -0
- package/dist/display/Sparkline.d.ts +48 -0
- package/dist/display/Sparkline.js +130 -0
- package/dist/display/Sparkline.js.map +1 -0
- package/dist/display/Stat.d.ts +105 -0
- package/dist/display/Stat.js +268 -0
- package/dist/display/Stat.js.map +1 -0
- package/dist/display/Timeline.d.ts +106 -0
- package/dist/display/Timeline.js +257 -0
- package/dist/display/Timeline.js.map +1 -0
- package/dist/display/Tree.d.ts +132 -0
- package/dist/display/Tree.js +645 -0
- package/dist/display/Tree.js.map +1 -0
- package/dist/display/VirtualList.d.ts +80 -0
- package/dist/display/VirtualList.js +166 -0
- package/dist/display/VirtualList.js.map +1 -0
- package/dist/display/Watermark.d.ts +39 -0
- package/dist/display/Watermark.js +130 -0
- package/dist/display/Watermark.js.map +1 -0
- package/dist/docs-kit/CodeGroup.d.ts +29 -0
- package/dist/docs-kit/CodeGroup.js +81 -0
- package/dist/docs-kit/CodeGroup.js.map +1 -0
- package/dist/docs-kit/CodePreview.d.ts +60 -0
- package/dist/docs-kit/CodePreview.js +183 -0
- package/dist/docs-kit/CodePreview.js.map +1 -0
- package/dist/docs-kit/ColorSwatch.d.ts +28 -0
- package/dist/docs-kit/ColorSwatch.js +85 -0
- package/dist/docs-kit/ColorSwatch.js.map +1 -0
- package/dist/docs-kit/PropsTable.d.ts +73 -0
- package/dist/docs-kit/PropsTable.js +122 -0
- package/dist/docs-kit/PropsTable.js.map +1 -0
- package/dist/docs-kit/index.d.ts +13 -0
- package/dist/docs-kit/index.js +6 -0
- package/dist/docs-kit/messages.d.ts +25 -0
- package/dist/docs-kit/messages.js +30 -0
- package/dist/docs-kit/messages.js.map +1 -0
- package/dist/feedback/Alert.d.ts +83 -0
- package/dist/feedback/Alert.js +179 -0
- package/dist/feedback/Alert.js.map +1 -0
- package/dist/feedback/Banner.d.ts +60 -0
- package/dist/feedback/Banner.js +122 -0
- package/dist/feedback/Banner.js.map +1 -0
- package/dist/feedback/Empty.d.ts +38 -0
- package/dist/feedback/Empty.js +114 -0
- package/dist/feedback/Empty.js.map +1 -0
- package/dist/feedback/LoadingBar.d.ts +45 -0
- package/dist/feedback/LoadingBar.js +124 -0
- package/dist/feedback/LoadingBar.js.map +1 -0
- package/dist/feedback/LoadingOverlay.d.ts +29 -0
- package/dist/feedback/LoadingOverlay.js +70 -0
- package/dist/feedback/LoadingOverlay.js.map +1 -0
- package/dist/feedback/Progress.d.ts +215 -0
- package/dist/feedback/Progress.js +437 -0
- package/dist/feedback/Progress.js.map +1 -0
- package/dist/feedback/Result.d.ts +69 -0
- package/dist/feedback/Result.js +165 -0
- package/dist/feedback/Result.js.map +1 -0
- package/dist/feedback/Skeleton.d.ts +50 -0
- package/dist/feedback/Skeleton.js +100 -0
- package/dist/feedback/Skeleton.js.map +1 -0
- package/dist/feedback/SkeletonText.d.ts +25 -0
- package/dist/feedback/SkeletonText.js +40 -0
- package/dist/feedback/SkeletonText.js.map +1 -0
- package/dist/feedback/Toast.d.ts +204 -0
- package/dist/feedback/Toast.js +572 -0
- package/dist/feedback/Toast.js.map +1 -0
- package/dist/form/Field.d.ts +158 -0
- package/dist/form/Field.js +327 -0
- package/dist/form/Field.js.map +1 -0
- package/dist/form/Form.d.ts +14 -0
- package/dist/form/Form.js +66 -0
- package/dist/form/Form.js.map +1 -0
- package/dist/form/FormErrorSummary.d.ts +23 -0
- package/dist/form/FormErrorSummary.js +102 -0
- package/dist/form/FormErrorSummary.js.map +1 -0
- package/dist/form/FormSection.d.ts +66 -0
- package/dist/form/FormSection.js +227 -0
- package/dist/form/FormSection.js.map +1 -0
- package/dist/form/FormValue.d.ts +17 -0
- package/dist/form/FormValue.js +40 -0
- package/dist/form/FormValue.js.map +1 -0
- package/dist/form/field-layout.d.ts +34 -0
- package/dist/form/field-layout.js +39 -0
- package/dist/form/field-layout.js.map +1 -0
- package/dist/form/form-constraints.d.ts +38 -0
- package/dist/form/form-constraints.js +131 -0
- package/dist/form/form-constraints.js.map +1 -0
- package/dist/form/leave-confirmation.d.ts +9 -0
- package/dist/form/leave-confirmation.js +31 -0
- package/dist/form/leave-confirmation.js.map +1 -0
- package/dist/form/schemas.d.ts +52 -0
- package/dist/form/schemas.js +97 -0
- package/dist/form/schemas.js.map +1 -0
- package/dist/form/useForm.d.ts +192 -0
- package/dist/form/useForm.js +394 -0
- package/dist/form/useForm.js.map +1 -0
- package/dist/index.d.ts +282 -0
- package/dist/index.js +282 -0
- package/dist/input/Autocomplete.d.ts +14 -0
- package/dist/input/Autocomplete.js +35 -0
- package/dist/input/Autocomplete.js.map +1 -0
- package/dist/input/Cascader.d.ts +86 -0
- package/dist/input/Cascader.js +593 -0
- package/dist/input/Cascader.js.map +1 -0
- package/dist/input/CharacterCount.d.ts +21 -0
- package/dist/input/CharacterCount.js +47 -0
- package/dist/input/CharacterCount.js.map +1 -0
- package/dist/input/Checkbox.d.ts +93 -0
- package/dist/input/Checkbox.js +250 -0
- package/dist/input/Checkbox.js.map +1 -0
- package/dist/input/ColorField.d.ts +37 -0
- package/dist/input/ColorField.js +143 -0
- package/dist/input/ColorField.js.map +1 -0
- package/dist/input/Combobox.d.ts +75 -0
- package/dist/input/Combobox.js +321 -0
- package/dist/input/Combobox.js.map +1 -0
- package/dist/input/ConditionBuilder.d.ts +55 -0
- package/dist/input/ConditionBuilder.js +471 -0
- package/dist/input/ConditionBuilder.js.map +1 -0
- package/dist/input/ControlGroup.d.ts +26 -0
- package/dist/input/ControlGroup.js +50 -0
- package/dist/input/ControlGroup.js.map +1 -0
- package/dist/input/FileDrop.d.ts +49 -0
- package/dist/input/FileDrop.js +201 -0
- package/dist/input/FileDrop.js.map +1 -0
- package/dist/input/ListPopover.d.ts +39 -0
- package/dist/input/ListPopover.js +81 -0
- package/dist/input/ListPopover.js.map +1 -0
- package/dist/input/Listbox.d.ts +91 -0
- package/dist/input/Listbox.js +408 -0
- package/dist/input/Listbox.js.map +1 -0
- package/dist/input/Mentions.d.ts +74 -0
- package/dist/input/Mentions.js +287 -0
- package/dist/input/Mentions.js.map +1 -0
- package/dist/input/NumberField.d.ts +64 -0
- package/dist/input/NumberField.js +288 -0
- package/dist/input/NumberField.js.map +1 -0
- package/dist/input/NumberRangeField.d.ts +58 -0
- package/dist/input/NumberRangeField.js +157 -0
- package/dist/input/NumberRangeField.js.map +1 -0
- package/dist/input/OtpField.d.ts +58 -0
- package/dist/input/OtpField.js +200 -0
- package/dist/input/OtpField.js.map +1 -0
- package/dist/input/PeoplePicker.d.ts +42 -0
- package/dist/input/PeoplePicker.js +185 -0
- package/dist/input/PeoplePicker.js.map +1 -0
- package/dist/input/PeoplePickerPanel.d.ts +42 -0
- package/dist/input/PeoplePickerPanel.js +357 -0
- package/dist/input/PeoplePickerPanel.js.map +1 -0
- package/dist/input/Radio.d.ts +90 -0
- package/dist/input/Radio.js +211 -0
- package/dist/input/Radio.js.map +1 -0
- package/dist/input/Rating.d.ts +62 -0
- package/dist/input/Rating.js +225 -0
- package/dist/input/Rating.js.map +1 -0
- package/dist/input/Select.d.ts +97 -0
- package/dist/input/Select.js +455 -0
- package/dist/input/Select.js.map +1 -0
- package/dist/input/SelectedTags.d.ts +28 -0
- package/dist/input/SelectedTags.js +81 -0
- package/dist/input/SelectedTags.js.map +1 -0
- package/dist/input/Slider.d.ts +99 -0
- package/dist/input/Slider.js +343 -0
- package/dist/input/Slider.js.map +1 -0
- package/dist/input/Switch.d.ts +63 -0
- package/dist/input/Switch.js +198 -0
- package/dist/input/Switch.js.map +1 -0
- package/dist/input/TagsInput.d.ts +70 -0
- package/dist/input/TagsInput.js +314 -0
- package/dist/input/TagsInput.js.map +1 -0
- package/dist/input/TextField.d.ts +51 -0
- package/dist/input/TextField.js +185 -0
- package/dist/input/TextField.js.map +1 -0
- package/dist/input/Textarea.d.ts +50 -0
- package/dist/input/Textarea.js +146 -0
- package/dist/input/Textarea.js.map +1 -0
- package/dist/input/ToggleGroup.d.ts +82 -0
- package/dist/input/ToggleGroup.js +211 -0
- package/dist/input/ToggleGroup.js.map +1 -0
- package/dist/input/Transfer.d.ts +67 -0
- package/dist/input/Transfer.js +407 -0
- package/dist/input/Transfer.js.map +1 -0
- package/dist/input/TreeSelect.d.ts +94 -0
- package/dist/input/TreeSelect.js +412 -0
- package/dist/input/TreeSelect.js.map +1 -0
- package/dist/input/Upload.d.ts +143 -0
- package/dist/input/Upload.js +597 -0
- package/dist/input/Upload.js.map +1 -0
- package/dist/input/choice-styles.d.ts +117 -0
- package/dist/input/choice-styles.js +176 -0
- package/dist/input/choice-styles.js.map +1 -0
- package/dist/input/condition.d.ts +153 -0
- package/dist/input/condition.js +169 -0
- package/dist/input/condition.js.map +1 -0
- package/dist/input/control.d.ts +160 -0
- package/dist/input/control.js +236 -0
- package/dist/input/control.js.map +1 -0
- package/dist/input/list-state.d.ts +118 -0
- package/dist/input/list-state.js +186 -0
- package/dist/input/list-state.js.map +1 -0
- package/dist/input/people.d.ts +65 -0
- package/dist/input/people.js +47 -0
- package/dist/input/people.js.map +1 -0
- package/dist/input/remote-items.d.ts +20 -0
- package/dist/input/remote-items.js +36 -0
- package/dist/input/remote-items.js.map +1 -0
- package/dist/input/text-format.d.ts +46 -0
- package/dist/input/text-format.js +64 -0
- package/dist/input/text-format.js.map +1 -0
- package/dist/layout/Affix.d.ts +32 -0
- package/dist/layout/Affix.js +81 -0
- package/dist/layout/Affix.js.map +1 -0
- package/dist/layout/AsideLayout.d.ts +45 -0
- package/dist/layout/AsideLayout.js +69 -0
- package/dist/layout/AsideLayout.js.map +1 -0
- package/dist/layout/BackTop.d.ts +16 -0
- package/dist/layout/BackTop.js +83 -0
- package/dist/layout/BackTop.js.map +1 -0
- package/dist/layout/Container.d.ts +60 -0
- package/dist/layout/Container.js +62 -0
- package/dist/layout/Container.js.map +1 -0
- package/dist/layout/Flex.d.ts +116 -0
- package/dist/layout/Flex.js +109 -0
- package/dist/layout/Flex.js.map +1 -0
- package/dist/layout/Grid.d.ts +139 -0
- package/dist/layout/Grid.js +168 -0
- package/dist/layout/Grid.js.map +1 -0
- package/dist/layout/PageScrollbar.d.ts +20 -0
- package/dist/layout/PageScrollbar.js +49 -0
- package/dist/layout/PageScrollbar.js.map +1 -0
- package/dist/layout/Prose.d.ts +19 -0
- package/dist/layout/Prose.js +37 -0
- package/dist/layout/Prose.js.map +1 -0
- package/dist/layout/ResizeHandle.d.ts +28 -0
- package/dist/layout/ResizeHandle.js +94 -0
- package/dist/layout/ResizeHandle.js.map +1 -0
- package/dist/layout/ScrollArea.d.ts +99 -0
- package/dist/layout/ScrollArea.js +344 -0
- package/dist/layout/ScrollArea.js.map +1 -0
- package/dist/layout/Separator.d.ts +47 -0
- package/dist/layout/Separator.js +96 -0
- package/dist/layout/Separator.js.map +1 -0
- package/dist/layout/Splitter.d.ts +75 -0
- package/dist/layout/Splitter.js +236 -0
- package/dist/layout/Splitter.js.map +1 -0
- package/dist/layout/ViewportFill.d.ts +26 -0
- package/dist/layout/ViewportFill.js +59 -0
- package/dist/layout/ViewportFill.js.map +1 -0
- package/dist/navigation/Breadcrumbs.d.ts +59 -0
- package/dist/navigation/Breadcrumbs.js +150 -0
- package/dist/navigation/Breadcrumbs.js.map +1 -0
- package/dist/navigation/NavBar.d.ts +35 -0
- package/dist/navigation/NavBar.js +182 -0
- package/dist/navigation/NavBar.js.map +1 -0
- package/dist/navigation/NavList.d.ts +112 -0
- package/dist/navigation/NavList.js +375 -0
- package/dist/navigation/NavList.js.map +1 -0
- package/dist/navigation/PageJump.d.ts +27 -0
- package/dist/navigation/PageJump.js +77 -0
- package/dist/navigation/PageJump.js.map +1 -0
- package/dist/navigation/PageSizeSelect.d.ts +19 -0
- package/dist/navigation/PageSizeSelect.js +65 -0
- package/dist/navigation/PageSizeSelect.js.map +1 -0
- package/dist/navigation/Pager.d.ts +30 -0
- package/dist/navigation/Pager.js +111 -0
- package/dist/navigation/Pager.js.map +1 -0
- package/dist/navigation/Pagination.d.ts +51 -0
- package/dist/navigation/Pagination.js +157 -0
- package/dist/navigation/Pagination.js.map +1 -0
- package/dist/navigation/PaginationBar.d.ts +54 -0
- package/dist/navigation/PaginationBar.js +125 -0
- package/dist/navigation/PaginationBar.js.map +1 -0
- package/dist/navigation/SkipLink.d.ts +16 -0
- package/dist/navigation/SkipLink.js +58 -0
- package/dist/navigation/SkipLink.js.map +1 -0
- package/dist/navigation/Steps.d.ts +93 -0
- package/dist/navigation/Steps.js +198 -0
- package/dist/navigation/Steps.js.map +1 -0
- package/dist/navigation/TableOfContents.d.ts +32 -0
- package/dist/navigation/TableOfContents.js +119 -0
- package/dist/navigation/TableOfContents.js.map +1 -0
- package/dist/navigation/Tabs.d.ts +208 -0
- package/dist/navigation/Tabs.js +626 -0
- package/dist/navigation/Tabs.js.map +1 -0
- package/dist/navigation/Toolbar.d.ts +39 -0
- package/dist/navigation/Toolbar.js +67 -0
- package/dist/navigation/Toolbar.js.map +1 -0
- package/dist/overlay/AlertDialog.d.ts +43 -0
- package/dist/overlay/AlertDialog.js +106 -0
- package/dist/overlay/AlertDialog.js.map +1 -0
- package/dist/overlay/CommandPalette.d.ts +64 -0
- package/dist/overlay/CommandPalette.js +250 -0
- package/dist/overlay/CommandPalette.js.map +1 -0
- package/dist/overlay/ContextMenu.d.ts +21 -0
- package/dist/overlay/ContextMenu.js +76 -0
- package/dist/overlay/ContextMenu.js.map +1 -0
- package/dist/overlay/Dialog.d.ts +70 -0
- package/dist/overlay/Dialog.js +91 -0
- package/dist/overlay/Dialog.js.map +1 -0
- package/dist/overlay/Drawer.d.ts +186 -0
- package/dist/overlay/Drawer.js +214 -0
- package/dist/overlay/Drawer.js.map +1 -0
- package/dist/overlay/HoverCard.d.ts +48 -0
- package/dist/overlay/HoverCard.js +86 -0
- package/dist/overlay/HoverCard.js.map +1 -0
- package/dist/overlay/Lightbox.d.ts +57 -0
- package/dist/overlay/Lightbox.js +374 -0
- package/dist/overlay/Lightbox.js.map +1 -0
- package/dist/overlay/Menu.d.ts +218 -0
- package/dist/overlay/Menu.js +816 -0
- package/dist/overlay/Menu.js.map +1 -0
- package/dist/overlay/ModalCore.d.ts +132 -0
- package/dist/overlay/ModalCore.js +274 -0
- package/dist/overlay/ModalCore.js.map +1 -0
- package/dist/overlay/Popconfirm.d.ts +49 -0
- package/dist/overlay/Popconfirm.js +167 -0
- package/dist/overlay/Popconfirm.js.map +1 -0
- package/dist/overlay/Popover.d.ts +40 -0
- package/dist/overlay/Popover.js +96 -0
- package/dist/overlay/Popover.js.map +1 -0
- package/dist/overlay/Tooltip.d.ts +47 -0
- package/dist/overlay/Tooltip.js +86 -0
- package/dist/overlay/Tooltip.js.map +1 -0
- package/dist/overlay/Tour.d.ts +74 -0
- package/dist/overlay/Tour.js +309 -0
- package/dist/overlay/Tour.js.map +1 -0
- package/dist/overlay/detached.d.ts +40 -0
- package/dist/overlay/detached.js +109 -0
- package/dist/overlay/detached.js.map +1 -0
- package/dist/patterns/ActionBar.d.ts +29 -0
- package/dist/patterns/ActionBar.js +75 -0
- package/dist/patterns/ActionBar.js.map +1 -0
- package/dist/patterns/AppShell.d.ts +168 -0
- package/dist/patterns/AppShell.js +620 -0
- package/dist/patterns/AppShell.js.map +1 -0
- package/dist/patterns/CommentThread.d.ts +128 -0
- package/dist/patterns/CommentThread.js +386 -0
- package/dist/patterns/CommentThread.js.map +1 -0
- package/dist/patterns/DataImport.d.ts +72 -0
- package/dist/patterns/DataImport.js +486 -0
- package/dist/patterns/DataImport.js.map +1 -0
- package/dist/patterns/DeadlineBadge.d.ts +21 -0
- package/dist/patterns/DeadlineBadge.js +76 -0
- package/dist/patterns/DeadlineBadge.js.map +1 -0
- package/dist/patterns/FilterBar.d.ts +66 -0
- package/dist/patterns/FilterBar.js +254 -0
- package/dist/patterns/FilterBar.js.map +1 -0
- package/dist/patterns/KanbanBoard.d.ts +79 -0
- package/dist/patterns/KanbanBoard.js +294 -0
- package/dist/patterns/KanbanBoard.js.map +1 -0
- package/dist/patterns/NotificationCenter.d.ts +110 -0
- package/dist/patterns/NotificationCenter.js +342 -0
- package/dist/patterns/NotificationCenter.js.map +1 -0
- package/dist/patterns/PageTabs.d.ts +30 -0
- package/dist/patterns/PageTabs.js +97 -0
- package/dist/patterns/PageTabs.js.map +1 -0
- package/dist/patterns/QueryTable.d.ts +64 -0
- package/dist/patterns/QueryTable.js +276 -0
- package/dist/patterns/QueryTable.js.map +1 -0
- package/dist/patterns/StepsForm.d.ts +49 -0
- package/dist/patterns/StepsForm.js +130 -0
- package/dist/patterns/StepsForm.js.map +1 -0
- package/dist/patterns/ThemeSwitcher.d.ts +20 -0
- package/dist/patterns/ThemeSwitcher.js +102 -0
- package/dist/patterns/ThemeSwitcher.js.map +1 -0
- package/dist/patterns/form-dialog.d.ts +62 -0
- package/dist/patterns/form-dialog.js +143 -0
- package/dist/patterns/form-dialog.js.map +1 -0
- package/dist/patterns/index.d.ts +24 -0
- package/dist/patterns/index.js +15 -0
- package/dist/patterns/messages.d.ts +172 -0
- package/dist/patterns/messages.js +184 -0
- package/dist/patterns/messages.js.map +1 -0
- package/dist/table/ColumnHeaderActions.d.ts +71 -0
- package/dist/table/ColumnHeaderActions.js +247 -0
- package/dist/table/ColumnHeaderActions.js.map +1 -0
- package/dist/table/ColumnResizer.d.ts +12 -0
- package/dist/table/ColumnResizer.js +32 -0
- package/dist/table/ColumnResizer.js.map +1 -0
- package/dist/table/ColumnSettings.d.ts +34 -0
- package/dist/table/ColumnSettings.js +136 -0
- package/dist/table/ColumnSettings.js.map +1 -0
- package/dist/table/ColumnTable.d.ts +51 -0
- package/dist/table/ColumnTable.js +140 -0
- package/dist/table/ColumnTable.js.map +1 -0
- package/dist/table/DataTable.d.ts +44 -0
- package/dist/table/DataTable.js +453 -0
- package/dist/table/DataTable.js.map +1 -0
- package/dist/table/DataTableView.d.ts +328 -0
- package/dist/table/DataTableView.js +963 -0
- package/dist/table/DataTableView.js.map +1 -0
- package/dist/table/PivotTable.d.ts +66 -0
- package/dist/table/PivotTable.js +122 -0
- package/dist/table/PivotTable.js.map +1 -0
- package/dist/table/SelectionBar.d.ts +29 -0
- package/dist/table/SelectionBar.js +86 -0
- package/dist/table/SelectionBar.js.map +1 -0
- package/dist/table/Table.d.ts +169 -0
- package/dist/table/Table.js +304 -0
- package/dist/table/Table.js.map +1 -0
- package/dist/table/TreeDataTable.d.ts +36 -0
- package/dist/table/TreeDataTable.js +168 -0
- package/dist/table/TreeDataTable.js.map +1 -0
- package/dist/table/column-display.d.ts +20 -0
- package/dist/table/column-display.js +43 -0
- package/dist/table/column-display.js.map +1 -0
- package/dist/table/columns.d.ts +244 -0
- package/dist/table/columns.js +271 -0
- package/dist/table/columns.js.map +1 -0
- package/dist/table/csv.d.ts +24 -0
- package/dist/table/csv.js +35 -0
- package/dist/table/csv.js.map +1 -0
- package/dist/table/pivot.d.ts +66 -0
- package/dist/table/pivot.js +85 -0
- package/dist/table/pivot.js.map +1 -0
- package/dist/table/sheet.d.ts +44 -0
- package/dist/table/sheet.js +78 -0
- package/dist/table/sheet.js.map +1 -0
- package/dist/table/table-styles.d.ts +136 -0
- package/dist/table/table-styles.js +403 -0
- package/dist/table/table-styles.js.map +1 -0
- package/dist/table/use-table-query.d.ts +89 -0
- package/dist/table/use-table-query.js +194 -0
- package/dist/table/use-table-query.js.map +1 -0
- package/dist/theme-customize/ThemeCustomizer.d.ts +63 -0
- package/dist/theme-customize/ThemeCustomizer.js +361 -0
- package/dist/theme-customize/ThemeCustomizer.js.map +1 -0
- package/dist/theme-customize/ThemeThumbnail.d.ts +20 -0
- package/dist/theme-customize/ThemeThumbnail.js +82 -0
- package/dist/theme-customize/ThemeThumbnail.js.map +1 -0
- package/dist/theme-customize/contrast.d.ts +27 -0
- package/dist/theme-customize/contrast.js +251 -0
- package/dist/theme-customize/contrast.js.map +1 -0
- package/dist/theme-customize/customize.d.ts +65 -0
- package/dist/theme-customize/customize.js +105 -0
- package/dist/theme-customize/customize.js.map +1 -0
- package/dist/theme-customize/design-tokens.d.ts +31 -0
- package/dist/theme-customize/design-tokens.js +183 -0
- package/dist/theme-customize/design-tokens.js.map +1 -0
- package/dist/theme-customize/index.d.ts +20 -0
- package/dist/theme-customize/index.js +9 -0
- package/dist/theme-customize/messages.d.ts +74 -0
- package/dist/theme-customize/messages.js +142 -0
- package/dist/theme-customize/messages.js.map +1 -0
- package/dist/theme-customize/palette.d.ts +898 -0
- package/dist/theme-customize/palette.js +111 -0
- package/dist/theme-customize/palette.js.map +1 -0
- package/dist/theme-customize/token-catalog.d.ts +20 -0
- package/dist/theme-customize/token-catalog.js +836 -0
- package/dist/theme-customize/token-catalog.js.map +1 -0
- package/dist/three/background/AuroraBackground.d.ts +30 -0
- package/dist/three/background/AuroraBackground.js +80 -0
- package/dist/three/background/AuroraBackground.js.map +1 -0
- package/dist/three/background/MeshGradient.d.ts +28 -0
- package/dist/three/background/MeshGradient.js +76 -0
- package/dist/three/background/MeshGradient.js.map +1 -0
- package/dist/three/background/ShaderBackground.d.ts +25 -0
- package/dist/three/background/ShaderBackground.js +107 -0
- package/dist/three/background/ShaderBackground.js.map +1 -0
- package/dist/three/core/EffectSurface.d.ts +41 -0
- package/dist/three/core/EffectSurface.js +62 -0
- package/dist/three/core/EffectSurface.js.map +1 -0
- package/dist/three/core/ThreeCanvas.d.ts +39 -0
- package/dist/three/core/ThreeCanvas.js +77 -0
- package/dist/three/core/ThreeCanvas.js.map +1 -0
- package/dist/three/core/dispose.d.ts +9 -0
- package/dist/three/core/dispose.js +26 -0
- package/dist/three/core/dispose.js.map +1 -0
- package/dist/three/core/orbit.d.ts +31 -0
- package/dist/three/core/orbit.js +83 -0
- package/dist/three/core/orbit.js.map +1 -0
- package/dist/three/core/quality.d.ts +59 -0
- package/dist/three/core/quality.js +80 -0
- package/dist/three/core/quality.js.map +1 -0
- package/dist/three/core/renderer.d.ts +110 -0
- package/dist/three/core/renderer.js +303 -0
- package/dist/three/core/renderer.js.map +1 -0
- package/dist/three/core/shaders.d.ts +19 -0
- package/dist/three/core/shaders.js +100 -0
- package/dist/three/core/shaders.js.map +1 -0
- package/dist/three/core/theme-colors.d.ts +30 -0
- package/dist/three/core/theme-colors.js +113 -0
- package/dist/three/core/theme-colors.js.map +1 -0
- package/dist/three/effects/Confetti.d.ts +62 -0
- package/dist/three/effects/Confetti.js +242 -0
- package/dist/three/effects/Confetti.js.map +1 -0
- package/dist/three/effects/ParticleField.d.ts +39 -0
- package/dist/three/effects/ParticleField.js +266 -0
- package/dist/three/effects/ParticleField.js.map +1 -0
- package/dist/three/effects/WaveGrid.d.ts +37 -0
- package/dist/three/effects/WaveGrid.js +130 -0
- package/dist/three/effects/WaveGrid.js.map +1 -0
- package/dist/three/globe/Globe.d.ts +70 -0
- package/dist/three/globe/Globe.js +337 -0
- package/dist/three/globe/Globe.js.map +1 -0
- package/dist/three/globe/land.d.ts +9 -0
- package/dist/three/globe/land.js +14 -0
- package/dist/three/globe/land.js.map +1 -0
- package/dist/three/index.d.ts +24 -0
- package/dist/three/index.js +18 -0
- package/dist/three/model/ModelViewer.d.ts +63 -0
- package/dist/three/model/ModelViewer.js +193 -0
- package/dist/three/model/ModelViewer.js.map +1 -0
- package/dist/utils/data/collation.d.ts +36 -0
- package/dist/utils/data/collation.js +69 -0
- package/dist/utils/data/collation.js.map +1 -0
- package/dist/utils/data/color.d.ts +32 -0
- package/dist/utils/data/color.js +90 -0
- package/dist/utils/data/color.js.map +1 -0
- package/dist/utils/data/date.d.ts +186 -0
- package/dist/utils/data/date.js +409 -0
- package/dist/utils/data/date.js.map +1 -0
- package/dist/utils/data/diff.d.ts +21 -0
- package/dist/utils/data/diff.js +43 -0
- package/dist/utils/data/diff.js.map +1 -0
- package/dist/utils/data/equality.d.ts +5 -0
- package/dist/utils/data/equality.js +24 -0
- package/dist/utils/data/equality.js.map +1 -0
- package/dist/utils/data/history.d.ts +59 -0
- package/dist/utils/data/history.js +132 -0
- package/dist/utils/data/history.js.map +1 -0
- package/dist/utils/data/intl-cache.d.ts +8 -0
- package/dist/utils/data/intl-cache.js +19 -0
- package/dist/utils/data/intl-cache.js.map +1 -0
- package/dist/utils/data/number-parse.d.ts +7 -0
- package/dist/utils/data/number-parse.js +45 -0
- package/dist/utils/data/number-parse.js.map +1 -0
- package/dist/utils/data/number.d.ts +10 -0
- package/dist/utils/data/number.js +28 -0
- package/dist/utils/data/number.js.map +1 -0
- package/dist/utils/data/numeric.d.ts +55 -0
- package/dist/utils/data/numeric.js +133 -0
- package/dist/utils/data/numeric.js.map +1 -0
- package/dist/utils/data/pagination.d.ts +21 -0
- package/dist/utils/data/pagination.js +22 -0
- package/dist/utils/data/pagination.js.map +1 -0
- package/dist/utils/data/selection.d.ts +41 -0
- package/dist/utils/data/selection.js +21 -0
- package/dist/utils/data/selection.js.map +1 -0
- package/dist/utils/data/status.d.ts +43 -0
- package/dist/utils/data/status.js +27 -0
- package/dist/utils/data/status.js.map +1 -0
- package/dist/utils/data/text.d.ts +12 -0
- package/dist/utils/data/text.js +30 -0
- package/dist/utils/data/text.js.map +1 -0
- package/dist/utils/data/tree.d.ts +140 -0
- package/dist/utils/data/tree.js +273 -0
- package/dist/utils/data/tree.js.map +1 -0
- package/dist/utils/data/workdays.d.ts +67 -0
- package/dist/utils/data/workdays.js +67 -0
- package/dist/utils/data/workdays.js.map +1 -0
- package/dist/utils/dom/announcer.d.ts +11 -0
- package/dist/utils/dom/announcer.js +53 -0
- package/dist/utils/dom/announcer.js.map +1 -0
- package/dist/utils/dom/caret.d.ts +14 -0
- package/dist/utils/dom/caret.js +72 -0
- package/dist/utils/dom/caret.js.map +1 -0
- package/dist/utils/dom/clipboard.d.ts +16 -0
- package/dist/utils/dom/clipboard.js +66 -0
- package/dist/utils/dom/clipboard.js.map +1 -0
- package/dist/utils/dom/direction.d.ts +12 -0
- package/dist/utils/dom/direction.js +20 -0
- package/dist/utils/dom/direction.js.map +1 -0
- package/dist/utils/dom/download.d.ts +7 -0
- package/dist/utils/dom/download.js +19 -0
- package/dist/utils/dom/download.js.map +1 -0
- package/dist/utils/dom/element.d.ts +3 -0
- package/dist/utils/dom/element.js +12 -0
- package/dist/utils/dom/element.js.map +1 -0
- package/dist/utils/dom/event-listener.d.ts +8 -0
- package/dist/utils/dom/event-listener.js +35 -0
- package/dist/utils/dom/event-listener.js.map +1 -0
- package/dist/utils/dom/floating.d.ts +149 -0
- package/dist/utils/dom/floating.js +262 -0
- package/dist/utils/dom/floating.js.map +1 -0
- package/dist/utils/dom/focus.d.ts +28 -0
- package/dist/utils/dom/focus.js +105 -0
- package/dist/utils/dom/focus.js.map +1 -0
- package/dist/utils/dom/fullscreen.d.ts +11 -0
- package/dist/utils/dom/fullscreen.js +43 -0
- package/dist/utils/dom/fullscreen.js.map +1 -0
- package/dist/utils/dom/hotkeys.d.ts +43 -0
- package/dist/utils/dom/hotkeys.js +174 -0
- package/dist/utils/dom/hotkeys.js.map +1 -0
- package/dist/utils/dom/hover-intent.d.ts +47 -0
- package/dist/utils/dom/hover-intent.js +72 -0
- package/dist/utils/dom/hover-intent.js.map +1 -0
- package/dist/utils/dom/hover-layer.d.ts +36 -0
- package/dist/utils/dom/hover-layer.js +74 -0
- package/dist/utils/dom/hover-layer.js.map +1 -0
- package/dist/utils/dom/intersection.d.ts +13 -0
- package/dist/utils/dom/intersection.js +36 -0
- package/dist/utils/dom/intersection.js.map +1 -0
- package/dist/utils/dom/layout-batch.d.ts +14 -0
- package/dist/utils/dom/layout-batch.js +26 -0
- package/dist/utils/dom/layout-batch.js.map +1 -0
- package/dist/utils/dom/link.d.ts +18 -0
- package/dist/utils/dom/link.js +44 -0
- package/dist/utils/dom/link.js.map +1 -0
- package/dist/utils/dom/media-query.d.ts +18 -0
- package/dist/utils/dom/media-query.js +36 -0
- package/dist/utils/dom/media-query.js.map +1 -0
- package/dist/utils/dom/move.d.ts +47 -0
- package/dist/utils/dom/move.js +69 -0
- package/dist/utils/dom/move.js.map +1 -0
- package/dist/utils/dom/open-change.d.ts +51 -0
- package/dist/utils/dom/open-change.js +21 -0
- package/dist/utils/dom/open-change.js.map +1 -0
- package/dist/utils/dom/overflow.d.ts +29 -0
- package/dist/utils/dom/overflow.js +108 -0
- package/dist/utils/dom/overflow.js.map +1 -0
- package/dist/utils/dom/overlay.d.ts +35 -0
- package/dist/utils/dom/overlay.js +104 -0
- package/dist/utils/dom/overlay.js.map +1 -0
- package/dist/utils/dom/page-visibility.d.ts +10 -0
- package/dist/utils/dom/page-visibility.js +22 -0
- package/dist/utils/dom/page-visibility.js.map +1 -0
- package/dist/utils/dom/pan-zoom.d.ts +109 -0
- package/dist/utils/dom/pan-zoom.js +257 -0
- package/dist/utils/dom/pan-zoom.js.map +1 -0
- package/dist/utils/dom/rasterize.d.ts +18 -0
- package/dist/utils/dom/rasterize.js +41 -0
- package/dist/utils/dom/rasterize.js.map +1 -0
- package/dist/utils/dom/resize.d.ts +4 -0
- package/dist/utils/dom/resize.js +65 -0
- package/dist/utils/dom/resize.js.map +1 -0
- package/dist/utils/dom/ripple.d.ts +40 -0
- package/dist/utils/dom/ripple.js +96 -0
- package/dist/utils/dom/ripple.js.map +1 -0
- package/dist/utils/dom/roving-focus.d.ts +44 -0
- package/dist/utils/dom/roving-focus.js +184 -0
- package/dist/utils/dom/roving-focus.js.map +1 -0
- package/dist/utils/dom/scroll-spy.d.ts +30 -0
- package/dist/utils/dom/scroll-spy.js +55 -0
- package/dist/utils/dom/scroll-spy.js.map +1 -0
- package/dist/utils/dom/sortable.d.ts +82 -0
- package/dist/utils/dom/sortable.js +437 -0
- package/dist/utils/dom/sortable.js.map +1 -0
- package/dist/utils/dom/storage.d.ts +21 -0
- package/dist/utils/dom/storage.js +66 -0
- package/dist/utils/dom/storage.js.map +1 -0
- package/dist/utils/dom/typeahead.d.ts +15 -0
- package/dist/utils/dom/typeahead.js +26 -0
- package/dist/utils/dom/typeahead.js.map +1 -0
- package/dist/utils/motion/active-indicator.d.ts +24 -0
- package/dist/utils/motion/active-indicator.js +58 -0
- package/dist/utils/motion/active-indicator.js.map +1 -0
- package/dist/utils/motion/animation.d.ts +58 -0
- package/dist/utils/motion/animation.js +83 -0
- package/dist/utils/motion/animation.js.map +1 -0
- package/dist/utils/motion/delayed-loading.d.ts +18 -0
- package/dist/utils/motion/delayed-loading.js +38 -0
- package/dist/utils/motion/delayed-loading.js.map +1 -0
- package/dist/utils/motion/layout.d.ts +17 -0
- package/dist/utils/motion/layout.js +43 -0
- package/dist/utils/motion/layout.js.map +1 -0
- package/dist/utils/motion/pointer.d.ts +14 -0
- package/dist/utils/motion/pointer.js +72 -0
- package/dist/utils/motion/pointer.js.map +1 -0
- package/dist/utils/motion/presence.d.ts +57 -0
- package/dist/utils/motion/presence.js +100 -0
- package/dist/utils/motion/presence.js.map +1 -0
- package/dist/utils/motion/reveal.d.ts +9 -0
- package/dist/utils/motion/reveal.js +68 -0
- package/dist/utils/motion/reveal.js.map +1 -0
- package/dist/utils/motion/tween.d.ts +34 -0
- package/dist/utils/motion/tween.js +50 -0
- package/dist/utils/motion/tween.js.map +1 -0
- package/dist/utils/props.d.ts +84 -0
- package/dist/utils/props.js +189 -0
- package/dist/utils/props.js.map +1 -0
- package/dist/utils/request/http.d.ts +101 -0
- package/dist/utils/request/http.js +154 -0
- package/dist/utils/request/http.js.map +1 -0
- package/dist/utils/request/use-request.d.ts +37 -0
- package/dist/utils/request/use-request.js +90 -0
- package/dist/utils/request/use-request.js.map +1 -0
- package/dist/utils/request/wire.d.ts +48 -0
- package/dist/utils/request/wire.js +208 -0
- package/dist/utils/request/wire.js.map +1 -0
- package/dist/utils/style/attached.d.ts +25 -0
- package/dist/utils/style/attached.js +82 -0
- package/dist/utils/style/attached.js.map +1 -0
- package/dist/utils/style/item-styles.d.ts +18 -0
- package/dist/utils/style/item-styles.js +79 -0
- package/dist/utils/style/item-styles.js.map +1 -0
- package/dist/utils/style/markers.d.ts +6 -0
- package/dist/utils/style/markers.js +11 -0
- package/dist/utils/style/markers.js.map +1 -0
- package/dist/utils/style/shimmer.d.ts +20 -0
- package/dist/utils/style/shimmer.js +58 -0
- package/dist/utils/style/shimmer.js.map +1 -0
- package/dist/utils/style/styles.d.ts +118 -0
- package/dist/utils/style/styles.js +114 -0
- package/dist/utils/style/styles.js.map +1 -0
- package/dist/utils/style/swatch-styles.d.ts +10 -0
- package/dist/utils/style/swatch-styles.js +19 -0
- package/dist/utils/style/swatch-styles.js.map +1 -0
- package/dist/utils/style/tone-styles.d.ts +58 -0
- package/dist/utils/style/tone-styles.js +180 -0
- package/dist/utils/style/tone-styles.js.map +1 -0
- package/dist/utils/style/transitions.d.ts +43 -0
- package/dist/utils/style/transitions.js +118 -0
- package/dist/utils/style/transitions.js.map +1 -0
- package/dist/utils/style/typography.d.ts +155 -0
- package/dist/utils/style/typography.js +80 -0
- package/dist/utils/style/typography.js.map +1 -0
- package/dist/utils/style/vars.d.ts +18 -0
- package/dist/utils/style/vars.js +21 -0
- package/dist/utils/style/vars.js.map +1 -0
- package/dist/utils/virtual/use-virtualizer.d.ts +43 -0
- package/dist/utils/virtual/use-virtualizer.js +94 -0
- package/dist/utils/virtual/use-virtualizer.js.map +1 -0
- package/dist/utils/virtual/virtualizer.d.ts +145 -0
- package/dist/utils/virtual/virtualizer.js +316 -0
- package/dist/utils/virtual/virtualizer.js.map +1 -0
- package/dist/xlsx/index.d.ts +7 -0
- package/dist/xlsx/index.js +1 -0
- package/dist/xlsx/workbook.d.ts +33 -0
- package/dist/xlsx/workbook.js +195 -0
- package/dist/xlsx/workbook.js.map +1 -0
- package/package.json +205 -3
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { addNumeric, isDecimal, isNumeric, isNumericText, numericKind } from "../utils/data/numeric.js";
|
|
2
|
+
import { createComparer, createMatcher, isDateValue, sortByValues } from "../utils/data/collation.js";
|
|
3
|
+
//#region src/table/columns.ts
|
|
4
|
+
/**
|
|
5
|
+
* 按分组排出表头第一行:隐藏了的列不算,组里的列全隐藏时这一组也不显示;
|
|
6
|
+
* 组里的列被别的列隔开时,后一段另起一格、重复组标题
|
|
7
|
+
*/
|
|
8
|
+
function headerLayout(columns, groups) {
|
|
9
|
+
const groupOf = /* @__PURE__ */ new Map();
|
|
10
|
+
for (const group of groups) for (const key of group.columns) groupOf.set(key, group);
|
|
11
|
+
const cells = [];
|
|
12
|
+
for (const column of columns) {
|
|
13
|
+
const group = groupOf.get(column.key);
|
|
14
|
+
const last = cells.at(-1);
|
|
15
|
+
if (!group) cells.push({
|
|
16
|
+
kind: "column",
|
|
17
|
+
column
|
|
18
|
+
});
|
|
19
|
+
else if (last?.kind === "group" && last.group === group) last.columns.push(column);
|
|
20
|
+
else cells.push({
|
|
21
|
+
kind: "group",
|
|
22
|
+
group,
|
|
23
|
+
columns: [column]
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return cells;
|
|
27
|
+
}
|
|
28
|
+
/** 没写宽度的列,计算表格最小宽度与固定列偏移时按这么宽算(px) */
|
|
29
|
+
var COLUMN_FLEX_MIN_WIDTH = 120;
|
|
30
|
+
/** 拖动调整列宽时默认的最小宽度(px) */
|
|
31
|
+
var COLUMN_MIN_WIDTH = 64;
|
|
32
|
+
/** 固定列的偏移(px):起始边的从 leading(勾选列的宽度)之后累加,结束边的从末尾往回累加 */
|
|
33
|
+
function stickyOffsets(columns, widthOf, leading) {
|
|
34
|
+
const accumulate = (side, ordered, from) => {
|
|
35
|
+
const offsets = /* @__PURE__ */ new Map();
|
|
36
|
+
let offset = from;
|
|
37
|
+
for (const column of ordered) {
|
|
38
|
+
if (column.sticky !== side) continue;
|
|
39
|
+
offsets.set(column.key, offset);
|
|
40
|
+
offset += widthOf(column) ?? 120;
|
|
41
|
+
}
|
|
42
|
+
return offsets;
|
|
43
|
+
};
|
|
44
|
+
const start = accumulate("start", columns, leading);
|
|
45
|
+
const end = accumulate("end", [...columns].reverse(), 0);
|
|
46
|
+
return {
|
|
47
|
+
start,
|
|
48
|
+
end,
|
|
49
|
+
startEdge: [...start.keys()].at(-1),
|
|
50
|
+
endEdge: [...end.keys()].at(-1)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** 两组固定列的偏移是否相同(列与偏移都一样) */
|
|
54
|
+
function sameStickyOffsets(a, b) {
|
|
55
|
+
const sameMap = (x, y) => x.size === y.size && [...x].every(([key, offset]) => y.get(key) === offset);
|
|
56
|
+
return a.startEdge === b.startEdge && a.endEdge === b.endEdge && sameMap(a.start, b.start) && sameMap(a.end, b.end);
|
|
57
|
+
}
|
|
58
|
+
/** 表格的最小宽度(px):写了宽度的列按宽度,没写的按 minWidth 或 COLUMN_FLEX_MIN_WIDTH;放不下时横向滚动 */
|
|
59
|
+
function tableMinWidth(columns, widthOf, leading) {
|
|
60
|
+
return columns.reduce((total, column) => total + (widthOf(column) ?? column.minWidth ?? 120), leading);
|
|
61
|
+
}
|
|
62
|
+
/** 列在这一行的值:value 函数,或 row[key] */
|
|
63
|
+
function columnValue(column, row) {
|
|
64
|
+
if (column.value) return column.value(row);
|
|
65
|
+
return row[column.key];
|
|
66
|
+
}
|
|
67
|
+
var NUMERIC_TYPES = /* @__PURE__ */ new Set([
|
|
68
|
+
"number",
|
|
69
|
+
"currency",
|
|
70
|
+
"percent",
|
|
71
|
+
"fileSize"
|
|
72
|
+
]);
|
|
73
|
+
/**
|
|
74
|
+
* 列的值类型:写了 type 用它;写了数字格式(format)、或合计是 'sum' 的是数字列(这一页全是空值时也靠结束边对齐);
|
|
75
|
+
* 否则看第一个非空值(ISO 字符串不猜,算文字)
|
|
76
|
+
*/
|
|
77
|
+
function columnType(column, rows) {
|
|
78
|
+
if (column.type) return column.type;
|
|
79
|
+
if (column.format || column.summary === "sum") return "number";
|
|
80
|
+
for (const row of rows) {
|
|
81
|
+
const value = columnValue(column, row);
|
|
82
|
+
if (value == null) continue;
|
|
83
|
+
if (isNumeric(value)) return "number";
|
|
84
|
+
return value instanceof Date || isDateValue(value) ? "date" : "text";
|
|
85
|
+
}
|
|
86
|
+
return "text";
|
|
87
|
+
}
|
|
88
|
+
/** 列的对齐:写了 align 用它,数字类靠结束边方便对比位数 */
|
|
89
|
+
function columnAlign(type) {
|
|
90
|
+
return NUMERIC_TYPES.has(type) ? "end" : "start";
|
|
91
|
+
}
|
|
92
|
+
/** 没写 cell 时单元格的文字:按值类型与当前语言格式化;值与类型对不上(数字列里的文字)时原样显示 */
|
|
93
|
+
function formatCell(value, type, format, options) {
|
|
94
|
+
if (value == null) return "";
|
|
95
|
+
const numeric = isNumeric(value) || isNumericText(value);
|
|
96
|
+
if (numeric && type === "number") return format.number(value, options);
|
|
97
|
+
if (numeric && type === "currency") return format.number(value, {
|
|
98
|
+
style: "currency",
|
|
99
|
+
...options
|
|
100
|
+
});
|
|
101
|
+
if (numeric && type === "percent") return format.number(value, {
|
|
102
|
+
style: "percent",
|
|
103
|
+
maximumFractionDigits: 1,
|
|
104
|
+
...options
|
|
105
|
+
});
|
|
106
|
+
if (typeof value === "number" && type === "fileSize") return format.fileSize(value);
|
|
107
|
+
const date = value instanceof Date || isDateValue(value) || typeof value === "string";
|
|
108
|
+
if (date && type === "date") return format.date(value);
|
|
109
|
+
if (date && type === "dateTime") return format.date(value, {
|
|
110
|
+
dateStyle: "medium",
|
|
111
|
+
timeStyle: "short"
|
|
112
|
+
});
|
|
113
|
+
return String(value);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 一列数值的合计:跳过空值与不是数字的值;有 Decimal 时用它的构造函数精确相加,全是 bigint 时整数相加,
|
|
117
|
+
* 接口给的十进制字符串('19.90')按数字算。没有任何数值时为 null
|
|
118
|
+
*/
|
|
119
|
+
function sumColumn(column, rows) {
|
|
120
|
+
const values = [];
|
|
121
|
+
let kind;
|
|
122
|
+
for (const row of rows) {
|
|
123
|
+
const value = columnValue(column, row);
|
|
124
|
+
const numeric = isNumeric(value) ? value : isNumericText(value) ? Number(value) : null;
|
|
125
|
+
if (numeric == null) continue;
|
|
126
|
+
values.push(numeric);
|
|
127
|
+
if (isDecimal(numeric)) kind = numericKind(numeric);
|
|
128
|
+
else if (kind === void 0) kind = typeof numeric === "bigint" ? "bigint" : "number";
|
|
129
|
+
else if (kind === "bigint" && typeof numeric !== "bigint") kind = "number";
|
|
130
|
+
}
|
|
131
|
+
if (values.length === 0 || kind === void 0) return null;
|
|
132
|
+
return values.reduce((total, value) => addNumeric(total, value, kind), 0);
|
|
133
|
+
}
|
|
134
|
+
/** 点表头时的下一个排序:没排 → 升序 → 降序 → 不排 */
|
|
135
|
+
function nextSort(current, key) {
|
|
136
|
+
if (current?.key !== key) return {
|
|
137
|
+
key,
|
|
138
|
+
direction: "ascending"
|
|
139
|
+
};
|
|
140
|
+
return current.direction === "ascending" ? {
|
|
141
|
+
key,
|
|
142
|
+
direction: "descending"
|
|
143
|
+
} : null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 多列排序时点表头:additive(按住 Shift)时在已有的排序后面加上这一列、或切换它的方向(降序时再点去掉);
|
|
147
|
+
* 否则只按这一列(同 nextSort)
|
|
148
|
+
*/
|
|
149
|
+
function nextSorts(current, key, additive) {
|
|
150
|
+
if (!additive) {
|
|
151
|
+
const next = nextSort(current.length === 1 ? current[0] : void 0, key);
|
|
152
|
+
return next ? [next] : [];
|
|
153
|
+
}
|
|
154
|
+
const existing = current.find((item) => item.key === key);
|
|
155
|
+
if (!existing) return [...current, {
|
|
156
|
+
key,
|
|
157
|
+
direction: "ascending"
|
|
158
|
+
}];
|
|
159
|
+
if (existing.direction === "ascending") return current.map((item) => item.key === key ? {
|
|
160
|
+
key,
|
|
161
|
+
direction: "descending"
|
|
162
|
+
} : item);
|
|
163
|
+
return current.filter((item) => item.key !== key);
|
|
164
|
+
}
|
|
165
|
+
/** 排序状态统一成数组:单列排序是一个或零个 */
|
|
166
|
+
function sortList(sort) {
|
|
167
|
+
if (!sort) return [];
|
|
168
|
+
return Array.isArray(sort) ? sort : [sort];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 排序写成一段文字:逗号分隔的列 key,倒序的前面加减号(同 JSON:API),如 `-amount,name`;没有排序时是空字符串。
|
|
172
|
+
* 地址栏的 sort 参数与发给服务端的 sort 参数都是它,query 库的 `sortBy` 直接认
|
|
173
|
+
*/
|
|
174
|
+
function formatSorts(sort) {
|
|
175
|
+
return sortList(sort).map((item) => (item.direction === "descending" ? "-" : "") + item.key).join(",");
|
|
176
|
+
}
|
|
177
|
+
/** 读 formatSorts 写的文字:`-amount,name` 是两列排序;空的项跳过 */
|
|
178
|
+
function parseSorts(text) {
|
|
179
|
+
return text.split(",").map((part) => part.trim()).filter((part) => part.replace(/^-/, "") !== "").map((part) => part.startsWith("-") ? {
|
|
180
|
+
key: part.slice(1),
|
|
181
|
+
direction: "descending"
|
|
182
|
+
} : {
|
|
183
|
+
key: part,
|
|
184
|
+
direction: "ascending"
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 按当前排序排列(返回新数组,原数组不变);可以是几列(前一列相等时比下一列),没有排序、排序列都不存在时原样返回。
|
|
189
|
+
* 比较用 createComparer:数字按大小、日期按时间、文字按语言(中文按拼音、“第2章”在“第10章”前),空值总在最后
|
|
190
|
+
*/
|
|
191
|
+
function sortRows(rows, columns, sort, locale) {
|
|
192
|
+
const keys = sortList(sort).flatMap((state) => {
|
|
193
|
+
const column = columns.find((item) => item.key === state.key);
|
|
194
|
+
if (!column) return [];
|
|
195
|
+
const numeric = NUMERIC_TYPES.has(columnType(column, rows));
|
|
196
|
+
const value = (row) => {
|
|
197
|
+
const raw = columnValue(column, row);
|
|
198
|
+
return numeric && isNumericText(raw) ? Number(raw) : raw;
|
|
199
|
+
};
|
|
200
|
+
return [{
|
|
201
|
+
value,
|
|
202
|
+
direction: state.direction
|
|
203
|
+
}];
|
|
204
|
+
});
|
|
205
|
+
return keys.length ? sortByValues(rows, keys, locale) : rows;
|
|
206
|
+
}
|
|
207
|
+
/** 这一格能不能编辑 */
|
|
208
|
+
function isCellEditable(column, row) {
|
|
209
|
+
return typeof column.editable === "function" ? column.editable(row) : !!column.editable;
|
|
210
|
+
}
|
|
211
|
+
/** 列的筛选设置:没写或 false 时 undefined,true 是列出出现过的值 */
|
|
212
|
+
function columnFilter(column) {
|
|
213
|
+
if (!column.filter) return void 0;
|
|
214
|
+
return column.filter === true ? {} : column.filter;
|
|
215
|
+
}
|
|
216
|
+
/** 表头筛选的选项:写了的原样(字符串转成选项),没写的列出这一列出现过的值(按语言排序,有 statuses 时用状态名) */
|
|
217
|
+
function filterOptions(column, rows, locale) {
|
|
218
|
+
const options = columnFilter(column)?.options;
|
|
219
|
+
if (options === "text") return [];
|
|
220
|
+
if (options) return options.map((option) => typeof option === "string" ? { value: option } : option);
|
|
221
|
+
const seen = /* @__PURE__ */ new Map();
|
|
222
|
+
for (const row of rows) {
|
|
223
|
+
const value = columnValue(column, row);
|
|
224
|
+
if (value == null || value === "") continue;
|
|
225
|
+
const text = String(value);
|
|
226
|
+
if (!seen.has(text)) seen.set(text, value);
|
|
227
|
+
}
|
|
228
|
+
const { statuses } = column;
|
|
229
|
+
const compare = createComparer(locale);
|
|
230
|
+
const order = statuses ? (a, b) => statuses.order(a) - statuses.order(b) : (a, b) => compare(seen.get(a), seen.get(b));
|
|
231
|
+
return [...seen.keys()].sort(order).map((value) => ({
|
|
232
|
+
value,
|
|
233
|
+
label: statuses?.label(value)
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
/** 按表头筛选留下的行:filters 是各列选中的值(关键字筛选时是 [关键字]),空的不算 */
|
|
237
|
+
function filterRows(rows, columns, filters, locale) {
|
|
238
|
+
const matchText = createMatcher(locale);
|
|
239
|
+
const tests = columns.flatMap((column) => {
|
|
240
|
+
const values = filters[column.key];
|
|
241
|
+
const filter = columnFilter(column);
|
|
242
|
+
if (!filter || !values?.length) return [];
|
|
243
|
+
const { match } = filter;
|
|
244
|
+
if (match) return [(row) => match(row, values)];
|
|
245
|
+
if (filter.options === "text") return [(row) => matchText(String(columnValue(column, row) ?? ""), values[0])];
|
|
246
|
+
const allowed = new Set(values);
|
|
247
|
+
return [(row) => allowed.has(String(columnValue(column, row) ?? ""))];
|
|
248
|
+
});
|
|
249
|
+
return tests.length ? rows.filter((row) => tests.every((test) => test(row))) : rows;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* 列的位置调整(列菜单、列设置):order 是列的 key 的顺序,没列到的按定义的顺序排在后面;
|
|
253
|
+
* pins 覆盖列的 sticky(null 取消固定)。固定在起始边的排到最前、结束边的排到最后:固定列要挨着表格的边
|
|
254
|
+
*/
|
|
255
|
+
function arrangeColumns(columns, order, pins) {
|
|
256
|
+
const rank = new Map((order ?? []).map((key, index) => [key, index]));
|
|
257
|
+
const position = (column) => rank.get(column.key) ?? rank.size + columns.indexOf(column);
|
|
258
|
+
const arranged = [...columns].sort((a, b) => position(a) - position(b)).map((column) => pins && column.key in pins ? {
|
|
259
|
+
...column,
|
|
260
|
+
sticky: pins[column.key] ?? void 0
|
|
261
|
+
} : column);
|
|
262
|
+
return [
|
|
263
|
+
...arranged.filter((column) => column.sticky === "start"),
|
|
264
|
+
...arranged.filter((column) => !column.sticky),
|
|
265
|
+
...arranged.filter((column) => column.sticky === "end")
|
|
266
|
+
];
|
|
267
|
+
}
|
|
268
|
+
//#endregion
|
|
269
|
+
export { COLUMN_FLEX_MIN_WIDTH, COLUMN_MIN_WIDTH, arrangeColumns, columnAlign, columnFilter, columnType, columnValue, filterOptions, filterRows, formatCell, formatSorts, headerLayout, isCellEditable, nextSort, nextSorts, parseSorts, sameStickyOffsets, sortList, sortRows, stickyOffsets, sumColumn, tableMinWidth };
|
|
270
|
+
|
|
271
|
+
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.js","names":[],"sources":["../../src/table/columns.ts"],"sourcesContent":["/**\n * 表格的列定义与排序:DataTable、TreeDataTable 共用(参考 TanStack DataTable 的列模型,只取最常用的部分)。\n *\n * const columns: DataTableColumn<Order>[] = [\n * { key: 'id', header: '订单号', width: 120, sticky: 'start' },\n * { key: 'customer', header: '客户', sortable: true },\n * { key: 'amount', header: '金额', type: 'currency', sortable: true },\n * ];\n */\nimport type { VNodeChild } from 'vue';\nimport type { NumericFormat, useFormat } from '../config/lang/format';\nimport {\n createComparer,\n createMatcher,\n isDateValue,\n sortByValues,\n type SortValue,\n} from '../utils/data/collation';\nimport {\n addNumeric,\n isDecimal,\n isNumeric,\n isNumericText,\n numericKind,\n type NumericKind,\n type NumericValue,\n} from '../utils/data/numeric';\nimport type { StatusMap } from '../utils/data/status';\n\n/** 单元格内容的对齐 */\nexport interface ColumnAligns {\n /** 起始边(默认):文字 */\n start: unknown;\n /** 居中:状态、图标 */\n center: unknown;\n /** 结束边:数字、金额,方便对比位数 */\n end: unknown;\n}\n\n/** 列的值类型:不写 cell 时按它格式化(跟随语言),数字类默认靠结束边对齐 */\nexport interface ColumnTypes {\n /** 文字:原样显示 */\n text: unknown;\n /** 数字:按语言分组,1234.5 → 1,234.5 */\n number: unknown;\n /** 金额,语言的币种:19.9 → ¥19.90 */\n currency: unknown;\n /** 百分比:0.125 → 12.5% */\n percent: unknown;\n /** 文件大小(字节):1234567 → 1.2 MB */\n fileSize: unknown;\n /** 日期:Date、DateValue 或 ISO 字符串 */\n date: unknown;\n /** 日期与时间 */\n dateTime: unknown;\n}\n\n/** 固定在哪一侧(横向滚动时不动) */\nexport interface ColumnStickies {\n /** 起始边:名称、编号 */\n start: unknown;\n /** 结束边:操作 */\n end: unknown;\n}\n\n/** 表头筛选里的一个选项 */\nexport interface ColumnFilterOption {\n /** 值:筛选状态里存它,默认与这一列的值(转成文字)比较 */\n value: string;\n /** 显示的文字;不写时用 value */\n label?: VNodeChild;\n}\n\n/** 列的表头筛选 */\nexport interface ColumnFilter<T> {\n /**\n * 选项(可以多选):不写时列出这一列出现过的值(有 statuses 时显示状态的名称);\n * 'text' 是输入关键字,不列选项\n */\n options?: readonly (string | ColumnFilterOption)[] | 'text';\n /** 这一行留不留:values 是选中的值(关键字筛选时是 [关键字]);默认这一列的值在其中 / 文字包含关键字 */\n match?: (row: T, values: readonly string[]) => boolean;\n}\n\n/** 自定义单元格编辑器拿到的 */\nexport interface CellEditorContext<T> {\n /** 这一行 */\n row: T;\n /** 正在编辑的值(草稿) */\n value: unknown;\n /** 改草稿 */\n onChange: (value: unknown) => void;\n /** 提交(校验通过后交给 onCellChange) */\n commit: () => void;\n /** 放弃,回到原来的值 */\n cancel: () => void;\n /** 校验没过的原因:编辑器用它标出错误(aria-invalid) */\n error: string | undefined;\n}\n\n/** 一列 */\nexport interface DataTableColumn<T> {\n /** 列的标识:同一表格里不能重复;不写 value 时也是取值的字段名 */\n key: string;\n /** 表头内容 */\n header: VNodeChild;\n /** 单元格内容;不写时按 type 格式化 value */\n cell?: (row: T, index: number) => VNodeChild;\n /** 值的类型:决定默认的格式与对齐;不写时按第一个非空值推断(数字 → number,日期 → date,其余 text) */\n type?: keyof ColumnTypes;\n /**\n * 数字类(number、currency、percent)的格式,与 type 的默认格式合并:\n * 金额以万元显示写 `{ scale: 10_000, maximumFractionDigits: 2 }`(单位写在表头里),美元写 `{ currency: 'USD' }`\n */\n format?: NumericFormat;\n /** 排序用的值;不写时取 row[key] */\n value?: (row: T) => SortValue;\n /** 宽度(px);不写时与其他没写宽度的列平分剩余宽度。固定列一定要写(偏移量按它算) */\n width?: number;\n /**\n * 最小宽度(px):拖动调整宽度时不能更窄,默认 COLUMN_MIN_WIDTH(64);\n * 没写宽度的列按它(默认 COLUMN_FLEX_MIN_WIDTH)算表格的最小宽度,放不下时横向滚动而不是继续压窄\n */\n minWidth?: number;\n /** 对齐;默认数字类(number、currency、percent、fileSize)靠 end,其余 start */\n align?: keyof ColumnAligns;\n /** 可以点表头排序 */\n sortable?: boolean;\n /** 表头筛选:true 列出这一列出现过的值,也可以给选项或关键字筛选(见 ColumnFilter) */\n filter?: boolean | ColumnFilter<T>;\n /** 可以编辑(DataTable 的 onCellChange 写回):true 或按行判断;表格随之变成可以用方向键走格的网格 */\n editable?: boolean | ((row: T) => boolean);\n /**\n * 编辑器:不写时按列选——状态列是 Select,数字类是 NumberField,其余是 TextField。\n * 自己写时拿到草稿与提交、放弃(日期、下拉选人这类)\n */\n editor?: (context: CellEditorContext<T>) => VNodeChild;\n /** 提交前校验这一格:返回原因就不提交,编辑器标红并说明 */\n validate?: (value: unknown, row: T) => string | null | undefined;\n /** 固定在哪一侧 */\n sticky?: keyof ColumnStickies;\n /** 可以拖动调整宽度;不写时跟随表格的 resizable */\n resizable?: boolean;\n /** 内容可以换行;默认一行显示不下时省略 */\n wrap?: boolean;\n /** 没有值(null、undefined、空字符串)时显示的内容,如“待定价”;默认语言包的 emptyValue(—) */\n empty?: VNodeChild;\n /** 状态映射(createStatusMap):值是状态的 key,显示成 StatusBadge;写了 cell 时以 cell 为准 */\n statuses?: StatusMap;\n /**\n * 合计行里这一列的内容:`'sum'` 把这一列的数值精确相加(有 Decimal 时按 Decimal),按列的类型与 format 显示;\n * 也可以是函数,拿到全部行(如平均值、“3 项待定价”)。有一列写了 summary,表格底部就多一行吸底的合计\n */\n summary?: 'sum' | ((rows: readonly T[]) => VNodeChild);\n}\n\n/** 分组表头:相邻的几列上方共用一个标题(如“测算”下的 A、B、D 值);只分一层 */\nexport interface DataTableColumnGroup {\n /** 组的标识 */\n key: string;\n /** 组标题 */\n header: VNodeChild;\n /** 组里各列的 key:要相邻,显示顺序随列定义 */\n columns: readonly string[];\n}\n\n/** 表头第一行的一格:一个分组(跨组里的几列),或没有分组的一列(跨两行) */\nexport type HeaderLayoutCell<T> =\n | { kind: 'group'; group: DataTableColumnGroup; columns: DataTableColumn<T>[] }\n | { kind: 'column'; column: DataTableColumn<T> };\n\n/**\n * 按分组排出表头第一行:隐藏了的列不算,组里的列全隐藏时这一组也不显示;\n * 组里的列被别的列隔开时,后一段另起一格、重复组标题\n */\nexport function headerLayout<T>(\n columns: readonly DataTableColumn<T>[],\n groups: readonly DataTableColumnGroup[],\n): HeaderLayoutCell<T>[] {\n const groupOf = new Map<string, DataTableColumnGroup>();\n for (const group of groups) for (const key of group.columns) groupOf.set(key, group);\n const cells: HeaderLayoutCell<T>[] = [];\n for (const column of columns) {\n const group = groupOf.get(column.key);\n const last = cells.at(-1);\n if (!group) cells.push({ kind: 'column', column });\n else if (last?.kind === 'group' && last.group === group) last.columns.push(column);\n else cells.push({ kind: 'group', group, columns: [column] });\n }\n return cells;\n}\n\n/** 排序方向(与 aria-sort 的取值一致) */\nexport interface SortDirections {\n /** 升序:小到大、A 到 Z */\n ascending: unknown;\n /** 降序 */\n descending: unknown;\n}\n\n/** 当前的排序:按哪一列、哪个方向 */\nexport interface SortState {\n /** 列的 key */\n key: string;\n /** 方向 */\n direction: keyof SortDirections;\n}\n\n/** 没写宽度的列,计算表格最小宽度与固定列偏移时按这么宽算(px) */\nexport const COLUMN_FLEX_MIN_WIDTH = 120;\n\n/** 拖动调整列宽时默认的最小宽度(px) */\nexport const COLUMN_MIN_WIDTH = 64;\n\n/** 列当前的宽度(px):调整过的、列定义里的;都没有时 undefined(与其他没写宽度的列平分) */\nexport type ColumnWidthOf<T> = (column: DataTableColumn<T>) => number | undefined;\n\n/** 固定列的偏移(px),按列的 key 取 */\nexport interface StickyOffsets {\n /** 固定在起始边的列 */\n start: Map<string, number>;\n /** 固定在结束边的列 */\n end: Map<string, number>;\n /** 起始边固定列里最靠里的一列(挨着滚动的列,画分隔线) */\n startEdge?: string;\n /** 结束边固定列里最靠里的一列 */\n endEdge?: string;\n}\n\n/** 固定列的偏移(px):起始边的从 leading(勾选列的宽度)之后累加,结束边的从末尾往回累加 */\nexport function stickyOffsets<T>(\n columns: readonly DataTableColumn<T>[],\n widthOf: ColumnWidthOf<T>,\n leading: number,\n): StickyOffsets {\n const accumulate = (\n side: 'start' | 'end',\n ordered: readonly DataTableColumn<T>[],\n from: number,\n ) => {\n const offsets = new Map<string, number>();\n let offset = from;\n for (const column of ordered) {\n if (column.sticky !== side) continue;\n offsets.set(column.key, offset);\n offset += widthOf(column) ?? COLUMN_FLEX_MIN_WIDTH;\n }\n return offsets;\n };\n const start = accumulate('start', columns, leading);\n const end = accumulate('end', [...columns].reverse(), 0);\n // Map 按插入顺序:最后插入的就是最靠里的\n return { start, end, startEdge: [...start.keys()].at(-1), endEdge: [...end.keys()].at(-1) };\n}\n\n/** 两组固定列的偏移是否相同(列与偏移都一样) */\nexport function sameStickyOffsets(a: StickyOffsets, b: StickyOffsets): boolean {\n const sameMap = (x: Map<string, number>, y: Map<string, number>) =>\n x.size === y.size && [...x].every(([key, offset]) => y.get(key) === offset);\n return (\n a.startEdge === b.startEdge &&\n a.endEdge === b.endEdge &&\n sameMap(a.start, b.start) &&\n sameMap(a.end, b.end)\n );\n}\n\n/** 表格的最小宽度(px):写了宽度的列按宽度,没写的按 minWidth 或 COLUMN_FLEX_MIN_WIDTH;放不下时横向滚动 */\nexport function tableMinWidth<T>(\n columns: readonly DataTableColumn<T>[],\n widthOf: ColumnWidthOf<T>,\n leading: number,\n): number {\n return columns.reduce(\n (total, column) => total + (widthOf(column) ?? column.minWidth ?? COLUMN_FLEX_MIN_WIDTH),\n leading,\n );\n}\n\n/** 列在这一行的值:value 函数,或 row[key] */\nexport function columnValue<T>(column: DataTableColumn<T>, row: T): SortValue {\n if (column.value) return column.value(row);\n return (row as Record<string, SortValue>)[column.key];\n}\n\nconst NUMERIC_TYPES = new Set<keyof ColumnTypes>(['number', 'currency', 'percent', 'fileSize']);\n\n/**\n * 列的值类型:写了 type 用它;写了数字格式(format)、或合计是 'sum' 的是数字列(这一页全是空值时也靠结束边对齐);\n * 否则看第一个非空值(ISO 字符串不猜,算文字)\n */\nexport function columnType<T>(column: DataTableColumn<T>, rows: Iterable<T>): keyof ColumnTypes {\n if (column.type) return column.type;\n if (column.format || column.summary === 'sum') return 'number';\n for (const row of rows) {\n const value = columnValue(column, row);\n if (value == null) continue;\n if (isNumeric(value)) return 'number';\n return value instanceof Date || isDateValue(value) ? 'date' : 'text';\n }\n return 'text';\n}\n\n/** 列的对齐:写了 align 用它,数字类靠结束边方便对比位数 */\nexport function columnAlign(type: keyof ColumnTypes): keyof ColumnAligns {\n return NUMERIC_TYPES.has(type) ? 'end' : 'start';\n}\n\n/** 没写 cell 时单元格的文字:按值类型与当前语言格式化;值与类型对不上(数字列里的文字)时原样显示 */\nexport function formatCell(\n value: SortValue,\n type: keyof ColumnTypes,\n format: ReturnType<typeof useFormat>,\n options?: NumericFormat,\n): string {\n if (value == null) return '';\n // 接口常把金额给成十进制字符串('19.90'):能读成数字的字符串也按数字格式化,且不经过浮点\n const numeric = isNumeric(value) || isNumericText(value);\n if (numeric && type === 'number') return format.number(value, options);\n if (numeric && type === 'currency')\n return format.number(value, { style: 'currency', ...options });\n if (numeric && type === 'percent')\n return format.number(value, { style: 'percent', maximumFractionDigits: 1, ...options });\n if (typeof value === 'number' && type === 'fileSize') return format.fileSize(value);\n const date = value instanceof Date || isDateValue(value) || typeof value === 'string';\n if (date && type === 'date') return format.date(value);\n if (date && type === 'dateTime')\n return format.date(value, { dateStyle: 'medium', timeStyle: 'short' });\n return String(value);\n}\n\n/**\n * 一列数值的合计:跳过空值与不是数字的值;有 Decimal 时用它的构造函数精确相加,全是 bigint 时整数相加,\n * 接口给的十进制字符串('19.90')按数字算。没有任何数值时为 null\n */\nexport function sumColumn<T>(column: DataTableColumn<T>, rows: Iterable<T>): NumericValue | null {\n const values: NumericValue[] = [];\n let kind: NumericKind | undefined;\n for (const row of rows) {\n const value = columnValue(column, row);\n const numeric = isNumeric(value) ? value : isNumericText(value) ? Number(value) : null;\n if (numeric == null) continue;\n values.push(numeric);\n // 有 Decimal 就按 Decimal;否则全是 bigint 才按 bigint\n if (isDecimal(numeric)) kind = numericKind(numeric);\n else if (kind === undefined) kind = typeof numeric === 'bigint' ? 'bigint' : 'number';\n else if (kind === 'bigint' && typeof numeric !== 'bigint') kind = 'number';\n }\n if (values.length === 0 || kind === undefined) return null;\n return values.reduce<NumericValue>((total, value) => addNumeric(total, value, kind!), 0);\n}\n\n/** 点表头时的下一个排序:没排 → 升序 → 降序 → 不排 */\nexport function nextSort(current: SortState | null | undefined, key: string): SortState | null {\n if (current?.key !== key) return { key, direction: 'ascending' };\n return current.direction === 'ascending' ? { key, direction: 'descending' } : null;\n}\n\n/**\n * 多列排序时点表头:additive(按住 Shift)时在已有的排序后面加上这一列、或切换它的方向(降序时再点去掉);\n * 否则只按这一列(同 nextSort)\n */\nexport function nextSorts(\n current: readonly SortState[],\n key: string,\n additive: boolean,\n): SortState[] {\n if (!additive) {\n const own = current.length === 1 ? current[0] : undefined;\n const next = nextSort(own, key);\n return next ? [next] : [];\n }\n const existing = current.find((item) => item.key === key);\n if (!existing) return [...current, { key, direction: 'ascending' }];\n if (existing.direction === 'ascending')\n return current.map((item) => (item.key === key ? { key, direction: 'descending' } : item));\n return current.filter((item) => item.key !== key);\n}\n\n/** 排序状态统一成数组:单列排序是一个或零个 */\nexport function sortList(\n sort: SortState | readonly SortState[] | null | undefined,\n): readonly SortState[] {\n if (!sort) return [];\n return Array.isArray(sort) ? sort : [sort as SortState];\n}\n\n/**\n * 排序写成一段文字:逗号分隔的列 key,倒序的前面加减号(同 JSON:API),如 `-amount,name`;没有排序时是空字符串。\n * 地址栏的 sort 参数与发给服务端的 sort 参数都是它,query 库的 `sortBy` 直接认\n */\nexport function formatSorts(sort: SortState | readonly SortState[] | null | undefined): string {\n return sortList(sort)\n .map((item) => (item.direction === 'descending' ? '-' : '') + item.key)\n .join(',');\n}\n\n/** 读 formatSorts 写的文字:`-amount,name` 是两列排序;空的项跳过 */\nexport function parseSorts(text: string): SortState[] {\n return text\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.replace(/^-/, '') !== '')\n .map((part) =>\n part.startsWith('-')\n ? { key: part.slice(1), direction: 'descending' }\n : { key: part, direction: 'ascending' },\n );\n}\n\n/**\n * 按当前排序排列(返回新数组,原数组不变);可以是几列(前一列相等时比下一列),没有排序、排序列都不存在时原样返回。\n * 比较用 createComparer:数字按大小、日期按时间、文字按语言(中文按拼音、“第2章”在“第10章”前),空值总在最后\n */\nexport function sortRows<T>(\n rows: readonly T[],\n columns: readonly DataTableColumn<T>[],\n sort: SortState | readonly SortState[] | null | undefined,\n locale: string,\n): readonly T[] {\n const keys = sortList(sort).flatMap((state) => {\n const column = columns.find((item) => item.key === state.key);\n if (!column) return [];\n // 数字类的列里,十进制字符串('2.5'、'2.10')按数值排:按文字比较时 '2.5' 会排在 '2.10' 前面\n const numeric = NUMERIC_TYPES.has(columnType(column, rows));\n const value = (row: T) => {\n const raw = columnValue(column, row);\n return numeric && isNumericText(raw) ? Number(raw) : raw;\n };\n return [{ value, direction: state.direction }];\n });\n return keys.length ? sortByValues(rows, keys, locale) : rows;\n}\n\n/** 这一格能不能编辑 */\nexport function isCellEditable<T>(column: DataTableColumn<T>, row: T): boolean {\n return typeof column.editable === 'function' ? column.editable(row) : !!column.editable;\n}\n\n/** 列的筛选设置:没写或 false 时 undefined,true 是列出出现过的值 */\nexport function columnFilter<T>(column: DataTableColumn<T>): ColumnFilter<T> | undefined {\n if (!column.filter) return undefined;\n return column.filter === true ? {} : column.filter;\n}\n\n/** 表头筛选的选项:写了的原样(字符串转成选项),没写的列出这一列出现过的值(按语言排序,有 statuses 时用状态名) */\nexport function filterOptions<T>(\n column: DataTableColumn<T>,\n rows: Iterable<T>,\n locale: string,\n): ColumnFilterOption[] {\n const options = columnFilter(column)?.options;\n if (options === 'text') return [];\n if (options)\n return options.map((option) => (typeof option === 'string' ? { value: option } : option));\n const seen = new Map<string, SortValue>();\n for (const row of rows) {\n const value = columnValue(column, row);\n if (value == null || value === '') continue;\n const text = String(value);\n if (!seen.has(text)) seen.set(text, value);\n }\n const { statuses } = column;\n // 状态按阶段的顺序,其余按语言排序\n const compare = createComparer(locale);\n const order = statuses\n ? (a: string, b: string) => statuses.order(a) - statuses.order(b)\n : (a: string, b: string) => compare(seen.get(a), seen.get(b));\n return [...seen.keys()].sort(order).map((value) => ({ value, label: statuses?.label(value) }));\n}\n\n/** 按表头筛选留下的行:filters 是各列选中的值(关键字筛选时是 [关键字]),空的不算 */\nexport function filterRows<T>(\n rows: readonly T[],\n columns: readonly DataTableColumn<T>[],\n filters: Readonly<Record<string, readonly string[]>>,\n locale: string,\n): readonly T[] {\n const matchText = createMatcher(locale);\n const tests = columns.flatMap((column) => {\n const values = filters[column.key];\n const filter = columnFilter(column);\n if (!filter || !values?.length) return [];\n const { match } = filter;\n if (match) return [(row: T) => match(row, values)];\n if (filter.options === 'text')\n return [(row: T) => matchText(String(columnValue(column, row) ?? ''), values[0]!)];\n const allowed = new Set(values);\n return [(row: T) => allowed.has(String(columnValue(column, row) ?? ''))];\n });\n return tests.length ? rows.filter((row) => tests.every((test) => test(row))) : rows;\n}\n\n/**\n * 列的位置调整(列菜单、列设置):order 是列的 key 的顺序,没列到的按定义的顺序排在后面;\n * pins 覆盖列的 sticky(null 取消固定)。固定在起始边的排到最前、结束边的排到最后:固定列要挨着表格的边\n */\nexport function arrangeColumns<T>(\n columns: readonly DataTableColumn<T>[],\n order: readonly string[] | undefined,\n pins: Readonly<Record<string, keyof ColumnStickies | null>> | undefined,\n): DataTableColumn<T>[] {\n const rank = new Map((order ?? []).map((key, index) => [key, index]));\n const position = (column: DataTableColumn<T>) =>\n rank.get(column.key) ?? rank.size + columns.indexOf(column);\n const arranged = [...columns]\n .sort((a, b) => position(a) - position(b))\n .map((column) =>\n pins && column.key in pins ? { ...column, sticky: pins[column.key] ?? undefined } : column,\n );\n return [\n ...arranged.filter((column) => column.sticky === 'start'),\n ...arranged.filter((column) => !column.sticky),\n ...arranged.filter((column) => column.sticky === 'end'),\n ];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按列定义把行导出成 CSV(RFC 4180):表头是列的标题文字,单元格是表格里看到的文字
|
|
3
|
+
* (状态映射显示名字,数字、金额、日期按列的 type 与 format 格式化);开头带 BOM,Excel 打开中文不乱码。
|
|
4
|
+
*
|
|
5
|
+
* const format = useFormat();
|
|
6
|
+
* downloadFile('台账.csv', tableToCsv(rows, columns, format), 'text/csv');
|
|
7
|
+
*
|
|
8
|
+
* 只要导出部分列时先筛 columns(去掉操作列);raw 时数值、日期导出原值,便于表格软件再计算。
|
|
9
|
+
* 文字列里以 = + - @ 开头的内容前面加 ',打开时不会被当成公式执行(CSV 注入;同 PapaParse 的 escapeFormulae);
|
|
10
|
+
* 数字、金额、日期列是格式化出来的,不会是公式,负数照常。
|
|
11
|
+
*/
|
|
12
|
+
import type { useFormat } from '../config/lang/format';
|
|
13
|
+
import { type DataTableColumn, type DataTableColumnGroup } from './columns';
|
|
14
|
+
/** tableToCsv 的选项 */
|
|
15
|
+
export interface CsvOptions {
|
|
16
|
+
/** 开头加 BOM(U+FEFF),默认 true:Excel 按 UTF-8 读,中文不乱码 */
|
|
17
|
+
bom?: boolean;
|
|
18
|
+
/** 导出原值,不按列的格式格式化(数值不带千分位、日期是 ISO),默认 false */
|
|
19
|
+
raw?: boolean;
|
|
20
|
+
/** 分组表头(同 DataTable 的 columnGroups):组里的列的表头写成“组标题 / 列标题”(如“收益(万元)/ 目标”) */
|
|
21
|
+
groups?: readonly DataTableColumnGroup[];
|
|
22
|
+
}
|
|
23
|
+
/** 行 → CSV 文字(见文件开头) */
|
|
24
|
+
export declare function tableToCsv<T>(rows: readonly T[], columns: readonly DataTableColumn<T>[], format: ReturnType<typeof useFormat>, { bom, raw, groups }?: CsvOptions): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { isNumeric, isNumericText, numericText } from "../utils/data/numeric.js";
|
|
2
|
+
import { plainText } from "../utils/data/text.js";
|
|
3
|
+
import { columnType, columnValue, formatCell } from "./columns.js";
|
|
4
|
+
//#region src/table/csv.ts
|
|
5
|
+
/** 行 → CSV 文字(见文件开头) */
|
|
6
|
+
function tableToCsv(rows, columns, format, { bom = true, raw = false, groups = [] } = {}) {
|
|
7
|
+
const types = columns.map((column) => columnType(column, rows));
|
|
8
|
+
const text = [columns.map((column) => {
|
|
9
|
+
const title = plainText(column.header) ?? column.key;
|
|
10
|
+
const group = groups.find((item) => item.columns.includes(column.key));
|
|
11
|
+
const groupTitle = group && plainText(group.header);
|
|
12
|
+
return guardFormula(groupTitle ? `${groupTitle} / ${title}` : title);
|
|
13
|
+
}), ...rows.map((row) => columns.map((column, index) => {
|
|
14
|
+
const value = columnValue(column, row);
|
|
15
|
+
if (value == null) return "";
|
|
16
|
+
if (column.statuses && typeof value === "string") return column.statuses.label(value);
|
|
17
|
+
if (isNumeric(value)) return raw ? numericText(value) : formatCell(value, types[index], format, column.format);
|
|
18
|
+
if (raw || types[index] === "text") return guardFormula(rawText(value));
|
|
19
|
+
return formatCell(value, types[index], format, column.format);
|
|
20
|
+
}))].map((line) => line.map(field).join(",")).join("\r\n");
|
|
21
|
+
return bom ? `\uFEFF${text}` : text;
|
|
22
|
+
}
|
|
23
|
+
/** 原值的文字:日期是 ISO */
|
|
24
|
+
var rawText = (value) => value instanceof Date ? value.toISOString() : String(value);
|
|
25
|
+
/** 文字以 = + - @ 开头(且不是数字)时前面加 ':表格软件不会当成公式执行 */
|
|
26
|
+
var guardFormula = (text) => {
|
|
27
|
+
const value = text;
|
|
28
|
+
return /^[=+\-@\t\r]/.test(text) && !isNumericText(value) ? `'${text}` : text;
|
|
29
|
+
};
|
|
30
|
+
/** 一格:含逗号、引号、换行时加引号(引号写两遍) */
|
|
31
|
+
var field = (text) => /[",\r\n]/.test(text) ? `"${text.replaceAll("\"", "\"\"")}"` : text;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { tableToCsv };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.js","names":[],"sources":["../../src/table/csv.ts"],"sourcesContent":["/**\n * 按列定义把行导出成 CSV(RFC 4180):表头是列的标题文字,单元格是表格里看到的文字\n * (状态映射显示名字,数字、金额、日期按列的 type 与 format 格式化);开头带 BOM,Excel 打开中文不乱码。\n *\n * const format = useFormat();\n * downloadFile('台账.csv', tableToCsv(rows, columns, format), 'text/csv');\n *\n * 只要导出部分列时先筛 columns(去掉操作列);raw 时数值、日期导出原值,便于表格软件再计算。\n * 文字列里以 = + - @ 开头的内容前面加 ',打开时不会被当成公式执行(CSV 注入;同 PapaParse 的 escapeFormulae);\n * 数字、金额、日期列是格式化出来的,不会是公式,负数照常。\n */\nimport type { useFormat } from '../config/lang/format';\nimport { isNumeric, isNumericText, numericText } from '../utils/data/numeric';\nimport { plainText } from '../utils/data/text';\nimport {\n columnType,\n columnValue,\n formatCell,\n type DataTableColumn,\n type DataTableColumnGroup,\n} from './columns';\n\n/** tableToCsv 的选项 */\nexport interface CsvOptions {\n /** 开头加 BOM(U+FEFF),默认 true:Excel 按 UTF-8 读,中文不乱码 */\n bom?: boolean;\n /** 导出原值,不按列的格式格式化(数值不带千分位、日期是 ISO),默认 false */\n raw?: boolean;\n /** 分组表头(同 DataTable 的 columnGroups):组里的列的表头写成“组标题 / 列标题”(如“收益(万元)/ 目标”) */\n groups?: readonly DataTableColumnGroup[];\n}\n\n/** 行 → CSV 文字(见文件开头) */\nexport function tableToCsv<T>(\n rows: readonly T[],\n columns: readonly DataTableColumn<T>[],\n format: ReturnType<typeof useFormat>,\n { bom = true, raw = false, groups = [] }: CsvOptions = {},\n): string {\n const types = columns.map((column) => columnType(column, rows));\n const header = columns.map((column) => {\n const title = plainText(column.header) ?? column.key;\n const group = groups.find((item) => item.columns.includes(column.key));\n const groupTitle = group && plainText(group.header);\n return guardFormula(groupTitle ? `${groupTitle} / ${title}` : title);\n });\n const lines = rows.map((row) =>\n columns.map((column, index) => {\n const value = columnValue(column, row);\n if (value == null) return '';\n if (column.statuses && typeof value === 'string') return column.statuses.label(value);\n if (isNumeric(value))\n return raw ? numericText(value) : formatCell(value, types[index]!, format, column.format);\n if (raw || types[index] === 'text') return guardFormula(rawText(value));\n return formatCell(value, types[index]!, format, column.format);\n }),\n );\n const text = [header, ...lines].map((line) => line.map(field).join(',')).join('\\r\\n');\n return bom ? `\\uFEFF${text}` : text;\n}\n\n/** 原值的文字:日期是 ISO */\nconst rawText = (value: unknown) => (value instanceof Date ? value.toISOString() : String(value));\n\n/** 文字以 = + - @ 开头(且不是数字)时前面加 ':表格软件不会当成公式执行 */\nconst guardFormula = (text: string) => {\n // isNumericText 是类型守卫:判断一个 unknown 的副本,text 本身不被收窄成 never\n const value: unknown = text;\n return /^[=+\\-@\\t\\r]/.test(text) && !isNumericText(value) ? `'${text}` : text;\n};\n\n/** 一格:含逗号、引号、换行时加引号(引号写两遍) */\nconst field = (text: string) => (/[\",\\r\\n]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text);\n"],"mappings":";;;;;AAiCA,SAAgB,WACd,MACA,SACA,QACA,EAAE,MAAM,MAAM,MAAM,OAAO,SAAS,CAAC,MAAkB,CAAC,GAChD;CACR,MAAM,QAAQ,QAAQ,KAAK,WAAW,WAAW,QAAQ,IAAI,CAAC;CAkB9D,MAAM,OAAO,CAjBE,QAAQ,KAAK,WAAW;EACrC,MAAM,QAAQ,UAAU,OAAO,MAAM,KAAK,OAAO;EACjD,MAAM,QAAQ,OAAO,MAAM,SAAS,KAAK,QAAQ,SAAS,OAAO,GAAG,CAAC;EACrE,MAAM,aAAa,SAAS,UAAU,MAAM,MAAM;EAClD,OAAO,aAAa,aAAa,GAAG,WAAW,KAAK,UAAU,KAAK;CACrE,CAYc,GAAQ,GAXR,KAAK,KAAK,QACtB,QAAQ,KAAK,QAAQ,UAAU;EAC7B,MAAM,QAAQ,YAAY,QAAQ,GAAG;EACrC,IAAI,SAAS,MAAM,OAAO;EAC1B,IAAI,OAAO,YAAY,OAAO,UAAU,UAAU,OAAO,OAAO,SAAS,MAAM,KAAK;EACpF,IAAI,UAAU,KAAK,GACjB,OAAO,MAAM,YAAY,KAAK,IAAI,WAAW,OAAO,MAAM,QAAS,QAAQ,OAAO,MAAM;EAC1F,IAAI,OAAO,MAAM,WAAW,QAAQ,OAAO,aAAa,QAAQ,KAAK,CAAC;EACtE,OAAO,WAAW,OAAO,MAAM,QAAS,QAAQ,OAAO,MAAM;CAC/D,CAAC,CAEsB,CAAK,CAAC,CAAC,KAAK,SAAS,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM;CACpF,OAAO,MAAM,SAAS,SAAS;AACjC;;AAGA,IAAM,WAAW,UAAoB,iBAAiB,OAAO,MAAM,YAAY,IAAI,OAAO,KAAK;;AAG/F,IAAM,gBAAgB,SAAiB;CAErC,MAAM,QAAiB;CACvB,OAAO,eAAe,KAAK,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,IAAI,SAAS;AAC3E;;AAGA,IAAM,SAAS,SAAkB,WAAW,KAAK,IAAI,IAAI,IAAI,KAAK,WAAW,MAAK,MAAI,EAAE,KAAK"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 透视:把明细按行维度(可以多级)与列维度分组,每格聚合一个数值(求和、计数、平均、最小、最大),
|
|
3
|
+
* 带行合计、列合计与总计。PivotTable 用它;要自己画(热力图、导出)时直接用。
|
|
4
|
+
*
|
|
5
|
+
* const result = pivot(records, {
|
|
6
|
+
* rows: [(r) => r.region, (r) => r.supplier],
|
|
7
|
+
* columns: (r) => r.quarter,
|
|
8
|
+
* value: (r) => r.amount,
|
|
9
|
+
* aggregate: 'sum',
|
|
10
|
+
* });
|
|
11
|
+
* result.cell(['华东', '华辰'], 'Q1') // 这一格的值;没有明细时 null
|
|
12
|
+
*
|
|
13
|
+
* 求和按 sumColumn:有 Decimal 时精确相加,接口给的十进制字符串按数字算;平均是和除以个数(浮点)。
|
|
14
|
+
* 行、列的顺序:给了 order 时按它(没列出的排在后面),否则按值排序(数字按大小、文字按当前语言)。
|
|
15
|
+
*/
|
|
16
|
+
import type { SortValue } from '../utils/data/collation';
|
|
17
|
+
import { type NumericValue } from '../utils/data/numeric';
|
|
18
|
+
/** 聚合的方式 */
|
|
19
|
+
export interface PivotAggregates {
|
|
20
|
+
/** 求和(默认) */
|
|
21
|
+
sum: unknown;
|
|
22
|
+
/** 明细的条数 */
|
|
23
|
+
count: unknown;
|
|
24
|
+
/** 平均 */
|
|
25
|
+
avg: unknown;
|
|
26
|
+
/** 最小 */
|
|
27
|
+
min: unknown;
|
|
28
|
+
/** 最大 */
|
|
29
|
+
max: unknown;
|
|
30
|
+
}
|
|
31
|
+
/** pivot 的选项 */
|
|
32
|
+
export interface PivotOptions<T> {
|
|
33
|
+
/** 行维度:每个取出一级的分组值(地区、供应商) */
|
|
34
|
+
rows: readonly ((row: T) => SortValue)[];
|
|
35
|
+
/** 列维度;不写时只有一列(只按行分组) */
|
|
36
|
+
columns?: (row: T) => SortValue;
|
|
37
|
+
/** 聚合的数值;count 时可以不写 */
|
|
38
|
+
value?: (row: T) => SortValue;
|
|
39
|
+
/** 聚合的方式,默认 sum */
|
|
40
|
+
aggregate?: keyof PivotAggregates;
|
|
41
|
+
/** 各级行维度的顺序(按位置对应 rows) */
|
|
42
|
+
rowOrder?: readonly (readonly string[] | undefined)[];
|
|
43
|
+
/** 列的顺序 */
|
|
44
|
+
columnOrder?: readonly string[];
|
|
45
|
+
/** 排序用的比较(文字按语言);默认 localeCompare */
|
|
46
|
+
compare?: (a: string, b: string) => number;
|
|
47
|
+
}
|
|
48
|
+
/** 透视的结果 */
|
|
49
|
+
export interface PivotResult {
|
|
50
|
+
/** 各行的维度值(每级一个),按顺序 */
|
|
51
|
+
rowKeys: string[][];
|
|
52
|
+
/** 各列的值,按顺序;没有列维度时是 [''] */
|
|
53
|
+
columnKeys: string[];
|
|
54
|
+
/** 一格的值:没有明细(或明细里都没有数值)时 null */
|
|
55
|
+
cell: (row: readonly string[], column: string) => NumericValue | null;
|
|
56
|
+
/** 一行的合计(这一行全部明细的聚合) */
|
|
57
|
+
rowTotal: (row: readonly string[]) => NumericValue | null;
|
|
58
|
+
/** 一列的合计 */
|
|
59
|
+
columnTotal: (column: string) => NumericValue | null;
|
|
60
|
+
/** 总计 */
|
|
61
|
+
grandTotal: NumericValue | null;
|
|
62
|
+
/** 各格(不含合计)里最小、最大的值:热力图按它定颜色深浅;没有值时 null */
|
|
63
|
+
extent: [number, number] | null;
|
|
64
|
+
}
|
|
65
|
+
/** 按行维度、列维度分组聚合 */
|
|
66
|
+
export declare function pivot<T>(data: readonly T[], options: PivotOptions<T>): PivotResult;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { compareNumeric, isNumeric, toNumber } from "../utils/data/numeric.js";
|
|
2
|
+
import { sumColumn } from "./columns.js";
|
|
3
|
+
//#region src/table/pivot.ts
|
|
4
|
+
var SEP = "\0";
|
|
5
|
+
/** 一组明细的聚合 */
|
|
6
|
+
function aggregateOf(rows, value, how) {
|
|
7
|
+
if (how === "count") return rows.length;
|
|
8
|
+
if (!value || rows.length === 0) return null;
|
|
9
|
+
const column = {
|
|
10
|
+
key: "",
|
|
11
|
+
header: "",
|
|
12
|
+
value
|
|
13
|
+
};
|
|
14
|
+
if (how === "sum") return sumColumn(column, rows);
|
|
15
|
+
if (how === "avg") {
|
|
16
|
+
const numbers = rows.map(value).filter(isNumeric);
|
|
17
|
+
const total = sumColumn(column, rows);
|
|
18
|
+
return total == null || numbers.length === 0 ? null : toNumber(total) / numbers.length;
|
|
19
|
+
}
|
|
20
|
+
const numbers = rows.map(value).filter(isNumeric);
|
|
21
|
+
if (numbers.length === 0) return null;
|
|
22
|
+
return numbers.reduce((best, current) => (how === "min" ? compareNumeric(current, best) < 0 : compareNumeric(current, best) > 0) ? current : best);
|
|
23
|
+
}
|
|
24
|
+
/** 按 order 排,没列出的按 compare 排在后面 */
|
|
25
|
+
function ordered(values, order, compare) {
|
|
26
|
+
const rank = new Map((order ?? []).map((value, position) => [value, position]));
|
|
27
|
+
return [...new Set(values)].sort((a, b) => {
|
|
28
|
+
const ra = rank.get(a);
|
|
29
|
+
const rb = rank.get(b);
|
|
30
|
+
if (ra !== void 0 || rb !== void 0) return (ra ?? Infinity) - (rb ?? Infinity);
|
|
31
|
+
return compare(a, b);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** 文字形式的维度值:空值是空字符串 */
|
|
35
|
+
var text = (value) => value == null ? "" : String(value);
|
|
36
|
+
/** 按行维度、列维度分组聚合 */
|
|
37
|
+
function pivot(data, options) {
|
|
38
|
+
const { rows: dimensions, columns, value, aggregate = "sum", rowOrder, columnOrder, compare = (a, b) => a.localeCompare(b, void 0, { numeric: true }) } = options;
|
|
39
|
+
const groups = /* @__PURE__ */ new Map();
|
|
40
|
+
const byRow = /* @__PURE__ */ new Map();
|
|
41
|
+
const byColumn = /* @__PURE__ */ new Map();
|
|
42
|
+
const push = (map, key, row) => {
|
|
43
|
+
const list = map.get(key);
|
|
44
|
+
if (list) list.push(row);
|
|
45
|
+
else map.set(key, [row]);
|
|
46
|
+
};
|
|
47
|
+
for (const row of data) {
|
|
48
|
+
const rowKey = dimensions.map((dimension) => text(dimension(row))).join(SEP);
|
|
49
|
+
const columnKey = columns ? text(columns(row)) : "";
|
|
50
|
+
push(groups, `${rowKey}${SEP}${SEP}${columnKey}`, row);
|
|
51
|
+
push(byRow, rowKey, row);
|
|
52
|
+
push(byColumn, columnKey, row);
|
|
53
|
+
}
|
|
54
|
+
const rowKeys = [...byRow.keys()].map((key) => key.split(SEP)).sort((a, b) => {
|
|
55
|
+
for (let level = 0; level < dimensions.length; level++) {
|
|
56
|
+
if (a[level] === b[level]) continue;
|
|
57
|
+
return ordered([a[level], b[level]], rowOrder?.[level], compare)[0] === a[level] ? -1 : 1;
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
});
|
|
61
|
+
const columnKeys = ordered(byColumn.keys(), columnOrder, compare);
|
|
62
|
+
const cache = /* @__PURE__ */ new Map();
|
|
63
|
+
const cell = (row, column) => {
|
|
64
|
+
const key = `${row.join(SEP)}${SEP}${SEP}${column}`;
|
|
65
|
+
if (!cache.has(key)) cache.set(key, aggregateOf(groups.get(key) ?? [], value, aggregate));
|
|
66
|
+
return cache.get(key);
|
|
67
|
+
};
|
|
68
|
+
const values = rowKeys.flatMap((row) => columnKeys.flatMap((column) => {
|
|
69
|
+
const result = cell(row, column);
|
|
70
|
+
return result == null ? [] : [toNumber(result)];
|
|
71
|
+
}));
|
|
72
|
+
return {
|
|
73
|
+
rowKeys,
|
|
74
|
+
columnKeys,
|
|
75
|
+
cell,
|
|
76
|
+
rowTotal: (row) => aggregateOf(byRow.get(row.join(SEP)) ?? [], value, aggregate),
|
|
77
|
+
columnTotal: (column) => aggregateOf(byColumn.get(column) ?? [], value, aggregate),
|
|
78
|
+
grandTotal: aggregateOf(data, value, aggregate),
|
|
79
|
+
extent: values.length ? [Math.min(...values), Math.max(...values)] : null
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { pivot };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=pivot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pivot.js","names":[],"sources":["../../src/table/pivot.ts"],"sourcesContent":["/**\n * 透视:把明细按行维度(可以多级)与列维度分组,每格聚合一个数值(求和、计数、平均、最小、最大),\n * 带行合计、列合计与总计。PivotTable 用它;要自己画(热力图、导出)时直接用。\n *\n * const result = pivot(records, {\n * rows: [(r) => r.region, (r) => r.supplier],\n * columns: (r) => r.quarter,\n * value: (r) => r.amount,\n * aggregate: 'sum',\n * });\n * result.cell(['华东', '华辰'], 'Q1') // 这一格的值;没有明细时 null\n *\n * 求和按 sumColumn:有 Decimal 时精确相加,接口给的十进制字符串按数字算;平均是和除以个数(浮点)。\n * 行、列的顺序:给了 order 时按它(没列出的排在后面),否则按值排序(数字按大小、文字按当前语言)。\n */\nimport type { SortValue } from '../utils/data/collation';\nimport { compareNumeric, isNumeric, toNumber, type NumericValue } from '../utils/data/numeric';\nimport { sumColumn } from './columns';\n\n/** 聚合的方式 */\nexport interface PivotAggregates {\n /** 求和(默认) */\n sum: unknown;\n /** 明细的条数 */\n count: unknown;\n /** 平均 */\n avg: unknown;\n /** 最小 */\n min: unknown;\n /** 最大 */\n max: unknown;\n}\n\n/** pivot 的选项 */\nexport interface PivotOptions<T> {\n /** 行维度:每个取出一级的分组值(地区、供应商) */\n rows: readonly ((row: T) => SortValue)[];\n /** 列维度;不写时只有一列(只按行分组) */\n columns?: (row: T) => SortValue;\n /** 聚合的数值;count 时可以不写 */\n value?: (row: T) => SortValue;\n /** 聚合的方式,默认 sum */\n aggregate?: keyof PivotAggregates;\n /** 各级行维度的顺序(按位置对应 rows) */\n rowOrder?: readonly (readonly string[] | undefined)[];\n /** 列的顺序 */\n columnOrder?: readonly string[];\n /** 排序用的比较(文字按语言);默认 localeCompare */\n compare?: (a: string, b: string) => number;\n}\n\n/** 透视的结果 */\nexport interface PivotResult {\n /** 各行的维度值(每级一个),按顺序 */\n rowKeys: string[][];\n /** 各列的值,按顺序;没有列维度时是 [''] */\n columnKeys: string[];\n /** 一格的值:没有明细(或明细里都没有数值)时 null */\n cell: (row: readonly string[], column: string) => NumericValue | null;\n /** 一行的合计(这一行全部明细的聚合) */\n rowTotal: (row: readonly string[]) => NumericValue | null;\n /** 一列的合计 */\n columnTotal: (column: string) => NumericValue | null;\n /** 总计 */\n grandTotal: NumericValue | null;\n /** 各格(不含合计)里最小、最大的值:热力图按它定颜色深浅;没有值时 null */\n extent: [number, number] | null;\n}\n\nconst SEP = '\\u0000';\n\n/** 一组明细的聚合 */\nfunction aggregateOf<T>(\n rows: readonly T[],\n value: ((row: T) => SortValue) | undefined,\n how: keyof PivotAggregates,\n): NumericValue | null {\n if (how === 'count') return rows.length;\n if (!value || rows.length === 0) return null;\n const column = { key: '', header: '', value };\n if (how === 'sum') return sumColumn(column, rows);\n if (how === 'avg') {\n const numbers = rows.map(value).filter(isNumeric);\n const total = sumColumn(column, rows);\n return total == null || numbers.length === 0 ? null : toNumber(total) / numbers.length;\n }\n const numbers = rows.map(value).filter(isNumeric);\n if (numbers.length === 0) return null;\n return numbers.reduce((best, current) =>\n (how === 'min' ? compareNumeric(current, best) < 0 : compareNumeric(current, best) > 0)\n ? current\n : best,\n );\n}\n\n/** 按 order 排,没列出的按 compare 排在后面 */\nfunction ordered(\n values: Iterable<string>,\n order: readonly string[] | undefined,\n compare: (a: string, b: string) => number,\n): string[] {\n const rank = new Map((order ?? []).map((value, position) => [value, position]));\n return [...new Set(values)].sort((a, b) => {\n const ra = rank.get(a);\n const rb = rank.get(b);\n if (ra !== undefined || rb !== undefined) return (ra ?? Infinity) - (rb ?? Infinity);\n return compare(a, b);\n });\n}\n\n/** 文字形式的维度值:空值是空字符串 */\nconst text = (value: SortValue) => (value == null ? '' : String(value));\n\n/** 按行维度、列维度分组聚合 */\nexport function pivot<T>(data: readonly T[], options: PivotOptions<T>): PivotResult {\n const {\n rows: dimensions,\n columns,\n value,\n aggregate = 'sum',\n rowOrder,\n columnOrder,\n compare = (a, b) => a.localeCompare(b, undefined, { numeric: true }),\n } = options;\n const groups = new Map<string, T[]>();\n const byRow = new Map<string, T[]>();\n const byColumn = new Map<string, T[]>();\n const push = (map: Map<string, T[]>, key: string, row: T) => {\n const list = map.get(key);\n if (list) list.push(row);\n else map.set(key, [row]);\n };\n for (const row of data) {\n const rowKey = dimensions.map((dimension) => text(dimension(row))).join(SEP);\n const columnKey = columns ? text(columns(row)) : '';\n push(groups, `${rowKey}${SEP}${SEP}${columnKey}`, row);\n push(byRow, rowKey, row);\n push(byColumn, columnKey, row);\n }\n\n // 行:逐级排序(同一上级下的下级按 order 或 compare)\n const rowKeys = [...byRow.keys()]\n .map((key) => key.split(SEP))\n .sort((a, b) => {\n for (let level = 0; level < dimensions.length; level++) {\n if (a[level] === b[level]) continue;\n const sorted = ordered([a[level]!, b[level]!], rowOrder?.[level], compare);\n return sorted[0] === a[level] ? -1 : 1;\n }\n return 0;\n });\n const columnKeys = ordered(byColumn.keys(), columnOrder, compare);\n\n const cache = new Map<string, NumericValue | null>();\n const cell = (row: readonly string[], column: string) => {\n const key = `${row.join(SEP)}${SEP}${SEP}${column}`;\n if (!cache.has(key)) cache.set(key, aggregateOf(groups.get(key) ?? [], value, aggregate));\n return cache.get(key)!;\n };\n const values = rowKeys.flatMap((row) =>\n columnKeys.flatMap((column) => {\n const result = cell(row, column);\n return result == null ? [] : [toNumber(result)];\n }),\n );\n return {\n rowKeys,\n columnKeys,\n cell,\n rowTotal: (row) => aggregateOf(byRow.get(row.join(SEP)) ?? [], value, aggregate),\n columnTotal: (column) => aggregateOf(byColumn.get(column) ?? [], value, aggregate),\n grandTotal: aggregateOf(data, value, aggregate),\n extent: values.length ? [Math.min(...values), Math.max(...values)] : null,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 读进来的表格(CSV、Excel 的一张工作表)统一成 SheetTable:表头是各列的标题文字,每行是“标题 → 值”。
|
|
3
|
+
* 导入(DataImport)、@zerodep-dev/vue-tsx-pro-ui/xlsx 的 readXlsx 都产出它;CSV 由这里的 readCsvFile 读,不依赖别的库。
|
|
4
|
+
*
|
|
5
|
+
* const [sheet] = await readCsvFile(file);
|
|
6
|
+
* sheet.headers // ['零件号', '名称', '数量']
|
|
7
|
+
* sheet.rows[0] // { 零件号: 'P-001', 名称: '支架', 数量: '40' }
|
|
8
|
+
*
|
|
9
|
+
* 从行列矩阵转成表(sheetFromMatrix)时:
|
|
10
|
+
* - 多行表头(headerRows > 1,合并单元格已展开):同一列各行的标题用“ / ”连接,上下相同的只留一个(“收益(万元)/ 目标”,
|
|
11
|
+
* 与 tableToCsv、exportXlsx 的分组表头一致);
|
|
12
|
+
* - 全空的行去掉;标题重复时后面的加序号(“备注”“备注 2”);
|
|
13
|
+
* - splitLines:这些列的单元格里有换行时拆成几行,别的列照抄(一格里写了几个零件号的报价单)。
|
|
14
|
+
*/
|
|
15
|
+
/** 单元格的值 */
|
|
16
|
+
export type SheetValue = string | number | boolean | Date | null;
|
|
17
|
+
/** 一行:列标题 → 值 */
|
|
18
|
+
export type SheetRow = Record<string, SheetValue>;
|
|
19
|
+
/** 一张表 */
|
|
20
|
+
export interface SheetTable {
|
|
21
|
+
/** 工作表名(CSV 是文件名) */
|
|
22
|
+
name: string;
|
|
23
|
+
/** 各列的标题,按列的顺序 */
|
|
24
|
+
headers: string[];
|
|
25
|
+
/** 数据行 */
|
|
26
|
+
rows: SheetRow[];
|
|
27
|
+
}
|
|
28
|
+
/** sheetFromMatrix 的选项 */
|
|
29
|
+
export interface SheetMatrixOptions {
|
|
30
|
+
/** 表头占几行,默认 1 */
|
|
31
|
+
headerRows?: number;
|
|
32
|
+
/** 这些列(标题)的单元格里有换行时拆成几行;true 是所有列 */
|
|
33
|
+
splitLines?: boolean | readonly string[];
|
|
34
|
+
/** 没有标题的列叫什么(从 0 起的列号),默认“第 N 列”;跟随语言时传 lang.sheetColumn */
|
|
35
|
+
untitled?: (column: number) => string;
|
|
36
|
+
}
|
|
37
|
+
/** 行列矩阵(合并单元格已展开)→ 表:表头可以是几行,见文件开头 */
|
|
38
|
+
export declare function sheetFromMatrix(name: string, matrix: readonly (readonly SheetValue[])[], { headerRows, splitLines, untitled, }?: SheetMatrixOptions): SheetTable;
|
|
39
|
+
/** CSV 文字 → 行列矩阵(RFC 4180:引号里的逗号、换行、两个引号;开头的 BOM 去掉) */
|
|
40
|
+
export declare function parseCsv(text: string): string[][];
|
|
41
|
+
/** 读 CSV 文件:一张表,名字是文件名(去掉扩展名) */
|
|
42
|
+
export declare function readCsvFile(file: Blob & {
|
|
43
|
+
name?: string;
|
|
44
|
+
}, options?: SheetMatrixOptions): Promise<SheetTable[]>;
|