material-plus-ui 1.5.0 → 1.7.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/README.md +2 -2
- package/dist/components/accordion/MPAccordion.d.ts +21 -1
- package/dist/components/accordion/MPAccordion.js +1 -1
- package/dist/components/alert/MPAlert.d.ts +33 -2
- 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 +2 -1
- 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 +156 -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.js +2 -1
- package/dist/components/avatar/MPAvatar.d.ts +10 -1
- package/dist/components/avatar/MPAvatar.js +1 -1
- package/dist/components/badge/MPBadge.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 +10 -1
- package/dist/components/blockquote/MPBlockquote.js +1 -1
- package/dist/components/bottom-navigation/MPBottomNavigation.d.ts +19 -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.d.ts +49 -3
- package/dist/components/button/MPButton.js +1 -1
- package/dist/components/calendar/MPCalendar.d.ts +160 -0
- package/dist/components/calendar/MPCalendar.js +2 -0
- package/dist/components/calendar/index.d.ts +2 -0
- package/dist/components/calendar/index.js +1 -0
- package/dist/components/card/MPCard.js +1 -1
- package/dist/components/carousel/MPCarousel.js +1 -1
- package/dist/components/chat-bubble/MPChatBubble.js +1 -1
- package/dist/components/checkbox/MPCheckbox.js +1 -1
- package/dist/components/chip/MPChip.d.ts +31 -7
- 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 +71 -5
- 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 +166 -0
- package/dist/components/config/MPConfigProvider.js +2 -0
- package/dist/components/config/index.d.ts +2 -0
- package/dist/components/config/index.js +1 -0
- package/dist/components/confirm/MPConfirmProvider.d.ts +143 -0
- package/dist/components/confirm/MPConfirmProvider.js +2 -0
- package/dist/components/confirm/index.d.ts +2 -0
- package/dist/components/confirm/index.js +1 -0
- 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 +295 -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.d.ts +53 -2
- package/dist/components/date-picker/MPDatePicker.js +1 -1
- package/dist/components/date-picker/index.d.ts +1 -1
- package/dist/components/date-range-picker/MPDateRangePicker.js +1 -1
- package/dist/components/date-time-picker/MPDateTimePicker.js +1 -1
- package/dist/components/dialog/MPDialog.d.ts +24 -3
- package/dist/components/dialog/MPDialog.js +1 -1
- package/dist/components/divider/MPDivider.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 +23 -1
- 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 +100 -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/image/MPImage.d.ts +121 -0
- package/dist/components/image/MPImage.js +2 -0
- package/dist/components/image/index.d.ts +2 -0
- package/dist/components/image/index.js +1 -0
- 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 +51 -1
- package/dist/components/list/MPList.js +1 -1
- package/dist/components/menu/MPMenu.d.ts +21 -2
- 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.d.ts +3 -3
- package/dist/components/number-field/MPNumberField.js +1 -1
- package/dist/components/otp-field/MPOtpField.js +1 -1
- package/dist/components/overlay/MPOverlay.d.ts +1 -1
- package/dist/components/overlay/MPOverlay.js +1 -1
- package/dist/components/pagination/MPPagination.js +1 -1
- package/dist/components/panes/MPPanes.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 +92 -0
- package/dist/components/popconfirm/MPPopconfirm.js +2 -0
- package/dist/components/popconfirm/index.d.ts +2 -0
- package/dist/components/popconfirm/index.js +1 -0
- package/dist/components/popover/MPPopover.d.ts +1 -1
- 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/progress-box/MPProgressBox.js +1 -1
- package/dist/components/progress-circular/MPProgressCircular.js +1 -1
- package/dist/components/progress-linear/MPProgressLinear.js +1 -1
- 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 +28 -5
- package/dist/components/select/MPSelect.js +1 -1
- package/dist/components/shortcut/MPShortcut.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/skeleton/MPSkeleton.js +1 -1
- package/dist/components/slider/MPSlider.d.ts +27 -0
- package/dist/components/slider/MPSlider.js +1 -1
- package/dist/components/snackbar/MPSnackbar.d.ts +20 -1
- package/dist/components/snackbar/MPSnackbar.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.d.ts +153 -0
- package/dist/components/stepper/MPStepper.js +2 -0
- package/dist/components/stepper/index.d.ts +2 -0
- package/dist/components/stepper/index.js +1 -0
- package/dist/components/switch/MPSwitch.js +1 -1
- package/dist/components/table/MPTable.d.ts +24 -2
- 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/text-field/MPTextField.d.ts +38 -14
- package/dist/components/text-field/MPTextField.js +1 -1
- package/dist/components/time-picker/MPTimePicker.js +1 -1
- package/dist/components/timeline/MPTimeline.d.ts +10 -2
- 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/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 +17 -1
- package/dist/components/typography/MPTypography.js +1 -1
- package/dist/components/visually-hidden/MPVisuallyHidden.d.ts +60 -0
- package/dist/components/visually-hidden/MPVisuallyHidden.js +2 -0
- package/dist/components/visually-hidden/index.d.ts +2 -0
- package/dist/components/visually-hidden/index.js +1 -0
- package/dist/constants/glyphs.d.ts +4 -0
- package/dist/constants/glyphs.js +1 -1
- package/dist/constants/icons.d.ts +2 -0
- package/dist/constants/icons.js +1 -1
- package/dist/hooks/index.d.ts +40 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useMPColorScheme.d.ts +135 -0
- package/dist/hooks/useMPColorScheme.js +2 -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.d.ts +32 -0
- package/dist/hooks/useMPReducedMotion.js +2 -0
- package/dist/hooks/useMPShortcut.d.ts +105 -0
- package/dist/hooks/useMPShortcut.js +2 -0
- package/dist/hooks/useMPWindowClass.d.ts +55 -0
- package/dist/hooks/useMPWindowClass.js +2 -0
- package/dist/index.d.ts +43 -1
- package/dist/index.js +1 -1
- package/dist/internal/Calendar.d.ts +19 -4
- package/dist/internal/Calendar.js +1 -1
- package/dist/internal/ChartChrome.d.ts +205 -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.d.ts +15 -3
- package/dist/internal/Picker.js +1 -1
- 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 +471 -0
- package/dist/internal/chart.js +1 -0
- package/dist/internal/color-scheme.d.ts +28 -0
- package/dist/internal/color-scheme.js +2 -0
- package/dist/internal/config.d.ts +62 -0
- package/dist/internal/config.js +2 -0
- package/dist/internal/data-table.d.ts +162 -0
- package/dist/internal/data-table.js +1 -0
- package/dist/internal/date.d.ts +50 -3
- 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 +196 -1
- package/dist/internal/initials.d.ts +28 -0
- package/dist/internal/initials.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/confirm.d.ts +3 -0
- package/dist/internal/messages/confirm.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/picker.js +1 -1
- 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/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/progress.d.ts +14 -0
- 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 +86 -0
- package/dist/internal/step.js +1 -0
- 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 +48 -0
- package/dist/internal/window-class.js +2 -0
- 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 +2 -0
- 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 +2 -0
- package/dist/styles/confirm.css +2 -0
- 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/image.css +2 -0
- 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/panes.css +1 -1
- package/dist/styles/pie-chart.css +2 -0
- package/dist/styles/pill.css +1 -1
- package/dist/styles/popconfirm.css +2 -0
- 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/shortcut.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 +2 -0
- 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/visually-hidden.css +2 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind.css +1423 -114
- package/dist/types.d.ts +628 -3
- package/package.json +8 -2
- 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,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { useRender } from '@base-ui/react/use-render';
|
|
3
|
-
import type { MPColor } from '../../types.js';
|
|
3
|
+
import type { MPColor, MPTransition } from '../../types.js';
|
|
4
4
|
/**
|
|
5
5
|
* What a piece of text *is*, which decides both its type scale and the element
|
|
6
6
|
* it renders as.
|
|
@@ -40,6 +40,13 @@ export interface MPTypographyProps extends Omit<React.ComponentPropsWithoutRef<'
|
|
|
40
40
|
* has **no default**: prose inherits the surface's own ink unless a role is
|
|
41
41
|
* asked for, because the common case for a paragraph is to look like the
|
|
42
42
|
* paragraphs around it.
|
|
43
|
+
*
|
|
44
|
+
* No default means no declaration, not a quiet one. Nothing here writes a
|
|
45
|
+
* `color` until this prop is passed, so a `text-white` on the dark section
|
|
46
|
+
* above wins by simply being the only thing that spoke — and a role outside
|
|
47
|
+
* the four accents is a `className` away: `className="text-mp-on-surface-variant"`
|
|
48
|
+
* on a `caption` is the muted line this component used to hand out whether or
|
|
49
|
+
* not it was wanted.
|
|
43
50
|
*/
|
|
44
51
|
color?: MPColor;
|
|
45
52
|
/**
|
|
@@ -70,6 +77,15 @@ export interface MPTypographyProps extends Omit<React.ComponentPropsWithoutRef<'
|
|
|
70
77
|
*/
|
|
71
78
|
render?: useRender.RenderProp;
|
|
72
79
|
children?: React.ReactNode;
|
|
80
|
+
/**
|
|
81
|
+
* An entrance, run once as it mounts.
|
|
82
|
+
*
|
|
83
|
+
* `transition="fade"` is the whole of what most callers want; the object form
|
|
84
|
+
* takes a duration, an edge to come from, or a scale to start at. Anything
|
|
85
|
+
* that has to run again — on scroll, on hover, under your own control — is an
|
|
86
|
+
* [MPAnimateFade](../motion/animate-fade) and its siblings.
|
|
87
|
+
*/
|
|
88
|
+
transition?: MPTransition;
|
|
73
89
|
}
|
|
74
90
|
/**
|
|
75
91
|
* Text at one of Material's type roles.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import*as p from"react";import{useRender as t}from"@base-ui/react/use-render";import{accentSlots as e}from"../../internal/accent.js";const
|
|
2
|
+
import*as p from"react";import{useRender as t}from"@base-ui/react/use-render";import{accentSlots as e}from"../../internal/accent.js";import{transitionProps as r}from"../../internal/transition.js";const a={h1:"[&.mp-typography]:text-mp-display-small",h2:"[&.mp-typography]:text-mp-headline-large",h3:"[&.mp-typography]:text-mp-headline-medium",h4:"[&.mp-typography]:text-mp-headline-small",h5:"[&.mp-typography]:text-mp-title-large",h6:"[&.mp-typography]:text-mp-title-medium",lead:"[&.mp-typography]:text-mp-title-large",body:"[&.mp-typography]:text-mp-body-large",caption:"[&.mp-typography]:text-mp-body-small",overline:"[&.mp-typography]:text-mp-label-small [&.mp-typography]:tracking-[0.08em] uppercase"},m={h1:"regular",h2:"regular",h3:"regular",h4:"regular",h5:"regular",h6:"medium",lead:"regular",body:"regular",caption:"regular",overline:"medium"},o={h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",lead:"p",body:"p",caption:"span",overline:"span"},y={h1:"[&.mp-typography]:mb-4",h2:"[&.mp-typography]:mb-3.5",h3:"[&.mp-typography]:mb-3",h4:"[&.mp-typography]:mb-2.5",h5:"[&.mp-typography]:mb-2",h6:"[&.mp-typography]:mb-2",lead:"[&.mp-typography]:mb-4",body:"[&.mp-typography]:mb-3",caption:"[&.mp-typography]:mb-2",overline:"[&.mp-typography]:mb-2"},l="[&.mp-typography]:mt-0 [&.mp-typography]:ms-0 [&.mp-typography]:me-0",h={regular:"[&.mp-typography]:font-normal",medium:"[&.mp-typography]:font-medium",semibold:"[&.mp-typography]:font-semibold",bold:"[&.mp-typography]:font-bold"},n={start:"text-start",center:"text-center",end:"text-end",justify:"text-justify"},i={1:"truncate",2:"line-clamp-2",3:"line-clamp-3",4:"line-clamp-4",5:"line-clamp-5",6:"line-clamp-6"};export const MPTypography=/*@__PURE__*/p.forwardRef(function({level:g="body",color:s,weight:c,align:d,lines:b,gutter:u=!1,render:x,transition:f,className:j,style:v,children:N,...$},w){const k=r(f),B=["mp-typography",a[g],h[c??m[g]],l,u?y[g]:"[&.mp-typography]:mb-0",d?n[d]:"",b?i[b]??"line-clamp-6":"",s?"[&.mp-typography]:text-(--_mp-accent)":"",j??""].filter(Boolean).join(" ");return t({render:x??p.createElement(o[g]),ref:w,props:{className:`${B}${k.className?` ${k.className}`:""}`,style:s?{...e(s),...k.style,...v}:{...k.style,...v},children:N,...$}})});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
3
|
+
export interface MPVisuallyHiddenProps extends React.ComponentPropsWithoutRef<'span'> {
|
|
4
|
+
/** Renders something other than a `<span>`. Base UI's own escape hatch. */
|
|
5
|
+
render?: useRender.RenderProp;
|
|
6
|
+
children?: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Text for a screen reader and nobody else.
|
|
10
|
+
*
|
|
11
|
+
* The sentence behind a bare number on a badge, the "opens in a new tab" after a
|
|
12
|
+
* link's label, the name an avatar's initials stand in for, the direction a
|
|
13
|
+
* sorted column is sorted in. In every one of those the visible mark is a
|
|
14
|
+
* shorthand a reader who can see it expands instantly and a reader who cannot
|
|
15
|
+
* gets nothing at all from.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <button>
|
|
19
|
+
* <MPIcon icon={ICONS.close} />
|
|
20
|
+
* <MPVisuallyHidden>Close this dialog</MPVisuallyHidden>
|
|
21
|
+
* </button>
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Nine components in this library were already drawing themselves with it —
|
|
25
|
+
* `MPPagination`'s live region, `MPRating`'s radios, `MPShortcut`'s key names,
|
|
26
|
+
* `MPCarousel`'s slide announcement — and an application putting a bare glyph in
|
|
27
|
+
* a button of its own had no way to reach the same treatment. It had the rule,
|
|
28
|
+
* not the name.
|
|
29
|
+
*
|
|
30
|
+
* ## Not `hidden`, not `display: none`, not `opacity: 0`
|
|
31
|
+
*
|
|
32
|
+
* The first two take the text off the accessibility tree along with the screen,
|
|
33
|
+
* which is the opposite of what is wanted, and the third leaves a clickable ghost
|
|
34
|
+
* the size of the words. A 1px clipped box is the one form that is invisible to
|
|
35
|
+
* a sighted reader and present to every other kind.
|
|
36
|
+
*
|
|
37
|
+
* ## Why not `sr-only`
|
|
38
|
+
*
|
|
39
|
+
* Which is Tailwind's own utility for this, and it is what the rule below is
|
|
40
|
+
* written out from. It is written out because `sr-only` is *generated*: a
|
|
41
|
+
* project running its own Tailwind build with a `prefix` configured generates it
|
|
42
|
+
* under a different name, and a component that hardcoded `sr-only` would come
|
|
43
|
+
* out visible on their page. The arbitrary properties survive any prefix.
|
|
44
|
+
*
|
|
45
|
+
* ## It stays in the layout
|
|
46
|
+
*
|
|
47
|
+
* `position: absolute`, so it takes no room — but it is still *in* the document,
|
|
48
|
+
* which is the whole point: it is read in the order it is written. Put it where
|
|
49
|
+
* the sentence belongs rather than at the end of the block.
|
|
50
|
+
*
|
|
51
|
+
* ## Sharp edges
|
|
52
|
+
*
|
|
53
|
+
* - **A focusable thing inside this stays focusable**, and a reader tabbing into
|
|
54
|
+
* it lands somewhere they cannot see. Anything that can take focus wants
|
|
55
|
+
* `aria-label` on the control instead.
|
|
56
|
+
* - **It is not a live region.** Text swapped inside it is not announced unless
|
|
57
|
+
* the element also carries `aria-live` — which is exactly what the components
|
|
58
|
+
* above pass through.
|
|
59
|
+
*/
|
|
60
|
+
export declare const MPVisuallyHidden: React.ForwardRefExoticComponent<MPVisuallyHiddenProps & React.RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{jsx as r}from"react/jsx-runtime";import*as e from"react";import{useRender as n}from"@base-ui/react/use-render";import{VISUALLY_HIDDEN as a}from"../../internal/visually-hidden.js";export const MPVisuallyHidden=/*@__PURE__*/e.forwardRef(function({render:e,className:i,children:o,...s},t){return n({render:e??r("span",{}),ref:t,props:{...s,className:[a,i].filter(Boolean).join(" "),children:o}})});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{MPVisuallyHidden}from"./MPVisuallyHidden.js";
|
|
@@ -34,6 +34,10 @@ export declare const LinkIcon: import("react").ForwardRefExoticComponent<Omit<im
|
|
|
34
34
|
export declare const ExternalLinkIcon: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
35
35
|
/** Copy to clipboard. */
|
|
36
36
|
export declare const CopyIcon: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
37
|
+
/** Source as it was written — `MPCodeBlock`'s toggle out of the colouring. */
|
|
38
|
+
export declare const CodeIcon: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
39
|
+
/** A picture that could not be fetched — `MPImage`'s own fallback. */
|
|
40
|
+
export declare const BrokenImageIcon: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
37
41
|
/** Severity: something worth knowing. */
|
|
38
42
|
export declare const InfoIcon: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
39
43
|
/** Severity: it worked. */
|
package/dist/constants/glyphs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{ArrowDown as o,ArrowRight as n,ArrowUp as t,CalendarDays as c,Check as r,ChevronDown as e,ChevronLeft as s,ChevronRight as p,ChevronsLeft as
|
|
2
|
+
import{ArrowDown as o,ArrowRight as n,ArrowUp as t,CalendarDays as c,Check as r,ChevronDown as e,ChevronLeft as s,ChevronRight as p,ChevronsLeft as I,ChevronsRight as x,ChevronUp as i,CircleAlert as C,CircleCheck as h,Clock as a,Code as l,Copy as v,Ellipsis as d,ExternalLink as f,Eye as g,ImageOff as k,EyeOff as w,Info as m,Link as A,LoaderCircle as L,Menu as R,Minus as S,Plus as u,Search as y,Star as U,TriangleAlert as b,Upload as D,X as E}from"lucide-react";export const VisibilityIcon=g;export const VisibilityOffIcon=w;export const CloseIcon=E;export const CheckIcon=r;export const ChevronDownIcon=e;export const ChevronUpIcon=i;export const ChevronLeftIcon=s;export const ChevronRightIcon=p;export const ChevronsLeftIcon=I;export const ChevronsRightIcon=x;export const SearchIcon=y;export const ArrowUpIcon=t;export const ArrowDownIcon=o;export const ArrowRightIcon=n;export const MoreIcon=d;export const LinkIcon=A;export const ExternalLinkIcon=f;export const CopyIcon=v;export const CodeIcon=l;export const BrokenImageIcon=k;export const InfoIcon=m;export const SuccessIcon=h;export const WarningIcon=b;export const ErrorIcon=C;export const AddIcon=u;export const RemoveIcon=S;export const UploadIcon=D;export const CalendarIcon=c;export const ClockIcon=a;export const StarIcon=U;export const SpinnerIcon=L;export const MenuIcon=R;
|
|
@@ -60,6 +60,8 @@ export declare const ICONS: {
|
|
|
60
60
|
readonly link: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
61
61
|
readonly 'external-link': import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
62
62
|
readonly copy: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
63
|
+
readonly code: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
64
|
+
readonly 'broken-image': import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
63
65
|
readonly info: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
64
66
|
readonly success: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
65
67
|
readonly warning: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
package/dist/constants/icons.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./glyphs.js";import{VisibilityIcon as r,VisibilityOffIcon as o,CloseIcon as e,CheckIcon as n,ChevronDownIcon as c,ChevronUpIcon as i,ChevronLeftIcon as s,ChevronRightIcon as h,ChevronsLeftIcon as l,ChevronsRightIcon as t,SearchIcon as a,ArrowUpIcon as p,ArrowDownIcon as v,ArrowRightIcon as
|
|
1
|
+
export*from"./glyphs.js";import{VisibilityIcon as r,VisibilityOffIcon as o,CloseIcon as e,CheckIcon as n,ChevronDownIcon as c,ChevronUpIcon as i,ChevronLeftIcon as s,ChevronRightIcon as h,ChevronsLeftIcon as l,ChevronsRightIcon as t,SearchIcon as a,ArrowUpIcon as p,ArrowDownIcon as v,ArrowRightIcon as d,MoreIcon as f,MenuIcon as g,LinkIcon as m,ExternalLinkIcon as w,CopyIcon as k,CodeIcon as u,BrokenImageIcon as y,InfoIcon as b,SuccessIcon as x,WarningIcon as j,ErrorIcon as C,AddIcon as I,RemoveIcon as N,UploadIcon as O,CalendarIcon as S,ClockIcon as q,StarIcon as z,SpinnerIcon as A}from"./glyphs.js";export const ICONS={visibility:r,"visibility-off":o,close:e,check:n,"chevron-down":c,"chevron-up":i,"chevron-left":s,"chevron-right":h,"chevrons-left":l,"chevrons-right":t,search:a,"arrow-up":p,"arrow-down":v,"arrow-right":d,more:f,menu:g,link:m,"external-link":w,copy:k,code:u,"broken-image":y,info:b,success:x,warning:j,error:C,add:I,remove:N,upload:O,calendar:S,clock:q,star:z,spinner:A};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The machinery this library was already running, with a name a consumer can
|
|
3
|
+
* import.
|
|
4
|
+
*
|
|
5
|
+
* Two kinds live here, and both are the same argument.
|
|
6
|
+
*
|
|
7
|
+
* The first existed in `internal/` before it existed here, and was exported
|
|
8
|
+
* because an application that has told the library something — or that has to
|
|
9
|
+
* answer a question the library has already answered for itself — should not
|
|
10
|
+
* have to answer it a second time, in numbers or in detection code that can
|
|
11
|
+
* drift away from what the components are using.
|
|
12
|
+
*
|
|
13
|
+
* The second is the general form of something the library does several times
|
|
14
|
+
* over and could not export as it stood. `useMPWindowClass` watches four media
|
|
15
|
+
* queries; `useMPMediaQuery` is one. `MPTabs` measures its own bar;
|
|
16
|
+
* `useMPElementSize` is that measurement. `trigger="visible"` watches an
|
|
17
|
+
* element cross the viewport; `useMPOnScreen` is the watching without the
|
|
18
|
+
* animation. And `useMPDisclosure` is the six lines every page writes to open a
|
|
19
|
+
* dialog, with the two details a version written in a hurry leaves out.
|
|
20
|
+
*
|
|
21
|
+
* `useMPLocale` and `useMPSnackbar` are not here. They belong to a provider and
|
|
22
|
+
* live with it, the way a hook that reads a context should.
|
|
23
|
+
*
|
|
24
|
+
* `useMPColorScheme` is the one that is more than a rename: the stylesheet
|
|
25
|
+
* had the switch and nothing to drive it with, so every application wrote the
|
|
26
|
+
* same state, the same storage round trip and the same `<head>` script.
|
|
27
|
+
*/
|
|
28
|
+
export { useMPColorScheme, mpColorSchemeScript } from './useMPColorScheme.js';
|
|
29
|
+
export type { MPColorScheme, MPResolvedColorScheme, MPColorSchemeOptions, MPColorSchemeResult } from './useMPColorScheme.js';
|
|
30
|
+
export { useMPWindowClass } from './useMPWindowClass.js';
|
|
31
|
+
export { useMPReducedMotion } from './useMPReducedMotion.js';
|
|
32
|
+
export { useMPShortcut, useMPPlatform } from './useMPShortcut.js';
|
|
33
|
+
export { useMPMediaQuery } from './useMPMediaQuery.js';
|
|
34
|
+
export { useMPElementSize } from './useMPElementSize.js';
|
|
35
|
+
export type { MPElementSize } from './useMPElementSize.js';
|
|
36
|
+
export { useMPOnScreen } from './useMPOnScreen.js';
|
|
37
|
+
export type { MPOnScreenOptions } from './useMPOnScreen.js';
|
|
38
|
+
export { useMPDisclosure } from './useMPDisclosure.js';
|
|
39
|
+
export type { MPDisclosure } from './useMPDisclosure.js';
|
|
40
|
+
export type { MPShortcutOptions, MPResolvedOS } from './useMPShortcut.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{useMPColorScheme,mpColorSchemeScript}from"./useMPColorScheme.js";export{useMPWindowClass}from"./useMPWindowClass.js";export{useMPReducedMotion}from"./useMPReducedMotion.js";export{useMPShortcut,useMPPlatform}from"./useMPShortcut.js";export{useMPMediaQuery}from"./useMPMediaQuery.js";export{useMPElementSize}from"./useMPElementSize.js";export{useMPOnScreen}from"./useMPOnScreen.js";export{useMPDisclosure}from"./useMPDisclosure.js";
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { type MPColorScheme, type MPResolvedColorScheme } from '../internal/color-scheme.js';
|
|
2
|
+
export type { MPColorScheme, MPResolvedColorScheme };
|
|
3
|
+
export interface MPColorSchemeOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Where the choice is remembered, in `localStorage`.
|
|
6
|
+
*
|
|
7
|
+
* Change it to keep two applications on one origin from sharing a theme, or
|
|
8
|
+
* to namespace it under a product. It has to match the key given to
|
|
9
|
+
* `mpColorSchemeScript`, or the page paints one scheme and then corrects
|
|
10
|
+
* itself to the other.
|
|
11
|
+
* @default 'mp-color-scheme'
|
|
12
|
+
*/
|
|
13
|
+
storageKey?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MPColorSchemeResult {
|
|
16
|
+
/**
|
|
17
|
+
* What has been **chosen** — including `'system'`, which is the absence of a
|
|
18
|
+
* choice rather than a third scheme. This is what a settings control should be
|
|
19
|
+
* bound to: a three-way radio group is honest about the state, and a two-way
|
|
20
|
+
* toggle bound to this cannot show "follow the system" at all.
|
|
21
|
+
*/
|
|
22
|
+
scheme: MPColorScheme;
|
|
23
|
+
/**
|
|
24
|
+
* What is actually **painted**, with `'system'` resolved against the operating
|
|
25
|
+
* system. This is what a page reads to draw a sun or a moon, or to pick an
|
|
26
|
+
* image.
|
|
27
|
+
*/
|
|
28
|
+
resolved: MPResolvedColorScheme;
|
|
29
|
+
/** Whether the choice is `'system'`, spelled out because it reads better. */
|
|
30
|
+
isSystem: boolean;
|
|
31
|
+
/** Chooses a scheme. `'system'` gives the choice back to the operating system. */
|
|
32
|
+
setScheme: (scheme: MPColorScheme) => void;
|
|
33
|
+
/**
|
|
34
|
+
* The other one of the two.
|
|
35
|
+
*
|
|
36
|
+
* From `'system'` it goes to the opposite of whatever is currently painted,
|
|
37
|
+
* which is what a reader pressing a single button means by it — never back to
|
|
38
|
+
* the scheme they are already looking at.
|
|
39
|
+
*/
|
|
40
|
+
toggle: () => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The page's colour scheme: what it is, and how to change it.
|
|
44
|
+
*
|
|
45
|
+
* The stylesheet has always had the switch — `prefers-color-scheme`, and
|
|
46
|
+
* `data-mp-scheme` for a page that drives it itself. What it did not have was
|
|
47
|
+
* anything to drive it *with*, so every application wrote the same three things:
|
|
48
|
+
* a piece of state, a `localStorage` round trip, and a script in the `<head>` to
|
|
49
|
+
* stop the first paint flashing.
|
|
50
|
+
*
|
|
51
|
+
* ```tsx
|
|
52
|
+
* const { resolved, toggle } = useMPColorScheme();
|
|
53
|
+
*
|
|
54
|
+
* <MPIconButton
|
|
55
|
+
* icon={<MPIcon icon={resolved === 'dark' ? SunIcon : MoonIcon} />}
|
|
56
|
+
* label="Switch theme"
|
|
57
|
+
* onClick={toggle}
|
|
58
|
+
* />;
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* ## Three states, not two
|
|
62
|
+
*
|
|
63
|
+
* `'system'` is the absence of a choice rather than a third scheme, and keeping
|
|
64
|
+
* it is the point. A reader who has never touched the toggle should follow their
|
|
65
|
+
* operating system *as it changes* — including at sunset, which is when a
|
|
66
|
+
* two-state hook stops tracking and a page goes light in a dark room.
|
|
67
|
+
*
|
|
68
|
+
* `scheme` is what was chosen and `resolved` is what is painted. Bind a settings
|
|
69
|
+
* control to the first and draw with the second.
|
|
70
|
+
*
|
|
71
|
+
* ## One page, one answer
|
|
72
|
+
*
|
|
73
|
+
* The choice lives in a module-level store rather than in each caller's state,
|
|
74
|
+
* so a header's toggle and a settings screen's radio group are looking at the
|
|
75
|
+
* same thing. Two components holding `useState` would each show what they last
|
|
76
|
+
* set and neither would hear about the other.
|
|
77
|
+
*
|
|
78
|
+
* ## What it writes
|
|
79
|
+
*
|
|
80
|
+
* `data-mp-scheme` on `<html>`, and `'system'` **removes** it rather than
|
|
81
|
+
* writing the word — that is how the media query gets its say back.
|
|
82
|
+
*
|
|
83
|
+
* It deliberately does not touch `.dark`. That class is what a project's own
|
|
84
|
+
* Tailwind keys on, and a library reaching in to toggle a class it did not put
|
|
85
|
+
* there is a library editing somebody else's markup. A page that wants both is
|
|
86
|
+
* one line of its own in an effect.
|
|
87
|
+
*
|
|
88
|
+
* ## Storage can fail, and that is fine
|
|
89
|
+
*
|
|
90
|
+
* Reading and writing `localStorage` throws in a private window in some browsers
|
|
91
|
+
* and behind some cookie policies. Both are caught: the toggle still works for
|
|
92
|
+
* the visit and the choice is simply not remembered, which is much better than a
|
|
93
|
+
* theme button that crashes the render.
|
|
94
|
+
*
|
|
95
|
+
* ## The first paint
|
|
96
|
+
*
|
|
97
|
+
* A hook cannot run before the page paints, so a remembered `dark` arrives one
|
|
98
|
+
* frame late and the reader sees white. That is what `mpColorSchemeScript` is
|
|
99
|
+
* for — see it for the two lines that go in the `<head>`.
|
|
100
|
+
*/
|
|
101
|
+
export declare function useMPColorScheme(options?: MPColorSchemeOptions): MPColorSchemeResult;
|
|
102
|
+
/**
|
|
103
|
+
* The two lines that stop the first paint flashing, as a string to inline.
|
|
104
|
+
*
|
|
105
|
+
* A hook runs after the browser has already painted, so a reader who chose dark
|
|
106
|
+
* gets a white page for a frame and then the right one. The only thing that can
|
|
107
|
+
* run earlier is a **synchronous script in the `<head>`**, before the body is
|
|
108
|
+
* parsed, and this is that script.
|
|
109
|
+
*
|
|
110
|
+
* ```tsx
|
|
111
|
+
* // app/layout.tsx
|
|
112
|
+
* <head>
|
|
113
|
+
* <script dangerouslySetInnerHTML={{ __html: mpColorSchemeScript() }} />
|
|
114
|
+
* </head>
|
|
115
|
+
* ```
|
|
116
|
+
*
|
|
117
|
+
* It reads the same key the hook does, writes the same attribute, and does
|
|
118
|
+
* nothing at all when the stored value is absent or `system` — leaving the media
|
|
119
|
+
* query to answer, which it does before the first paint anyway.
|
|
120
|
+
*
|
|
121
|
+
* Pass the same `storageKey` you pass the hook. Two different keys is a page
|
|
122
|
+
* that paints one scheme and then corrects itself to the other, which is the
|
|
123
|
+
* flash this exists to remove.
|
|
124
|
+
*
|
|
125
|
+
* The output is a JavaScript source string and contains no interpolated markup:
|
|
126
|
+
* the key is JSON-encoded, so a key with a quote in it cannot end the script
|
|
127
|
+
* early.
|
|
128
|
+
*
|
|
129
|
+
* ## It has to be inline
|
|
130
|
+
*
|
|
131
|
+
* A `<script src>` is fetched, and a fetch is exactly the delay being avoided.
|
|
132
|
+
* If the page has a Content Security Policy without `unsafe-inline`, give the
|
|
133
|
+
* tag a nonce — this returns the source, not the tag, so the tag is yours.
|
|
134
|
+
*/
|
|
135
|
+
export declare function mpColorSchemeScript(options?: MPColorSchemeOptions): string;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import*as e from"react";import{DEFAULT_STORAGE_KEY as t,SCHEME_ATTRIBUTE as r,setScheme as s,useChosenScheme as o,useSystemScheme as c}from"../internal/color-scheme.js";export function useMPColorScheme(r={}){const{storageKey:m=t}=r,a=o(m),i=c(),l="system"===a?i:a,n=e.useCallback(e=>s(m,e),[m]),u=e.useCallback(()=>s(m,"dark"===l?"light":"dark"),[m,l]);return e.useMemo(()=>({scheme:a,resolved:l,isSystem:"system"===a,setScheme:n,toggle:u}),[a,l,n,u])}export function mpColorSchemeScript(e={}){const{storageKey:s=t}=e;return`try{var s=localStorage.getItem(${JSON.stringify(s)});if(s==="dark"||s==="light")document.documentElement.setAttribute(${JSON.stringify(r)},s)}catch(e){}`}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Whether something is open, and the three ways to change that. */
|
|
2
|
+
export interface MPDisclosure {
|
|
3
|
+
open: boolean;
|
|
4
|
+
/** Opens it. Already open, nothing happens and nothing re-renders. */
|
|
5
|
+
onOpen: () => void;
|
|
6
|
+
/** Closes it. */
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
/** The other one, whichever that is. */
|
|
9
|
+
onToggle: () => void;
|
|
10
|
+
/**
|
|
11
|
+
* Sets it outright, which is what a controlled prop wants: pass this straight
|
|
12
|
+
* to an `onOpenChange`.
|
|
13
|
+
*/
|
|
14
|
+
setOpen: (open: boolean) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Open, and the three ways to change it.
|
|
18
|
+
*
|
|
19
|
+
* The most-written six lines in any application using this library. A dialog, a
|
|
20
|
+
* drawer, a popover, a menu and a command palette are all controlled the same
|
|
21
|
+
* way — `open` and `onOpenChange` — and every page that mounts one writes the
|
|
22
|
+
* same `useState` and the same three callbacks, usually as inline arrows that
|
|
23
|
+
* are a new function on every render.
|
|
24
|
+
*
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const dialog = useMPDisclosure();
|
|
27
|
+
*
|
|
28
|
+
* <MPButton onClick={dialog.onOpen}>Delete</MPButton>
|
|
29
|
+
* <MPDialog open={dialog.open} onOpenChange={dialog.setOpen} title="Delete?">
|
|
30
|
+
* <MPButton onClick={dialog.onClose}>Cancel</MPButton>
|
|
31
|
+
* </MPDialog>;
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* ## Why the library ships one at all
|
|
35
|
+
*
|
|
36
|
+
* Because the alternative is not "no hook", it is a hook per application, and
|
|
37
|
+
* the two things this gets right are the two that get left out of one written in
|
|
38
|
+
* a hurry.
|
|
39
|
+
*
|
|
40
|
+
* Every callback is stable for the life of the component. An inline
|
|
41
|
+
* `onClick={() => setOpen(true)}` is a new function on every render, which
|
|
42
|
+
* re-renders a memoised trigger for no reason and defeats the `React.memo` a
|
|
43
|
+
* page put there on purpose.
|
|
44
|
+
*
|
|
45
|
+
* And `onOpen` on something already open is not a state change. React bails out
|
|
46
|
+
* of a `useState` set to the value it already holds, so the three callbacks here
|
|
47
|
+
* cost nothing when they are asked for what is already true — which matters
|
|
48
|
+
* because a close handler is often wired to three things at once: a button, an
|
|
49
|
+
* `onOpenChange`, and an Escape the component also handles.
|
|
50
|
+
*
|
|
51
|
+
* ## It is not a controlled/uncontrolled helper
|
|
52
|
+
*
|
|
53
|
+
* It holds state, so it makes a thing controlled. A component that should
|
|
54
|
+
* manage its own open state takes `defaultOpen` and needs none of this.
|
|
55
|
+
*
|
|
56
|
+
* @param defaultOpen what it starts as. @default false
|
|
57
|
+
*/
|
|
58
|
+
export declare function useMPDisclosure(defaultOpen?: boolean): MPDisclosure;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import*as e from"react";export function useMPDisclosure(o=!1){const[s,n]=e.useState(o),a=e.useCallback(()=>n(!0),[]),l=e.useCallback(()=>n(!1),[]),t=e.useCallback(()=>n(e=>!e),[]);return e.useMemo(()=>({open:s,onOpen:a,onClose:l,onToggle:t,setOpen:n}),[s,a,l,t])}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/** What an element measures, in CSS pixels. */
|
|
3
|
+
export interface MPElementSize {
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* How big an element is, kept up to date as it changes.
|
|
9
|
+
*
|
|
10
|
+
* The library measures elements in five places — a tab bar deciding whether it
|
|
11
|
+
* overflows, a field sizing its outline's notch, panes tracking a drag — and an
|
|
12
|
+
* application that wants the same answer had to write the `ResizeObserver`
|
|
13
|
+
* out again, including the two parts of it that are easy to get wrong.
|
|
14
|
+
*
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const ref = React.useRef<HTMLDivElement>(null);
|
|
17
|
+
* const { width } = useMPElementSize(ref);
|
|
18
|
+
*
|
|
19
|
+
* <div ref={ref}>{width > 480 ? <Chart /> : <Figure />}</div>;
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* This is the answer for **a component's own width**, which is what a container
|
|
23
|
+
* query asks and a media query cannot: a card in a sidebar and the same card in
|
|
24
|
+
* a main column are the same window and two different widths.
|
|
25
|
+
* [useMPMediaQuery](#usempmediaquery) is the other question.
|
|
26
|
+
*
|
|
27
|
+
* ## Zero until it has measured
|
|
28
|
+
*
|
|
29
|
+
* The first render has no element yet — a ref is filled in during the commit —
|
|
30
|
+
* so the first answer is `{ width: 0, height: 0 }` and the real one arrives on
|
|
31
|
+
* the render after it. Branch on a threshold rather than on the number itself,
|
|
32
|
+
* or a chart will mount, be told it is zero wide, and mount again.
|
|
33
|
+
*
|
|
34
|
+
* ## The two parts that are easy to get wrong
|
|
35
|
+
*
|
|
36
|
+
* It reads `getBoundingClientRect`, not the observer entry's `contentRect`.
|
|
37
|
+
* Those differ by the padding and the border — `contentRect` is the content box
|
|
38
|
+
* — and a caller comparing a measurement against a breakpoint means the box the
|
|
39
|
+
* element actually occupies.
|
|
40
|
+
*
|
|
41
|
+
* And it re-renders only when a number changes. A `ResizeObserver` fires for a
|
|
42
|
+
* subpixel reflow that rounds to the same integer, and a hook that set state on
|
|
43
|
+
* every callback would re-render a chart on every scroll of a page with a
|
|
44
|
+
* sticky header.
|
|
45
|
+
*
|
|
46
|
+
* ## Where there is no observer
|
|
47
|
+
*
|
|
48
|
+
* A browser without `ResizeObserver` measures once on mount and stays there,
|
|
49
|
+
* which is right more often than it is wrong: an element that never resizes is
|
|
50
|
+
* the common case, and the alternative is a `resize` listener that misses every
|
|
51
|
+
* change the window did not cause.
|
|
52
|
+
*
|
|
53
|
+
* @param ref a ref to the element to measure.
|
|
54
|
+
*/
|
|
55
|
+
export declare function useMPElementSize(ref: React.RefObject<Element | null>): MPElementSize;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import*as e from"react";export function useMPElementSize(t){const[n,i]=e.useState({width:0,height:0});return e.useEffect(()=>{const e=t.current;if(!e)return;const n=()=>{const t=e.getBoundingClientRect(),n={width:Math.round(t.width),height:Math.round(t.height)};i(e=>e.width===n.width&&e.height===n.height?e:n)};if(n(),"undefined"==typeof ResizeObserver)return;const r=new ResizeObserver(n);return r.observe(e),()=>r.disconnect()},[t]),n}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a media query matches, and it re-renders when that changes.
|
|
3
|
+
*
|
|
4
|
+
* The general form of what this library already does four times over for the
|
|
5
|
+
* window size classes, and once each for `prefers-reduced-motion` and the
|
|
6
|
+
* colour scheme. A page has questions of its own — is this a coarse pointer, is
|
|
7
|
+
* the window tall enough for a two-row bar, is the reader in a high-contrast
|
|
8
|
+
* mode — and had to write the subscription out again to ask one.
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const coarse = useMPMediaQuery('(pointer: coarse)');
|
|
12
|
+
*
|
|
13
|
+
* <MPTooltip disabled={coarse}>…</MPTooltip>;
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* ## Reach for `useMPWindowClass` for a width
|
|
17
|
+
*
|
|
18
|
+
* A width query written here is a copy of a number the library also holds, and
|
|
19
|
+
* the two drift the moment an `MPConfigProvider` moves a boundary. Ask
|
|
20
|
+
* [useMPWindowClass](#usempwindowclass) instead — it reads the same ladder the
|
|
21
|
+
* grid and the sidebar do.
|
|
22
|
+
*
|
|
23
|
+
* ## On a server, and before hydration
|
|
24
|
+
*
|
|
25
|
+
* `onServer`, which defaults to `false`. There is no window to ask, and a
|
|
26
|
+
* default of "matches" would mean every server-rendered page claiming every
|
|
27
|
+
* preference at once.
|
|
28
|
+
*
|
|
29
|
+
* `useSyncExternalStore` is what makes the correction on hydration legitimate
|
|
30
|
+
* rather than a mismatch React warns about — but it is a second render, so
|
|
31
|
+
* anything that swaps a whole layout on this does so visibly on a first load.
|
|
32
|
+
* Where that matters the answer is CSS, which has no first render to be wrong.
|
|
33
|
+
*
|
|
34
|
+
* A browser without `matchMedia` gets the same `onServer` answer, for the same
|
|
35
|
+
* reason: there is no way to ask, and a guess is worse than the caller's own.
|
|
36
|
+
*
|
|
37
|
+
* @param query any CSS media query, without the `@media`.
|
|
38
|
+
* @param onServer what to answer where there is nothing to ask. @default false
|
|
39
|
+
*/
|
|
40
|
+
export declare function useMPMediaQuery(query: string, onServer?: boolean): boolean;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import*as e from"react";export function useMPMediaQuery(t,a=!1){const r=e.useMemo(()=>function(e){if("undefined"==typeof window||!window.matchMedia)return null;let t=n.get(e);t||(t=window.matchMedia(e),n.set(e,t));return t}(t),[t]),c=e.useCallback(e=>r?(r.addEventListener("change",e),()=>r.removeEventListener("change",e)):()=>{},[r]),o=e.useCallback(()=>r?r.matches:a,[r,a]),u=e.useCallback(()=>a,[a]);return e.useSyncExternalStore(c,o,u)}const n=new Map;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/** What to watch for. */
|
|
3
|
+
export interface MPOnScreenOptions {
|
|
4
|
+
/**
|
|
5
|
+
* How much of the element has to be showing before it counts, from `0` to `1`.
|
|
6
|
+
*
|
|
7
|
+
* The same default the `MPAnimate*` components take, so a page's own answer
|
|
8
|
+
* and the library's arrive at the same scroll position.
|
|
9
|
+
* @default 0.2
|
|
10
|
+
*/
|
|
11
|
+
threshold?: number;
|
|
12
|
+
/**
|
|
13
|
+
* Whether it stops watching the first time. Off, it reports every entrance and
|
|
14
|
+
* every exit.
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
once?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* A CSS `margin`-shaped string that grows or shrinks the region the element is
|
|
20
|
+
* tested against — `'200px 0px'` reports something 200px before it arrives.
|
|
21
|
+
* For loading a picture, or starting a request, ahead of the reader.
|
|
22
|
+
*/
|
|
23
|
+
rootMargin?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether an element is on screen.
|
|
27
|
+
*
|
|
28
|
+
* The `MPAnimate*` components already ask this — `trigger="visible"` is exactly
|
|
29
|
+
* it — and an application asks it for other reasons: loading an image, starting
|
|
30
|
+
* a request, marking a section read, pausing something expensive that has
|
|
31
|
+
* scrolled away.
|
|
32
|
+
*
|
|
33
|
+
* ```tsx
|
|
34
|
+
* const ref = React.useRef<HTMLDivElement>(null);
|
|
35
|
+
* const seen = useMPOnScreen(ref);
|
|
36
|
+
*
|
|
37
|
+
* <div ref={ref}>{seen ? <Chart data={data} /> : <MPSkeleton height={240} />}</div>;
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* ## `once` is on, and that is the common case
|
|
41
|
+
*
|
|
42
|
+
* Most reasons to ask are one-way: something loads, or is marked read, and does
|
|
43
|
+
* not unload when it scrolls off. Turn it off for the ones that are not — a
|
|
44
|
+
* video that should pause, a poll that should stop.
|
|
45
|
+
*
|
|
46
|
+
* ## Where there is no observer
|
|
47
|
+
*
|
|
48
|
+
* `true`. A browser with no `IntersectionObserver` has no way to be asked, and
|
|
49
|
+
* showing content is the answer that fails safe: the alternative is a page
|
|
50
|
+
* whose every deferred section stays a skeleton forever.
|
|
51
|
+
*
|
|
52
|
+
* The same is true before the ref is filled in, which is why this starts at
|
|
53
|
+
* `false` and not at `true` — on the first render there is no element yet, and
|
|
54
|
+
* an element that has not been observed is not the same as one that cannot be.
|
|
55
|
+
*
|
|
56
|
+
* @param ref a ref to the element to watch.
|
|
57
|
+
*/
|
|
58
|
+
export declare function useMPOnScreen(ref: React.RefObject<Element | null>, { threshold, once, rootMargin }?: MPOnScreenOptions): boolean;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import*as e from"react";export function useMPOnScreen(r,{threshold:n=.2,once:t=!0,rootMargin:o}={}){const[s,c]=e.useState(!1);return e.useEffect(()=>{const e=r.current;if(!e)return;if("undefined"==typeof IntersectionObserver)return void c(!0);const s=new IntersectionObserver(([e])=>{e.isIntersecting?(c(!0),t&&s.disconnect()):t||c(!1)},{threshold:n,rootMargin:o});return s.observe(e),()=>s.disconnect()},[r,n,t,o]),s}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the reader has asked for less motion.
|
|
3
|
+
*
|
|
4
|
+
* `prefers-reduced-motion: reduce`, which every `MPAnimate*` component in this
|
|
5
|
+
* library already consults on its own — a fade becomes an appearance, a
|
|
6
|
+
* typewriter prints its sentence, a marquee stops. This is the same answer,
|
|
7
|
+
* exported so an application's own motion can be held to the preference the
|
|
8
|
+
* library is already holding itself to, rather than each of them asking
|
|
9
|
+
* separately and one of them forgetting.
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* const still = useMPReducedMotion();
|
|
13
|
+
*
|
|
14
|
+
* <video autoPlay={!still} />;
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* ## Why not `usePrefersReducedMotion`
|
|
18
|
+
*
|
|
19
|
+
* Which is what it is called internally, and what the ecosystem calls it. The
|
|
20
|
+
* `MP` prefix is on every name this package exports for the reason the icons
|
|
21
|
+
* carry it: a file importing from four libraries should be able to tell which
|
|
22
|
+
* one a name came from without going back to the import block.
|
|
23
|
+
*
|
|
24
|
+
* ## On a server
|
|
25
|
+
*
|
|
26
|
+
* `false` — motion allowed. A preference is a property of a reader and a server
|
|
27
|
+
* has none, and the alternative would be a first paint that suppressed animation
|
|
28
|
+
* for everybody and then started it a moment later for most of them, which is a
|
|
29
|
+
* flash rather than a preference. `useSyncExternalStore` under this hands over
|
|
30
|
+
* to the browser's real answer on hydration.
|
|
31
|
+
*/
|
|
32
|
+
export declare function useMPReducedMotion(): boolean;
|