material-plus-ui 1.6.0 → 1.8.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 +1 -1
- package/README.md +20 -14
- package/dist/components/accordion/MPAccordion.d.ts +21 -1
- package/dist/components/accordion/MPAccordion.js +1 -1
- package/dist/components/alert/MPAlert.d.ts +34 -3
- package/dist/components/alert/MPAlert.js +1 -1
- package/dist/components/anchor/MPAnchor.d.ts +107 -0
- package/dist/components/anchor/MPAnchor.js +2 -0
- package/dist/components/anchor/index.d.ts +2 -0
- package/dist/components/anchor/index.js +1 -0
- package/dist/components/animate-appear/MPAnimateAppear.d.ts +2 -2
- package/dist/components/animate-appear/MPAnimateAppear.js +1 -1
- package/dist/components/animate-blink/MPAnimateBlink.d.ts +2 -2
- package/dist/components/animate-blink/MPAnimateBlink.js +2 -1
- package/dist/components/animate-counter/MPAnimateCounter.d.ts +67 -0
- package/dist/components/animate-counter/MPAnimateCounter.js +2 -0
- package/dist/components/animate-counter/index.d.ts +2 -0
- package/dist/components/animate-counter/index.js +1 -0
- package/dist/components/animate-fade/MPAnimateFade.d.ts +2 -2
- package/dist/components/animate-fade/MPAnimateFade.js +2 -1
- package/dist/components/animate-float/MPAnimateFloat.d.ts +53 -0
- package/dist/components/animate-float/MPAnimateFloat.js +2 -0
- package/dist/components/animate-float/index.d.ts +2 -0
- package/dist/components/animate-float/index.js +1 -0
- package/dist/components/animate-grow/MPAnimateGrow.d.ts +2 -2
- package/dist/components/animate-grow/MPAnimateGrow.js +2 -1
- package/dist/components/animate-lighting/MPAnimateLighting.js +1 -0
- package/dist/components/animate-reveal/MPAnimateReveal.d.ts +64 -0
- package/dist/components/animate-reveal/MPAnimateReveal.js +2 -0
- package/dist/components/animate-reveal/index.d.ts +2 -0
- package/dist/components/animate-reveal/index.js +1 -0
- package/dist/components/animate-rotate/MPAnimateRotate.d.ts +2 -2
- package/dist/components/animate-rotate/MPAnimateRotate.js +2 -1
- package/dist/components/animate-scramble/MPAnimateScramble.d.ts +65 -0
- package/dist/components/animate-scramble/MPAnimateScramble.js +2 -0
- package/dist/components/animate-scramble/index.d.ts +2 -0
- package/dist/components/animate-scramble/index.js +1 -0
- package/dist/components/animate-shake/MPAnimateShake.d.ts +65 -0
- package/dist/components/animate-shake/MPAnimateShake.js +2 -0
- package/dist/components/animate-shake/index.d.ts +2 -0
- package/dist/components/animate-shake/index.js +1 -0
- package/dist/components/animate-slide/MPAnimateSlide.d.ts +2 -2
- package/dist/components/animate-slide/MPAnimateSlide.js +2 -1
- package/dist/components/animate-split/MPAnimateSplit.d.ts +56 -0
- package/dist/components/animate-split/MPAnimateSplit.js +2 -0
- package/dist/components/animate-split/index.d.ts +2 -0
- package/dist/components/animate-split/index.js +1 -0
- package/dist/components/animate-typing/MPAnimateTyping.js +1 -1
- package/dist/components/animate-zoom/MPAnimateZoom.d.ts +2 -2
- package/dist/components/animate-zoom/MPAnimateZoom.js +2 -1
- package/dist/components/app-logo/MPAppLogo.d.ts +171 -0
- package/dist/components/app-logo/MPAppLogo.js +2 -0
- package/dist/components/app-logo/index.d.ts +2 -0
- package/dist/components/app-logo/index.js +1 -0
- package/dist/components/area-chart/MPAreaChart.d.ts +79 -0
- package/dist/components/area-chart/MPAreaChart.js +2 -0
- package/dist/components/area-chart/index.d.ts +2 -0
- package/dist/components/area-chart/index.js +1 -0
- package/dist/components/aspect-ratio/MPAspectRatio.d.ts +1 -1
- package/dist/components/aspect-ratio/MPAspectRatio.js +2 -1
- package/dist/components/avatar/MPAvatar.d.ts +10 -1
- package/dist/components/avatar/MPAvatar.js +1 -1
- package/dist/components/bar-chart/MPBarChart.d.ts +74 -0
- package/dist/components/bar-chart/MPBarChart.js +2 -0
- package/dist/components/bar-chart/index.d.ts +2 -0
- package/dist/components/bar-chart/index.js +1 -0
- package/dist/components/blockquote/MPBlockquote.d.ts +18 -1
- package/dist/components/blockquote/MPBlockquote.js +1 -1
- package/dist/components/bottom-navigation/MPBottomNavigation.d.ts +2 -18
- package/dist/components/bottom-navigation/MPBottomNavigation.js +1 -1
- package/dist/components/box/MPBox.d.ts +43 -8
- package/dist/components/box/MPBox.js +2 -1
- package/dist/components/breadcrumb/MPBreadcrumb.js +1 -1
- package/dist/components/button/MPButton.js +1 -1
- package/dist/components/calendar/MPCalendar.js +1 -1
- package/dist/components/card/MPCard.js +1 -1
- package/dist/components/carousel/MPCarousel.js +1 -1
- package/dist/components/checkbox/MPCheckbox.js +1 -1
- package/dist/components/chip/MPChip.d.ts +11 -2
- package/dist/components/chip/MPChip.js +1 -1
- package/dist/components/code-block/MPCodeBlock.d.ts +177 -0
- package/dist/components/code-block/MPCodeBlock.js +2 -0
- package/dist/components/code-block/index.d.ts +2 -0
- package/dist/components/code-block/index.js +1 -0
- package/dist/components/collapsible/MPCollapsible.d.ts +12 -1
- package/dist/components/collapsible/MPCollapsible.js +1 -1
- package/dist/components/color-picker/MPColorPicker.js +1 -1
- package/dist/components/combobox/MPCombobox.d.ts +21 -4
- package/dist/components/combobox/MPCombobox.js +1 -1
- package/dist/components/command-palette/MPCommandPalette.d.ts +12 -2
- package/dist/components/command-palette/MPCommandPalette.js +1 -1
- package/dist/components/config/MPConfigProvider.d.ts +49 -7
- package/dist/components/config/MPConfigProvider.js +1 -1
- package/dist/components/confirm/MPConfirmProvider.js +1 -1
- package/dist/components/container/MPContainer.d.ts +9 -2
- package/dist/components/container/MPContainer.js +2 -1
- package/dist/components/data-list/MPDataList.d.ts +82 -0
- package/dist/components/data-list/MPDataList.js +2 -0
- package/dist/components/data-list/index.d.ts +2 -0
- package/dist/components/data-list/index.js +1 -0
- package/dist/components/data-table/MPDataTable.d.ts +314 -0
- package/dist/components/data-table/MPDataTable.js +2 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/components/data-table/index.js +1 -0
- package/dist/components/date-picker/MPDatePicker.js +1 -1
- package/dist/components/dialog/MPDialog.d.ts +10 -2
- package/dist/components/dialog/MPDialog.js +1 -1
- package/dist/components/drawer/MPDrawer.d.ts +8 -2
- package/dist/components/drawer/MPDrawer.js +1 -1
- package/dist/components/empty/MPEmpty.d.ts +10 -1
- package/dist/components/empty/MPEmpty.js +1 -1
- package/dist/components/fieldset/MPFieldset.js +1 -1
- package/dist/components/file-picker/MPFilePicker.js +1 -1
- package/dist/components/flex/MPFlex.d.ts +95 -0
- package/dist/components/flex/MPFlex.js +2 -0
- package/dist/components/flex/index.d.ts +2 -0
- package/dist/components/flex/index.js +1 -0
- package/dist/components/floating-action-button/MPFloatingActionButton.js +1 -1
- package/dist/components/floating-bottom-navigation/MPFloatingBottomNavigation.d.ts +127 -0
- package/dist/components/floating-bottom-navigation/MPFloatingBottomNavigation.js +2 -0
- package/dist/components/floating-bottom-navigation/index.d.ts +2 -0
- package/dist/components/floating-bottom-navigation/index.js +1 -0
- package/dist/components/footer/MPFooter.d.ts +24 -4
- package/dist/components/footer/MPFooter.js +1 -1
- package/dist/components/form/MPForm.js +1 -1
- package/dist/components/gauge-chart/MPGaugeChart.d.ts +78 -0
- package/dist/components/gauge-chart/MPGaugeChart.js +2 -0
- package/dist/components/gauge-chart/index.d.ts +2 -0
- package/dist/components/gauge-chart/index.js +1 -0
- package/dist/components/grid/MPGrid.d.ts +25 -8
- package/dist/components/grid/MPGrid.js +1 -1
- package/dist/components/header/MPHeader.d.ts +26 -4
- package/dist/components/header/MPHeader.js +1 -1
- package/dist/components/heatmap-chart/MPHeatmapChart.d.ts +75 -0
- package/dist/components/heatmap-chart/MPHeatmapChart.js +2 -0
- package/dist/components/heatmap-chart/index.d.ts +2 -0
- package/dist/components/heatmap-chart/index.js +1 -0
- package/dist/components/hover-card/MPHoverCard.d.ts +101 -0
- package/dist/components/hover-card/MPHoverCard.js +2 -0
- package/dist/components/hover-card/index.d.ts +2 -0
- package/dist/components/hover-card/index.js +1 -0
- package/dist/components/icon/MPIcon.js +1 -1
- package/dist/components/image/MPImage.d.ts +122 -5
- package/dist/components/image/MPImage.js +1 -1
- package/dist/components/image/index.d.ts +1 -1
- package/dist/components/line-chart/MPLineChart.d.ts +66 -0
- package/dist/components/line-chart/MPLineChart.js +2 -0
- package/dist/components/line-chart/index.d.ts +2 -0
- package/dist/components/line-chart/index.js +1 -0
- package/dist/components/list/MPList.d.ts +23 -1
- package/dist/components/list/MPList.js +1 -1
- package/dist/components/menu/MPMenu.d.ts +1 -1
- package/dist/components/menu/MPMenu.js +1 -1
- package/dist/components/menubar/MPMenubar.js +1 -1
- package/dist/components/meter/MPMeter.d.ts +87 -0
- package/dist/components/meter/MPMeter.js +2 -0
- package/dist/components/meter/index.d.ts +2 -0
- package/dist/components/meter/index.js +1 -0
- package/dist/components/mockup/MPMockup.d.ts +143 -0
- package/dist/components/mockup/MPMockup.js +2 -0
- package/dist/components/mockup/index.d.ts +2 -0
- package/dist/components/mockup/index.js +1 -0
- package/dist/components/navigation-menu/MPNavigationMenu.js +1 -1
- package/dist/components/number-field/MPNumberField.js +1 -1
- package/dist/components/pie-chart/MPPieChart.d.ts +77 -0
- package/dist/components/pie-chart/MPPieChart.js +2 -0
- package/dist/components/pie-chart/index.d.ts +2 -0
- package/dist/components/pie-chart/index.js +1 -0
- package/dist/components/pill/MPPill.js +1 -1
- package/dist/components/popconfirm/MPPopconfirm.d.ts +2 -2
- package/dist/components/popover/MPPopover.d.ts +1 -0
- package/dist/components/popover/MPPopover.js +1 -1
- package/dist/components/portal/MPPortal.d.ts +75 -0
- package/dist/components/portal/MPPortal.js +2 -0
- package/dist/components/portal/index.d.ts +2 -0
- package/dist/components/portal/index.js +1 -0
- package/dist/components/radio-group/MPRadioGroup.js +1 -1
- package/dist/components/rating/MPRating.js +1 -1
- package/dist/components/scatter-chart/MPScatterChart.d.ts +66 -0
- package/dist/components/scatter-chart/MPScatterChart.js +2 -0
- package/dist/components/scatter-chart/index.d.ts +2 -0
- package/dist/components/scatter-chart/index.js +1 -0
- package/dist/components/scroll-area/MPScrollArea.d.ts +82 -0
- package/dist/components/scroll-area/MPScrollArea.js +2 -0
- package/dist/components/scroll-area/index.d.ts +2 -0
- package/dist/components/scroll-area/index.js +1 -0
- package/dist/components/scroll-zone/MPScrollZone.d.ts +165 -0
- package/dist/components/scroll-zone/MPScrollZone.js +2 -0
- package/dist/components/scroll-zone/index.d.ts +2 -0
- package/dist/components/scroll-zone/index.js +1 -0
- package/dist/components/segmented-button/MPSegmentedButton.js +1 -1
- package/dist/components/select/MPSelect.d.ts +27 -4
- package/dist/components/select/MPSelect.js +1 -1
- package/dist/components/show/MPShow.d.ts +78 -0
- package/dist/components/show/MPShow.js +2 -0
- package/dist/components/show/index.d.ts +2 -0
- package/dist/components/show/index.js +1 -0
- package/dist/components/sidebar/MPSidebar.d.ts +20 -1
- package/dist/components/sidebar/MPSidebar.js +1 -1
- package/dist/components/sparkline/MPSparkline.d.ts +85 -0
- package/dist/components/sparkline/MPSparkline.js +2 -0
- package/dist/components/sparkline/index.d.ts +2 -0
- package/dist/components/sparkline/index.js +1 -0
- package/dist/components/spoiler/MPSpoiler.d.ts +12 -0
- package/dist/components/spoiler/MPSpoiler.js +1 -1
- package/dist/components/stack/MPStack.d.ts +198 -0
- package/dist/components/stack/MPStack.js +2 -0
- package/dist/components/stack/index.d.ts +2 -0
- package/dist/components/stack/index.js +1 -0
- package/dist/components/statistic/MPStatistic.d.ts +104 -0
- package/dist/components/statistic/MPStatistic.js +2 -0
- package/dist/components/statistic/index.d.ts +2 -0
- package/dist/components/statistic/index.js +1 -0
- package/dist/components/stepper/MPStepper.js +1 -1
- package/dist/components/table/MPTable.d.ts +25 -3
- package/dist/components/table/MPTable.js +1 -1
- package/dist/components/tabs/MPTabs.d.ts +12 -0
- package/dist/components/tabs/MPTabs.js +1 -1
- package/dist/components/timeline/MPTimeline.js +1 -1
- package/dist/components/timeline-chart/MPTimelineChart.d.ts +63 -0
- package/dist/components/timeline-chart/MPTimelineChart.js +2 -0
- package/dist/components/timeline-chart/index.d.ts +2 -0
- package/dist/components/timeline-chart/index.js +1 -0
- package/dist/components/toggle/MPToggle.js +1 -1
- package/dist/components/toolbar/MPToolbar.d.ts +106 -0
- package/dist/components/toolbar/MPToolbar.js +2 -0
- package/dist/components/toolbar/index.d.ts +2 -0
- package/dist/components/toolbar/index.js +1 -0
- package/dist/components/tooltip/MPTooltip.js +1 -1
- package/dist/components/tour/MPTour.d.ts +120 -0
- package/dist/components/tour/MPTour.js +2 -0
- package/dist/components/tour/index.d.ts +2 -0
- package/dist/components/tour/index.js +1 -0
- package/dist/components/transfer/MPTransfer.js +1 -1
- package/dist/components/tree-select/MPTreeSelect.d.ts +113 -0
- package/dist/components/tree-select/MPTreeSelect.js +2 -0
- package/dist/components/tree-select/index.d.ts +2 -0
- package/dist/components/tree-select/index.js +1 -0
- package/dist/components/tree-view/MPTreeView.d.ts +153 -0
- package/dist/components/tree-view/MPTreeView.js +2 -0
- package/dist/components/tree-view/index.d.ts +2 -0
- package/dist/components/tree-view/index.js +1 -0
- package/dist/components/typography/MPTypography.d.ts +10 -1
- package/dist/components/typography/MPTypography.js +2 -1
- package/dist/constants/glyphs.d.ts +33 -31
- package/dist/constants/glyphs.js +1 -1
- package/dist/constants/icons.d.ts +32 -31
- package/dist/constants/icons.js +1 -1
- package/dist/hooks/index.d.ts +22 -5
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useMPColorScheme.js +1 -0
- package/dist/hooks/useMPDisclosure.d.ts +58 -0
- package/dist/hooks/useMPDisclosure.js +2 -0
- package/dist/hooks/useMPElementSize.d.ts +55 -0
- package/dist/hooks/useMPElementSize.js +2 -0
- package/dist/hooks/useMPMediaQuery.d.ts +40 -0
- package/dist/hooks/useMPMediaQuery.js +2 -0
- package/dist/hooks/useMPOnScreen.d.ts +58 -0
- package/dist/hooks/useMPOnScreen.js +2 -0
- package/dist/hooks/useMPReducedMotion.js +1 -0
- package/dist/hooks/useMPWindowClass.d.ts +7 -0
- package/dist/hooks/useMPWindowClass.js +1 -0
- package/dist/index.d.ts +35 -1
- package/dist/index.js +1 -1
- package/dist/internal/Calendar.js +1 -1
- package/dist/internal/ChartChrome.d.ts +199 -0
- package/dist/internal/ChartChrome.js +2 -0
- package/dist/internal/ChartFrame.d.ts +197 -0
- package/dist/internal/ChartFrame.js +2 -0
- package/dist/internal/FieldOutline.d.ts +14 -5
- package/dist/internal/FieldOutline.js +1 -1
- package/dist/internal/Picker.js +1 -1
- package/dist/internal/PopupArrow.d.ts +60 -0
- package/dist/internal/PopupArrow.js +2 -0
- package/dist/internal/SupportingText.d.ts +24 -0
- package/dist/internal/SupportingText.js +1 -1
- package/dist/internal/animate-core.d.ts +121 -0
- package/dist/internal/animate-core.js +1 -0
- package/dist/internal/animate.d.ts +75 -55
- package/dist/internal/animate.js +1 -1
- package/dist/internal/bottom-navigation.d.ts +58 -0
- package/dist/internal/bottom-navigation.js +2 -0
- package/dist/internal/chart.d.ts +461 -0
- package/dist/internal/chart.js +1 -0
- package/dist/internal/color-scheme.d.ts +0 -9
- package/dist/internal/color-scheme.js +1 -1
- package/dist/internal/config.d.ts +24 -5
- package/dist/internal/config.js +1 -1
- package/dist/internal/data-table.d.ts +195 -0
- package/dist/internal/data-table.js +1 -0
- package/dist/internal/date.d.ts +22 -18
- package/dist/internal/date.js +1 -1
- package/dist/internal/density.d.ts +9 -0
- package/dist/internal/density.js +1 -0
- package/dist/internal/elevation.d.ts +26 -0
- package/dist/internal/elevation.js +1 -0
- package/dist/internal/highlight.d.ts +96 -0
- package/dist/internal/highlight.js +1 -0
- package/dist/internal/i18n.d.ts +180 -0
- package/dist/internal/initials.d.ts +28 -0
- package/dist/internal/initials.js +1 -0
- package/dist/internal/intl.d.ts +64 -0
- package/dist/internal/intl.js +1 -0
- package/dist/internal/mark.d.ts +52 -0
- package/dist/internal/mark.js +1 -0
- package/dist/internal/measure.d.ts +31 -0
- package/dist/internal/measure.js +1 -0
- package/dist/internal/messages/anchor.d.ts +3 -0
- package/dist/internal/messages/anchor.js +1 -0
- package/dist/internal/messages/chart.d.ts +3 -0
- package/dist/internal/messages/chart.js +1 -0
- package/dist/internal/messages/code.d.ts +3 -0
- package/dist/internal/messages/code.js +1 -0
- package/dist/internal/messages/data-table.d.ts +3 -0
- package/dist/internal/messages/data-table.js +1 -0
- package/dist/internal/messages/scroll.d.ts +3 -0
- package/dist/internal/messages/scroll.js +1 -0
- package/dist/internal/messages/sparkline.d.ts +3 -0
- package/dist/internal/messages/sparkline.js +1 -0
- package/dist/internal/messages/tour.d.ts +3 -0
- package/dist/internal/messages/tour.js +1 -0
- package/dist/internal/messages/transfer.d.ts +1 -1
- package/dist/internal/messages/transfer.js +1 -1
- package/dist/internal/mockup.d.ts +174 -0
- package/dist/internal/mockup.js +2 -0
- package/dist/internal/page-layout.d.ts +24 -5
- package/dist/internal/page-layout.js +1 -1
- package/dist/internal/responsive.d.ts +55 -0
- package/dist/internal/responsive.js +1 -0
- package/dist/internal/scale.d.ts +0 -17
- package/dist/internal/scale.js +1 -1
- package/dist/internal/step.d.ts +15 -0
- package/dist/internal/step.js +1 -1
- package/dist/internal/table.d.ts +53 -0
- package/dist/internal/table.js +1 -0
- package/dist/internal/text.d.ts +57 -0
- package/dist/internal/text.js +1 -0
- package/dist/internal/threshold.d.ts +19 -0
- package/dist/internal/threshold.js +1 -0
- package/dist/internal/time-scale.d.ts +44 -0
- package/dist/internal/time-scale.js +1 -0
- package/dist/internal/transition.d.ts +33 -0
- package/dist/internal/transition.js +1 -0
- package/dist/internal/visibility.d.ts +48 -0
- package/dist/internal/visibility.js +1 -0
- package/dist/internal/window-class.d.ts +29 -2
- package/dist/internal/window-class.js +1 -1
- package/dist/locales/ar.js +1 -1
- package/dist/locales/de.js +1 -1
- package/dist/locales/es.js +1 -1
- package/dist/locales/fr.js +1 -1
- package/dist/locales/hi.js +1 -1
- package/dist/locales/id.js +1 -1
- package/dist/locales/it.js +1 -1
- package/dist/locales/ja.js +1 -1
- package/dist/locales/ko.js +1 -1
- package/dist/locales/nl.js +1 -1
- package/dist/locales/pl.js +1 -1
- package/dist/locales/pt.js +1 -1
- package/dist/locales/ru.js +1 -1
- package/dist/locales/th.js +1 -1
- package/dist/locales/tr.js +1 -1
- package/dist/locales/vi.js +1 -1
- package/dist/locales/zh-hans.js +1 -1
- package/dist/locales/zh-hant.js +1 -1
- package/dist/styles/accordion.css +1 -1
- package/dist/styles/alert.css +1 -1
- package/dist/styles/anchor.css +2 -0
- package/dist/styles/animate-appear.css +1 -1
- package/dist/styles/animate-blink.css +1 -1
- package/dist/styles/animate-counter.css +2 -0
- package/dist/styles/animate-fade.css +1 -1
- package/dist/styles/animate-float.css +2 -0
- package/dist/styles/animate-grow.css +1 -1
- package/dist/styles/animate-headline.css +1 -1
- package/dist/styles/animate-lighting.css +1 -1
- package/dist/styles/animate-marquee.css +1 -1
- package/dist/styles/animate-reveal.css +2 -0
- package/dist/styles/animate-rotate.css +1 -1
- package/dist/styles/animate-scramble.css +2 -0
- package/dist/styles/animate-shake.css +2 -0
- package/dist/styles/animate-slide.css +1 -1
- package/dist/styles/animate-split.css +2 -0
- package/dist/styles/animate-typing.css +1 -1
- package/dist/styles/animate-zoom.css +1 -1
- package/dist/styles/app-logo.css +2 -0
- package/dist/styles/area-chart.css +2 -0
- package/dist/styles/aspect-ratio.css +1 -1
- package/dist/styles/avatar.css +1 -1
- package/dist/styles/badge.css +1 -1
- package/dist/styles/bar-chart.css +2 -0
- package/dist/styles/blockquote.css +1 -1
- package/dist/styles/bottom-navigation.css +1 -1
- package/dist/styles/box.css +1 -1
- package/dist/styles/breadcrumb.css +1 -1
- package/dist/styles/button.css +1 -1
- package/dist/styles/calendar.css +1 -1
- package/dist/styles/card.css +1 -1
- package/dist/styles/carousel.css +1 -1
- package/dist/styles/chat-bubble.css +1 -1
- package/dist/styles/checkbox.css +1 -1
- package/dist/styles/chip.css +1 -1
- package/dist/styles/code-block.css +2 -0
- package/dist/styles/collapsible.css +1 -1
- package/dist/styles/color-picker.css +1 -1
- package/dist/styles/combobox.css +1 -1
- package/dist/styles/command-palette.css +1 -1
- package/dist/styles/config.css +1 -1
- package/dist/styles/confirm.css +1 -1
- package/dist/styles/container.css +1 -1
- package/dist/styles/data-list.css +2 -0
- package/dist/styles/data-table.css +2 -0
- package/dist/styles/date-picker.css +1 -1
- package/dist/styles/date-range-picker.css +1 -1
- package/dist/styles/date-time-picker.css +1 -1
- package/dist/styles/dialog.css +1 -1
- package/dist/styles/divider.css +1 -1
- package/dist/styles/drawer.css +1 -1
- package/dist/styles/empty.css +1 -1
- package/dist/styles/fieldset.css +1 -1
- package/dist/styles/file-picker.css +1 -1
- package/dist/styles/flex.css +2 -0
- package/dist/styles/floating-action-button.css +1 -1
- package/dist/styles/floating-bottom-navigation.css +2 -0
- package/dist/styles/footer.css +1 -1
- package/dist/styles/form.css +1 -1
- package/dist/styles/gauge-chart.css +2 -0
- package/dist/styles/grid.css +1 -1
- package/dist/styles/header.css +1 -1
- package/dist/styles/heatmap-chart.css +2 -0
- package/dist/styles/highlight.css +1 -1
- package/dist/styles/hover-card.css +2 -0
- package/dist/styles/icon-button.css +1 -1
- package/dist/styles/icon.css +1 -1
- package/dist/styles/image.css +1 -1
- package/dist/styles/line-chart.css +2 -0
- package/dist/styles/list.css +1 -1
- package/dist/styles/locale.css +1 -1
- package/dist/styles/menu.css +1 -1
- package/dist/styles/menubar.css +1 -1
- package/dist/styles/meter.css +2 -0
- package/dist/styles/mockup.css +2 -0
- package/dist/styles/navigation-menu.css +1 -1
- package/dist/styles/number-field.css +1 -1
- package/dist/styles/otp-field.css +1 -1
- package/dist/styles/overlay.css +1 -1
- package/dist/styles/page-layout.css +1 -1
- package/dist/styles/pagination.css +1 -1
- package/dist/styles/pie-chart.css +2 -0
- package/dist/styles/pill.css +1 -1
- package/dist/styles/popconfirm.css +1 -1
- package/dist/styles/popover.css +1 -1
- package/dist/styles/portal.css +2 -0
- package/dist/styles/progress-box.css +1 -1
- package/dist/styles/progress-circular.css +1 -1
- package/dist/styles/progress-linear.css +1 -1
- package/dist/styles/radio-group.css +1 -1
- package/dist/styles/rating.css +1 -1
- package/dist/styles/scatter-chart.css +2 -0
- package/dist/styles/scroll-area.css +2 -0
- package/dist/styles/scroll-zone.css +2 -0
- package/dist/styles/segmented-button.css +1 -1
- package/dist/styles/select.css +1 -1
- package/dist/styles/show.css +2 -0
- package/dist/styles/sidebar.css +1 -1
- package/dist/styles/skeleton.css +1 -1
- package/dist/styles/slider.css +1 -1
- package/dist/styles/snackbar.css +1 -1
- package/dist/styles/sparkline.css +2 -0
- package/dist/styles/spoiler.css +1 -1
- package/dist/styles/stack.css +2 -0
- package/dist/styles/statistic.css +2 -0
- package/dist/styles/stepper.css +1 -1
- package/dist/styles/switch.css +1 -1
- package/dist/styles/table.css +1 -1
- package/dist/styles/tabs.css +1 -1
- package/dist/styles/text-field.css +1 -1
- package/dist/styles/text-link.css +1 -1
- package/dist/styles/time-picker.css +1 -1
- package/dist/styles/timeline-chart.css +2 -0
- package/dist/styles/timeline.css +1 -1
- package/dist/styles/toggle.css +1 -1
- package/dist/styles/tokens.css +1 -1
- package/dist/styles/toolbar.css +2 -0
- package/dist/styles/tour.css +2 -0
- package/dist/styles/transfer.css +1 -1
- package/dist/styles/tree-select.css +2 -0
- package/dist/styles/tree-view.css +2 -0
- package/dist/styles/typography.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind.css +2606 -185
- package/dist/types.d.ts +566 -5
- package/package.json +26 -25
- package/.fix.py +0 -92
- package/dist/components/avatar-group/MPAvatarGroup.d.ts +0 -74
- package/dist/components/avatar-group/MPAvatarGroup.js +0 -2
- package/dist/components/avatar-group/index.d.ts +0 -2
- package/dist/components/avatar-group/index.js +0 -1
- package/dist/internal/avatar-group.d.ts +0 -22
- package/dist/internal/avatar-group.js +0 -2
- package/dist/styles/avatar-group.css +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{jsx as e,jsxs as
|
|
2
|
+
import{jsx as e,jsxs as r}from"react/jsx-runtime";import*as t from"react";import{Toggle as o}from"@base-ui/react/toggle";import{accentSlots as n}from"../../internal/accent.js";import{MPButtonGroupContext as a}from"../../internal/button-group.js";import{MPStateLayer as s}from"../../internal/StateLayer.js";import{CONTROL_GAP as i,CONTROL_HEIGHT as c,CONTROL_PAD_X as l,CONTROL_SQUARE as d,CONTROL_TEXT as p,hasContent as m}from"../../internal/scale.js";import{useMPColor as u,useMPSize as f}from"../../internal/config.js";const b={filled:"border-0 bg-mp-surface-container-highest text-mp-on-surface-variant",tonal:"border-0 bg-mp-surface-container text-mp-on-surface-variant",elevated:"shadow-mp-1 border-0 bg-mp-surface-container-low text-mp-on-surface-variant",outlined:"border-mp-outline border bg-transparent text-mp-on-surface-variant",text:"border-0 bg-transparent text-mp-on-surface-variant"},g={filled:"border-0 bg-(--_mp-accent) text-(--_mp-on-accent)",tonal:"border-0 bg-(--_mp-accent-container) text-(--_mp-on-accent-container)",elevated:"shadow-mp-1 border-0 bg-(--_mp-accent-container) text-(--_mp-on-accent-container)",outlined:"border-(--_mp-accent) border bg-(--_mp-accent-container) text-(--_mp-on-accent-container)",text:"border-0 bg-transparent text-(--_mp-accent)"},x={filled:"border-0 bg-mp-on-surface/12 text-mp-on-surface/38",tonal:"border-0 bg-mp-on-surface/12 text-mp-on-surface/38",elevated:"border-0 bg-mp-on-surface/12 text-mp-on-surface/38 shadow-none",outlined:"border-mp-on-surface/12 border bg-transparent text-mp-on-surface/38",text:"border-0 bg-transparent text-mp-on-surface/38"};export const MPToggle=/*@__PURE__*/t.forwardRef(function({variant:v,size:h,color:j,disabled:w,pressed:_,defaultPressed:y,onPressedChange:P,value:z,startIcon:C,endIcon:k,fullWidth:I=!1,className:N,style:B,children:L,...M},R){const S=t.useContext(a),T=v??S?.variant??"outlined",W=f(h??S?.size),$=u(j??S?.color),q=w??S?.disabled??!1,A=!m(L);return r(o,{ref:R,value:z,pressed:_,defaultPressed:y,onPressedChange:e=>P?.(e),disabled:q,"data-mp-size":W,"data-mp-variant":T,className:e=>["mp-toggle group relative inline-flex shrink-0 items-center justify-center","rounded-mp-full box-border overflow-hidden align-middle whitespace-nowrap select-none","cursor-pointer appearance-none font-[inherit]","outline-mp-secondary focus-visible:outline-2 focus-visible:outline-offset-2","focus-visible:outline-solid outline-none","transition-[background-color,border-color,box-shadow,color]","duration-(--mp-sys-motion-duration-short4)",c[W],p[W],i[W],A?`${d[W]} px-0`:l[W],q?x[T]:e.pressed?g[T]:b[T],q?"cursor-default":"",I?"w-full":"",N??""].filter(Boolean).join(" "),style:{...n($),...B},...M,children:[q?null:e(s,{}),C,L,k]})});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
3
|
+
import type { MPDensity, MPElevation, MPPosition, MPSize, MPVariant } from '../../types.js';
|
|
4
|
+
/** Which edge a pinned bar is held against. */
|
|
5
|
+
export type MPToolbarSide = 'top' | 'bottom';
|
|
6
|
+
export interface MPToolbarProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
7
|
+
/**
|
|
8
|
+
* How much surface the bar paints.
|
|
9
|
+
*
|
|
10
|
+
* A container's ladder, so the bar is never dyed — exactly as on `MPBox`. A
|
|
11
|
+
* toolbar holds other people's controls, and those controls arrive with
|
|
12
|
+
* colours of their own.
|
|
13
|
+
* @default 'outlined'
|
|
14
|
+
*/
|
|
15
|
+
variant?: MPVariant;
|
|
16
|
+
/**
|
|
17
|
+
* How far off the page it is lifted, on MD3's five levels.
|
|
18
|
+
*
|
|
19
|
+
* Left unset the bar is flat even when it is pinned, and that is deliberate: a
|
|
20
|
+
* shadow under a header is a way of saying "there is content beneath this",
|
|
21
|
+
* which is only true once the page has been scrolled. Raise it yourself, or
|
|
22
|
+
* leave it flat and turn on `divider`.
|
|
23
|
+
*/
|
|
24
|
+
elevation?: MPElevation;
|
|
25
|
+
/**
|
|
26
|
+
* The room inside. As on `MPBox`, `size` sets padding here and neither a
|
|
27
|
+
* height nor a type scale: a toolbar is as tall as the controls in it.
|
|
28
|
+
* @default 'md'
|
|
29
|
+
*/
|
|
30
|
+
size?: MPSize;
|
|
31
|
+
/** Takes room out of that padding, two pixels a face per step. @default 0 */
|
|
32
|
+
density?: MPDensity;
|
|
33
|
+
/**
|
|
34
|
+
* How the bar sits in the page's scroll.
|
|
35
|
+
*
|
|
36
|
+
* - `static` — in the flow, scrolling away with the content.
|
|
37
|
+
* - `sticky` — in the flow until it reaches the edge, then held there. What an
|
|
38
|
+
* application header usually wants: it takes up its own room, so nothing
|
|
39
|
+
* underneath has to be padded around it.
|
|
40
|
+
* - `fixed` — out of the flow entirely. The page needs padding of its own, or
|
|
41
|
+
* the first screenful sits behind the bar.
|
|
42
|
+
* - `absolute` — pinned to the nearest positioned ancestor rather than to the
|
|
43
|
+
* window. For a bar along the edge of a panel.
|
|
44
|
+
* @default 'static'
|
|
45
|
+
*/
|
|
46
|
+
position?: MPPosition;
|
|
47
|
+
/** Which edge it is held against when `position` is not `static`. @default 'top' */
|
|
48
|
+
side?: MPToolbarSide;
|
|
49
|
+
/**
|
|
50
|
+
* Draws a hairline along the edge that faces the content — under a `top` bar,
|
|
51
|
+
* over a `bottom` one.
|
|
52
|
+
* @default false
|
|
53
|
+
*/
|
|
54
|
+
divider?: boolean;
|
|
55
|
+
/** Pinned to the start of the bar: a logo, a title, a back button. */
|
|
56
|
+
start?: React.ReactNode;
|
|
57
|
+
/** Pinned to the end: the actions. */
|
|
58
|
+
end?: React.ReactNode;
|
|
59
|
+
/**
|
|
60
|
+
* Renders something other than a `<div>`. Worth reaching for here more than
|
|
61
|
+
* anywhere else: a page's header should be a `<header>`.
|
|
62
|
+
*/
|
|
63
|
+
render?: useRender.RenderProp;
|
|
64
|
+
/** The middle. Takes whatever width `start` and `end` leave. */
|
|
65
|
+
children?: React.ReactNode;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A bar of controls: an application header, a page's action row, the strip along
|
|
69
|
+
* the bottom of an editor.
|
|
70
|
+
*
|
|
71
|
+
* ```tsx
|
|
72
|
+
* <MPToolbar render={<header />} position="sticky" divider start={<MPAppLogo name="Acme" />}>
|
|
73
|
+
* <MPTextField placeholder="Search" />
|
|
74
|
+
* </MPToolbar>
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* Three slots and a row. `start` and `end` are pinned to their ends and
|
|
78
|
+
* `children` takes what is left, which is the arrangement every toolbar has ever
|
|
79
|
+
* had — so it is laid out here rather than left to a caller and the spacer
|
|
80
|
+
* `<div>` they have to remember.
|
|
81
|
+
*
|
|
82
|
+
* ## It takes no height
|
|
83
|
+
*
|
|
84
|
+
* A toolbar is as tall as the controls in it plus its padding, and that padding
|
|
85
|
+
* is the `size`/`density` pair every other surface uses. So `density={-2}` gives
|
|
86
|
+
* the dense bar without a second prop that means the same thing, and without the
|
|
87
|
+
* type scale moving.
|
|
88
|
+
*
|
|
89
|
+
* ## It has no `role="toolbar"`, deliberately
|
|
90
|
+
*
|
|
91
|
+
* That role is a promise about keyboard behaviour — one tab stop for the whole
|
|
92
|
+
* bar, arrow keys between the controls inside it — and a bar that claims it
|
|
93
|
+
* without implementing it is worse for a keyboard reader than one that claimed
|
|
94
|
+
* nothing at all.
|
|
95
|
+
*
|
|
96
|
+
* What a page header wants is `render={<header />}`, which is a landmark and is
|
|
97
|
+
* true. What a genuine roving-focus toolbar wants is `MPButtonGroup`, which is
|
|
98
|
+
* one.
|
|
99
|
+
*
|
|
100
|
+
* ## What it is not
|
|
101
|
+
*
|
|
102
|
+
* Not `MPHeader`, which is `MPPageLayout`'s own slot and knows about the
|
|
103
|
+
* sidebar, the skip link and the drawer. This is a bar you can put anywhere,
|
|
104
|
+
* including inside a card.
|
|
105
|
+
*/
|
|
106
|
+
export declare const MPToolbar: React.ForwardRefExoticComponent<MPToolbarProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{jsx as t,jsxs as e}from"react/jsx-runtime";import*as o from"react";import{useRender as r}from"@base-ui/react/use-render";import{sheetPadX as i,sheetPadY as n}from"../../internal/density.js";import{containerSurface as s}from"../../internal/elevation.js";import{SHEET_GAP as a,hasContent as m}from"../../internal/scale.js";import{useMPDensity as l,useMPSize as d}from"../../internal/config.js";const p={static:{top:"",bottom:""},absolute:{top:"absolute inset-x-0 top-0 z-20",bottom:"absolute inset-x-0 bottom-0 z-20"},sticky:{top:"sticky top-0 z-20",bottom:"sticky bottom-0 z-20"},fixed:{top:"fixed inset-x-0 top-0 z-30",bottom:"fixed inset-x-0 bottom-0 z-30"}},c={top:"border-mp-outline-variant border-b",bottom:"border-mp-outline-variant border-t"};export const MPToolbar=/*@__PURE__*/o.forwardRef(function({variant:b="outlined",elevation:f,size:x,density:u,position:v="static",side:h="top",divider:j=!1,start:z,end:y,render:w,className:_,style:g,children:k,...N},B){const F=d(x),M=l(u);return r({render:w,ref:B,props:{"data-mp-size":F,"data-mp-variant":b,className:["mp-toolbar box-border flex w-full min-w-0 items-center",i(F,M),n(F,M),a[F],"static"===v?"rounded-mp-md":"",s(b,f),"text-mp-on-surface",j?c[h]:"",p[v][h],_??""].filter(Boolean).join(" "),style:g,children:e(o.Fragment,{children:[m(z)?t("div",{className:"mp-toolbar__start flex min-w-0 shrink-0 items-center gap-2",children:z}):null,t("div",{className:"mp-toolbar__main flex min-w-0 flex-1 items-center gap-2",children:k}),m(y)?t("div",{className:"mp-toolbar__end flex min-w-0 shrink-0 items-center gap-2",children:y}):null]}),...N}})});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{MPToolbar}from"./MPToolbar.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{jsx as
|
|
2
|
+
import{jsx as o,jsxs as e}from"react/jsx-runtime";import*as t from"react";import{POPUP_ARROW_TURN as l,PopupArrow as i}from"../../internal/PopupArrow.js";import{Tooltip as r}from"@base-ui/react/tooltip";import{accentSlots as a}from"../../internal/accent.js";export const MPTooltipProvider=r.Provider;const s={xs:"py-0.5",sm:"py-1",md:"py-1",lg:"py-1.5",xl:"py-2"},n={xs:"px-1.5",sm:"px-2",md:"px-2",lg:"px-3",xl:"px-4"},p={xs:"text-mp-body-small",sm:"text-mp-body-small",md:"text-mp-body-small",lg:"text-mp-body-medium",xl:"text-mp-body-medium"},m={xs:6,sm:7,md:8,lg:9,xl:10};export function MPTooltip({content:d,children:c,size:x="sm",color:y,side:u="top",align:f="center",sideOffset:g=6,delay:b,closeDelay:v,arrow:h=!0,open:_,defaultOpen:P,onOpenChange:j,disabled:O=!1,className:w,style:z}){const N=m[x],T=t.useId(),[A,C]=t.useState(P??!1),D=_??A,M={"--_mp-tooltip":y?`var(--_mp-color-${y})`:"var(--_mp-color-inverse-surface)","--_mp-on-tooltip":y?`var(--_mp-color-on-${y})`:"var(--_mp-color-inverse-on-surface)",...y?a(y):null};return e(r.Root,{open:_,defaultOpen:P,onOpenChange:o=>{void 0===_&&C(o),j?.(o)},children:[o(r.Trigger,{render:c,delay:b,closeDelay:v,disabled:O,"aria-describedby":D?T:void 0}),o(r.Portal,{children:o(r.Positioner,{className:"mp-portal z-50 outline-none",side:u,align:f,sideOffset:g,children:e(r.Popup,{id:T,role:"tooltip","data-mp-size":x,className:["mp-tooltip rounded-mp-xs max-w-64 outline-none","bg-(--_mp-tooltip) text-(--_mp-on-tooltip)","transition-opacity duration-(--mp-sys-motion-duration-short4)","data-starting-style:opacity-0 data-ending-style:opacity-0","data-instant:duration-0",n[x],s[x],p[x],w??""].filter(Boolean).join(" "),style:{...M,...z},children:[h?o(r.Arrow,{className:l,children:o(i,{size:N,fill:"var(--_mp-tooltip)"})}):null,d]})})})]})}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { MPAlign, MPColor, MPSide, MPSize, MPSlots } from '../../types.js';
|
|
3
|
+
/** One stop on the tour. */
|
|
4
|
+
export interface MPTourStep {
|
|
5
|
+
/**
|
|
6
|
+
* A CSS selector for what this step is about.
|
|
7
|
+
*
|
|
8
|
+
* Left out, the card is centred over the page with nothing cut out of the
|
|
9
|
+
* dimming — which is what a welcome step and a closing step are.
|
|
10
|
+
*/
|
|
11
|
+
target?: string;
|
|
12
|
+
/** The step's heading. */
|
|
13
|
+
title?: React.ReactNode;
|
|
14
|
+
/** What it says. */
|
|
15
|
+
content?: React.ReactNode;
|
|
16
|
+
/** Which edge of the target the card sits on. @default 'bottom' */
|
|
17
|
+
side?: MPSide;
|
|
18
|
+
/** Where along that edge. @default 'center' */
|
|
19
|
+
align?: MPAlign;
|
|
20
|
+
/**
|
|
21
|
+
* How far the hole is inflated past the target, in pixels. A control with a
|
|
22
|
+
* focus ring wants a couple; a whole panel wants none.
|
|
23
|
+
* @default 6
|
|
24
|
+
*/
|
|
25
|
+
padding?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The parts an `MPTour` draws around its card.
|
|
29
|
+
*
|
|
30
|
+
* `className` is the card — the sheet the steps are written on — and `scrim` is
|
|
31
|
+
* the dimming behind it, which is a sibling of the card rather than a descendant
|
|
32
|
+
* and so has no other way in.
|
|
33
|
+
*/
|
|
34
|
+
export type MPTourSlot = 'scrim' | 'title' | 'content' | 'close' | 'footer';
|
|
35
|
+
export interface MPTourProps {
|
|
36
|
+
/** The stops, in order. */
|
|
37
|
+
steps: readonly MPTourStep[];
|
|
38
|
+
/** Whether the tour is running. Use with `onOpenChange` for a controlled one. */
|
|
39
|
+
open?: boolean;
|
|
40
|
+
/** Whether it starts running, for an uncontrolled one. @default false */
|
|
41
|
+
defaultOpen?: boolean;
|
|
42
|
+
onOpenChange?: (open: boolean) => void;
|
|
43
|
+
/** Which stop, from `0`. Use with `onStepChange` for a controlled one. */
|
|
44
|
+
step?: number;
|
|
45
|
+
/** Which one it starts on. @default 0 */
|
|
46
|
+
defaultStep?: number;
|
|
47
|
+
onStepChange?: (step: number) => void;
|
|
48
|
+
/** Called when the last step's button is pressed, before the tour closes. */
|
|
49
|
+
onFinish?: () => void;
|
|
50
|
+
/**
|
|
51
|
+
* Dims the page and cuts the target out of the dimming. Off, the card is the
|
|
52
|
+
* only thing the tour draws.
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
scrim?: boolean;
|
|
56
|
+
/** Offers the Skip button beside the counter. @default true */
|
|
57
|
+
skippable?: boolean;
|
|
58
|
+
/** Whether Escape and the × end the tour. @default true */
|
|
59
|
+
dismissible?: boolean;
|
|
60
|
+
/** Scrolls each target into view as the tour reaches it. @default true */
|
|
61
|
+
scrollIntoView?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Which language the buttons and the counter are written in. Falls back to the
|
|
64
|
+
* nearest `MPLocaleProvider`, then to English.
|
|
65
|
+
*/
|
|
66
|
+
locale?: string;
|
|
67
|
+
/** Individual overrides for the five words the tour says on its own behalf. */
|
|
68
|
+
labels?: Partial<{
|
|
69
|
+
previous: string;
|
|
70
|
+
next: string;
|
|
71
|
+
done: string;
|
|
72
|
+
skip: string;
|
|
73
|
+
position: string;
|
|
74
|
+
}>;
|
|
75
|
+
/** @default 'md' */
|
|
76
|
+
size?: MPSize;
|
|
77
|
+
/** Which accent family the buttons read. @default 'primary' */
|
|
78
|
+
color?: MPColor;
|
|
79
|
+
/** Class names for the card. */
|
|
80
|
+
className?: string;
|
|
81
|
+
style?: React.CSSProperties;
|
|
82
|
+
/**
|
|
83
|
+
* Class names for the parts around it. `className` is the card, so the dimming
|
|
84
|
+
* behind it is `classNames.scrim`.
|
|
85
|
+
*/
|
|
86
|
+
classNames?: MPSlots<MPTourSlot>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A guided walk over a page that already exists.
|
|
90
|
+
*
|
|
91
|
+
* ```tsx
|
|
92
|
+
* <MPTour
|
|
93
|
+
* defaultOpen
|
|
94
|
+
* steps={[{ target: '#search', title: 'Find anything', content: 'Press ⌘K.' }]}
|
|
95
|
+
* />
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* It is [MPStepper](../display/stepper) turned inside out. That component puts
|
|
99
|
+
* the instructions *in* the page and the reader follows them; this one leaves
|
|
100
|
+
* the page exactly as it is and stands over it. The steps are therefore given by
|
|
101
|
+
* selector rather than as content: what a tour is about is already on screen,
|
|
102
|
+
* and describing it a second time inside the card would be two copies to keep in
|
|
103
|
+
* step.
|
|
104
|
+
*
|
|
105
|
+
* ## The dimming never takes the pointer
|
|
106
|
+
*
|
|
107
|
+
* A reader can use the control being pointed at while the card is up, and that
|
|
108
|
+
* is the difference between a tour and a sequence of dialogs. Nothing outside
|
|
109
|
+
* the card is blocked, no focus is trapped, and neither a press outside nor the
|
|
110
|
+
* focus leaving ends the tour — only Escape, the ×, and the card's own buttons
|
|
111
|
+
* do.
|
|
112
|
+
*
|
|
113
|
+
* ## What it is not
|
|
114
|
+
*
|
|
115
|
+
* It is not documentation, and it is not a place to put anything a reader will
|
|
116
|
+
* need twice. A tour is shown once, to somebody who has not asked for it, over
|
|
117
|
+
* a page they are trying to get on with — so three or four steps is the shape,
|
|
118
|
+
* and anything that has to be found again belongs on the page.
|
|
119
|
+
*/
|
|
120
|
+
export declare function MPTour({ steps, open: openProp, defaultOpen, onOpenChange, step: stepProp, defaultStep, onStepChange, onFinish, scrim, skippable, dismissible, scrollIntoView, locale: localeProp, labels, size: sizeProp, color: colorProp, className, style, classNames }: MPTourProps): React.JSX.Element | null;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import*as n from"react";import{Popover as o}from"@base-ui/react/popover";import{MPButton as i}from"../button/MPButton.js";import{MPIcon as r}from"../icon/MPIcon.js";import{CloseIcon as s}from"../../constants/icons.js";import{accentSlots as l}from"../../internal/accent.js";import{useMPColor as a,useMPSize as c}from"../../internal/config.js";import{fillMessage as m}from"../../internal/i18n.js";import{useMPLocale as u,useMPMessages as p}from"../../internal/locale.js";import{COMMON as d}from"../../internal/messages/common.js";import{TOUR as f}from"../../internal/messages/tour.js";import{CONTROL_ICON as h,META_TEXT as g,PROSE_TEXT as x,SHEET_GAP as v,SHEET_PAD as j,SHEET_TITLE as b,hasContent as w}from"../../internal/scale.js";import{MPStateLayer as N}from"../../internal/StateLayer.js";import{FADE as y,PORTAL_LAYER as S}from"../../internal/surface.js";import{VISUALLY_HIDDEN as k}from"../../internal/visually-hidden.js";const _={xs:"max-w-56",sm:"max-w-64",md:"max-w-80",lg:"max-w-96",xl:"max-w-md"},B={xs:"xs",sm:"xs",md:"sm",lg:"sm",xl:"md"};function z({spot:t,className:n}){return e("div",null===t?{"aria-hidden":"true",className:["mp-tour__scrim bg-mp-scrim/32 pointer-events-none fixed inset-0 z-40",n??""].filter(Boolean).join(" ")}:{"aria-hidden":"true",className:["mp-tour__scrim rounded-mp-xs pointer-events-none fixed z-40","shadow-[0_0_0_9999px_color-mix(in_oklab,var(--_mp-color-scrim)_32%,transparent)]","transition-[top,left,width,height] duration-(--mp-sys-motion-duration-medium1)","ease-mp-standard motion-reduce:transition-none",n??""].filter(Boolean).join(" "),style:{top:t.top,left:t.left,width:t.width,height:t.height}})}export function MPTour({steps:C,open:M,defaultOpen:P=!1,onOpenChange:$,step:O,defaultStep:R=0,onStepChange:q,onFinish:E,scrim:F=!0,skippable:I=!0,dismissible:T=!0,scrollIntoView:A=!0,locale:D,labels:H,size:L,color:V,className:W,style:G,classNames:J}){const K=c(L),Q=a(V),U=u(D),X=p(f,U,H),Y=p(d,U),[Z,ee]=n.useState(P),[te,ne]=n.useState(R),oe=M??Z,ie=Math.min(O??te,Math.max(0,C.length-1)),re=C[ie],[se,le]=n.useState(null),[ae,ce]=n.useState(""),me=n.useRef(ie);n.useEffect(()=>{if(!oe)return me.current=ie,void ce("");if(me.current===ie)return;me.current=ie;const e=m(X.position,{index:String(ie+1),total:String(C.length)}),t=C[ie]?.title;ce("string"==typeof t&&""!==t?`${e}. ${t}`:e)},[oe,ie,C,X.position]);const ue=e=>{void 0===M&&ee(e),$?.(e)},pe=e=>{void 0===O&&ne(e),q?.(e)},de=re?.target,fe=re?.padding??6;if(n.useEffect(()=>{if(!oe||!de)return;const e=document.querySelector(de);if(!(e instanceof HTMLElement))return;A&&e.scrollIntoView({block:"center",inline:"nearest",behavior:"smooth"});let t=0,n="";const o=()=>{const i=e.getBoundingClientRect(),r=`${i.top} ${i.left} ${i.width} ${i.height}`;r!==n&&(n=r,le({selector:de,spot:{top:i.top-fe,left:i.left-fe,width:i.width+2*fe,height:i.height+2*fe}})),t=requestAnimationFrame(o)};return o(),()=>cancelAnimationFrame(t)},[oe,de,fe,A]),0===C.length)return null;const he=oe&&de&&se?.selector===de?se.spot:null,ge=0===ie,xe=ie===C.length-1,ve=B[K],je=w(re?.title)||w(re?.content);return t(o.Root,{open:oe,onOpenChange:(e,t)=>{e?ue(!0):"outside-press"===t.reason||"focus-out"===t.reason||"escape-key"===t.reason&&!T?t.cancel():ue(!1)},children:[oe&&F?e(z,{spot:he,className:J?.scrim}):null,e(o.Portal,{children:e(o.Positioner,{className:S,side:re?.side??"bottom",align:re?.align??"center",sideOffset:de?10:0,collisionPadding:12,anchor:()=>de?document.querySelector(de):{getBoundingClientRect:()=>new DOMRect(window.innerWidth/2,window.innerHeight/2,0,0)},children:t(o.Popup,{"data-mp-size":K,className:["mp-tour rounded-mp-md relative box-border flex flex-col outline-none","bg-mp-surface-container text-mp-on-surface shadow-mp-3",j[K],v[K],x[K],_[K],y,W??""].filter(Boolean).join(" "),style:{...l(Q),...G},children:[je?t("div",{className:"flex items-start gap-3",children:[t("div",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[w(re?.title)?e(o.Title,{className:["text-mp-on-surface m-0 font-medium",b[K],J?.title??""].filter(Boolean).join(" "),children:re?.title}):null,w(re?.content)?e(o.Description,{className:["text-mp-on-surface-variant m-0 min-w-0",J?.content??""].filter(Boolean).join(" "),children:re?.content}):null]}),T?t("button",{type:"button","aria-label":Y.close,onClick:()=>ue(!1),className:["group/close rounded-mp-full text-mp-on-surface-variant relative -me-1 -mt-1","flex size-8 shrink-0 cursor-pointer items-center justify-center","appearance-none border-0 bg-transparent font-[inherit]","outline-mp-secondary focus-visible:outline-2 focus-visible:outline-offset-1","focus-visible:outline-solid outline-none",J?.close??""].filter(Boolean).join(" "),children:[e(N,{className:"group-hover/close:opacity-8 group-focus-visible/close:opacity-10"}),e(r,{icon:s,size:h[K]})]}):null]}):null,e("span",{className:k,"aria-live":"polite",children:ae}),t("div",{className:["flex items-center gap-2",J?.footer??""].filter(Boolean).join(" "),children:[e("span",{className:`text-mp-on-surface-variant shrink-0 tabular-nums ${g}`,children:m(X.position,{index:String(ie+1),total:String(C.length)})}),t("div",{className:"ms-auto flex items-center gap-1",children:[I&&!xe?e(i,{size:ve,variant:"text",color:"secondary",onClick:()=>ue(!1),children:X.skip}):null,ge?null:e(i,{size:ve,variant:"outlined",color:Q,onClick:()=>pe(ie-1),children:X.previous}),e(i,{size:ve,color:Q,onClick:()=>xe?(E?.(),void ue(!1)):pe(ie+1),children:xe?X.done:X.next})]})]})]})})})]})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{MPTour}from"./MPTour.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{jsx as e,jsxs as a}from"react/jsx-runtime";import*as t from"react";import{MPBox as l}from"../box/MPBox.js";import{MPCheckbox as
|
|
2
|
+
import{jsx as e,jsxs as a}from"react/jsx-runtime";import*as t from"react";import{MPBox as l}from"../box/MPBox.js";import{MPCheckbox as r}from"../checkbox/MPCheckbox.js";import{MPIcon as s}from"../icon/MPIcon.js";import{MPIconButton as i}from"../icon-button/MPIconButton.js";import{MPTextField as n}from"../text-field/MPTextField.js";import{ArrowRightIcon as o}from"../../constants/icons.js";import{useMPLocale as c,useMPMessages as m}from"../../internal/locale.js";import{cssLength as d}from"../../internal/length.js";import{TRANSFER as u}from"../../internal/messages/transfer.js";import{fillMessage as h}from"../../internal/i18n.js";import{VISUALLY_HIDDEN as f}from"../../internal/visually-hidden.js";import{useMPColor as p,useMPSize as v}from"../../internal/config.js";import{hasContent as g,META_TEXT as b,SHEET_PAD_X as x}from"../../internal/scale.js";const w={xs:"py-1",sm:"py-1.5",md:"py-2",lg:"py-2.5",xl:"py-3"},k={xs:"py-0.5",sm:"py-1",md:"py-1",lg:"py-1.5",xl:"py-2"},S=new Set;function j({title:s,rows:i,total:o,ticked:c,arrived:m,onTick:d,onTickAll:u,search:h,onSearch:f,searchable:p,disabled:v,height:g,messages:S,variant:j,size:y,color:N}){const T=i.filter(e=>!e.disabled),z=T.filter(e=>c.has(e.value)),C=T.length>0&&z.length===T.length,$=z.length>0&&!C,_=x[y],M=t.useId();return a(l,{variant:j,size:y,padded:!1,className:"mp-transfer__panel flex min-w-0 flex-col overflow-hidden",children:[a("div",{className:["mp-transfer__heading border-mp-outline-variant flex items-center gap-2 border-b",_,w[y]].join(" "),children:[e("div",{className:"min-w-0 flex-1",children:e(r,{size:y,color:N,checked:C,indeterminate:$,disabled:v||0===T.length,label:e("span",{id:M,className:"block truncate font-medium",children:s}),onCheckedChange:e=>u(e)})}),a("span",{className:`text-mp-on-surface-variant shrink-0 tabular-nums ${b}`,children:[z.length,"/",o]})]}),p?e("div",{className:`${_} ${w[y]}`,children:e(n,{size:y,fullWidth:!0,disabled:v,placeholder:S.search,"aria-label":S.search,value:h,onChange:f})}):null,e("div",{role:"group","aria-labelledby":M,className:`mp-transfer__list flex flex-col overflow-y-auto overscroll-contain ${_} ${w[y]}`,style:{height:g},children:0===i.length?e("span",{className:`text-mp-on-surface-variant ${b} ${k[y]}`,children:S.empty}):i.map((a,t)=>e("div",{className:[k[y],m.has(a.value)?"mp-row-arrive":""].filter(Boolean).join(" "),children:e(r,{size:y,color:N,label:a.label,checked:c.has(a.value),disabled:v||a.disabled,onCheckedChange:e=>d(a.value,e)})},`${t}:${a.value}`))})]})}function y(e,a){if(""===a)return e;const t=a.toLowerCase();return e.filter(e=>"string"!=typeof e.label||e.label.toLowerCase().includes(t))}export const MPTransfer=/*@__PURE__*/t.forwardRef(function({items:l,value:r,defaultValue:n,onValueChange:b,sourceLabel:x,targetLabel:w,searchable:k=!1,height:N=220,disabled:T=!1,variant:z="outlined",size:C,color:$,locale:_,labels:M,className:P,...B},L){const A=v(C),I=p($),V=c(_),E=m(u,V,M),[F,R]=t.useState(n??[]),W=r??F,[q,D]=t.useState(()=>new Set),[G,H]=t.useState(()=>({values:new Set,toTarget:!0})),[J,K]=t.useState(""),[O,Q]=t.useState(""),[U,X]=t.useState(null),Y=t.useMemo(()=>new Set(W),[W]),Z=l.filter(e=>!Y.has(e.value)),ee=l.filter(e=>Y.has(e.value));t.useEffect(()=>{const e=new Set(l.map(e=>e.value));D(a=>{const t=[...a].filter(a=>e.has(a));return t.length===a.size?a:new Set(t)})},[l]);const ae=(e,a)=>{D(t=>{const l=new Set(t);return a?l.add(e):l.delete(e),l})},te=(e,a)=>{D(t=>{const l=new Set(t);for(const t of e)t.disabled||(a?l.add(t.value):l.delete(t.value));return l})},le=(e,a)=>{const t=e.filter(e=>!e.disabled&&q.has(e.value));if(0===t.length)return;const s=new Set(t.map(e=>e.value)),i=a?l.filter(e=>Y.has(e.value)||s.has(e.value)).map(e=>e.value):W.filter(e=>!s.has(e));D(e=>new Set([...e].filter(e=>!s.has(e)))),H({values:s,toTarget:a}),X(e=>{return{tick:(e?.tick??0)+1,text:h(E.moved,{count:String(t.length),list:(l=a?w:x,r=a?E.target:E.source,"string"==typeof l&&""!==l?l:r)})};var l,r}),(e=>{void 0===r&&R(e),b?.(e)})(i)},re=y(Z,J),se=y(ee,O),ie=re.some(e=>!e.disabled&&q.has(e.value)),ne=se.some(e=>!e.disabled&&q.has(e.value)),oe=d(N),ce={ticked:q,disabled:T,height:oe,messages:E,variant:z,size:A,color:I,searchable:k};return a("div",{ref:L,"data-mp-size":A,className:["mp-transfer grid w-full items-center gap-3","[grid-template-columns:minmax(0,1fr)]","mp-medium:[grid-template-columns:minmax(0,1fr)_auto_minmax(0,1fr)]",P??""].filter(Boolean).join(" "),...B,children:[e(j,{...ce,title:g(x)?x:E.source,rows:re,total:Z.length,arrived:G.toTarget?S:G.values,onTick:ae,onTickAll:e=>te(re,e),search:J,onSearch:K}),a("div",{className:"flex flex-row justify-center gap-2 mp-medium:flex-col",children:[e(i,{size:A,color:I,variant:"text"===z?"text":"outlined",label:E.toTarget,disabled:T||!ie,onClick:()=>le(re,!0),icon:e(s,{icon:o,className:"rotate-90 mp-medium:rotate-0"})}),e(i,{size:A,color:I,variant:"text"===z?"text":"outlined",label:E.toSource,disabled:T||!ne,onClick:()=>le(se,!1),icon:e(s,{icon:o,className:"-rotate-90 mp-medium:rotate-180"})})]}),e("span",{className:f,"aria-live":"polite","aria-atomic":"true",children:U?e("span",{children:U.text},U.tick):null}),e(j,{...ce,title:g(w)?w:E.target,rows:se,total:ee.length,arrived:G.toTarget?G.values:S,onTick:ae,onTickAll:e=>te(se,e),search:O,onSearch:Q})]})});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type MPTreeViewValue } from '../tree-view/MPTreeView.js';
|
|
3
|
+
import { type MPPickerShellProps } from '../../internal/Picker.js';
|
|
4
|
+
import type { MPPickerLabels } from '../../internal/Calendar.js';
|
|
5
|
+
import type { MPSlots } from '../../types.js';
|
|
6
|
+
/** One node of the tree the reader is choosing from. */
|
|
7
|
+
export interface MPTreeSelectItem {
|
|
8
|
+
/** What is stored when this node is chosen. Unique across the whole tree. */
|
|
9
|
+
value: MPTreeViewValue;
|
|
10
|
+
label: React.ReactNode;
|
|
11
|
+
/** What a search matches against. Falls back to `label` when it is a string. */
|
|
12
|
+
searchLabel?: string;
|
|
13
|
+
startIcon?: React.ReactNode;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Whether this node may itself be chosen.
|
|
17
|
+
*
|
|
18
|
+
* `false` makes it a heading with children under it — a "Europe" that groups
|
|
19
|
+
* countries without being one. Defaults to `true` for a leaf and follows
|
|
20
|
+
* `selectableBranches` for a node that has children.
|
|
21
|
+
*/
|
|
22
|
+
selectable?: boolean;
|
|
23
|
+
children?: MPTreeSelectItem[];
|
|
24
|
+
}
|
|
25
|
+
/** The parts an `MPTreeSelect` draws that a `className` cannot reach. */
|
|
26
|
+
export type MPTreeSelectSlot = 'popup' | 'tree' | 'item' | 'empty';
|
|
27
|
+
export interface MPTreeSelectProps extends MPPickerShellProps {
|
|
28
|
+
/** The tree, as nested items. */
|
|
29
|
+
items?: MPTreeSelectItem[];
|
|
30
|
+
/** The chosen value, or values when `multiple`. */
|
|
31
|
+
value?: MPTreeViewValue | MPTreeViewValue[] | null;
|
|
32
|
+
defaultValue?: MPTreeViewValue | MPTreeViewValue[] | null;
|
|
33
|
+
onValueChange?: (value: MPTreeViewValue[]) => void;
|
|
34
|
+
/** Whether more than one node may be held. @default false */
|
|
35
|
+
multiple?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Whether a node that has children may itself be chosen.
|
|
38
|
+
*
|
|
39
|
+
* Off by default, which is the shape most of these trees have: the branches
|
|
40
|
+
* are the taxonomy and the leaves are the answers, and a "Europe" that can be
|
|
41
|
+
* chosen alongside "France" is usually a data model nobody meant. An item's
|
|
42
|
+
* own `selectable` overrides it either way.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
selectableBranches?: boolean;
|
|
46
|
+
/** Which branches start open. */
|
|
47
|
+
defaultExpanded?: MPTreeViewValue[];
|
|
48
|
+
expanded?: MPTreeViewValue[];
|
|
49
|
+
onExpandedChange?: (expanded: MPTreeViewValue[]) => void;
|
|
50
|
+
/** Whether the popup is open. Use with `onOpenChange` to control it. */
|
|
51
|
+
open?: boolean;
|
|
52
|
+
defaultOpen?: boolean;
|
|
53
|
+
onOpenChange?: (open: boolean) => void;
|
|
54
|
+
/** Shown in the trigger while nothing is chosen. */
|
|
55
|
+
placeholder?: React.ReactNode;
|
|
56
|
+
/** Offers the × that empties the control. @default false */
|
|
57
|
+
clearable?: boolean;
|
|
58
|
+
/** Closes the popup as soon as a node is chosen. @default !multiple */
|
|
59
|
+
closeOnSelect?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Offers a field above the tree that filters it.
|
|
62
|
+
*
|
|
63
|
+
* A match keeps its ancestors, because a node with its parents cut away is a
|
|
64
|
+
* node the reader cannot place — "Seoul" under nothing at all.
|
|
65
|
+
* @default false
|
|
66
|
+
*/
|
|
67
|
+
searchable?: boolean;
|
|
68
|
+
searchPlaceholder?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Which language this draws its own strings in — the search field's
|
|
71
|
+
* placeholder, the line an empty tree shows, the × that empties the control.
|
|
72
|
+
*/
|
|
73
|
+
locale?: string;
|
|
74
|
+
/** How the trigger writes what is held. Defaults to the labels, comma-joined. */
|
|
75
|
+
format?: (chosen: MPTreeSelectItem[]) => React.ReactNode;
|
|
76
|
+
labels?: Partial<MPPickerLabels>;
|
|
77
|
+
/** Identifies the field when a form is submitted. One input per value. */
|
|
78
|
+
name?: string;
|
|
79
|
+
classNames?: MPSlots<MPTreeSelectSlot>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A value chosen from a tree rather than from a list.
|
|
83
|
+
*
|
|
84
|
+
* ```tsx
|
|
85
|
+
* <MPTreeSelect label="Category" items={categories} searchable />
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
88
|
+
* The gap between `MPSelect` and `MPTreeView`: the first is a flat list behind
|
|
89
|
+
* a field, the second is a hierarchy that shows what it holds but has no field.
|
|
90
|
+
* A category, a folder, an org-chart node and a region are all chosen from a
|
|
91
|
+
* shape a flat list flattens away.
|
|
92
|
+
*
|
|
93
|
+
* ## Branches are not answers by default
|
|
94
|
+
*
|
|
95
|
+
* `selectableBranches` is off, because that is the shape most of these trees
|
|
96
|
+
* have: the branches are the taxonomy and the leaves are the answers, and a
|
|
97
|
+
* "Europe" that can be chosen alongside "France" is usually a data model
|
|
98
|
+
* nobody meant. An item's own `selectable` overrides it either way, which is how
|
|
99
|
+
* a tree with one selectable branch says so.
|
|
100
|
+
*
|
|
101
|
+
* A branch that cannot be chosen still opens and shuts, and still looks like
|
|
102
|
+
* every other row — it is not the answer, which is not the same as being
|
|
103
|
+
* unavailable. Its press is answered here rather than by the tree, so that a
|
|
104
|
+
* press on "Europe" leaves the "France" underneath it alone.
|
|
105
|
+
*
|
|
106
|
+
* ## A search keeps the ancestors
|
|
107
|
+
*
|
|
108
|
+
* Filtered to bare matches, a tree is a list — and a list of leaves is exactly
|
|
109
|
+
* what a tree was chosen over. So a match brings its parents with it, and every
|
|
110
|
+
* branch the filter kept is opened: a match folded inside a shut parent is a
|
|
111
|
+
* match the reader was not shown.
|
|
112
|
+
*/
|
|
113
|
+
export declare const MPTreeSelect: React.ForwardRefExoticComponent<MPTreeSelectProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{jsx as e,jsxs as l}from"react/jsx-runtime";import*as a from"react";import{MPTreeItem as n,MPTreeView as r}from"../tree-view/MPTreeView.js";import{MPPickerShell as t}from"../../internal/Picker.js";import{useMPLocale as o,useMPMessages as i}from"../../internal/locale.js";import{COMBOBOX as s}from"../../internal/messages/combobox.js";import{TRANSFER as c}from"../../internal/messages/transfer.js";import{PICKER as d}from"../../internal/messages/picker.js";import{META_TEXT as p}from"../../internal/scale.js";import{useMPColor as m,useMPSize as u}from"../../internal/config.js";function h(e,l=new Map){for(const a of e)l.set(a.value,a),a.children&&h(a.children,l);return l}const f=e=>e.trim().toLocaleLowerCase();function v(e){return f(e.searchLabel??("string"==typeof e.label?e.label:String(e.value)))}function g(e,l){if(""===l)return e;const a=[];for(const n of e){const e=n.children?g(n.children,l):void 0,r=v(n).includes(l);(r||e&&e.length>0)&&a.push({...n,children:r?n.children:e})}return a}function b(e,l=[]){for(const a of e)a.children&&a.children.length>0&&(l.push(a.value),b(a.children,l));return l}export const MPTreeSelect=/*@__PURE__*/a.forwardRef(function({items:v=[],value:x,defaultValue:j,onValueChange:y,multiple:C=!1,selectableBranches:S=!1,defaultExpanded:w,expanded:N,onExpandedChange:M,open:O,defaultOpen:_,onOpenChange:k,placeholder:P,clearable:V=!1,closeOnSelect:z,searchable:B=!1,searchPlaceholder:E,locale:L,format:T,labels:A,name:I,size:R,color:D,readOnly:q=!1,disabled:F=!1,classNames:G,...H},J){const K=u(R),Q=m(D),U=o(L),W=i(s,U),X=i(d,U,A),Y=i(c,U),Z=e=>null==e?[]:Array.isArray(e)?e:[e],[$,ee]=a.useState(()=>Z(j)),le=void 0!==x?Z(x):$,[ae,ne]=a.useState(_??!1),re=O??ae,[te,oe]=a.useState(""),ie=a.useMemo(()=>h(v),[v]),se=f(te),ce=a.useMemo(()=>g(v,se),[v,se]),de=a.useMemo(()=>""===se?void 0:b(ce),[se,ce]),[pe,me]=a.useState(()=>w??[]),ue=de??N??pe,he=e=>{de||(void 0===N&&me(e),M?.(e))},fe=e=>{e&&(q||F)||(void 0===O&&ne(e),e||oe(""),k?.(e))},ve=e=>{void 0===x&&ee(e),y?.(e)},ge=e=>e.selectable??(!(e.children&&e.children.length>0)||S),be=e=>l=>{l.preventDefault(),e.children&&e.children.length>0&&he(ue.includes(e.value)?ue.filter(l=>l!==e.value):[...ue,e.value])},xe=le.map(e=>ie.get(e)).filter(e=>void 0!==e),je=0===xe.length?P??"":T?T(xe):xe.map(e=>e.label).reduce((e,l,a)=>0===a?[l]:[...e,", ",l],[]),ye=l=>l.map(l=>e(n,{value:l.value,label:l.label,startIcon:l.startIcon,disabled:l.disabled,onClick:ge(l)?void 0:be(l),className:G?.item,children:l.children?ye(l.children):null},l.value));return e(t,{...H,slug:"tree-select",size:K,color:Q,readOnly:q,disabled:F,triggerRef:J,display:je,empty:0===xe.length,clearable:V,onClear:()=>ve([]),open:re,onOpenChange:fe,labels:X,hiddenValues:I?le.map(e=>({name:I,value:String(e)})):void 0,children:l("div",{className:["mp-tree-select__popup flex max-h-80 w-64 flex-col gap-2",G?.popup??""].filter(Boolean).join(" "),children:[B?e("input",{type:"text",value:te,placeholder:E??Y.search,"aria-label":E??Y.search,onChange:e=>oe(e.currentTarget.value),className:["mp-tree-select__search text-mp-on-surface w-full shrink-0 bg-transparent","placeholder:text-mp-on-surface-variant px-1 py-1 [font:inherit] outline-none"].join(" ")}):null,e("div",{className:"min-h-0 flex-1 overflow-auto",children:0===ce.length?e("p",{className:["mp-tree-select__empty text-mp-on-surface-variant m-0 px-1 py-2",p,G?.empty??""].filter(Boolean).join(" "),children:W.empty}):e(r,{size:K,variant:"text",multiple:C,selected:le,onSelectedChange:e=>{const l=e.filter(e=>ie.has(e));ve(C?l:l.slice(-1)),(z??!C)&&fe(!1)},expanded:ue,onExpandedChange:he,className:G?.tree,children:ye(ce)})})]})})});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{MPTreeSelect}from"./MPTreeSelect.js";
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { MPDensity, MPElevation, MPSize, MPVariant } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* How the hierarchy is drawn between the rows.
|
|
5
|
+
*
|
|
6
|
+
* - `none` — indentation only. The quietest, and usually right for a navigation
|
|
7
|
+
* sidebar, where the tree is two levels deep and the labels say what the
|
|
8
|
+
* structure is.
|
|
9
|
+
* - `simple` — one hairline rail per level, running the full height of the
|
|
10
|
+
* group. Enough to follow a column of rows back to the branch it belongs to.
|
|
11
|
+
* - `folder` — the rail plus an elbow into every row, with the rail under a
|
|
12
|
+
* last child stopping at that row. The file-manager drawing, and the one to
|
|
13
|
+
* reach for when the tree is deep.
|
|
14
|
+
*/
|
|
15
|
+
export type MPTreeViewLines = 'none' | 'simple' | 'folder';
|
|
16
|
+
/** A row's identity, and what `expanded` and `selected` are lists of. */
|
|
17
|
+
export type MPTreeViewValue = string | number;
|
|
18
|
+
export interface MPTreeViewProps extends Omit<React.ComponentPropsWithoutRef<'ul'>, 'defaultValue' | 'onSelect'> {
|
|
19
|
+
/**
|
|
20
|
+
* How much surface the sheet paints.
|
|
21
|
+
*
|
|
22
|
+
* A container's ladder, so the sheet is never dyed — a tree holds other
|
|
23
|
+
* people's labels, and those arrive with colours of their own. `text` is the
|
|
24
|
+
* one to reach for in a sidebar: the sidebar is already a surface, and a
|
|
25
|
+
* second bordered rectangle inside it is a second rectangle.
|
|
26
|
+
* @default 'outlined'
|
|
27
|
+
*/
|
|
28
|
+
variant?: MPVariant;
|
|
29
|
+
/** How far off the page the sheet is lifted, on MD3's five levels. */
|
|
30
|
+
elevation?: MPElevation;
|
|
31
|
+
/** The row height and the type the labels are set in. @default 'md' */
|
|
32
|
+
size?: MPSize;
|
|
33
|
+
/** Takes room out of that row height, four pixels a step. @default 0 */
|
|
34
|
+
density?: MPDensity;
|
|
35
|
+
/**
|
|
36
|
+
* How the hierarchy is drawn between the rows.
|
|
37
|
+
* @default 'simple'
|
|
38
|
+
*/
|
|
39
|
+
lines?: MPTreeViewLines;
|
|
40
|
+
/** Which branches are open. Use with `onExpandedChange` for a controlled tree. */
|
|
41
|
+
expanded?: MPTreeViewValue[];
|
|
42
|
+
/** Which start open, for an uncontrolled one. */
|
|
43
|
+
defaultExpanded?: MPTreeViewValue[];
|
|
44
|
+
onExpandedChange?: (expanded: MPTreeViewValue[]) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Which rows are chosen. An array even when only one row may be chosen at a
|
|
47
|
+
* time — the same shape `MPAccordion`'s value takes, so turning `multiple` on
|
|
48
|
+
* does not also change the type of the value.
|
|
49
|
+
*/
|
|
50
|
+
selected?: MPTreeViewValue[];
|
|
51
|
+
/** Which start chosen, for an uncontrolled one. */
|
|
52
|
+
defaultSelected?: MPTreeViewValue[];
|
|
53
|
+
onSelectedChange?: (selected: MPTreeViewValue[]) => void;
|
|
54
|
+
/**
|
|
55
|
+
* Whether more than one row may be chosen at a time.
|
|
56
|
+
* @default false
|
|
57
|
+
*/
|
|
58
|
+
multiple?: boolean;
|
|
59
|
+
/** Every row stops answering. */
|
|
60
|
+
disabled?: boolean;
|
|
61
|
+
/** The name the tree is announced by. */
|
|
62
|
+
label?: string;
|
|
63
|
+
/** The top-level `MPTreeItem`s. */
|
|
64
|
+
children?: React.ReactNode;
|
|
65
|
+
}
|
|
66
|
+
export interface MPTreeItemProps extends Omit<React.ComponentPropsWithoutRef<'li'>, 'onClick'> {
|
|
67
|
+
/**
|
|
68
|
+
* Identifies the row to `expanded` and `selected`. One is generated when it is
|
|
69
|
+
* left out, which is fine for a tree nobody drives from code.
|
|
70
|
+
*/
|
|
71
|
+
value?: MPTreeViewValue;
|
|
72
|
+
/**
|
|
73
|
+
* The row's text. Its own prop rather than `children`, because in a tree the
|
|
74
|
+
* children are the rows underneath it.
|
|
75
|
+
*/
|
|
76
|
+
label?: React.ReactNode;
|
|
77
|
+
/** Content before the label — a folder glyph, a file type, a status dot. */
|
|
78
|
+
startIcon?: React.ReactNode;
|
|
79
|
+
/** Content after the label, inside the pressable area — a count, a badge. */
|
|
80
|
+
endIcon?: React.ReactNode;
|
|
81
|
+
/**
|
|
82
|
+
* A control pinned to the end of the row, deliberately outside the pressable
|
|
83
|
+
* area — the same shape `MPListItem` uses. A row that both opens and holds a
|
|
84
|
+
* menu button has two things to press.
|
|
85
|
+
*/
|
|
86
|
+
action?: React.ReactNode;
|
|
87
|
+
/** Renders the row as a link, for a tree that is navigation. */
|
|
88
|
+
href?: string;
|
|
89
|
+
/** Fires when the row is pressed, before it opens or is chosen. */
|
|
90
|
+
onClick?: React.MouseEventHandler<HTMLElement>;
|
|
91
|
+
/**
|
|
92
|
+
* Forces the disclosure arrow onto a row with no children yet — the branch
|
|
93
|
+
* that is fetched the first time it is opened.
|
|
94
|
+
*/
|
|
95
|
+
expandable?: boolean;
|
|
96
|
+
/** Unavailable. Its branch, if it is open, keeps working. */
|
|
97
|
+
disabled?: boolean;
|
|
98
|
+
/** The rows underneath this one. */
|
|
99
|
+
children?: React.ReactNode;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A tree of rows that open and shut.
|
|
103
|
+
*
|
|
104
|
+
* ```tsx
|
|
105
|
+
* <MPTreeView label="Files" defaultExpanded={['src']}>
|
|
106
|
+
* <MPTreeItem value="src" label="src">
|
|
107
|
+
* <MPTreeItem value="index" label="index.ts" />
|
|
108
|
+
* </MPTreeItem>
|
|
109
|
+
* </MPTreeView>
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* There is no Base UI primitive under this — the library has no tree — and the
|
|
113
|
+
* three things a tree owes are most of the component: the
|
|
114
|
+
* `tree`/`treeitem`/`group` roles, one tab stop for the whole widget, and the
|
|
115
|
+
* arrow keys that walk it.
|
|
116
|
+
*
|
|
117
|
+
* ## The keyboard is handled once, at the top
|
|
118
|
+
*
|
|
119
|
+
* A tree's arrow keys are questions about the **tree** — what is the next
|
|
120
|
+
* visible row, where is my parent — and the only element that can answer them
|
|
121
|
+
* is the one holding all of them. The rows a query returns are in document
|
|
122
|
+
* order, which is reading order, because a shut branch is unmounted rather than
|
|
123
|
+
* hidden.
|
|
124
|
+
*
|
|
125
|
+
* | | |
|
|
126
|
+
* | --- | --- |
|
|
127
|
+
* | Up, Down | The previous and next visible row |
|
|
128
|
+
* | Home, End | The first and last |
|
|
129
|
+
* | Right | Opens a shut branch; steps into an open one |
|
|
130
|
+
* | Left | Shuts an open branch; steps out of a leaf |
|
|
131
|
+
* | Enter, Space | Presses the row, which chooses it and opens it |
|
|
132
|
+
*
|
|
133
|
+
* Right and Left swap under RTL, read off the element rather than off a prop: a
|
|
134
|
+
* caller may have set `dir` three ancestors up, and ArrowRight has to mean
|
|
135
|
+
* "further in" either way.
|
|
136
|
+
*
|
|
137
|
+
* ## Why the arrow is not a button
|
|
138
|
+
*
|
|
139
|
+
* The `<li>` is the `treeitem` and it is what takes focus, which is the ARIA
|
|
140
|
+
* pattern. A button inside it would be a second tab stop in a widget that is
|
|
141
|
+
* supposed to have exactly one — and the keyboard already opens a branch with
|
|
142
|
+
* ArrowRight. So the disclosure arrow is a plain span with a click handler: a
|
|
143
|
+
* pointer target, and nothing a keyboard has to walk past.
|
|
144
|
+
*/
|
|
145
|
+
export declare const MPTreeView: React.ForwardRefExoticComponent<MPTreeViewProps & React.RefAttributes<HTMLUListElement>>;
|
|
146
|
+
/**
|
|
147
|
+
* One row, and everything under it.
|
|
148
|
+
*
|
|
149
|
+
* The `<li>` is the `treeitem` and it is what takes focus, which is the ARIA
|
|
150
|
+
* pattern — see the note on `MPTreeView` for why that makes the disclosure
|
|
151
|
+
* arrow a span rather than a button.
|
|
152
|
+
*/
|
|
153
|
+
export declare const MPTreeItem: React.ForwardRefExoticComponent<MPTreeItemProps & React.RefAttributes<HTMLLIElement>>;
|