plass-ui 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/PlAccordion.d.ts +98 -0
- package/dist/components/accordion/PlAccordion.js +131 -0
- package/dist/components/accordion/index.d.ts +2 -0
- package/dist/components/accordion/index.js +1 -0
- package/dist/components/alert/PlAlert.d.ts +50 -0
- package/dist/components/alert/PlAlert.js +109 -0
- package/dist/components/alert/index.d.ts +2 -0
- package/dist/components/alert/index.js +1 -0
- package/dist/components/animate-appear/PlAnimateAppear.d.ts +55 -0
- package/dist/components/animate-appear/PlAnimateAppear.js +71 -0
- package/dist/components/animate-appear/index.d.ts +2 -0
- package/dist/components/animate-appear/index.js +1 -0
- package/dist/components/animate-blink/PlAnimateBlink.d.ts +30 -0
- package/dist/components/animate-blink/PlAnimateBlink.js +47 -0
- package/dist/components/animate-blink/index.d.ts +2 -0
- package/dist/components/animate-blink/index.js +1 -0
- package/dist/components/animate-fade/PlAnimateFade.d.ts +35 -0
- package/dist/components/animate-fade/PlAnimateFade.js +48 -0
- package/dist/components/animate-fade/index.d.ts +2 -0
- package/dist/components/animate-fade/index.js +1 -0
- package/dist/components/animate-grow/PlAnimateGrow.d.ts +45 -0
- package/dist/components/animate-grow/PlAnimateGrow.js +49 -0
- package/dist/components/animate-grow/index.d.ts +2 -0
- package/dist/components/animate-grow/index.js +1 -0
- package/dist/components/animate-headline/PlAnimateHeadline.d.ts +55 -0
- package/dist/components/animate-headline/PlAnimateHeadline.js +120 -0
- package/dist/components/animate-headline/index.d.ts +2 -0
- package/dist/components/animate-headline/index.js +1 -0
- package/dist/components/animate-lighting/PlAnimateLighting.d.ts +67 -0
- package/dist/components/animate-lighting/PlAnimateLighting.js +65 -0
- package/dist/components/animate-lighting/index.d.ts +2 -0
- package/dist/components/animate-lighting/index.js +1 -0
- package/dist/components/animate-marquee/PlAnimateMarquee.d.ts +65 -0
- package/dist/components/animate-marquee/PlAnimateMarquee.js +94 -0
- package/dist/components/animate-marquee/index.d.ts +2 -0
- package/dist/components/animate-marquee/index.js +1 -0
- package/dist/components/animate-rotate/PlAnimateRotate.d.ts +52 -0
- package/dist/components/animate-rotate/PlAnimateRotate.js +50 -0
- package/dist/components/animate-rotate/index.d.ts +2 -0
- package/dist/components/animate-rotate/index.js +1 -0
- package/dist/components/animate-slide/PlAnimateSlide.d.ts +47 -0
- package/dist/components/animate-slide/PlAnimateSlide.js +49 -0
- package/dist/components/animate-slide/index.d.ts +2 -0
- package/dist/components/animate-slide/index.js +1 -0
- package/dist/components/animate-typing/PlAnimateTyping.d.ts +56 -0
- package/dist/components/animate-typing/PlAnimateTyping.js +177 -0
- package/dist/components/animate-typing/index.d.ts +2 -0
- package/dist/components/animate-typing/index.js +1 -0
- package/dist/components/animate-zoom/PlAnimateZoom.d.ts +37 -0
- package/dist/components/animate-zoom/PlAnimateZoom.js +45 -0
- package/dist/components/animate-zoom/index.d.ts +2 -0
- package/dist/components/animate-zoom/index.js +1 -0
- package/dist/components/aspect-ratio/PlAspectRatio.d.ts +64 -0
- package/dist/components/aspect-ratio/PlAspectRatio.js +58 -0
- package/dist/components/aspect-ratio/index.d.ts +2 -0
- package/dist/components/aspect-ratio/index.js +1 -0
- package/dist/components/avatar/PlAvatar.d.ts +102 -0
- package/dist/components/avatar/PlAvatar.js +121 -0
- package/dist/components/avatar/index.d.ts +2 -0
- package/dist/components/avatar/index.js +1 -0
- package/dist/components/badge/PlBadge.d.ts +86 -0
- package/dist/components/badge/PlBadge.js +168 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +1 -0
- package/dist/components/blockquote/PlBlockquote.d.ts +64 -0
- package/dist/components/blockquote/PlBlockquote.js +112 -0
- package/dist/components/blockquote/index.d.ts +2 -0
- package/dist/components/blockquote/index.js +1 -0
- package/dist/components/bottom-navigation/PlBottomNavigation.d.ts +111 -0
- package/dist/components/bottom-navigation/PlBottomNavigation.js +141 -0
- package/dist/components/bottom-navigation/index.d.ts +2 -0
- package/dist/components/bottom-navigation/index.js +1 -0
- package/dist/components/box/PlBox.d.ts +50 -0
- package/dist/components/box/PlBox.js +46 -0
- package/dist/components/box/index.d.ts +2 -0
- package/dist/components/box/index.js +1 -0
- package/dist/components/breadcrumb/PlBreadcrumb.d.ts +138 -0
- package/dist/components/breadcrumb/PlBreadcrumb.js +201 -0
- package/dist/components/breadcrumb/index.d.ts +2 -0
- package/dist/components/breadcrumb/index.js +1 -0
- package/dist/components/button/{Button.d.ts → PlButton.d.ts} +3 -3
- package/dist/components/button/PlButton.js +196 -0
- package/dist/components/button/index.d.ts +2 -2
- package/dist/components/button/index.js +1 -1
- package/dist/components/button-group/PlButtonGroup.d.ts +32 -0
- package/dist/components/button-group/PlButtonGroup.js +64 -0
- package/dist/components/button-group/index.d.ts +2 -0
- package/dist/components/button-group/index.js +1 -0
- package/dist/components/card/PlCard.d.ts +81 -0
- package/dist/components/card/PlCard.js +102 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.js +1 -0
- package/dist/components/carousel/PlCarousel.d.ts +78 -0
- package/dist/components/carousel/PlCarousel.js +177 -0
- package/dist/components/carousel/index.d.ts +2 -0
- package/dist/components/carousel/index.js +1 -0
- package/dist/components/chat-bubble/PlChatBubble.d.ts +127 -0
- package/dist/components/chat-bubble/PlChatBubble.js +206 -0
- package/dist/components/chat-bubble/index.d.ts +2 -0
- package/dist/components/chat-bubble/index.js +1 -0
- package/dist/components/checkbox/PlCheckbox.d.ts +39 -0
- package/dist/components/checkbox/PlCheckbox.js +100 -0
- package/dist/components/checkbox/index.d.ts +2 -0
- package/dist/components/checkbox/index.js +1 -0
- package/dist/components/chip/PlChip.d.ts +55 -0
- package/dist/components/chip/PlChip.js +144 -0
- package/dist/components/chip/index.d.ts +2 -0
- package/dist/components/chip/index.js +1 -0
- package/dist/components/collapsible/PlCollapsible.d.ts +84 -0
- package/dist/components/collapsible/PlCollapsible.js +65 -0
- package/dist/components/collapsible/index.d.ts +2 -0
- package/dist/components/collapsible/index.js +1 -0
- package/dist/components/combobox/PlCombobox.d.ts +140 -0
- package/dist/components/combobox/PlCombobox.js +199 -0
- package/dist/components/combobox/index.d.ts +2 -0
- package/dist/components/combobox/index.js +1 -0
- package/dist/components/container/PlContainer.d.ts +66 -0
- package/dist/components/container/PlContainer.js +47 -0
- package/dist/components/container/index.d.ts +2 -0
- package/dist/components/container/index.js +1 -0
- package/dist/components/date-picker/PlDatePicker.d.ts +73 -0
- package/dist/components/date-picker/PlDatePicker.js +87 -0
- package/dist/components/date-picker/index.d.ts +2 -0
- package/dist/components/date-picker/index.js +1 -0
- package/dist/components/date-range-picker/PlDateRangePicker.d.ts +91 -0
- package/dist/components/date-range-picker/PlDateRangePicker.js +152 -0
- package/dist/components/date-range-picker/index.d.ts +2 -0
- package/dist/components/date-range-picker/index.js +1 -0
- package/dist/components/date-time-picker/PlDateTimePicker.d.ts +74 -0
- package/dist/components/date-time-picker/PlDateTimePicker.js +106 -0
- package/dist/components/date-time-picker/index.d.ts +2 -0
- package/dist/components/date-time-picker/index.js +1 -0
- package/dist/components/divider/PlDivider.d.ts +73 -0
- package/dist/components/divider/PlDivider.js +107 -0
- package/dist/components/divider/index.d.ts +2 -0
- package/dist/components/divider/index.js +1 -0
- package/dist/components/drawer/PlDrawer.d.ts +144 -0
- package/dist/components/drawer/PlDrawer.js +190 -0
- package/dist/components/drawer/index.d.ts +2 -0
- package/dist/components/drawer/index.js +1 -0
- package/dist/components/file-picker/PlFilePicker.d.ts +105 -0
- package/dist/components/file-picker/PlFilePicker.js +274 -0
- package/dist/components/file-picker/index.d.ts +2 -0
- package/dist/components/file-picker/index.js +1 -0
- package/dist/components/floating-bottom-navigation/PlFloatingBottomNavigation.d.ts +118 -0
- package/dist/components/floating-bottom-navigation/PlFloatingBottomNavigation.js +291 -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/grid/PlGrid.d.ts +67 -0
- package/dist/components/grid/PlGrid.js +51 -0
- package/dist/components/grid/PlGridItem.d.ts +50 -0
- package/dist/components/grid/PlGridItem.js +34 -0
- package/dist/components/grid/index.d.ts +4 -0
- package/dist/components/grid/index.js +2 -0
- package/dist/components/highlight/PlHighlight.d.ts +90 -0
- package/dist/components/highlight/PlHighlight.js +185 -0
- package/dist/components/highlight/index.d.ts +2 -0
- package/dist/components/highlight/index.js +1 -0
- package/dist/components/hot-keys/PlHotKeys.d.ts +93 -0
- package/dist/components/hot-keys/PlHotKeys.js +294 -0
- package/dist/components/hot-keys/index.d.ts +2 -0
- package/dist/components/hot-keys/index.js +1 -0
- package/dist/components/icon/PlIcon.d.ts +62 -0
- package/dist/components/icon/PlIcon.js +58 -0
- package/dist/components/icon/index.d.ts +2 -0
- package/dist/components/icon/index.js +1 -0
- package/dist/components/icon-button/PlIconButton.d.ts +39 -0
- package/dist/components/icon-button/PlIconButton.js +37 -0
- package/dist/components/icon-button/index.d.ts +2 -0
- package/dist/components/icon-button/index.js +1 -0
- package/dist/components/list/PlList.d.ts +82 -0
- package/dist/components/list/PlList.js +160 -0
- package/dist/components/list/index.d.ts +2 -0
- package/dist/components/list/index.js +1 -0
- package/dist/components/menu/PlMenu.d.ts +210 -0
- package/dist/components/menu/PlMenu.js +209 -0
- package/dist/components/menu/index.d.ts +2 -0
- package/dist/components/menu/index.js +1 -0
- package/dist/components/modal/PlModal.d.ts +112 -0
- package/dist/components/modal/PlModal.js +150 -0
- package/dist/components/modal/index.d.ts +2 -0
- package/dist/components/modal/index.js +1 -0
- package/dist/components/number-field/PlNumberField.d.ts +133 -0
- package/dist/components/number-field/PlNumberField.js +111 -0
- package/dist/components/number-field/index.d.ts +2 -0
- package/dist/components/number-field/index.js +1 -0
- package/dist/components/otp-field/PlOtpField.d.ts +82 -0
- package/dist/components/otp-field/PlOtpField.js +109 -0
- package/dist/components/otp-field/index.d.ts +2 -0
- package/dist/components/otp-field/index.js +1 -0
- package/dist/components/overlay/PlOverlay.d.ts +96 -0
- package/dist/components/overlay/PlOverlay.js +77 -0
- package/dist/components/overlay/index.d.ts +2 -0
- package/dist/components/overlay/index.js +1 -0
- package/dist/components/pagination/PlPagination.d.ts +88 -0
- package/dist/components/pagination/PlPagination.js +159 -0
- package/dist/components/pagination/index.d.ts +2 -0
- package/dist/components/pagination/index.js +1 -0
- package/dist/components/panes/PlPanes.d.ts +79 -0
- package/dist/components/panes/PlPanes.js +324 -0
- package/dist/components/panes/index.d.ts +2 -0
- package/dist/components/panes/index.js +1 -0
- package/dist/components/pill/PlPill.d.ts +81 -0
- package/dist/components/pill/PlPill.js +154 -0
- package/dist/components/pill/index.d.ts +2 -0
- package/dist/components/pill/index.js +1 -0
- package/dist/components/popover/PlPopover.d.ts +107 -0
- package/dist/components/popover/PlPopover.js +113 -0
- package/dist/components/popover/index.d.ts +2 -0
- package/dist/components/popover/index.js +1 -0
- package/dist/components/progress-box/PlProgressBox.d.ts +32 -0
- package/dist/components/progress-box/PlProgressBox.js +34 -0
- package/dist/components/progress-box/index.d.ts +2 -0
- package/dist/components/progress-box/index.js +1 -0
- package/dist/components/progress-circular/PlProgressCircular.d.ts +22 -0
- package/dist/components/progress-circular/PlProgressCircular.js +47 -0
- package/dist/components/progress-circular/index.d.ts +2 -0
- package/dist/components/progress-circular/index.js +1 -0
- package/dist/components/progress-linear/PlProgressLinear.d.ts +31 -0
- package/dist/components/progress-linear/PlProgressLinear.js +40 -0
- package/dist/components/progress-linear/index.d.ts +2 -0
- package/dist/components/progress-linear/index.js +1 -0
- package/dist/components/radio-group/PlRadioGroup.d.ts +54 -0
- package/dist/components/radio-group/PlRadioGroup.js +99 -0
- package/dist/components/radio-group/index.d.ts +2 -0
- package/dist/components/radio-group/index.js +1 -0
- package/dist/components/rating/PlRating.d.ts +90 -0
- package/dist/components/rating/PlRating.js +101 -0
- package/dist/components/rating/index.d.ts +2 -0
- package/dist/components/rating/index.js +1 -0
- package/dist/components/scroll-zone/PlScrollZone.d.ts +132 -0
- package/dist/components/scroll-zone/PlScrollZone.js +411 -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/PlSegmentedButton.d.ts +79 -0
- package/dist/components/segmented-button/PlSegmentedButton.js +206 -0
- package/dist/components/segmented-button/index.d.ts +2 -0
- package/dist/components/segmented-button/index.js +1 -0
- package/dist/components/select/PlSelect.d.ts +77 -0
- package/dist/components/select/PlSelect.js +115 -0
- package/dist/components/select/index.d.ts +2 -0
- package/dist/components/select/index.js +1 -0
- package/dist/components/skeleton/PlSkeleton.d.ts +73 -0
- package/dist/components/skeleton/PlSkeleton.js +142 -0
- package/dist/components/skeleton/index.d.ts +2 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/slider/PlSlider.d.ts +44 -0
- package/dist/components/slider/PlSlider.js +132 -0
- package/dist/components/slider/index.d.ts +2 -0
- package/dist/components/slider/index.js +1 -0
- package/dist/components/spoiler/PlSpoiler.d.ts +84 -0
- package/dist/components/spoiler/PlSpoiler.js +74 -0
- package/dist/components/spoiler/index.d.ts +2 -0
- package/dist/components/spoiler/index.js +1 -0
- package/dist/components/switch/PlSwitch.d.ts +42 -0
- package/dist/components/switch/PlSwitch.js +131 -0
- package/dist/components/switch/index.d.ts +2 -0
- package/dist/components/switch/index.js +1 -0
- package/dist/components/table/PlTable.d.ts +112 -0
- package/dist/components/table/PlTable.js +210 -0
- package/dist/components/table/index.d.ts +2 -0
- package/dist/components/table/index.js +1 -0
- package/dist/components/tabs/PlTabs.d.ts +94 -0
- package/dist/components/tabs/PlTabs.js +182 -0
- package/dist/components/tabs/index.d.ts +2 -0
- package/dist/components/tabs/index.js +1 -0
- package/dist/components/text-field/{TextField.d.ts → PlTextField.d.ts} +5 -5
- package/dist/components/text-field/PlTextField.js +126 -0
- package/dist/components/text-field/index.d.ts +2 -2
- package/dist/components/text-field/index.js +1 -1
- package/dist/components/text-link/PlTextLink.d.ts +80 -0
- package/dist/components/text-link/PlTextLink.js +136 -0
- package/dist/components/text-link/index.d.ts +2 -0
- package/dist/components/text-link/index.js +1 -0
- package/dist/components/time-picker/PlTimePicker.d.ts +88 -0
- package/dist/components/time-picker/PlTimePicker.js +97 -0
- package/dist/components/time-picker/index.d.ts +2 -0
- package/dist/components/time-picker/index.js +1 -0
- package/dist/components/timeline/PlTimeline.d.ts +98 -0
- package/dist/components/timeline/PlTimeline.js +207 -0
- package/dist/components/timeline/index.d.ts +2 -0
- package/dist/components/timeline/index.js +1 -0
- package/dist/components/toast/PlToast.d.ts +122 -0
- package/dist/components/toast/PlToast.js +174 -0
- package/dist/components/toast/index.d.ts +2 -0
- package/dist/components/toast/index.js +1 -0
- package/dist/components/toolbar/PlToolbar.d.ts +68 -0
- package/dist/components/toolbar/PlToolbar.js +65 -0
- package/dist/components/toolbar/index.d.ts +2 -0
- package/dist/components/toolbar/index.js +1 -0
- package/dist/components/tooltip/PlTooltip.d.ts +92 -0
- package/dist/components/tooltip/PlTooltip.js +117 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/typography/PlTypography.d.ts +66 -0
- package/dist/components/typography/PlTypography.js +143 -0
- package/dist/components/typography/index.d.ts +2 -0
- package/dist/components/typography/index.js +1 -0
- package/dist/css/accordion.css +2 -0
- package/dist/css/alert.css +2 -0
- package/dist/css/animate-appear.css +2 -0
- package/dist/css/animate-blink.css +2 -0
- package/dist/css/animate-fade.css +2 -0
- package/dist/css/animate-grow.css +2 -0
- package/dist/css/animate-headline.css +2 -0
- package/dist/css/animate-lighting.css +2 -0
- package/dist/css/animate-marquee.css +2 -0
- package/dist/css/animate-rotate.css +2 -0
- package/dist/css/animate-slide.css +2 -0
- package/dist/css/animate-typing.css +2 -0
- package/dist/css/animate-zoom.css +2 -0
- package/dist/css/aspect-ratio.css +2 -0
- package/dist/css/avatar.css +2 -0
- package/dist/css/badge.css +2 -0
- package/dist/css/base.css +4 -0
- package/dist/css/blockquote.css +2 -0
- package/dist/css/bottom-navigation.css +2 -0
- package/dist/css/box.css +2 -0
- package/dist/css/breadcrumb.css +2 -0
- package/dist/css/button-group.css +2 -0
- package/dist/css/button.css +2 -0
- package/dist/css/card.css +2 -0
- package/dist/css/carousel.css +2 -0
- package/dist/css/chat-bubble.css +2 -0
- package/dist/css/checkbox.css +2 -0
- package/dist/css/chip.css +2 -0
- package/dist/css/collapsible.css +2 -0
- package/dist/css/combobox.css +2 -0
- package/dist/css/container.css +2 -0
- package/dist/css/date-picker.css +2 -0
- package/dist/css/date-range-picker.css +2 -0
- package/dist/css/date-time-picker.css +2 -0
- package/dist/css/divider.css +2 -0
- package/dist/css/drawer.css +2 -0
- package/dist/css/file-picker.css +2 -0
- package/dist/css/floating-bottom-navigation.css +2 -0
- package/dist/css/grid.css +2 -0
- package/dist/css/highlight.css +2 -0
- package/dist/css/hot-keys.css +2 -0
- package/dist/css/icon-button.css +2 -0
- package/dist/css/icon.css +2 -0
- package/dist/css/list.css +2 -0
- package/dist/css/menu.css +2 -0
- package/dist/css/modal.css +2 -0
- package/dist/css/number-field.css +2 -0
- package/dist/css/otp-field.css +2 -0
- package/dist/css/overlay.css +2 -0
- package/dist/css/pagination.css +2 -0
- package/dist/css/panes.css +2 -0
- package/dist/css/pill.css +2 -0
- package/dist/css/popover.css +2 -0
- package/dist/css/progress-box.css +2 -0
- package/dist/css/progress-circular.css +2 -0
- package/dist/css/progress-linear.css +2 -0
- package/dist/css/radio-group.css +2 -0
- package/dist/css/rating.css +2 -0
- package/dist/css/scroll-zone.css +2 -0
- package/dist/css/segmented-button.css +2 -0
- package/dist/css/select.css +2 -0
- package/dist/css/skeleton.css +2 -0
- package/dist/css/slider.css +2 -0
- package/dist/css/spoiler.css +2 -0
- package/dist/css/switch.css +2 -0
- package/dist/css/table.css +2 -0
- package/dist/css/tabs.css +2 -0
- package/dist/css/text-field.css +2 -0
- package/dist/css/text-link.css +2 -0
- package/dist/css/time-picker.css +2 -0
- package/dist/css/timeline.css +2 -0
- package/dist/css/toast.css +2 -0
- package/dist/css/toolbar.css +2 -0
- package/dist/css/tooltip.css +2 -0
- package/dist/css/typography.css +2 -0
- package/dist/index.d.ts +75 -3
- package/dist/index.js +75 -1
- package/dist/internal/animate.d.ts +161 -0
- package/dist/internal/animate.js +318 -0
- package/dist/internal/button-group.d.ts +27 -0
- package/dist/internal/button-group.js +19 -0
- package/dist/internal/calendar.d.ts +148 -0
- package/dist/internal/calendar.js +501 -0
- package/dist/internal/date.d.ts +173 -0
- package/dist/internal/date.js +353 -0
- package/dist/internal/format.d.ts +24 -0
- package/dist/internal/format.js +41 -0
- package/dist/internal/grid.d.ts +67 -0
- package/dist/internal/grid.js +143 -0
- package/dist/internal/icons.d.ts +86 -1
- package/dist/internal/icons.js +138 -1
- package/dist/internal/menu.d.ts +20 -0
- package/dist/internal/menu.js +18 -0
- package/dist/internal/picker.d.ts +118 -0
- package/dist/internal/picker.js +139 -0
- package/dist/internal/progress.d.ts +145 -0
- package/dist/internal/progress.js +167 -0
- package/dist/internal/sizer.d.ts +32 -0
- package/dist/internal/sizer.js +35 -0
- package/dist/internal/styles.d.ts +198 -8
- package/dist/internal/styles.js +636 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind.css +899 -125
- package/dist/tokens.css +1275 -0
- package/dist/types.d.ts +150 -8
- package/dist/types.js +1 -1
- package/package.json +31 -27
- package/README.md +0 -111
- package/dist/components/button/Button.js +0 -1
- package/dist/components/text-field/TextField.js +0 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { controlSlots, controlTextClasses, cx, focusRingClasses, gapClasses, glassClasses, hasContent, iconClasses, iconSizeClasses, metaTextClasses, paddingXClasses, sheetBodyClasses, transitionClasses } from '../../internal/styles.js';
|
|
4
|
+
/**
|
|
5
|
+
* The three materials, said the way a *control* says them — the surface takes
|
|
6
|
+
* the tint, as on a `PlButton` and a `PlChip`, because a pill is the thing being
|
|
7
|
+
* coloured rather than a sheet holding somebody else's content.
|
|
8
|
+
*/
|
|
9
|
+
const restClasses = {
|
|
10
|
+
solid: 'text-(--p-on-solid) [background-image:var(--p-fill)] [box-shadow:var(--p-elev),var(--p-lift)]',
|
|
11
|
+
glass: /* @__PURE__ */ [
|
|
12
|
+
glassClasses,
|
|
13
|
+
'border text-(--p-accent) bg-(--plass-glass)',
|
|
14
|
+
'[border-color:var(--plass-glass-line)]',
|
|
15
|
+
'[box-shadow:var(--p-elev),var(--plass-gloss-glass)]'
|
|
16
|
+
].join(' '),
|
|
17
|
+
ghost: `${glassClasses} text-(--p-accent) bg-(--p-soft)`
|
|
18
|
+
};
|
|
19
|
+
const hoverClasses = {
|
|
20
|
+
solid: 'hover:brightness-105 active:brightness-95',
|
|
21
|
+
glass: 'hover:bg-(--plass-glass-hover) hover:[border-color:var(--p-line)] active:bg-(--plass-glass-press)',
|
|
22
|
+
ghost: 'hover:bg-(--p-soft-hover) active:bg-(--p-soft-press)'
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The row's floor, as a minimum rather than as a height.
|
|
26
|
+
*
|
|
27
|
+
* The numbers are `controlHeightClasses`' — a collapsed pill lines up with a
|
|
28
|
+
* `PlButton` of the same `size` beside it — but a pill carrying a description is
|
|
29
|
+
* two lines tall and a fixed height would clip the second.
|
|
30
|
+
*/
|
|
31
|
+
const rowMinHeightClasses = {
|
|
32
|
+
xs: 'min-h-5.5',
|
|
33
|
+
sm: 'min-h-6.5',
|
|
34
|
+
md: 'min-h-8',
|
|
35
|
+
lg: 'min-h-10',
|
|
36
|
+
xl: 'min-h-12'
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Exactly half the row's minimum height at every step — 22, 26, 32, 40 and 48px
|
|
40
|
+
* — so a collapsed pill is a true stadium.
|
|
41
|
+
*
|
|
42
|
+
* Written as a length rather than as `rounded-full`, and the difference only
|
|
43
|
+
* shows once the pill grows: `rounded-full` on a box that has taken a second
|
|
44
|
+
* line, or opened its `details`, is a corner half its new height, and a corner
|
|
45
|
+
* that big eats the first two words of every line. Pinning the radius to the
|
|
46
|
+
* *row* is what lets the lozenge grow into a rounded rectangle with the same
|
|
47
|
+
* corner it always had.
|
|
48
|
+
*/
|
|
49
|
+
const pillRadiusClasses = {
|
|
50
|
+
xs: 'rounded-[0.6875rem]',
|
|
51
|
+
sm: 'rounded-[0.8125rem]',
|
|
52
|
+
md: 'rounded-[1rem]',
|
|
53
|
+
lg: 'rounded-[1.25rem]',
|
|
54
|
+
xl: 'rounded-[1.5rem]'
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The air either side of the middle, and the thing that makes this shape read as
|
|
58
|
+
* the lozenge it is rather than as a wide `PlChip`.
|
|
59
|
+
*
|
|
60
|
+
* Roughly double the control padding at every step. The leading glyph and the
|
|
61
|
+
* trailing slot are the pill's furniture; what it is *about* is the column
|
|
62
|
+
* between them, and giving that column noticeably more room than either
|
|
63
|
+
* neighbour is what puts the eye there first. `density` halves it, exactly as it
|
|
64
|
+
* does everywhere else.
|
|
65
|
+
*/
|
|
66
|
+
const centerPaddingClasses = {
|
|
67
|
+
default: { xs: 'px-3', sm: 'px-4', md: 'px-5', lg: 'px-6', xl: 'px-8' },
|
|
68
|
+
compact: { xs: 'px-1.5', sm: 'px-2', md: 'px-2.5', lg: 'px-3', xl: 'px-4' }
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The leading box: a square the size of a standalone glyph, clipped round.
|
|
72
|
+
*
|
|
73
|
+
* `iconSizeClasses` rather than a ladder of its own, because that table already
|
|
74
|
+
* answers the same question — how big is a glyph that is not riding on a label —
|
|
75
|
+
* and the leading slot of a pill is exactly that.
|
|
76
|
+
*/
|
|
77
|
+
const mediaClasses = 'flex shrink-0 items-center justify-center overflow-hidden rounded-full [&_img]:size-full [&_img]:object-cover';
|
|
78
|
+
/**
|
|
79
|
+
* The description under the title.
|
|
80
|
+
*
|
|
81
|
+
* Mixed toward transparent rather than pointed at `--plass-muted-fg`: the middle
|
|
82
|
+
* of a pill sits on the colour family's own fill as often as on a bare surface,
|
|
83
|
+
* and a fixed grey that reads as secondary on white reads as dirt on `primary`.
|
|
84
|
+
* Taking the ink that is already there and letting some of the surface through
|
|
85
|
+
* is the one form of "one step quieter" that holds on all three materials.
|
|
86
|
+
*/
|
|
87
|
+
const descriptionClasses = '[color:color-mix(in_oklab,currentColor_72%,transparent)]';
|
|
88
|
+
/** Where a pinned pill hangs, and how far in from the edge. */
|
|
89
|
+
const positionClasses = {
|
|
90
|
+
static: { top: '', bottom: '' },
|
|
91
|
+
sticky: { top: 'sticky top-3 z-20', bottom: 'sticky bottom-3 z-20' },
|
|
92
|
+
fixed: {
|
|
93
|
+
// Centred by stretching the box across the viewport and letting `mx-auto`
|
|
94
|
+
// shrink it back, not by translating it half its own width. The house rule
|
|
95
|
+
// against transforming a surface holds here too, and `auto` margins are
|
|
96
|
+
// direction-agnostic, so the lozenge stays centred under RTL.
|
|
97
|
+
top: 'fixed inset-x-0 top-3 z-30 mx-auto w-fit',
|
|
98
|
+
bottom: 'fixed inset-x-0 bottom-3 z-30 mx-auto w-fit'
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* A floating lozenge holding a small amount of live information.
|
|
103
|
+
*
|
|
104
|
+
* The shape is a **stadium**, which the house radius rule otherwise forbids:
|
|
105
|
+
* every control is held just short of the 50% that would make it a pill, because
|
|
106
|
+
* the flat run along its top and bottom edge is what still reads as a sheet with
|
|
107
|
+
* the corners cut off it. This is the exception the rule is drawn against, and
|
|
108
|
+
* it works for the same reason the rule does — this is not a sheet lying on the
|
|
109
|
+
* page. It is an object hovering over one, and an object hovering over the page
|
|
110
|
+
* should not look as though it was cut from the same material.
|
|
111
|
+
*
|
|
112
|
+
* `details` is revealed by animating a measured height, exactly as a
|
|
113
|
+
* `PlAccordion` panel is: nothing is transformed and no text is resampled, the
|
|
114
|
+
* pill is simply a window that opens. The measurement is a `ResizeObserver`
|
|
115
|
+
* rather than a hardcoded height, so a details area whose content changes —
|
|
116
|
+
* which is what live information does — grows with it.
|
|
117
|
+
*/
|
|
118
|
+
export const PlPill = /* @__PURE__ */ React.forwardRef(function PlPill({ variant = 'solid', size = 'md', color = 'secondary', density = 'default', elevation = 2, startIcon, endIcon, title, description, details, expanded = false, position = 'static', side = 'top', className, style, children, onClick, ...props }, ref) {
|
|
119
|
+
const detailsRef = React.useRef(null);
|
|
120
|
+
const [detailsHeight, setDetailsHeight] = React.useState(0);
|
|
121
|
+
React.useEffect(() => {
|
|
122
|
+
const element = detailsRef.current;
|
|
123
|
+
if (!element || typeof ResizeObserver === 'undefined') {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const observer = new ResizeObserver(() => setDetailsHeight(element.scrollHeight));
|
|
127
|
+
observer.observe(element);
|
|
128
|
+
setDetailsHeight(element.scrollHeight);
|
|
129
|
+
return () => observer.disconnect();
|
|
130
|
+
}, [details]);
|
|
131
|
+
const interactive = Boolean(onClick);
|
|
132
|
+
const padX = paddingXClasses[density][size];
|
|
133
|
+
const row = (_jsxs(_Fragment, { children: [hasContent(startIcon) ? (_jsx("span", { className: cx(mediaClasses, iconSizeClasses[size]), children: startIcon })) : null, hasContent(title) || hasContent(description) || hasContent(children) ? (_jsxs("span", { className: cx('flex min-w-0 flex-1 flex-col items-center justify-center text-center', centerPaddingClasses[density][size]), children: [hasContent(title) ? _jsx("span", { className: "max-w-full truncate", children: title }) : null, hasContent(description) ? (_jsx("span", { className: cx('max-w-full truncate font-normal', metaTextClasses[size], descriptionClasses), children: description })) : null, children] })) : null] }));
|
|
134
|
+
return (_jsxs("div", { ref: ref, className: cx('inline-flex max-w-full flex-col overflow-hidden align-middle', pillRadiusClasses[size], 'font-medium whitespace-nowrap select-none', controlTextClasses[size], restClasses[variant], transitionClasses, iconClasses, interactive ? `plass-glow ${hoverClasses[variant]}` : '', positionClasses[position][side], className), style: { ...controlSlots(color, elevation, variant), ...style }, ...props, children: [_jsxs("div", { className: cx(
|
|
135
|
+
// `min-h` rather than a fixed height: one line keeps the stadium the
|
|
136
|
+
// radius ladder is cut for, and a title with a description under it
|
|
137
|
+
// grows into a rounded rectangle instead of being clipped. `py-1`
|
|
138
|
+
// costs nothing in the one-line case — the minimum is taller than
|
|
139
|
+
// the line plus the padding — and is what keeps two lines off the
|
|
140
|
+
// edges.
|
|
141
|
+
'flex shrink-0 items-center py-1', rowMinHeightClasses[size], gapClasses[size],
|
|
142
|
+
// With a pressable middle the padding belongs to the button, so its
|
|
143
|
+
// hit area covers the whole row rather than just the words.
|
|
144
|
+
interactive ? 'ps-0' : padX, hasContent(endIcon) ? 'pe-1' : interactive ? 'pe-0' : ''), children: [interactive ? (_jsx("button", { type: "button", className: cx('flex min-w-0 flex-1 cursor-pointer items-center justify-center self-stretch',
|
|
145
|
+
// `inherit`, so the focus ring traces the lozenge's own corners
|
|
146
|
+
// rather than drawing a second, squarer rectangle inside them.
|
|
147
|
+
'rounded-[inherit]', gapClasses[size], padX, focusRingClasses), onClick: onClick, children: row })) : (row), hasContent(endIcon) ? (_jsx("span", { className: "flex h-[1lh] shrink-0 items-center", children: endIcon })) : null] }), hasContent(details) ? (_jsx("div", { className: cx('overflow-hidden', '[transition:height_var(--plass-duration-slow)_var(--plass-ease)]', 'motion-reduce:[transition-duration:0ms]'), style: { height: expanded ? detailsHeight : 0 },
|
|
148
|
+
// `inert` rather than `aria-hidden`: a collapsed panel is a
|
|
149
|
+
// zero-height box that its content is still perfectly focusable
|
|
150
|
+
// inside, and `aria-hidden` alone would leave a keyboard reader
|
|
151
|
+
// tabbing into something their screen reader has been told does not
|
|
152
|
+
// exist.
|
|
153
|
+
inert: !expanded, children: _jsx("div", { ref: detailsRef, className: cx('whitespace-normal pb-2', padX, sheetBodyClasses[size]), children: details }) })) : null] }));
|
|
154
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PlPill } from './PlPill.js';
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Popover as BaseUIPopover } from '@base-ui/react/popover';
|
|
3
|
+
import type { PlassAlign, PlassSide, PlassStyleProps } from '../../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* A popover takes `size`, `color` and `density` and stops there.
|
|
6
|
+
*
|
|
7
|
+
* There is no `variant`, for `PlMenu`'s reason: the three materials answer "how
|
|
8
|
+
* much does this surface assert itself against the page", and a popup that had
|
|
9
|
+
* to be asked for has already answered it. There is no `elevation` either — a
|
|
10
|
+
* popover genuinely floats, which is the one case the ladder exists for, so it
|
|
11
|
+
* is fixed at its top rung.
|
|
12
|
+
*/
|
|
13
|
+
export interface PlPopoverProps extends Pick<PlassStyleProps, 'size' | 'color' | 'density'>, Omit<React.ComponentPropsWithoutRef<'div'>, 'color' | 'title' | 'children'> {
|
|
14
|
+
/**
|
|
15
|
+
* The element the popup hangs off and that opens it. Exactly one element,
|
|
16
|
+
* which must accept a ref and spread props — every Plass component does.
|
|
17
|
+
*
|
|
18
|
+
* Optional: a controlled popover anchored from elsewhere needs none, though it
|
|
19
|
+
* then has nothing to position against and will sit against the viewport.
|
|
20
|
+
*/
|
|
21
|
+
trigger?: React.ReactElement;
|
|
22
|
+
/** The heading, rendered as the element that names the popup. */
|
|
23
|
+
title?: React.ReactNode;
|
|
24
|
+
/** A line under the title, and the popup's accessible description. */
|
|
25
|
+
description?: React.ReactNode;
|
|
26
|
+
/** The body. */
|
|
27
|
+
children?: React.ReactNode;
|
|
28
|
+
/**
|
|
29
|
+
* Which edge of the trigger it appears on. Flips to the opposite side when
|
|
30
|
+
* there is no room, which is Base UI's doing and is the right behaviour.
|
|
31
|
+
* @default 'bottom'
|
|
32
|
+
*/
|
|
33
|
+
side?: PlassSide;
|
|
34
|
+
/** Where it sits along that edge. @default 'center' */
|
|
35
|
+
align?: PlassAlign;
|
|
36
|
+
/** Distance from the trigger, in pixels. @default 6 */
|
|
37
|
+
sideOffset?: number;
|
|
38
|
+
/** Shift along that edge, in pixels. @default 0 */
|
|
39
|
+
alignOffset?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Draws the little wedge pointing at the trigger.
|
|
42
|
+
*
|
|
43
|
+
* Off by default, unlike on a `PlTooltip`. A tooltip is a filled plate and its
|
|
44
|
+
* wedge is the same solid colour; this surface is translucent over a blurred
|
|
45
|
+
* backdrop, and a wedge sticking out past the popup's own box cannot carry
|
|
46
|
+
* that backdrop with it. Turn it on where the trigger is far enough away that
|
|
47
|
+
* the popup needs to say what it belongs to.
|
|
48
|
+
* @default false
|
|
49
|
+
*/
|
|
50
|
+
arrow?: boolean;
|
|
51
|
+
/** Whether the popover is open. Use with `onOpenChange` for a controlled one. */
|
|
52
|
+
open?: boolean;
|
|
53
|
+
/** Whether it starts open, for an uncontrolled one. */
|
|
54
|
+
defaultOpen?: boolean;
|
|
55
|
+
onOpenChange?: (open: boolean) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Whether the page behind is taken away. `false` — the default — leaves the
|
|
58
|
+
* page scrollable and clickable, which is what separates a popover from a
|
|
59
|
+
* `PlModal`: it is a detail beside the page, not instead of it.
|
|
60
|
+
* `'trap-focus'` holds focus inside without locking the scroll.
|
|
61
|
+
* @default false
|
|
62
|
+
*/
|
|
63
|
+
modal?: boolean | 'trap-focus';
|
|
64
|
+
/**
|
|
65
|
+
* Whether pressing Escape or clicking outside closes the popup. Turn it off
|
|
66
|
+
* only for a popup with its own way out, because there will be no other.
|
|
67
|
+
* @default true
|
|
68
|
+
*/
|
|
69
|
+
dismissible?: boolean;
|
|
70
|
+
/** Shows the × in the corner. @default false */
|
|
71
|
+
showClose?: boolean;
|
|
72
|
+
/** Accessible name of the × button. Never drawn. @default 'Close' */
|
|
73
|
+
closeLabel?: string;
|
|
74
|
+
/**
|
|
75
|
+
* A hard cap on the popup's width, overriding the one `size` implies. Numbers
|
|
76
|
+
* are pixels. For the popover whose content decides its width — a form, a
|
|
77
|
+
* single line of help — rather than for tuning the scale, which is `size`.
|
|
78
|
+
*/
|
|
79
|
+
width?: number | string;
|
|
80
|
+
}
|
|
81
|
+
export type PlPopoverCloseProps = React.ComponentPropsWithoutRef<typeof BaseUIPopover.Close>;
|
|
82
|
+
/**
|
|
83
|
+
* Closes the popover it is inside.
|
|
84
|
+
*
|
|
85
|
+
* Exported for `PlModalClose`'s reason: an uncontrolled popover has no `setOpen`
|
|
86
|
+
* for its Cancel button to call, and making every popover controlled is a piece
|
|
87
|
+
* of state per popover that exists only to answer a button.
|
|
88
|
+
*
|
|
89
|
+
* `render` is Base UI's own escape hatch, so a real Plass button dismisses:
|
|
90
|
+
* `<PlPopoverClose render={<PlButton variant="ghost">Cancel</PlButton>} />`.
|
|
91
|
+
*/
|
|
92
|
+
export declare const PlPopoverClose: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").PopoverCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
93
|
+
/**
|
|
94
|
+
* A sheet that opens beside the thing that opened it.
|
|
95
|
+
*
|
|
96
|
+
* The difference from a `PlTooltip` is that this one can be **reached**: it
|
|
97
|
+
* stays up until it is dismissed, it can be entered with the pointer or the
|
|
98
|
+
* keyboard, and what is inside it can be clicked and typed into. The difference
|
|
99
|
+
* from a `PlModal` is that it does not take the page — it is anchored to a
|
|
100
|
+
* control, and the page behind goes on working.
|
|
101
|
+
*
|
|
102
|
+
* Base UI owns everything hard about it: the anchoring and the flip at the
|
|
103
|
+
* window edge, the click-outside and Escape, returning focus to the trigger, and
|
|
104
|
+
* the `aria-labelledby` / `aria-describedby` wiring. What is left here is the
|
|
105
|
+
* surface, the width ladder and the header.
|
|
106
|
+
*/
|
|
107
|
+
export declare function PlPopover({ size, color, density, trigger, title, description, children, side, align, sideOffset, alignOffset, arrow, open, defaultOpen, onOpenChange, modal, dismissible, showClose, closeLabel, width, className, style, ...props }: PlPopoverProps): React.JSX.Element;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Popover as BaseUIPopover } from '@base-ui/react/popover';
|
|
3
|
+
import { CloseIcon } from '../../internal/icons.js';
|
|
4
|
+
import { cx, focusRingClasses, glassClasses, hasContent, metaTextClasses, radiusClasses, sheetBodyClasses, sheetHeaderGapClasses, sheetPaddingXClasses, sheetPaddingYClasses, sheetSectionGapClasses, sheetTitleClasses, surfaceSlots } from '../../internal/styles.js';
|
|
5
|
+
/**
|
|
6
|
+
* How wide the popup is allowed to get, per `size` — the same axis `PlModal`
|
|
7
|
+
* folds its width into, one rung narrower at every step because a popover is a
|
|
8
|
+
* detail beside a control rather than a sheet in the middle of the page.
|
|
9
|
+
*/
|
|
10
|
+
const maxWidthClasses = {
|
|
11
|
+
xs: 'max-w-56',
|
|
12
|
+
sm: 'max-w-64',
|
|
13
|
+
md: 'max-w-80',
|
|
14
|
+
lg: 'max-w-96',
|
|
15
|
+
xl: 'max-w-lg'
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The sheet. The same frosted panel a `PlSelect` popup and a `PlModal` draw, and
|
|
19
|
+
* for the same reason it carries the top of the shadow ladder: it is one of the
|
|
20
|
+
* few surfaces in the library that is genuinely meant to float.
|
|
21
|
+
*/
|
|
22
|
+
const popupClasses = /* @__PURE__ */ [
|
|
23
|
+
glassClasses,
|
|
24
|
+
'relative flex flex-col',
|
|
25
|
+
'border text-(--plass-fg) bg-(--plass-glass-press)',
|
|
26
|
+
'[border-color:var(--plass-glass-line)]',
|
|
27
|
+
'[box-shadow:var(--plass-shadow-3),var(--plass-gloss-glass)]',
|
|
28
|
+
'[outline:none]',
|
|
29
|
+
// Opacity only. A popup that scales or slides in drags its own text across the
|
|
30
|
+
// screen for the length of the transition, which is the one thing the house
|
|
31
|
+
// style is against — and unlike a control, this one is full of text.
|
|
32
|
+
'[transition:opacity_var(--plass-duration)_var(--plass-ease)]',
|
|
33
|
+
'data-[starting-style]:opacity-0 data-[ending-style]:opacity-0'
|
|
34
|
+
].join(' ');
|
|
35
|
+
/** The wedge, at roughly a third of the sheet's corner radius per step. */
|
|
36
|
+
const arrowSizes = {
|
|
37
|
+
xs: 8,
|
|
38
|
+
sm: 9,
|
|
39
|
+
md: 10,
|
|
40
|
+
lg: 11,
|
|
41
|
+
xl: 12
|
|
42
|
+
};
|
|
43
|
+
/** The × in the corner, the same one a `PlModal` draws. */
|
|
44
|
+
const closeButtonClasses = /* @__PURE__ */ [
|
|
45
|
+
'flex size-[1.6em] shrink-0 cursor-pointer items-center justify-center',
|
|
46
|
+
'rounded-full text-(--plass-muted-fg)',
|
|
47
|
+
'[&_svg]:size-[1.1em] [&_svg]:shrink-0',
|
|
48
|
+
'[transition:background-color_var(--plass-duration)_var(--plass-ease),color_var(--plass-duration)_var(--plass-ease)]',
|
|
49
|
+
'hover:bg-(--p-soft) hover:text-(--plass-fg)',
|
|
50
|
+
focusRingClasses
|
|
51
|
+
].join(' ');
|
|
52
|
+
/**
|
|
53
|
+
* Closes the popover it is inside.
|
|
54
|
+
*
|
|
55
|
+
* Exported for `PlModalClose`'s reason: an uncontrolled popover has no `setOpen`
|
|
56
|
+
* for its Cancel button to call, and making every popover controlled is a piece
|
|
57
|
+
* of state per popover that exists only to answer a button.
|
|
58
|
+
*
|
|
59
|
+
* `render` is Base UI's own escape hatch, so a real Plass button dismisses:
|
|
60
|
+
* `<PlPopoverClose render={<PlButton variant="ghost">Cancel</PlButton>} />`.
|
|
61
|
+
*/
|
|
62
|
+
export const PlPopoverClose = BaseUIPopover.Close;
|
|
63
|
+
/**
|
|
64
|
+
* A sheet that opens beside the thing that opened it.
|
|
65
|
+
*
|
|
66
|
+
* The difference from a `PlTooltip` is that this one can be **reached**: it
|
|
67
|
+
* stays up until it is dismissed, it can be entered with the pointer or the
|
|
68
|
+
* keyboard, and what is inside it can be clicked and typed into. The difference
|
|
69
|
+
* from a `PlModal` is that it does not take the page — it is anchored to a
|
|
70
|
+
* control, and the page behind goes on working.
|
|
71
|
+
*
|
|
72
|
+
* Base UI owns everything hard about it: the anchoring and the flip at the
|
|
73
|
+
* window edge, the click-outside and Escape, returning focus to the trigger, and
|
|
74
|
+
* the `aria-labelledby` / `aria-describedby` wiring. What is left here is the
|
|
75
|
+
* surface, the width ladder and the header.
|
|
76
|
+
*/
|
|
77
|
+
export function PlPopover({ size = 'md', color = 'primary', density = 'default', trigger, title, description, children, side = 'bottom', align = 'center', sideOffset = 6, alignOffset = 0, arrow = false, open, defaultOpen, onOpenChange, modal = false, dismissible = true, showClose = false, closeLabel = 'Close', width, className, style, ...props }) {
|
|
78
|
+
const insetX = sheetPaddingXClasses[density][size];
|
|
79
|
+
const insetY = sheetPaddingYClasses[density][size];
|
|
80
|
+
const arrowSize = arrowSizes[size];
|
|
81
|
+
const hasHeader = hasContent(title) || hasContent(description);
|
|
82
|
+
return (_jsxs(BaseUIPopover.Root, { open: open, defaultOpen: defaultOpen, modal: modal, onOpenChange: (next, details) => {
|
|
83
|
+
// Base UI has no `disablePointerDismissal` on a popover, so both ways
|
|
84
|
+
// out are cancelled here by the reason the change arrives with. An
|
|
85
|
+
// imperative close and a `PlPopoverClose` press still get through, which
|
|
86
|
+
// is what keeps `dismissible={false}` from being a trap.
|
|
87
|
+
if (!dismissible &&
|
|
88
|
+
!next &&
|
|
89
|
+
(details.reason === 'escape-key' ||
|
|
90
|
+
details.reason === 'outside-press' ||
|
|
91
|
+
details.reason === 'focus-out')) {
|
|
92
|
+
details.cancel();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
onOpenChange?.(next);
|
|
96
|
+
}, children: [trigger ? _jsx(BaseUIPopover.Trigger, { render: trigger }) : null, _jsx(BaseUIPopover.Portal, { children: _jsx(BaseUIPopover.Positioner, { className: "plass-portal z-50 [outline:none]", side: side, align: align, sideOffset: sideOffset, alignOffset: alignOffset, children: _jsxs(BaseUIPopover.Popup, { className: cx(popupClasses, radiusClasses[size], sheetBodyClasses[size], sheetSectionGapClasses[size], insetX, insetY, width === undefined ? maxWidthClasses[size] : '', className), style: {
|
|
97
|
+
...surfaceSlots(color, 3),
|
|
98
|
+
...(width === undefined
|
|
99
|
+
? null
|
|
100
|
+
: { maxWidth: typeof width === 'number' ? `${width}px` : width }),
|
|
101
|
+
...style
|
|
102
|
+
}, ...props, children: [arrow ? (_jsx(BaseUIPopover.Arrow
|
|
103
|
+
// Base UI positions the wedge and reports which side it ended up
|
|
104
|
+
// on. It is drawn pointing down once and turned to match — a
|
|
105
|
+
// rotation of a glyph, which is the one allowance the
|
|
106
|
+
// no-transform rule makes.
|
|
107
|
+
, {
|
|
108
|
+
// Base UI positions the wedge and reports which side it ended up
|
|
109
|
+
// on. It is drawn pointing down once and turned to match — a
|
|
110
|
+
// rotation of a glyph, which is the one allowance the
|
|
111
|
+
// no-transform rule makes.
|
|
112
|
+
className: cx('data-[side=top]:bottom-[-1px]', 'data-[side=bottom]:top-[-1px] data-[side=bottom]:rotate-180', 'data-[side=left]:right-[-1px] data-[side=left]:-rotate-90', 'data-[side=right]:left-[-1px] data-[side=right]:rotate-90'), children: _jsxs("svg", { width: arrowSize, height: arrowSize / 2, viewBox: "0 0 10 5", "aria-hidden": "true", className: "block", children: [_jsx("path", { d: "M0 0h10L5 5z", fill: "var(--plass-glass-press)" }), _jsx("path", { d: "M0 0 5 5 10 0", fill: "none", stroke: "var(--plass-glass-line)", strokeWidth: "1", vectorEffect: "non-scaling-stroke" })] }) })) : null, hasHeader || showClose ? (_jsxs("div", { className: "flex shrink-0 items-start gap-3", children: [_jsxs("div", { className: cx('flex min-w-0 flex-1 flex-col', sheetHeaderGapClasses[size]), children: [hasContent(title) ? (_jsx(BaseUIPopover.Title, { className: cx('m-0 font-semibold', sheetTitleClasses[size]), children: title })) : null, hasContent(description) ? (_jsx(BaseUIPopover.Description, { className: cx('m-0 text-(--plass-muted-fg)', metaTextClasses[size]), children: description })) : null] }), showClose ? (_jsx(BaseUIPopover.Close, { "aria-label": closeLabel, className: closeButtonClasses, children: _jsx(CloseIcon, {}) })) : null] })) : null, hasContent(children) ? _jsx("div", { className: "min-w-0", children: children }) : null] }) }) })] }));
|
|
113
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PlPopover, PlPopoverClose } from './PlPopover.js';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type PlassProgressProps } from '../../internal/progress.js';
|
|
3
|
+
export interface PlProgressBoxProps extends PlassProgressProps {
|
|
4
|
+
/** Size of one plate. */
|
|
5
|
+
size?: PlassProgressProps['size'];
|
|
6
|
+
/**
|
|
7
|
+
* How many plates the row is made of.
|
|
8
|
+
*
|
|
9
|
+
* Four by default: enough that the wave reads as a wave, few enough that a
|
|
10
|
+
* determinate row can be counted at a glance rather than measured. Set it to
|
|
11
|
+
* the number of steps when the thing being waited on genuinely has steps.
|
|
12
|
+
* @default 4
|
|
13
|
+
*/
|
|
14
|
+
count?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A row of small glass plates that light up.
|
|
18
|
+
*
|
|
19
|
+
* The third shape, and the one that is about the material rather than about the
|
|
20
|
+
* quantity. A bar and a ring both say "this much of it is done"; a row of
|
|
21
|
+
* plates says "this is working" in the library's own vocabulary — the same
|
|
22
|
+
* groove, the same corner, the same gradient — which is what makes it the right
|
|
23
|
+
* one for a loading state inside a Plass surface, where a foreign grey spinner
|
|
24
|
+
* would look borrowed.
|
|
25
|
+
*
|
|
26
|
+
* It answers a value when it has one: the plates fill in order, the leading one
|
|
27
|
+
* partially, so four plates read as a four-segment bar rather than as four
|
|
28
|
+
* quarters. Without a value they cycle, each held back by its own index — and
|
|
29
|
+
* what cycles is the fill's **opacity**, because a gradient has no interpolation
|
|
30
|
+
* between itself and nothing.
|
|
31
|
+
*/
|
|
32
|
+
export declare const PlProgressBox: React.ForwardRefExoticComponent<PlProgressBoxProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Progress } from '@base-ui/react/progress';
|
|
4
|
+
import { fillTransitionClasses, plateGapClasses, plateRadiusClasses, plateSizeClasses, progressAriaText, progressFraction, progressSlots, progressText, trackClasses } from '../../internal/progress.js';
|
|
5
|
+
import { cx, metaTextClasses, stackGapClasses } from '../../internal/styles.js';
|
|
6
|
+
/**
|
|
7
|
+
* A row of small glass plates that light up.
|
|
8
|
+
*
|
|
9
|
+
* The third shape, and the one that is about the material rather than about the
|
|
10
|
+
* quantity. A bar and a ring both say "this much of it is done"; a row of
|
|
11
|
+
* plates says "this is working" in the library's own vocabulary — the same
|
|
12
|
+
* groove, the same corner, the same gradient — which is what makes it the right
|
|
13
|
+
* one for a loading state inside a Plass surface, where a foreign grey spinner
|
|
14
|
+
* would look borrowed.
|
|
15
|
+
*
|
|
16
|
+
* It answers a value when it has one: the plates fill in order, the leading one
|
|
17
|
+
* partially, so four plates read as a four-segment bar rather than as four
|
|
18
|
+
* quarters. Without a value they cycle, each held back by its own index — and
|
|
19
|
+
* what cycles is the fill's **opacity**, because a gradient has no interpolation
|
|
20
|
+
* between itself and nothing.
|
|
21
|
+
*/
|
|
22
|
+
export const PlProgressBox = /* @__PURE__ */ React.forwardRef(function PlProgressBox({ size = 'md', color = 'primary', count = 4, value = null, min = 0, max = 100, label, showValue = false, format, className, style, ...props }, ref) {
|
|
23
|
+
const fraction = progressFraction(value, min, max);
|
|
24
|
+
const indeterminate = fraction === null;
|
|
25
|
+
const hasFormat = format !== undefined;
|
|
26
|
+
// A row of no plates is not a loading indicator, and a fractional count is a
|
|
27
|
+
// caller who divided something. Both land on one plate rather than on none.
|
|
28
|
+
const plates = Math.max(1, Math.floor(count));
|
|
29
|
+
return (_jsxs(Progress.Root, { ref: ref, value: value ?? null, min: min, max: max, format: format, getAriaValueText: progressAriaText(fraction, hasFormat), className: cx('inline-flex flex-col', stackGapClasses[size], className), style: { ...progressSlots(color), ...style }, ...props, children: [label || showValue ? (_jsxs("div", { className: cx('flex items-baseline gap-2', label ? 'justify-between' : 'justify-end', metaTextClasses[size]), children: [label ? (_jsx(Progress.Label, { className: "min-w-0 truncate text-(--plass-fg)", children: label })) : null, showValue ? (_jsx(Progress.Value, { className: "shrink-0 tabular-nums text-(--plass-muted-fg)", children: (formatted) => progressText(fraction, formatted, hasFormat) })) : null] })) : null, _jsx(Progress.Track, { className: cx('flex', plateGapClasses[size]), children: Array.from({ length: plates }, (_, index) => (_jsx("span", { className: cx('relative overflow-hidden', trackClasses, plateSizeClasses[size], plateRadiusClasses[size]), children: _jsx("span", { "aria-hidden": "true", className: cx('absolute inset-y-0 start-0 [background-image:var(--p-fill)]', indeterminate ? 'plass-plate-wave w-full' : fillTransitionClasses), style: indeterminate
|
|
30
|
+
? { '--p-i': index }
|
|
31
|
+
: {
|
|
32
|
+
width: `${Math.min(100, Math.max(0, (fraction * plates - index) * 100))}%`
|
|
33
|
+
} }) }, index))) })] }));
|
|
34
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PlProgressBox } from './PlProgressBox.js';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type PlassProgressProps } from '../../internal/progress.js';
|
|
3
|
+
export interface PlProgressCircularProps extends PlassProgressProps {
|
|
4
|
+
/** Diameter of the ring. Sits just under the control ladder at every step. */
|
|
5
|
+
size?: PlassProgressProps['size'];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A ring that fills, and the one to reach for where there is no room for a bar
|
|
9
|
+
* — inside a button, at the end of a table row, next to a field.
|
|
10
|
+
*
|
|
11
|
+
* The arc is the family's gradient rather than a flat colour, which takes a
|
|
12
|
+
* `<linearGradient>` of its own: an SVG stroke cannot be given a CSS gradient,
|
|
13
|
+
* so the two ends of the fill are lifted out of the slots and rebuilt at 135°.
|
|
14
|
+
* It is worth the extra element — a flat ring beside a swept bar is two
|
|
15
|
+
* materials for one idea.
|
|
16
|
+
*
|
|
17
|
+
* The value and the label sit *beside* the ring rather than inside it. A number
|
|
18
|
+
* in the middle of a dial is the picture everyone has of this component, and it
|
|
19
|
+
* only works at two of the five sizes: at `xs` the ring is fourteen pixels
|
|
20
|
+
* across and there is nowhere for "40%" to go. Beside it, every size reads.
|
|
21
|
+
*/
|
|
22
|
+
export declare const PlProgressCircular: React.ForwardRefExoticComponent<PlProgressCircularProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Progress } from '@base-ui/react/progress';
|
|
4
|
+
import { progressAriaText, progressFraction, progressSlots, progressText, ringDiameters, ringStrokes } from '../../internal/progress.js';
|
|
5
|
+
import { cx, gapClasses, metaTextClasses } from '../../internal/styles.js';
|
|
6
|
+
/**
|
|
7
|
+
* A ring that fills, and the one to reach for where there is no room for a bar
|
|
8
|
+
* — inside a button, at the end of a table row, next to a field.
|
|
9
|
+
*
|
|
10
|
+
* The arc is the family's gradient rather than a flat colour, which takes a
|
|
11
|
+
* `<linearGradient>` of its own: an SVG stroke cannot be given a CSS gradient,
|
|
12
|
+
* so the two ends of the fill are lifted out of the slots and rebuilt at 135°.
|
|
13
|
+
* It is worth the extra element — a flat ring beside a swept bar is two
|
|
14
|
+
* materials for one idea.
|
|
15
|
+
*
|
|
16
|
+
* The value and the label sit *beside* the ring rather than inside it. A number
|
|
17
|
+
* in the middle of a dial is the picture everyone has of this component, and it
|
|
18
|
+
* only works at two of the five sizes: at `xs` the ring is fourteen pixels
|
|
19
|
+
* across and there is nowhere for "40%" to go. Beside it, every size reads.
|
|
20
|
+
*/
|
|
21
|
+
export const PlProgressCircular = /* @__PURE__ */ React.forwardRef(function PlProgressCircular({ size = 'md', color = 'primary', value = null, min = 0, max = 100, label, showValue = false, format, className, style, ...props }, ref) {
|
|
22
|
+
const fraction = progressFraction(value, min, max);
|
|
23
|
+
const indeterminate = fraction === null;
|
|
24
|
+
const hasFormat = format !== undefined;
|
|
25
|
+
const gradientId = `${React.useId()}-fill`;
|
|
26
|
+
const diameter = ringDiameters[size];
|
|
27
|
+
const stroke = ringStrokes[size];
|
|
28
|
+
const centre = diameter / 2;
|
|
29
|
+
// The stroke straddles the path, so the radius has to come in by half of it
|
|
30
|
+
// or the ring is clipped by its own viewBox.
|
|
31
|
+
const radius = centre - stroke / 2;
|
|
32
|
+
const circumference = 2 * Math.PI * radius;
|
|
33
|
+
// Indeterminate draws a fixed quarter-arc and turns; determinate holds still
|
|
34
|
+
// and lets the gap close. Both are one dash pattern on one circle.
|
|
35
|
+
const dashArray = indeterminate ? `${circumference * 0.28} ${circumference}` : `${circumference}`;
|
|
36
|
+
const dashOffset = indeterminate ? 0 : circumference * (1 - fraction);
|
|
37
|
+
return (_jsxs(Progress.Root, { ref: ref, value: value ?? null, min: min, max: max, format: format, getAriaValueText: progressAriaText(fraction, hasFormat), className: cx('inline-flex items-center', gapClasses[size], metaTextClasses[size], className), style: { ...progressSlots(color), ...style }, ...props, children: [_jsxs("svg", {
|
|
38
|
+
// The rotation is on the whole `<svg>` and not on a group inside it:
|
|
39
|
+
// `transform-origin: center` resolves against an element's border box,
|
|
40
|
+
// which an SVG child does not have one of unless `transform-box` is set
|
|
41
|
+
// as well. One element, one rule, no surprises across browsers.
|
|
42
|
+
className: cx('shrink-0', indeterminate && 'plass-ring-spin'), width: diameter, height: diameter, viewBox: `0 0 ${diameter} ${diameter}`, fill: "none", "aria-hidden": "true", children: [_jsx("defs", { children: _jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "1", y2: "1", children: [_jsx("stop", { offset: "0%", stopColor: "var(--p-solid)" }), _jsx("stop", { offset: "100%", stopColor: "var(--p-solid-to)" })] }) }), _jsx("circle", { cx: centre, cy: centre, r: radius, stroke: "var(--plass-track)", strokeWidth: stroke }), _jsx("circle", { cx: centre, cy: centre, r: radius, stroke: `url(#${gradientId})`, strokeWidth: stroke, strokeLinecap: "round", strokeDasharray: dashArray, strokeDashoffset: dashOffset,
|
|
43
|
+
// An SVG geometry attribute rather than a CSS transform: this is where
|
|
44
|
+
// the arc starts, not something the ring does when its state changes.
|
|
45
|
+
// Without it a determinate ring would fill from three o'clock.
|
|
46
|
+
transform: `rotate(-90 ${centre} ${centre})`, className: "[transition:stroke-dashoffset_var(--plass-duration-slow)_var(--plass-ease)]" })] }), label ? (_jsx(Progress.Label, { className: "min-w-0 truncate text-(--plass-fg)", children: label })) : null, showValue ? (_jsx(Progress.Value, { className: "shrink-0 tabular-nums text-(--plass-muted-fg)", children: (formatted) => progressText(fraction, formatted, hasFormat) })) : null] }));
|
|
47
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PlProgressCircular } from './PlProgressCircular.js';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type PlassProgressProps } from '../../internal/progress.js';
|
|
3
|
+
export interface PlProgressLinearProps extends PlassProgressProps {
|
|
4
|
+
/** Thickness of the groove. Nothing else on a bar has a size. */
|
|
5
|
+
size?: PlassProgressProps['size'];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A bar that fills.
|
|
9
|
+
*
|
|
10
|
+
* The workhorse of the three: it is the only one that can show *how much* is
|
|
11
|
+
* left at a glance, because length is the one quantity a reader can compare
|
|
12
|
+
* without counting.
|
|
13
|
+
*
|
|
14
|
+
* The groove is `--plass-track`, the same neutral ink a PlSlider's rail and a
|
|
15
|
+
* PlSwitch's off state are cut in, and the segment over it is the family's
|
|
16
|
+
* gradient — so the filled part of the run is made of exactly the same material
|
|
17
|
+
* as the button that submits the form it is in. Which is also why the movement
|
|
18
|
+
* is on `width`: a gradient cannot be transitioned, and a length can.
|
|
19
|
+
*
|
|
20
|
+
* Both the groove and the segment are fully rounded, and that is the one place
|
|
21
|
+
* the library's rule about pills does not apply. The rule protects the flat run
|
|
22
|
+
* along a control's edge that a line of text sits on; at six pixels tall there
|
|
23
|
+
* is no flat run left to protect, and a square-ended bar reads as a rendering
|
|
24
|
+
* fault rather than as a cut edge.
|
|
25
|
+
*
|
|
26
|
+
* Base UI owns the semantics — `role="progressbar"`, the value and range
|
|
27
|
+
* attributes, `aria-valuetext`, and dropping the value entirely when the bar is
|
|
28
|
+
* indeterminate — and it computes the fill width too, so the determinate case
|
|
29
|
+
* here is a class list and nothing else.
|
|
30
|
+
*/
|
|
31
|
+
export declare const PlProgressLinear: React.ForwardRefExoticComponent<PlProgressLinearProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Progress } from '@base-ui/react/progress';
|
|
4
|
+
import { barThicknessClasses, fillTransitionClasses, progressAriaText, progressFraction, progressSlots, progressText, trackClasses } from '../../internal/progress.js';
|
|
5
|
+
import { cx, metaTextClasses, stackGapClasses } from '../../internal/styles.js';
|
|
6
|
+
/**
|
|
7
|
+
* A bar that fills.
|
|
8
|
+
*
|
|
9
|
+
* The workhorse of the three: it is the only one that can show *how much* is
|
|
10
|
+
* left at a glance, because length is the one quantity a reader can compare
|
|
11
|
+
* without counting.
|
|
12
|
+
*
|
|
13
|
+
* The groove is `--plass-track`, the same neutral ink a PlSlider's rail and a
|
|
14
|
+
* PlSwitch's off state are cut in, and the segment over it is the family's
|
|
15
|
+
* gradient — so the filled part of the run is made of exactly the same material
|
|
16
|
+
* as the button that submits the form it is in. Which is also why the movement
|
|
17
|
+
* is on `width`: a gradient cannot be transitioned, and a length can.
|
|
18
|
+
*
|
|
19
|
+
* Both the groove and the segment are fully rounded, and that is the one place
|
|
20
|
+
* the library's rule about pills does not apply. The rule protects the flat run
|
|
21
|
+
* along a control's edge that a line of text sits on; at six pixels tall there
|
|
22
|
+
* is no flat run left to protect, and a square-ended bar reads as a rendering
|
|
23
|
+
* fault rather than as a cut edge.
|
|
24
|
+
*
|
|
25
|
+
* Base UI owns the semantics — `role="progressbar"`, the value and range
|
|
26
|
+
* attributes, `aria-valuetext`, and dropping the value entirely when the bar is
|
|
27
|
+
* indeterminate — and it computes the fill width too, so the determinate case
|
|
28
|
+
* here is a class list and nothing else.
|
|
29
|
+
*/
|
|
30
|
+
export const PlProgressLinear = /* @__PURE__ */ React.forwardRef(function PlProgressLinear({ size = 'md', color = 'primary', value = null, min = 0, max = 100, label, showValue = false, format, className, style, ...props }, ref) {
|
|
31
|
+
const fraction = progressFraction(value, min, max);
|
|
32
|
+
const indeterminate = fraction === null;
|
|
33
|
+
const hasFormat = format !== undefined;
|
|
34
|
+
return (_jsxs(Progress.Root, { ref: ref, value: value ?? null, min: min, max: max, format: format, getAriaValueText: progressAriaText(fraction, hasFormat), className: cx('flex w-full flex-col', stackGapClasses[size], className), style: { ...progressSlots(color), ...style }, ...props, children: [label || showValue ? (_jsxs("div", { className: cx('flex items-baseline gap-2', label ? 'justify-between' : 'justify-end', metaTextClasses[size]), children: [label ? (_jsx(Progress.Label, { className: "min-w-0 truncate text-(--plass-fg)", children: label })) : null, showValue ? (_jsx(Progress.Value, { className: "shrink-0 tabular-nums text-(--plass-muted-fg)", children: (formatted) => progressText(fraction, formatted, hasFormat) })) : null] })) : null, _jsx(Progress.Track, { className: cx('relative w-full overflow-hidden rounded-full', trackClasses, barThicknessClasses[size]), children: _jsx(Progress.Indicator, { className: cx('rounded-full [background-image:var(--p-fill)]',
|
|
35
|
+
// `plass-progress-sweep` supplies the position, the width and the
|
|
36
|
+
// animation; with a value Base UI supplies the width instead and
|
|
37
|
+
// this transition is what makes it travel rather than jump. Both
|
|
38
|
+
// change an inline size, never a transform.
|
|
39
|
+
indeterminate ? 'plass-progress-sweep' : `absolute top-0 ${fillTransitionClasses}`) }) })] }));
|
|
40
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PlProgressLinear } from './PlProgressLinear.js';
|