@endfield-ui/react 1.2.0 → 1.2.1
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 +8 -3
- package/dist/components/accordion/Accordion.d.ts +46 -0
- package/dist/components/accordion/Accordion.js +2 -0
- package/dist/components/accordion/index.d.ts +3 -0
- package/dist/components/alert/Alert.d.ts +28 -0
- package/dist/components/alert/Alert.js +2 -0
- package/dist/components/alert/index.d.ts +3 -0
- package/dist/components/avatar/Avatar.d.ts +24 -0
- package/dist/components/avatar/Avatar.js +2 -0
- package/dist/components/avatar/AvatarSwitcher.d.ts +46 -0
- package/dist/components/avatar/AvatarSwitcher.js +2 -0
- package/dist/components/avatar/index.d.ts +4 -0
- package/dist/components/back-to-top/BackToTop.d.ts +21 -0
- package/dist/components/back-to-top/BackToTop.js +2 -0
- package/dist/components/back-to-top/index.d.ts +3 -0
- package/dist/components/badge/Badge.d.ts +20 -0
- package/dist/components/badge/Badge.js +2 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/bracket-title/BracketTitle.d.ts +17 -0
- package/dist/components/bracket-title/BracketTitle.js +2 -0
- package/dist/components/bracket-title/index.d.ts +3 -0
- package/dist/components/breadcrumb/Breadcrumb.d.ts +26 -0
- package/dist/components/breadcrumb/Breadcrumb.js +2 -0
- package/dist/components/breadcrumb/index.d.ts +3 -0
- package/dist/components/button/Button.d.ts +50 -0
- package/dist/components/button/Button.js +2 -0
- package/dist/components/button/ButtonGroup.d.ts +21 -0
- package/dist/components/button/ButtonGroup.js +2 -0
- package/dist/components/button/index.d.ts +4 -0
- package/dist/components/calendar/Calendar.d.ts +57 -0
- package/dist/components/calendar/Calendar.js +2 -0
- package/dist/components/calendar/index.d.ts +3 -0
- package/dist/components/carousel/Carousel.d.ts +38 -0
- package/dist/components/carousel/Carousel.js +2 -0
- package/dist/components/carousel/index.d.ts +3 -0
- package/dist/components/carousel/snap-track.js +2 -0
- package/dist/components/checkbox/Checkbox.d.ts +18 -0
- package/dist/components/checkbox/Checkbox.js +2 -0
- package/dist/components/checkbox/choice-style.js +2 -0
- package/dist/components/checkbox/index.d.ts +3 -0
- package/dist/components/chip/FilterChip.d.ts +18 -0
- package/dist/components/chip/FilterChip.js +2 -0
- package/dist/components/chip/ResourceChip.d.ts +16 -0
- package/dist/components/chip/ResourceChip.js +2 -0
- package/dist/components/chip/capsule-style.d.ts +4 -0
- package/dist/components/chip/capsule-style.js +2 -0
- package/dist/components/chip/index.d.ts +4 -0
- package/dist/components/combobox/Combobox.d.ts +105 -0
- package/dist/components/combobox/Combobox.js +2 -0
- package/dist/components/combobox/index.d.ts +3 -0
- package/dist/components/completion-banner/CompletionBanner.d.ts +26 -0
- package/dist/components/completion-banner/CompletionBanner.js +2 -0
- package/dist/components/completion-banner/index.d.ts +3 -0
- package/dist/components/context-menu/ContextMenu.d.ts +30 -0
- package/dist/components/context-menu/ContextMenu.js +2 -0
- package/dist/components/context-menu/index.d.ts +3 -0
- package/dist/components/corner-brackets/CornerBrackets.d.ts +20 -0
- package/dist/components/corner-brackets/CornerBrackets.js +2 -0
- package/dist/components/corner-brackets/index.d.ts +3 -0
- package/dist/components/countdown/Countdown.d.ts +26 -0
- package/dist/components/countdown/Countdown.js +2 -0
- package/dist/components/countdown/index.d.ts +3 -0
- package/dist/components/dash-indicator/DashIndicator.d.ts +15 -0
- package/dist/components/dash-indicator/DashIndicator.js +2 -0
- package/dist/components/dash-indicator/index.d.ts +3 -0
- package/dist/components/data-row/DataRow.d.ts +58 -0
- package/dist/components/data-row/DataRow.js +2 -0
- package/dist/components/data-row/index.d.ts +3 -0
- package/dist/components/date-picker/DateField.js +2 -0
- package/dist/components/date-picker/DatePicker.d.ts +56 -0
- package/dist/components/date-picker/DatePicker.js +2 -0
- package/dist/components/date-picker/DateRangePicker.d.ts +57 -0
- package/dist/components/date-picker/DateRangePicker.js +2 -0
- package/dist/components/date-picker/index.d.ts +4 -0
- package/dist/components/dialog/Dialog.d.ts +55 -0
- package/dist/components/dialog/Dialog.js +2 -0
- package/dist/components/dialog/index.d.ts +3 -0
- package/dist/components/dialog/initial-focus.js +2 -0
- package/dist/components/dialog/overlay-style.js +2 -0
- package/dist/components/drawer/Drawer.d.ts +48 -0
- package/dist/components/drawer/Drawer.js +2 -0
- package/dist/components/drawer/index.d.ts +3 -0
- package/dist/components/dropdown-menu/DropdownMenu.d.ts +115 -0
- package/dist/components/dropdown-menu/DropdownMenu.js +2 -0
- package/dist/components/dropdown-menu/MenuCheck.js +2 -0
- package/dist/components/dropdown-menu/index.d.ts +3 -0
- package/dist/components/dropdown-menu/menu-style.d.ts +4 -0
- package/dist/components/dropdown-menu/menu-style.js +2 -0
- package/dist/components/empty-state/EmptyState.d.ts +22 -0
- package/dist/components/empty-state/EmptyState.js +2 -0
- package/dist/components/empty-state/index.d.ts +3 -0
- package/dist/components/field/Field.d.ts +58 -0
- package/dist/components/field/Field.js +2 -0
- package/dist/components/field/index.d.ts +3 -0
- package/dist/components/file-upload/FileItem.d.ts +50 -0
- package/dist/components/file-upload/FileItem.js +2 -0
- package/dist/components/file-upload/FileUpload.d.ts +82 -0
- package/dist/components/file-upload/FileUpload.js +2 -0
- package/dist/components/file-upload/index.d.ts +4 -0
- package/dist/components/flyout-bar/FlyoutBar.d.ts +46 -0
- package/dist/components/flyout-bar/FlyoutBar.js +2 -0
- package/dist/components/flyout-bar/index.d.ts +3 -0
- package/dist/components/ghost-text/GhostText.d.ts +21 -0
- package/dist/components/ghost-text/GhostText.js +2 -0
- package/dist/components/ghost-text/index.d.ts +3 -0
- package/dist/components/hatch/Hatch.d.ts +18 -0
- package/dist/components/hatch/Hatch.js +2 -0
- package/dist/components/hatch/index.d.ts +3 -0
- package/dist/components/hazard-stripe/HazardStripe.d.ts +15 -0
- package/dist/components/hazard-stripe/HazardStripe.js +2 -0
- package/dist/components/hazard-stripe/index.d.ts +3 -0
- package/dist/components/hover-card/HoverCard.d.ts +35 -0
- package/dist/components/hover-card/HoverCard.js +2 -0
- package/dist/components/hover-card/index.d.ts +3 -0
- package/dist/components/icon-button/IconButton.d.ts +21 -0
- package/dist/components/icon-button/IconButton.js +2 -0
- package/dist/components/icon-button/index.d.ts +3 -0
- package/dist/components/image-viewer/ImageViewer.d.ts +48 -0
- package/dist/components/image-viewer/ImageViewer.js +2 -0
- package/dist/components/image-viewer/index.d.ts +3 -0
- package/dist/components/input/Input.d.ts +27 -0
- package/dist/components/input/Input.js +2 -0
- package/dist/components/input/control-box.d.ts +5 -0
- package/dist/components/input/control-box.js +2 -0
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/value-chip.js +2 -0
- package/dist/components/item-slot/ItemGrid.d.ts +12 -0
- package/dist/components/item-slot/ItemGrid.js +2 -0
- package/dist/components/item-slot/ItemSlot.d.ts +54 -0
- package/dist/components/item-slot/ItemSlot.js +2 -0
- package/dist/components/item-slot/index.d.ts +4 -0
- package/dist/components/kbd/Kbd.d.ts +15 -0
- package/dist/components/kbd/Kbd.js +2 -0
- package/dist/components/kbd/index.d.ts +3 -0
- package/dist/components/link-element/LinkElement.d.ts +6 -0
- package/dist/components/link-element/LinkElement.js +2 -0
- package/dist/components/list/List.d.ts +46 -0
- package/dist/components/list/List.js +2 -0
- package/dist/components/list/band-style.js +2 -0
- package/dist/components/list/index.d.ts +3 -0
- package/dist/components/loader/Loader.d.ts +23 -0
- package/dist/components/loader/Loader.js +2 -0
- package/dist/components/loader/index.d.ts +3 -0
- package/dist/components/marquee/Marquee.d.ts +22 -0
- package/dist/components/marquee/Marquee.js +2 -0
- package/dist/components/marquee/index.d.ts +3 -0
- package/dist/components/media-card/MediaCard.d.ts +36 -0
- package/dist/components/media-card/MediaCard.js +2 -0
- package/dist/components/media-card/index.d.ts +3 -0
- package/dist/components/nav-action/NavAction.d.ts +34 -0
- package/dist/components/nav-action/NavAction.js +2 -0
- package/dist/components/nav-action/index.d.ts +3 -0
- package/dist/components/nav-menu/NavMenu.d.ts +57 -0
- package/dist/components/nav-menu/NavMenu.js +2 -0
- package/dist/components/nav-menu/index.d.ts +3 -0
- package/dist/components/navigator/Navigator.d.ts +27 -0
- package/dist/components/navigator/Navigator.js +2 -0
- package/dist/components/navigator/index.d.ts +3 -0
- package/dist/components/otp-input/OtpInput.d.ts +52 -0
- package/dist/components/otp-input/OtpInput.js +2 -0
- package/dist/components/otp-input/index.d.ts +3 -0
- package/dist/components/page-header/PageHeader.d.ts +56 -0
- package/dist/components/page-header/PageHeader.js +2 -0
- package/dist/components/page-header/index.d.ts +3 -0
- package/dist/components/pagination/Pagination.d.ts +29 -0
- package/dist/components/pagination/Pagination.js +2 -0
- package/dist/components/pagination/index.d.ts +3 -0
- package/dist/components/panel/Panel.d.ts +36 -0
- package/dist/components/panel/Panel.js +2 -0
- package/dist/components/panel/index.d.ts +3 -0
- package/dist/components/play-button/PlayButton.d.ts +20 -0
- package/dist/components/play-button/PlayButton.js +2 -0
- package/dist/components/play-button/index.d.ts +3 -0
- package/dist/components/popover/Popover.d.ts +36 -0
- package/dist/components/popover/Popover.js +2 -0
- package/dist/components/popover/index.d.ts +3 -0
- package/dist/components/popover/panel-style.js +2 -0
- package/dist/components/progress/Progress.d.ts +27 -0
- package/dist/components/progress/Progress.js +2 -0
- package/dist/components/progress/ProgressRing.d.ts +23 -0
- package/dist/components/progress/ProgressRing.js +2 -0
- package/dist/components/progress/index.d.ts +4 -0
- package/dist/components/radio/Radio.d.ts +33 -0
- package/dist/components/radio/Radio.js +2 -0
- package/dist/components/radio/index.d.ts +3 -0
- package/dist/components/rec-indicator/RecIndicator.d.ts +16 -0
- package/dist/components/rec-indicator/RecIndicator.js +2 -0
- package/dist/components/rec-indicator/index.d.ts +3 -0
- package/dist/components/registration-strip/RegistrationStrip.d.ts +16 -0
- package/dist/components/registration-strip/RegistrationStrip.js +2 -0
- package/dist/components/registration-strip/index.d.ts +3 -0
- package/dist/components/rolling-number/RollingNumber.d.ts +25 -0
- package/dist/components/rolling-number/RollingNumber.js +2 -0
- package/dist/components/rolling-number/index.d.ts +3 -0
- package/dist/components/schedule/Schedule.d.ts +78 -0
- package/dist/components/schedule/Schedule.js +2 -0
- package/dist/components/schedule/index.d.ts +3 -0
- package/dist/components/scroll-area/ScrollArea.d.ts +26 -0
- package/dist/components/scroll-area/ScrollArea.js +2 -0
- package/dist/components/scroll-area/index.d.ts +3 -0
- package/dist/components/scroll-hint/ScrollHint.d.ts +23 -0
- package/dist/components/scroll-hint/ScrollHint.js +2 -0
- package/dist/components/scroll-hint/index.d.ts +3 -0
- package/dist/components/section-title/SectionTitle.d.ts +33 -0
- package/dist/components/section-title/SectionTitle.js +2 -0
- package/dist/components/section-title/index.d.ts +3 -0
- package/dist/components/segmented-control/SegmentedControl.d.ts +49 -0
- package/dist/components/segmented-control/SegmentedControl.js +2 -0
- package/dist/components/segmented-control/index.d.ts +3 -0
- package/dist/components/select/Select.d.ts +95 -0
- package/dist/components/select/Select.js +2 -0
- package/dist/components/select/index.d.ts +3 -0
- package/dist/components/side-rail/SideRail.d.ts +62 -0
- package/dist/components/side-rail/SideRail.js +2 -0
- package/dist/components/side-rail/SideRailSub.d.ts +47 -0
- package/dist/components/side-rail/SideRailSub.js +2 -0
- package/dist/components/side-rail/index.d.ts +4 -0
- package/dist/components/skeleton/Skeleton.d.ts +22 -0
- package/dist/components/skeleton/Skeleton.js +2 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/slider/Slider.d.ts +63 -0
- package/dist/components/slider/Slider.js +2 -0
- package/dist/components/slider/index.d.ts +3 -0
- package/dist/components/sparkline/Sparkline.d.ts +32 -0
- package/dist/components/sparkline/Sparkline.js +2 -0
- package/dist/components/sparkline/index.d.ts +3 -0
- package/dist/components/spinner/Spinner.d.ts +19 -0
- package/dist/components/spinner/Spinner.js +2 -0
- package/dist/components/spinner/index.d.ts +3 -0
- package/dist/components/splash-screen/SplashScreen.d.ts +43 -0
- package/dist/components/splash-screen/SplashScreen.js +2 -0
- package/dist/components/splash-screen/index.d.ts +3 -0
- package/dist/components/stat/Stat.d.ts +22 -0
- package/dist/components/stat/Stat.js +2 -0
- package/dist/components/stat/index.d.ts +3 -0
- package/dist/components/stepper/Stepper.d.ts +29 -0
- package/dist/components/stepper/Stepper.js +2 -0
- package/dist/components/stepper/index.d.ts +3 -0
- package/dist/components/steps/Steps.d.ts +55 -0
- package/dist/components/steps/Steps.js +2 -0
- package/dist/components/steps/index.d.ts +3 -0
- package/dist/components/switch/Switch.d.ts +28 -0
- package/dist/components/switch/Switch.js +2 -0
- package/dist/components/switch/index.d.ts +3 -0
- package/dist/components/table/Table.d.ts +96 -0
- package/dist/components/table/Table.js +2 -0
- package/dist/components/table/index.d.ts +3 -0
- package/dist/components/tabs/Tabs.d.ts +39 -0
- package/dist/components/tabs/Tabs.js +2 -0
- package/dist/components/tabs/index.d.ts +3 -0
- package/dist/components/tag/Tag.d.ts +25 -0
- package/dist/components/tag/Tag.js +2 -0
- package/dist/components/tag/TagPair.d.ts +16 -0
- package/dist/components/tag/TagPair.js +2 -0
- package/dist/components/tag/index.d.ts +4 -0
- package/dist/components/tag-input/TagInput.d.ts +66 -0
- package/dist/components/tag-input/TagInput.js +3 -0
- package/dist/components/tag-input/index.d.ts +3 -0
- package/dist/components/term/Term.d.ts +19 -0
- package/dist/components/term/Term.js +2 -0
- package/dist/components/term/index.d.ts +3 -0
- package/dist/components/textarea/Textarea.d.ts +17 -0
- package/dist/components/textarea/Textarea.js +2 -0
- package/dist/components/textarea/index.d.ts +3 -0
- package/dist/components/texture/Texture.d.ts +19 -0
- package/dist/components/texture/Texture.js +2 -0
- package/dist/components/texture/index.d.ts +3 -0
- package/dist/components/tick-ring/TickRing.d.ts +22 -0
- package/dist/components/tick-ring/TickRing.js +2 -0
- package/dist/components/tick-ring/index.d.ts +3 -0
- package/dist/components/timeline/Timeline.d.ts +22 -0
- package/dist/components/timeline/Timeline.js +2 -0
- package/dist/components/timeline/index.d.ts +3 -0
- package/dist/components/toast/Toast.d.ts +45 -0
- package/dist/components/toast/Toast.js +2 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toc/Toc.d.ts +46 -0
- package/dist/components/toc/Toc.js +2 -0
- package/dist/components/toc/index.d.ts +3 -0
- package/dist/components/toolbar/Toolbar.d.ts +97 -0
- package/dist/components/toolbar/Toolbar.js +2 -0
- package/dist/components/toolbar/index.d.ts +3 -0
- package/dist/components/tooltip/Tooltip.d.ts +47 -0
- package/dist/components/tooltip/Tooltip.js +2 -0
- package/dist/components/tooltip/index.d.ts +3 -0
- package/dist/components/top-bar/TopBar.d.ts +21 -0
- package/dist/components/top-bar/TopBar.js +2 -0
- package/dist/components/top-bar/index.d.ts +3 -0
- package/dist/components/viewfinder/Viewfinder.d.ts +35 -0
- package/dist/components/viewfinder/Viewfinder.js +2 -0
- package/dist/components/viewfinder/index.d.ts +3 -0
- package/dist/game/animated-dialog/AnimatedDialog.d.ts +53 -0
- package/dist/game/animated-dialog/AnimatedDialog.js +2 -0
- package/dist/game/animated-dialog/index.d.ts +3 -0
- package/dist/game/banner-alert/AlertIcons.js +2 -0
- package/dist/game/banner-alert/AlertModal.js +2 -0
- package/dist/game/banner-alert/BannerAlert.d.ts +6 -0
- package/dist/game/banner-alert/BannerAlert.js +2 -0
- package/dist/game/banner-alert/index.d.ts +3 -0
- package/dist/game/banner-alert/types.d.ts +48 -0
- package/dist/game/banner-alert/types.js +2 -0
- package/dist/game/banner-alert/useAlertActions.js +2 -0
- package/dist/game/banner-alert/useAlertGlitch.js +2 -0
- package/dist/game/full-width-alert/FullWidthAlert.d.ts +7 -0
- package/dist/game/full-width-alert/FullWidthAlert.js +2 -0
- package/dist/game/full-width-alert/index.d.ts +3 -0
- package/dist/game/item-card/ItemCard.d.ts +48 -0
- package/dist/game/item-card/ItemCard.js +2 -0
- package/dist/game/item-card/index.d.ts +3 -0
- package/dist/game/item-hover-card/ItemHoverCard.d.ts +31 -0
- package/dist/game/item-hover-card/ItemHoverCard.js +2 -0
- package/dist/game/item-hover-card/events.js +2 -0
- package/dist/game/item-hover-card/index.d.ts +3 -0
- package/dist/game/item-icon/ItemIcon.d.ts +5 -0
- package/dist/game/item-icon/ItemIcon.js +2 -0
- package/dist/game/item-icon/helpers.d.ts +22 -0
- package/dist/game/item-icon/helpers.js +2 -0
- package/dist/game/item-icon/index.d.ts +5 -0
- package/dist/game/item-icon/types.d.ts +32 -0
- package/dist/game/item-tooltip-card/ItemTooltipCard.d.ts +6 -0
- package/dist/game/item-tooltip-card/ItemTooltipCard.js +2 -0
- package/dist/game/item-tooltip-card/icons.js +2 -0
- package/dist/game/item-tooltip-card/index.d.ts +4 -0
- package/dist/game/item-tooltip-card/types.d.ts +40 -0
- package/dist/game/lib/core.d.ts +8 -0
- package/dist/game/lib/first-focusable.js +2 -0
- package/dist/game/rounded-button/RoundedButton.d.ts +22 -0
- package/dist/game/rounded-button/RoundedButton.js +2 -0
- package/dist/game/rounded-button/RoundedIconButton.d.ts +10 -0
- package/dist/game/rounded-button/RoundedIconButton.js +2 -0
- package/dist/game/rounded-button/index.d.ts +4 -0
- package/dist/game/rounded-select/RoundedSelect.d.ts +43 -0
- package/dist/game/rounded-select/RoundedSelect.js +2 -0
- package/dist/game/rounded-select/index.d.ts +3 -0
- package/dist/game/rounded-switch/RoundedSwitch.d.ts +16 -0
- package/dist/game/rounded-switch/RoundedSwitch.js +2 -0
- package/dist/game/rounded-switch/index.d.ts +3 -0
- package/dist/game/rounded-toggle/RoundedToggle.d.ts +23 -0
- package/dist/game/rounded-toggle/RoundedToggle.js +2 -0
- package/dist/game/rounded-toggle/index.d.ts +3 -0
- package/dist/game/rounded-toggle/keyboard.js +2 -0
- package/dist/game/rounded-toggle/spring-highlight.js +2 -0
- package/dist/game/splash-screen/EndfieldSplashScreen.d.ts +14 -0
- package/dist/game/splash-screen/EndfieldSplashScreen.js +2 -0
- package/dist/game/splash-screen/index.d.ts +3 -0
- package/dist/game.d.ts +29 -383
- package/dist/game.js +1 -2068
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/useAddedKeys.js +2 -0
- package/dist/hooks/useControllableState.d.ts +12 -0
- package/dist/hooks/useControllableState.js +2 -0
- package/dist/hooks/useFlip.js +2 -0
- package/dist/hooks/useInView.d.ts +15 -0
- package/dist/hooks/useInView.js +2 -0
- package/dist/hooks/useIndicator.js +2 -0
- package/dist/hooks/useLingering.js +2 -0
- package/dist/hooks/useOverflowing.js +2 -0
- package/dist/hooks/usePortalScope.d.ts +26 -0
- package/dist/hooks/usePortalScope.js +2 -0
- package/dist/hooks/usePresence.js +2 -0
- package/dist/hooks/useReducedMotion.d.ts +10 -0
- package/dist/hooks/useReducedMotion.js +2 -0
- package/dist/hooks/useScrollPosition.js +2 -0
- package/dist/hooks/useTheme.d.ts +21 -0
- package/dist/hooks/useTheme.js +2 -0
- package/dist/icons/ArrowCorner.d.ts +9 -0
- package/dist/icons/ArrowCorner.js +2 -0
- package/dist/icons/ArrowLeft.d.ts +8 -0
- package/dist/icons/ArrowLeft.js +2 -0
- package/dist/icons/ArrowRight.d.ts +8 -0
- package/dist/icons/ArrowRight.js +2 -0
- package/dist/icons/CalendarIcon.d.ts +12 -0
- package/dist/icons/CalendarIcon.js +2 -0
- package/dist/icons/Check.d.ts +9 -0
- package/dist/icons/Check.js +2 -0
- package/dist/icons/ChevronDown.d.ts +8 -0
- package/dist/icons/ChevronDown.js +2 -0
- package/dist/icons/ChevronLeft.d.ts +8 -0
- package/dist/icons/ChevronLeft.js +2 -0
- package/dist/icons/ChevronRight.d.ts +8 -0
- package/dist/icons/ChevronRight.js +2 -0
- package/dist/icons/Close.d.ts +8 -0
- package/dist/icons/Close.js +2 -0
- package/dist/icons/Crosshair.d.ts +9 -0
- package/dist/icons/Crosshair.js +2 -0
- package/dist/icons/Lock.d.ts +8 -0
- package/dist/icons/Lock.js +2 -0
- package/dist/icons/Menu.d.ts +9 -0
- package/dist/icons/Menu.js +2 -0
- package/dist/icons/Minus.d.ts +9 -0
- package/dist/icons/Minus.js +2 -0
- package/dist/icons/Plus.d.ts +8 -0
- package/dist/icons/Plus.js +2 -0
- package/dist/icons/StatusDanger.d.ts +9 -0
- package/dist/icons/StatusDanger.js +2 -0
- package/dist/icons/StatusInfo.d.ts +9 -0
- package/dist/icons/StatusInfo.js +2 -0
- package/dist/icons/StatusSuccess.d.ts +9 -0
- package/dist/icons/StatusSuccess.js +2 -0
- package/dist/icons/StatusWarning.d.ts +9 -0
- package/dist/icons/StatusWarning.js +2 -0
- package/dist/icons/TriangleRight.d.ts +9 -0
- package/dist/icons/TriangleRight.js +2 -0
- package/dist/icons/Upload.d.ts +9 -0
- package/dist/icons/Upload.js +2 -0
- package/dist/icons/createIcon.d.ts +16 -0
- package/dist/icons/createIcon.js +2 -0
- package/dist/icons/index.d.ts +23 -0
- package/dist/index.d.ts +209 -3546
- package/dist/index.js +1 -9848
- package/dist/lib/cn.d.ts +5 -0
- package/dist/lib/cn.js +2 -0
- package/dist/lib/create-lazy-context.js +2 -0
- package/dist/lib/date.js +2 -0
- package/dist/lib/decor.js +2 -0
- package/dist/lib/defined.js +2 -0
- package/dist/lib/file.js +2 -0
- package/dist/lib/focus-ring.js +2 -0
- package/dist/lib/inline-style.js +2 -0
- package/dist/lib/merge-refs.js +2 -0
- package/dist/lib/motion.js +2 -0
- package/package.json +17 -11
- package/src/components/accordion/Accordion.tsx +13 -5
- package/src/components/avatar/AvatarSwitcher.tsx +7 -5
- package/src/components/carousel/Carousel.tsx +6 -5
- package/src/components/context-menu/ContextMenu.tsx +5 -2
- package/src/components/data-row/DataRow.tsx +10 -4
- package/src/components/date-picker/DateField.tsx +1 -1
- package/src/components/dropdown-menu/DropdownMenu.tsx +7 -4
- package/src/components/dropdown-menu/menu-style.ts +3 -2
- package/src/components/field/Field.tsx +10 -6
- package/src/components/flyout-bar/FlyoutBar.tsx +1 -1
- package/src/components/image-viewer/ImageViewer.tsx +6 -5
- package/src/components/list/List.tsx +7 -5
- package/src/components/nav-action/NavAction.tsx +4 -3
- package/src/components/nav-menu/NavMenu.tsx +13 -7
- package/src/components/radio/Radio.tsx +7 -5
- package/src/components/schedule/Schedule.tsx +7 -5
- package/src/components/segmented-control/SegmentedControl.tsx +7 -5
- package/src/components/select/Select.tsx +11 -9
- package/src/components/side-rail/SideRail.tsx +15 -9
- package/src/components/side-rail/SideRailSub.tsx +12 -7
- package/src/components/steps/Steps.tsx +7 -5
- package/src/components/table/Table.tsx +23 -17
- package/src/components/tabs/Tabs.tsx +7 -5
- package/src/components/toast/Toast.tsx +8 -5
- package/src/components/toc/Toc.tsx +5 -4
- package/src/components/toolbar/Toolbar.tsx +7 -6
- package/src/components/tooltip/Tooltip.tsx +7 -4
- package/src/components/top-bar/TopBar.tsx +7 -2
- package/src/icons/ArrowCorner.tsx +1 -1
- package/src/icons/ArrowLeft.tsx +1 -1
- package/src/icons/ArrowRight.tsx +1 -1
- package/src/icons/CalendarIcon.tsx +1 -1
- package/src/icons/Check.tsx +4 -1
- package/src/icons/ChevronDown.tsx +4 -1
- package/src/icons/ChevronLeft.tsx +1 -1
- package/src/icons/ChevronRight.tsx +1 -1
- package/src/icons/Close.tsx +4 -1
- package/src/icons/Crosshair.tsx +1 -1
- package/src/icons/Lock.tsx +1 -1
- package/src/icons/Menu.tsx +4 -1
- package/src/icons/Minus.tsx +1 -1
- package/src/icons/Plus.tsx +4 -1
- package/src/icons/StatusDanger.tsx +1 -1
- package/src/icons/StatusInfo.tsx +1 -1
- package/src/icons/StatusSuccess.tsx +1 -1
- package/src/icons/StatusWarning.tsx +1 -1
- package/src/icons/TriangleRight.tsx +1 -1
- package/src/icons/Upload.tsx +1 -1
- package/src/lib/cn.ts +1 -1
- package/src/lib/create-lazy-context.ts +6 -0
- package/src/components/README.md +0 -191
- package/src/hooks/README.md +0 -20
- package/src/icons/README.md +0 -31
- package/src/lib/README.md +0 -19
- package/src/styles/README.md +0 -77
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ pnpm add @endfield-ui/react
|
|
|
37
37
|
| 样式 | Tailwind CSS v4(CSS-first,`@theme` 令牌,不使用 `tailwind.config.js`) |
|
|
38
38
|
| 变体 | 手写的 `Record<Variant, string>` + `cn()`(`clsx` + `tailwind-merge`) |
|
|
39
39
|
| 无障碍基元 | [Base UI](https://base-ui.com)(`@base-ui/react`),用在浮层和几个行为复杂的控件上:文字提示、气泡卡片、悬浮卡、弹窗、抽屉、全屏菜单、图片查看的大图层、轻提示、下拉选择、组合框、日期选择的面板、下拉菜单、右键菜单、展开条、折叠面板、侧轨的二级、工具栏、滑块、验证码输入、滚动区、头像。其余控件建立在原生元素上(月历是手写的:Base UI 还没有公开的日历基元) |
|
|
40
|
-
| 构建 | tsdown(ESM + 类型声明)+ `@tailwindcss/
|
|
40
|
+
| 构建 | tsdown(ESM + 类型声明)+ `@tailwindcss/node`(预编译 CSS) |
|
|
41
41
|
| 测试 | Vitest + Testing Library(jsdom) |
|
|
42
42
|
|
|
43
43
|
## 使用
|
|
@@ -942,10 +942,11 @@ packages/ui/
|
|
|
942
942
|
| --- | --- |
|
|
943
943
|
| `pnpm dev` | 启动 Storybook(`http://localhost:6106`),直接读本包源码,改了即热更新 |
|
|
944
944
|
| `pnpm test` | 跑单元测试 |
|
|
945
|
+
| `pnpm test:package` | 先 `pnpm build`,再检查发布产物、主入口与 Game 共享上下文,以及 Rollup 按需打包(模块版和重新合并的单文件版) |
|
|
945
946
|
| `pnpm test:browser` | 在真的浏览器里测键盘、焦点与布局(先 `pnpm build:docs`),见 [apps/docs](https://github.com/icaruszezen/endfield-ui/blob/main/apps/docs/README.md#浏览器实测) |
|
|
946
947
|
| `pnpm typecheck` | 类型检查全部工作区包 |
|
|
947
948
|
| `pnpm lint` | 用 oxlint 查写错的地方:漏掉的 `await`、钩子的用法、已弃用的接口等 |
|
|
948
|
-
| `pnpm build` |
|
|
949
|
+
| `pnpm build` | 按源码模块结构输出 JS 与类型声明;保留 `dist/index.js`、`dist/game.js` 两个公共入口,以及主库和 Game 的样式、图片、来源清单 |
|
|
949
950
|
| `pnpm format` | 用 Prettier 格式化全仓库;`pnpm format:check` 只检查不改,CI 跑的是它 |
|
|
950
951
|
|
|
951
952
|
格式用 Prettier 的默认配置,提交前跑一次 `pnpm format`。Markdown 不在它的范围里(它会把表格逐列补空格对齐);Tailwind 的类名顺序也不归它管。
|
|
@@ -954,11 +955,15 @@ packages/ui/
|
|
|
954
955
|
|
|
955
956
|
TypeScript 用的是 7.0。tsdown 在这个版本下生成类型声明时会提示"API 尚不稳定",目前产物正常;如果以后出问题,退路是 `tsc --emitDeclarationOnly`。
|
|
956
957
|
|
|
958
|
+
构建保留模块边界并压缩 JS,公共导入路径保持兼容。Context 统一通过 `createLazyContext` 缓存,纯工厂调用保留 tree-shaking 标记。源码用于 Tailwind 扫描,发布包只将 CSS 标为副作用。
|
|
959
|
+
|
|
960
|
+
`pnpm test:package` 检查真实 npm tarball 的导出、类型、共享上下文,以及六种用量下的模块版和单文件版按需打包,已接入 CI 和 `prepublishOnly`。测量范围与数据见 [PACKAGING.md](PACKAGING.md)。
|
|
961
|
+
|
|
957
962
|
### 发布
|
|
958
963
|
|
|
959
964
|
1. 改本目录 `package.json` 里的 `version`,在根目录的 [CHANGELOG.md](https://github.com/icaruszezen/endfield-ui/blob/main/CHANGELOG.md) 里写上这一版改了什么,提交并推到 `main`,等 CI 跑完。
|
|
960
965
|
2. 打一个和版本号对应的标签推上去:`git tag v1.0.0`,`git push origin v1.0.0`。
|
|
961
|
-
3. [publish.yml](https://github.com/icaruszezen/endfield-ui/blob/main/.github/workflows/publish.yml)
|
|
966
|
+
3. [publish.yml](https://github.com/icaruszezen/endfield-ui/blob/main/.github/workflows/publish.yml) 核对标签与版本号,跑类型检查、单元测试、构建与发布产物检查(`prepublishOnly`),然后发布到 npm。
|
|
962
967
|
|
|
963
968
|
认证用的是 npm 的 Trusted Publishing,仓库里不存 token:npm 上这个包的设置里登记了本仓库和 `publish.yml` 这个文件名,两边任何一个改名都要同步。
|
|
964
969
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, ReactNode } from "react";
|
|
3
|
+
//#region src/components/accordion/Accordion.d.ts
|
|
4
|
+
export type AccordionSize = "sm" | "md";
|
|
5
|
+
export type AccordionLevel = 2 | 3 | 4 | 5 | 6;
|
|
6
|
+
export type AccordionProps = Omit<ComponentProps<"div">, "defaultValue" | "onChange" | "style"> & {
|
|
7
|
+
/** 可以同时展开几项。默认开了这个,那个就收起来 */
|
|
8
|
+
multiple?: boolean;
|
|
9
|
+
/** 展开着的那几项的 `value` */
|
|
10
|
+
value?: string[];
|
|
11
|
+
defaultValue?: string[];
|
|
12
|
+
onValueChange?: (value: string[]) => void;
|
|
13
|
+
/** 标题行高 40 / 48px,默认 `md` */
|
|
14
|
+
size?: AccordionSize;
|
|
15
|
+
/** 标题的层级,默认 3(`<h3>`)。按它在页面里的位置给 */
|
|
16
|
+
level?: AccordionLevel;
|
|
17
|
+
/**
|
|
18
|
+
* 收起的内容也留在页面里:浏览器的页内查找找得到,找到时自动展开。
|
|
19
|
+
* 常见问题这类"来找一句话"的内容值得开
|
|
20
|
+
*/
|
|
21
|
+
searchable?: boolean;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** `AccordionItem` */
|
|
24
|
+
children: ReactNode;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 折叠面板:一摞可以各自展开收起的小节。先问能不能不折叠——
|
|
28
|
+
* 藏起来的东西有人会找不到。
|
|
29
|
+
*/
|
|
30
|
+
export declare function Accordion({ multiple, value, defaultValue, onValueChange, size, level, searchable, disabled, className, children, ...props }: AccordionProps): import("react").JSX.Element;
|
|
31
|
+
type ItemOwnProps = {
|
|
32
|
+
/** 这一项的标识:`Accordion` 的 `value` 里放的就是它 */
|
|
33
|
+
value: string;
|
|
34
|
+
/** 标题:写成"里面是什么" */
|
|
35
|
+
title: ReactNode;
|
|
36
|
+
/** 标题右侧、记号之前的补充:计数、一个标签。它在按钮里,不能放能点的东西 */
|
|
37
|
+
extra?: ReactNode;
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
/** 内容 */
|
|
40
|
+
children: ReactNode;
|
|
41
|
+
};
|
|
42
|
+
export type AccordionItemProps = ItemOwnProps & Omit<ComponentProps<"div">, keyof ItemOwnProps | "style">;
|
|
43
|
+
/** 折叠面板里的一节。 */
|
|
44
|
+
export declare function AccordionItem({ value, title, extra, disabled, className, children, ...props }: AccordionItemProps): import("react").JSX.Element;
|
|
45
|
+
//#endregion
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{Minus as e}from"../../icons/Minus.js";import{cn as t}from"../../lib/cn.js";import{focusRingInset as n}from"../../lib/focus-ring.js";import{createLazyContext as r}from"../../lib/create-lazy-context.js";import{Accordion as i}from"@base-ui/react/accordion";import{useContext as a,useMemo as o}from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";const l=/* @__PURE__ */ r({size:`md`,level:3});function u({multiple:e=!1,value:n,defaultValue:r,onValueChange:a,size:c=`md`,level:u=3,searchable:d=!1,disabled:f,className:p,children:m,...h}){let g=l(),_=o(()=>({size:c,level:u}),[c,u]);return/* @__PURE__ */ s(g.Provider,{value:_,children:/* @__PURE__ */ s(i.Root,{...h,multiple:e,value:n,defaultValue:r,onValueChange:a&&(e=>a(e)),hiddenUntilFound:d,disabled:f,"data-size":c,className:t(`flex flex-col border-t border-line text-ink`,p),children:m})})}const d={sm:`min-h-10 py-1.5 text-sm`,md:`min-h-12 py-2 text-base`};function f({value:r,title:o,extra:u,disabled:f,className:p,children:m,...h}){let{size:g,level:_}=a(l()),v=`h${_}`;return/* @__PURE__ */ c(i.Item,{...h,value:r,disabled:f,className:t(`border-b border-line`,p),children:[/* @__PURE__ */ s(i.Header,{render:/* @__PURE__ */ s(v,{}),className:`flex`,children:/* @__PURE__ */ c(i.Trigger,{render:(e,t)=>/* @__PURE__ */ s(`button`,{...e,disabled:!1,"aria-disabled":t.disabled||void 0}),className:t(`group/trigger flex w-full items-center gap-3 px-4 text-left font-medium`,`transition-colors duration-(--duration-fast) ease-standard`,`hover:bg-ink/5 data-panel-open:font-bold`,`data-disabled:cursor-not-allowed data-disabled:text-ink-disabled data-disabled:hover:bg-transparent`,n,d[g]),children:[/* @__PURE__ */ s(`span`,{className:`min-w-0 flex-1 wrap-anywhere`,children:o}),u&&/* @__PURE__ */ s(`span`,{className:`flex shrink-0 items-center gap-2 text-sm font-normal text-ink-secondary group-data-disabled/trigger:text-ink-disabled`,children:u}),/* @__PURE__ */ c(`span`,{"aria-hidden":`true`,className:`relative flex size-4 shrink-0 items-center justify-center text-ink-secondary group-data-disabled/trigger:text-ink-disabled`,children:[/* @__PURE__ */ s(e,{size:16}),/* @__PURE__ */ s(e,{size:16,className:`absolute rotate-90 transition-transform duration-(--duration-fast) ease-standard group-data-panel-open/trigger:rotate-0`})]})]})}),/* @__PURE__ */ s(i.Panel,{className:t(`h-(--accordion-panel-height) overflow-hidden`,`transition-[height] duration-(--duration-base) ease-standard`,`data-ending-style:h-0 data-starting-style:h-0`),children:/* @__PURE__ */ s(`div`,{className:t(`px-4 pb-4`,g===`sm`&&`text-sm`),children:m})})]})}export{u as Accordion,f as AccordionItem};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, ReactNode } from "react";
|
|
3
|
+
//#region src/components/alert/Alert.d.ts
|
|
4
|
+
export type AlertTone = "info" | "success" | "warning" | "danger";
|
|
5
|
+
export type AlertProps = Omit<ComponentProps<"div">, "title"> & {
|
|
6
|
+
/** 色调只点在左缘色条和图标上,底色保持中性。默认 `info` */
|
|
7
|
+
tone?: AlertTone;
|
|
8
|
+
/** 加粗的一行标题,可省 */
|
|
9
|
+
title?: ReactNode;
|
|
10
|
+
/** 右侧的一个操作,通常是 `text` 按钮 */
|
|
11
|
+
action?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* 传了就出现关闭图标。它只负责通知:显示与否由使用方决定——
|
|
14
|
+
* 要收起的过程,把 `open` 交给提示条;直接不渲染它就是立刻消失
|
|
15
|
+
*/
|
|
16
|
+
onClose?: () => void;
|
|
17
|
+
/** 置为 `false` 时先收起、淡出,再卸载。默认 `true` */
|
|
18
|
+
open?: boolean;
|
|
19
|
+
/** 收完、已经卸载之后触发 */
|
|
20
|
+
onExited?: () => void;
|
|
21
|
+
/** 关闭图标的可访问名称 */
|
|
22
|
+
closeLabel?: string;
|
|
23
|
+
/** 替换默认图标;传 `null` 去掉 */
|
|
24
|
+
icon?: ReactNode;
|
|
25
|
+
};
|
|
26
|
+
/** 页面内的一条常驻消息。需要用户处理的重要信息用它,不用会消失的轻提示。 */
|
|
27
|
+
export declare function Alert({ tone, title, action, onClose, open, onExited, closeLabel, icon, className, ref, children, ...props }: AlertProps): import("react").JSX.Element | null;
|
|
28
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import"../../lib/focus-ring.js";import{usePresence as t}from"../../hooks/usePresence.js";import{Close as n}from"../../icons/Close.js";import{StatusDanger as r}from"../../icons/StatusDanger.js";import{StatusInfo as i}from"../../icons/StatusInfo.js";import{StatusSuccess as a}from"../../icons/StatusSuccess.js";import{StatusWarning as o}from"../../icons/StatusWarning.js";import{mergeRefs as s}from"../../lib/merge-refs.js";import{jsx as c,jsxs as l}from"react/jsx-runtime";const u={info:i,success:a,warning:o,danger:r},d={info:`border-l-info`,success:`border-l-success`,warning:`border-l-warning`,danger:`border-l-danger`},f={info:`text-info`,success:`text-success`,warning:`text-warning`,danger:`text-danger`};function p(e){let{style:t}=e,n=t.cssText,r=0;if(e.parentElement){let t=getComputedStyle(e.parentElement);(t.display.includes(`grid`)||t.display.includes(`flex`)&&t.flexDirection.startsWith(`column`))&&(r=Number.parseFloat(t.rowGap)||0)}return t.height=`${e.getBoundingClientRect().height}px`,e.getBoundingClientRect(),t.height=`0px`,t.minHeight=`0px`,t.paddingBlock=`0px`,t.borderBlockWidth=`0px`,t.marginTop=`0px`,t.marginBottom=`${-r}px`,t.opacity=`0`,()=>{t.cssText=n}}function m({tone:r=`info`,title:i,action:a,onClose:o,open:m=!0,onExited:h,closeLabel:g=`关闭`,icon:_,className:v,ref:y,children:b,...x}){let{ref:S,mounted:C,leaving:w}=t(m,{onLeave:p,onExited:h});if(!C)return null;let T=u[r],E=_===void 0?/* @__PURE__ */ c(T,{size:20}):_;return/* @__PURE__ */ l(`div`,{role:r===`danger`||r===`warning`?`alert`:`status`,...x,ref:s(S,y),"data-tone":r,inert:w,className:e(`flex items-start gap-3 border-l-4 bg-surface-raised py-3 pr-3 pl-3 text-sm text-ink`,d[r],w&&[`pointer-events-none overflow-hidden`,`transition-[height,padding,margin,border-width,opacity] duration-(--duration-fast) ease-standard`],v),children:[E!==null&&/* @__PURE__ */ c(`span`,{"aria-hidden":`true`,className:e(`shrink-0`,f[r]),children:E}),/* @__PURE__ */ l(`div`,{className:`min-w-0 flex-1 wrap-anywhere`,children:[i&&/* @__PURE__ */ c(`p`,{className:`font-medium`,children:i}),b&&/* @__PURE__ */ c(`div`,{className:e(i&&`mt-0.5 text-ink-secondary`),children:b})]}),a&&/* @__PURE__ */ c(`div`,{className:`shrink-0`,children:a}),o&&/* @__PURE__ */ c(`button`,{type:`button`,"aria-label":g,onClick:o,className:e(`-my-1.5 -mr-1 inline-flex size-8 shrink-0 items-center justify-center text-ink-secondary hover:bg-ink/5 hover:text-ink active:bg-ink/10`,`transition-colors duration-(--duration-fast) ease-standard`,`focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus`),children:/* @__PURE__ */ c(n,{size:16})})]})}export{m as Alert};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, ReactNode } from "react";
|
|
3
|
+
//#region src/components/avatar/Avatar.d.ts
|
|
4
|
+
export type AvatarSize = "sm" | "md" | "lg" | "xl";
|
|
5
|
+
export type AvatarProps = Omit<ComponentProps<"span">, "style"> & {
|
|
6
|
+
/** 名字。没有图时显示它的首字;也是头像默认的可访问名称 */
|
|
7
|
+
name?: string;
|
|
8
|
+
/** 图片地址。没给、没加载出来、加载失败时显示首字 */
|
|
9
|
+
src?: string;
|
|
10
|
+
/**
|
|
11
|
+
* 可访问名称,默认取 `name`。
|
|
12
|
+
* 旁边已经写了名字时传 `""`:头像变成纯装饰,对读屏隐藏
|
|
13
|
+
*/
|
|
14
|
+
alt?: string;
|
|
15
|
+
/** 32 / 40 / 56 / 80px,默认 `md` */
|
|
16
|
+
size?: AvatarSize;
|
|
17
|
+
/** 选中:外面一圈行动色的环 */
|
|
18
|
+
selected?: boolean;
|
|
19
|
+
/** 没有图时显示的东西,代替首字(比如一个图标) */
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
};
|
|
22
|
+
/** 头像:代表一个人或一个角色的圆形图。自己不能点。 */
|
|
23
|
+
export declare function Avatar({ name, src, alt, size, selected, className, children, ...props }: AvatarProps): import("react").JSX.Element;
|
|
24
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{jsx as t,jsxs as n}from"react/jsx-runtime";import{Avatar as r}from"@base-ui/react/avatar";const i={sm:`size-8 text-xs`,md:`size-10 text-sm`,lg:`size-14 text-lg`,xl:`size-20 text-2xl`},a=`shadow-[0_0_0_2px_var(--ef-surface),0_0_0_5px_var(--ef-action),0_0_0_6px_var(--ef-ink)] forced-colors:border-[3px] forced-colors:border-[Highlight]`;function o(e){let t=e.trim().split(/\s+/).filter(Boolean),n=[...t[0]??``][0];return n?/[a-z]/i.test(n)?(n+(t.length>1?[...t[1]][0]??``:``)).toUpperCase():n:``}function s({name:a,src:s,alt:c=a??``,size:l=`md`,selected:u=!1,className:d,children:f,...p}){let m=c===``;return/* @__PURE__ */ n(r.Root,{...p,...m?{"aria-hidden":!0}:{role:`img`,"aria-label":c},"data-size":l,"data-selected":u?``:void 0,className:e(`relative inline-flex shrink-0 items-center justify-center overflow-clip rounded-full bg-surface-muted font-medium text-ink-secondary select-none`,i[l],u&&`shadow-[0_0_0_2px_var(--ef-surface),0_0_0_5px_var(--ef-action),0_0_0_6px_var(--ef-ink)] forced-colors:border-[3px] forced-colors:border-[Highlight]`,d),children:[s&&/* @__PURE__ */ t(r.Image,{src:s,alt:``,className:`size-full object-cover`}),/* @__PURE__ */ t(r.Fallback,{"aria-hidden":`true`,className:`flex size-full items-center justify-center leading-none [&_svg]:size-1/2`,children:f??(a?o(a):null)})]})}export{s as Avatar,a as avatarSelectedRing,o as initialsOf};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
import { AvatarSize } from "./Avatar.js";
|
|
3
|
+
import { ComponentProps, ReactNode } from "react";
|
|
4
|
+
//#region src/components/avatar/AvatarSwitcher.d.ts
|
|
5
|
+
export type AvatarSwitcherOrientation = "vertical" | "horizontal";
|
|
6
|
+
export type AvatarSwitcherProps = Omit<ComponentProps<"div">, "aria-label" | "defaultValue" | "onChange"> & {
|
|
7
|
+
/** 选的是什么,比如"人员" */
|
|
8
|
+
"aria-label": string;
|
|
9
|
+
/** 选中的那一个的 `value` */
|
|
10
|
+
value?: string;
|
|
11
|
+
defaultValue?: string;
|
|
12
|
+
onValueChange?: (value: string) => void;
|
|
13
|
+
/** 竖排(默认)或横排 */
|
|
14
|
+
orientation?: AvatarSwitcherOrientation;
|
|
15
|
+
/** 头像的大小,默认 `lg`(56px) */
|
|
16
|
+
size?: AvatarSize;
|
|
17
|
+
/** 翻页钮到头之后绕回另一头。默认到头时禁用 */
|
|
18
|
+
loop?: boolean;
|
|
19
|
+
/** 表单字段名:选中的值会随表单提交 */
|
|
20
|
+
name?: string;
|
|
21
|
+
previousLabel?: string;
|
|
22
|
+
nextLabel?: string;
|
|
23
|
+
/** 直接放 `AvatarSwitcherItem` */
|
|
24
|
+
children: ReactNode;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 头像切换:一列圆形头像里选一个,两端各一个圆形翻页钮。
|
|
28
|
+
* 语义是单选组——方向键换人。头像放不下时给它一个高度(横排时是宽度)上限,
|
|
29
|
+
* 头像在两个翻页钮之间滚动。
|
|
30
|
+
*/
|
|
31
|
+
export declare function AvatarSwitcher({ value: valueProp, defaultValue, onValueChange, orientation, size, loop, name: nameProp, previousLabel, nextLabel, className, children, ...props }: AvatarSwitcherProps): import("react").JSX.Element;
|
|
32
|
+
type ItemOwnProps = {
|
|
33
|
+
value: string;
|
|
34
|
+
/** 名字:这一项的可访问名称,没有图时显示它的首字 */
|
|
35
|
+
label: string;
|
|
36
|
+
/** 头像的图片地址 */
|
|
37
|
+
src?: string;
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
/** 没有图时显示的东西,代替首字 */
|
|
40
|
+
children?: ReactNode;
|
|
41
|
+
};
|
|
42
|
+
export type AvatarSwitcherItemProps = ItemOwnProps & Omit<ComponentProps<"label">, keyof ItemOwnProps>;
|
|
43
|
+
/** 头像切换里的一个头像。 */
|
|
44
|
+
export declare function AvatarSwitcherItem({ value, label, src, disabled, className, children, ...props }: AvatarSwitcherItemProps): import("react").JSX.Element;
|
|
45
|
+
//#endregion
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{createLazyContext as t}from"../../lib/create-lazy-context.js";import{Avatar as n}from"./Avatar.js";import{useControllableState as r}from"../../hooks/useControllableState.js";import{ChevronDown as i}from"../../icons/ChevronDown.js";import{ChevronLeft as a}from"../../icons/ChevronLeft.js";import{ChevronRight as o}from"../../icons/ChevronRight.js";import{IconButton as s}from"../icon-button/IconButton.js";import{Children as c,isValidElement as l,useContext as u,useEffect as d,useId as f,useMemo as p,useRef as m}from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";const _=/* @__PURE__ */ t(null);function v({value:t,defaultValue:n,onValueChange:u,orientation:v=`vertical`,size:y=`lg`,loop:b=!1,name:x,previousLabel:S=`上一个`,nextLabel:C=`下一个`,className:w,children:T,...E}){let D=_(),O=f(),k=x??O,A=v===`vertical`,j=m(null),[M,N]=r({value:t,defaultValue:n??null,onChange:e=>{e!==null&&u?.(e)}}),P=c.toArray(T).flatMap(e=>{if(!l(e))return[];let{value:t,disabled:n}=e.props;return typeof t==`string`&&!n?[t]:[]}),F=M===null?-1:P.indexOf(M),I=P.length-1,L=e=>{if(P.length===0)return;let t=F===-1?e===1?0:I:b?(F+e+P.length)%P.length:Math.min(I,Math.max(0,F+e));N(P[t])};d(()=>{let e=j.current,t=e?.querySelector(`[data-current]`);if(!e||!t)return;let n=A?t.offsetTop:t.offsetLeft,r=A?t.offsetHeight:t.offsetWidth,i=A?e.clientHeight:e.clientWidth,a=A?e.scrollTop:e.scrollLeft,o=a;n-12<a?o=n-12:n+r+12>a+i&&(o=n+r+12-i),o!==a&&e.scrollTo?.(A?{top:o}:{left:o})},[M,A]);let R=p(()=>({name:k,value:M,size:y,select:N}),[k,M,y,N]),z=A?i:a,B=A?i:o;return/* @__PURE__ */ h(D.Provider,{value:R,children:/* @__PURE__ */ g(`div`,{...E,role:`radiogroup`,"aria-orientation":v,"data-orientation":v,className:e(`inline-flex max-w-full items-center gap-1`,A?`flex-col`:`flex-row`,w),children:[/* @__PURE__ */ h(s,{variant:`floating`,size:`sm`,tabIndex:-1,"aria-label":S,disabled:!b&&F<=0,onClick:()=>L(-1),children:/* @__PURE__ */ h(z,{className:A?`rotate-180`:void 0})}),/* @__PURE__ */ h(`div`,{ref:j,className:e(`relative flex min-h-0 min-w-0 flex-1 gap-4 p-3 [scrollbar-width:none]`,A?`flex-col overflow-x-hidden overflow-y-auto`:`flex-row overflow-x-auto overflow-y-hidden`),children:T}),/* @__PURE__ */ h(s,{variant:`floating`,size:`sm`,tabIndex:-1,"aria-label":C,disabled:!b&&F>=I,onClick:()=>L(1),children:/* @__PURE__ */ h(B,{})})]})})}function y({value:t,label:r,src:i,disabled:a=!1,className:o,children:s,...c}){let l=u(_());if(!l)throw Error(`AvatarSwitcherItem 要放在 AvatarSwitcher 里面`);let d=l.value===t;return/* @__PURE__ */ g(`label`,{...c,"data-current":d?``:void 0,className:e(`relative flex shrink-0 rounded-full`,a?`cursor-not-allowed`:`cursor-pointer`,o),children:[/* @__PURE__ */ h(`input`,{type:`radio`,name:l.name,value:t,checked:d,disabled:a,"aria-label":r,onChange:()=>l.select(t),className:`peer absolute inset-0 size-full cursor-[inherit] appearance-none rounded-full outline-none`}),/* @__PURE__ */ h(n,{name:r,src:i,alt:``,size:l.size,selected:d,className:e(`pointer-events-none transition-opacity duration-(--duration-fast) ease-standard`,!d&&`opacity-60 peer-hover:opacity-100`,a&&`opacity-30 peer-hover:opacity-30`,`peer-focus-visible:outline-2 peer-focus-visible:outline-offset-[7px] peer-focus-visible:outline-focus`),children:s})]})}export{v as AvatarSwitcher,y as AvatarSwitcherItem};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
|
|
2
|
+
import { Avatar, AvatarProps, AvatarSize } from "./Avatar.js";
|
|
3
|
+
import { AvatarSwitcher, AvatarSwitcherItem, AvatarSwitcherItemProps, AvatarSwitcherOrientation, AvatarSwitcherProps } from "./AvatarSwitcher.js";
|
|
4
|
+
export { Avatar, type AvatarProps, type AvatarSize, AvatarSwitcher, AvatarSwitcherItem, type AvatarSwitcherItemProps, type AvatarSwitcherOrientation, type AvatarSwitcherProps };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, RefObject } from "react";
|
|
3
|
+
//#region src/components/back-to-top/BackToTop.d.ts
|
|
4
|
+
export type BackToTopSize = "sm" | "md";
|
|
5
|
+
export type BackToTopProps = Omit<ComponentProps<"button">, "children" | "aria-label"> & {
|
|
6
|
+
/** 默认"回到顶部" */
|
|
7
|
+
"aria-label"?: string;
|
|
8
|
+
/** 看哪个滚动容器、回到谁的顶部。不传就是整个页面 */
|
|
9
|
+
target?: RefObject<HTMLElement | null>;
|
|
10
|
+
/** 滚过多少像素才出现,默认 400 */
|
|
11
|
+
threshold?: number;
|
|
12
|
+
/** 48px(默认)或 40px 见方 */
|
|
13
|
+
size?: BackToTopSize;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 回到顶部:滚过一段才出现的悬浮钮,点了回到最上面,焦点也跟着回去。
|
|
17
|
+
* 默认看整个页面、自己 `fixed` 在视口右下角;放进某个滚动容器时传 `target`,
|
|
18
|
+
* 并用 `className` 把位置改成相对那个容器的。
|
|
19
|
+
*/
|
|
20
|
+
export declare function BackToTop({ "aria-label": ariaLabel, target, threshold, size, type, className, onClick, ...props }: BackToTopProps): import("react").JSX.Element;
|
|
21
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{focusRing as t}from"../../lib/focus-ring.js";import{useScrollPosition as n}from"../../hooks/useScrollPosition.js";import{ArrowRight as r}from"../../icons/ArrowRight.js";import{useCallback as i}from"react";import{jsx as a}from"react/jsx-runtime";const o={sm:`size-10 [&_svg]:size-5`,md:`size-12 [&_svg]:size-6`};function s(e){if(e.hasAttribute(`tabindex`)){e.focus({preventScroll:!0});return}let t=e.style.outline;e.setAttribute(`tabindex`,`-1`),e.style.outline=`none`,e.focus({preventScroll:!0}),e.addEventListener(`blur`,()=>{e.removeAttribute(`tabindex`),e.style.outline=t},{once:!0})}function c({"aria-label":c=`回到顶部`,target:l,threshold:u=400,size:d=`md`,type:f=`button`,className:p,onClick:m,...h}){let g=i(({scrolled:e})=>e>u,[u]),_=n(l,g,!1),v=e=>{if(m?.(e),e.defaultPrevented)return;let t=l?.current??null,n={top:0,behavior:typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?`instant`:`smooth`};t?t.scrollTo?.(n):window.scrollTo(n),s(t??document.body)};return/* @__PURE__ */ a(`button`,{...h,type:f,"aria-label":c,"data-visible":_?``:void 0,"data-size":d,onClick:v,className:e(`fixed right-[calc(1rem+env(safe-area-inset-right))] bottom-[calc(1rem+env(safe-area-inset-bottom))] z-(--z-float)`,`inline-flex shrink-0 items-center justify-center shadow-md`,`bg-surface-inverse text-ink-inverse hover:bg-action hover:text-on-action active:bg-action-pressed active:text-on-action`,`transition-[opacity,visibility,background-color,color] duration-(--duration-fast) ease-standard`,t,o[d],_?`visible opacity-100`:`invisible opacity-0`,p),children:/* @__PURE__ */ a(r,{className:`-rotate-90`})})}export{c as BackToTop};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, ReactNode } from "react";
|
|
3
|
+
//#region src/components/badge/Badge.d.ts
|
|
4
|
+
export type BadgeProps = Omit<ComponentProps<"span">, "children"> & {
|
|
5
|
+
/** 数量。显示为橙色数字块 */
|
|
6
|
+
count?: number;
|
|
7
|
+
/** 超过后显示为 `max+`,默认 99 */
|
|
8
|
+
max?: number;
|
|
9
|
+
/** `count` 为 0 时是否仍然显示,默认不显示 */
|
|
10
|
+
showZero?: boolean;
|
|
11
|
+
/** 不带数字的提醒:一个橙色菱形 */
|
|
12
|
+
dot?: boolean;
|
|
13
|
+
/** 给读屏的完整说明,如"12 条未读"。提供后角标本身对辅助技术隐藏 */
|
|
14
|
+
label?: string;
|
|
15
|
+
/** 被标记的元素。角标压在它的右上角,向外偏移半个自身 */
|
|
16
|
+
children?: ReactNode;
|
|
17
|
+
};
|
|
18
|
+
/** 通知角标:提醒与数量归橙色,不用来表示危险。 */
|
|
19
|
+
export declare function Badge({ count, max, showZero, dot, label, className, children, ...props }: BadgeProps): import("react").JSX.Element;
|
|
20
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{jsx as t,jsxs as n}from"react/jsx-runtime";function r({count:r,max:i=99,showZero:a=!1,dot:o=!1,label:s,className:c,children:l,...u}){let d=null;o?d=/* @__PURE__ */ t(`span`,{"aria-hidden":`true`,className:`block size-2 rotate-45 bg-notice`,"data-badge":`dot`}):r!==void 0&&(r>0||a)&&(d=/* @__PURE__ */ t(`span`,{"aria-hidden":s?`true`:void 0,className:`inline-flex h-4.5 min-w-4.5 items-center justify-center bg-notice px-1 font-tech text-xs leading-none font-bold text-neutral-900 tabular-nums`,"data-badge":`count`,children:r>i?`${i}+`:r}));let f=d!==null,p=f&&s?/* @__PURE__ */ t(`span`,{className:`sr-only`,children:s}):null;return l===void 0?/* @__PURE__ */ n(`span`,{...u,className:e(`inline-flex items-center`,c),children:[d,p]}):/* @__PURE__ */ n(`span`,{...u,className:e(`relative inline-flex`,c),children:[l,f&&/* @__PURE__ */ n(`span`,{className:`pointer-events-none absolute top-0 right-0 translate-x-1/2 -translate-y-1/2`,children:[d,p]})]})}export{r as Badge};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, ReactNode } from "react";
|
|
3
|
+
//#region src/components/bracket-title/BracketTitle.d.ts
|
|
4
|
+
export type BracketTitleProps = Omit<ComponentProps<"h3">, "children"> & {
|
|
5
|
+
/** 标题层级,默认 3(`<h3>`) */
|
|
6
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
7
|
+
/** 进入视口时播放一次入场:括号先到,名称随后。默认开启 */
|
|
8
|
+
animate?: boolean;
|
|
9
|
+
/** 名称 */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* 方括号标题 `[ 名称 ]`:人物、地点、物品的名称——"一个被归档的条目"。
|
|
14
|
+
* 普通的分节标题用 `SectionTitle`。字号用 `className` 改,默认是名称用的 `text-4xl`。
|
|
15
|
+
*/
|
|
16
|
+
export declare function BracketTitle({ level, animate, className, children, ref, ...props }: BracketTitleProps): import("react").JSX.Element;
|
|
17
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{mergeRefs as t}from"../../lib/merge-refs.js";import{useInView as n}from"../../hooks/useInView.js";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=`font-medium text-ink-tertiary`;function o({level:o=3,animate:s=!0,className:c,children:l,ref:u,...d}){let f=`h${o}`,[p,m]=n({disabled:!s}),h=s&&!m,g=s&&m,_=e(h&&`opacity-0`,g&&`animate-fade-in`);return/* @__PURE__ */ i(f,{...d,ref:t(p,u),className:e(`text-4xl font-bold wrap-anywhere text-ink`,c),children:[/* @__PURE__ */ r(`span`,{"aria-hidden":`true`,className:e(a,`mr-[0.4em]`,_),children:`[`}),/* @__PURE__ */ r(`span`,{className:e(h&&`opacity-0`,g&&`animate-fade-in [animation-delay:100ms]`)||void 0,children:l}),/* @__PURE__ */ r(`span`,{"aria-hidden":`true`,className:e(a,`ml-[0.4em]`,_),children:`]`})]})}export{o as BracketTitle};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
import { LinkRender } from "../link-element/LinkElement.js";
|
|
3
|
+
import { ComponentProps, ReactNode } from "react";
|
|
4
|
+
//#region src/components/breadcrumb/Breadcrumb.d.ts
|
|
5
|
+
export type BreadcrumbProps = ComponentProps<"nav"> & {
|
|
6
|
+
/**
|
|
7
|
+
* 最多显示几项。超出时保留首项和靠后的几项,中间折叠成 `…`,点击展开。
|
|
8
|
+
* 不传则全部显示。
|
|
9
|
+
*/
|
|
10
|
+
maxItems?: number;
|
|
11
|
+
/** 折叠按钮的可访问名称 */
|
|
12
|
+
expandLabel?: string;
|
|
13
|
+
};
|
|
14
|
+
/** 层级路径:`// 档案 / 干员 / 详情`。双斜杠起头,单斜杠分隔。 */
|
|
15
|
+
export declare function Breadcrumb({ maxItems, expandLabel, "aria-label": ariaLabel, className, children, ...props }: BreadcrumbProps): import("react").JSX.Element;
|
|
16
|
+
export type BreadcrumbItemProps = Omit<ComponentProps<"li">, "children"> & {
|
|
17
|
+
/** 传了就渲染成链接 */
|
|
18
|
+
href?: string;
|
|
19
|
+
/** 用这个元素代替 `<a>`(路由库的链接组件)。传了就按链接处理 */
|
|
20
|
+
render?: LinkRender;
|
|
21
|
+
/** 当前页:加粗、不可点击,输出 `aria-current="page"`。给最后一项 */
|
|
22
|
+
current?: boolean;
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
};
|
|
25
|
+
export declare function BreadcrumbItem({ href, render, current, className, children, ...props }: BreadcrumbItemProps): import("react").JSX.Element;
|
|
26
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{focusRing as t}from"../../lib/focus-ring.js";import{LinkElement as n}from"../link-element/LinkElement.js";import{Children as r,useEffect as i,useRef as a,useState as o}from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";function l(){return/* @__PURE__ */ s(`span`,{"aria-hidden":`true`,className:`text-ink-tertiary [li:first-child>&]:hidden`,children:`/`})}function u({maxItems:n,expandLabel:u=`显示完整路径`,"aria-label":d=`面包屑`,className:f,children:p,...m}){let[h,g]=o(!1),_=a(null),v=a(!1),y=r.toArray(p),b=n!==void 0&&n>=2&&y.length>n&&!h;i(()=>{v.current&&(v.current=!1,_.current?.querySelector(`li:nth-child(2) a, li:nth-child(2) button`)?.focus())},[h]);let x=y;return b&&(x=[y[0],/* @__PURE__ */ c(`li`,{className:`flex items-center gap-2`,children:[/* @__PURE__ */ s(l,{}),/* @__PURE__ */ s(`button`,{type:`button`,"aria-label":u,"aria-expanded":!1,onClick:()=>{v.current=!0,g(!0)},className:e(`px-1 text-ink-secondary hover:text-ink`,`transition-colors duration-(--duration-fast) ease-standard`,t),children:`…`})]},`ellipsis`),...y.slice(y.length-(n-1))]),/* @__PURE__ */ c(`nav`,{...m,"aria-label":d,className:e(`flex items-baseline gap-2 text-sm`,f),children:[/* @__PURE__ */ s(`span`,{"aria-hidden":`true`,className:`shrink-0 text-ink-tertiary`,children:`//`}),/* @__PURE__ */ s(`ol`,{ref:_,className:`flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-1`,children:x})]})}function d({href:r,render:i,current:a=!1,className:o,children:u,...d}){let f;return f=a?/* @__PURE__ */ s(`span`,{"aria-current":`page`,className:`font-bold text-ink`,children:u}):r!==void 0||i!==void 0?/* @__PURE__ */ s(n,{render:i,href:r,className:e(`text-ink-secondary underline-offset-4 hover:text-ink hover:underline`,`transition-colors duration-(--duration-fast) ease-standard`,t),children:u}):/* @__PURE__ */ s(`span`,{className:`text-ink-secondary`,children:u}),/* @__PURE__ */ c(`li`,{...d,className:e(`flex min-w-0 items-baseline gap-2`,o),children:[/* @__PURE__ */ s(l,{}),f]})}export{u as Breadcrumb,d as BreadcrumbItem};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
import { LinkRender } from "../link-element/LinkElement.js";
|
|
3
|
+
import { ComponentProps, ReactNode } from "react";
|
|
4
|
+
//#region src/components/button/Button.d.ts
|
|
5
|
+
export type ButtonVariant = "control" | "action" | "light" | "back" | "text" | "danger";
|
|
6
|
+
export type ButtonSize = "sm" | "md" | "lg";
|
|
7
|
+
type OwnProps = {
|
|
8
|
+
/**
|
|
9
|
+
* - `control` 深灰底 + 黄色竖条,默认;
|
|
10
|
+
* - `action` 信号黄底,一屏只用一个;
|
|
11
|
+
* - `light` 白底,用在深色底上或作次要项;
|
|
12
|
+
* - `back` 深灰斜纹底 + 左箭头,返回上一级;
|
|
13
|
+
* - `text` 无底、下划线、斜箭头,低强调;
|
|
14
|
+
* - `danger` 同 `control`,竖条为红色,用于不可逆操作。
|
|
15
|
+
*/
|
|
16
|
+
variant?: ButtonVariant;
|
|
17
|
+
size?: ButtonSize;
|
|
18
|
+
/** 文字左侧的图标 */
|
|
19
|
+
iconStart?: ReactNode;
|
|
20
|
+
/** 文字右侧的图标;`text` 变体默认是斜箭头,传 `null` 去掉 */
|
|
21
|
+
iconEnd?: ReactNode;
|
|
22
|
+
/** 提交中:记号变成旋转指示,尺寸不变,不响应点击 */
|
|
23
|
+
loading?: boolean;
|
|
24
|
+
/** 提交中显示的文字,如"处理中"。传了之后按钮按两段文字里较宽的一段定宽 */
|
|
25
|
+
loadingText?: ReactNode;
|
|
26
|
+
/** 撑满容器宽度 */
|
|
27
|
+
block?: boolean;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
};
|
|
30
|
+
type ButtonAsButton = OwnProps & Omit<ComponentProps<"button">, keyof OwnProps> & {
|
|
31
|
+
href?: undefined;
|
|
32
|
+
render?: undefined;
|
|
33
|
+
};
|
|
34
|
+
type ButtonAsLink = OwnProps & Omit<ComponentProps<"a">, keyof OwnProps> & {
|
|
35
|
+
/** 传了就渲染成链接 */
|
|
36
|
+
href: string;
|
|
37
|
+
render?: LinkRender;
|
|
38
|
+
};
|
|
39
|
+
type ButtonAsRendered = OwnProps & Omit<ComponentProps<"a">, keyof OwnProps> & {
|
|
40
|
+
href?: undefined;
|
|
41
|
+
/**
|
|
42
|
+
* 用这个元素代替 `<a>`,给路由库的链接组件用:
|
|
43
|
+
* `<Button render={<Link to="/archive" />}>`。传了就按链接处理
|
|
44
|
+
*/
|
|
45
|
+
render: LinkRender;
|
|
46
|
+
};
|
|
47
|
+
export type ButtonProps = ButtonAsButton | ButtonAsLink | ButtonAsRendered;
|
|
48
|
+
export declare function Button(props: ButtonProps): import("react").JSX.Element;
|
|
49
|
+
//#endregion
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{focusRing as t}from"../../lib/focus-ring.js";import{ChevronLeft as n}from"../../icons/ChevronLeft.js";import{LinkElement as r}from"../link-element/LinkElement.js";import{ArrowCorner as i}from"../../icons/ArrowCorner.js";import{Spinner as a}from"../spinner/Spinner.js";import{Fragment as o,jsx as s,jsxs as c}from"react/jsx-runtime";const l={control:`bg-action`,light:`bg-neutral-500`,danger:`bg-alert`},u={sm:`h-8 gap-1.5 text-sm`,md:`h-10 gap-2 text-base`,lg:`h-14 gap-2.5 text-lg`},d={sm:`min-w-16 px-7`,md:`min-w-24 px-10`,lg:`min-w-40 px-13`},f={sm:`left-3 h-4 w-2 [--marker-bar:2px]`,md:`left-4 h-5 w-2.5`,lg:`left-6 h-7 w-3`},p={sm:`group-hover:translate-x-1 group-active:translate-x-1`,md:`group-hover:translate-x-1.5 group-active:translate-x-1.5`,lg:`group-hover:translate-x-2 group-active:translate-x-2`},m={sm:`left-3 size-2`,md:`left-4 size-2.5`,lg:`left-6 size-3`},h={sm:`min-w-16 pl-4 pr-8`,md:`min-w-24 pl-6 pr-11`,lg:`min-w-40 pl-8 pr-15`},g={sm:`right-3.5 w-0.5`,md:`right-4.5 w-[3px]`,lg:`right-6 w-[3px]`},_={sm:`right-[3px] size-2`,md:`right-[5px] size-2`,lg:`right-1.5 size-3`},v={sm:`min-w-16 px-3.5`,md:`min-w-24 px-5`,lg:`min-w-40 px-7`},y={sm:14,md:16,lg:20},b={control:`bg-control text-on-control shadow-xs hover:bg-control-hover hover:text-white active:bg-control-pressed active:text-white`,danger:`bg-control text-on-control shadow-xs hover:bg-control-hover hover:text-white active:bg-control-pressed active:text-white`,light:`bg-neutral-0 text-neutral-900 shadow-xs hover:bg-neutral-100 active:bg-neutral-200`,action:`bg-action text-on-action shadow-md active:bg-action-pressed`,back:`hatch hatch-mid bg-control text-white shadow-xs hover:bg-neutral-600 active:bg-control-pressed`,text:`text-ink active:text-ink-secondary`};function x(x){let{variant:S=`control`,size:C=`md`,iconStart:w,iconEnd:T,loading:E=!1,loadingText:D,block:O=!1,disabled:k=!1,className:A,children:j,...M}=x,N=k||E,P=S===`text`,F=l[S],I=y[C],L=k?`forced-colors:bg-[GrayText]`:`forced-colors:bg-[ButtonText]`,R=e(`group relative inline-flex shrink-0 items-center justify-center font-medium leading-none whitespace-nowrap select-none`,`transition-colors duration-(--duration-fast) ease-standard`,t,u[C],F&&d[C],S===`action`&&h[C],S===`back`&&v[C],P&&`h-auto border-b border-current py-1`,k?P?`cursor-not-allowed text-ink-disabled`:`cursor-not-allowed bg-disabled text-on-disabled`:b[S],!P&&`forced-colors:border`,k?`forced-colors:border-[GrayText] forced-colors:text-[GrayText]`:!P&&`forced-colors:border-[ButtonText]`,E&&!k&&`forced-colors:text-[ButtonText]`,E&&`pointer-events-none`,O&&`flex w-full`,A),z=w,B=T;S===`back`&&z===void 0&&(z=E?/* @__PURE__ */ s(`span`,{className:`inline-flex items-center justify-center`,style:{width:I,height:I},children:/* @__PURE__ */ s(a,{label:null,className:e(`size-2`,L)})}):/* @__PURE__ */ s(n,{size:I})),P&&B===void 0&&(B=E?/* @__PURE__ */ s(`span`,{className:`inline-flex items-center justify-center`,style:{width:I,height:I},children:/* @__PURE__ */ s(a,{label:null,className:e(`size-2`,L)})}):/* @__PURE__ */ s(i,{size:I,className:e(`transition-[translate] duration-(--duration-base) ease-standard`,!k&&`group-hover:translate-x-0.5 group-hover:translate-y-0.5`)}));let V=D===void 0?j:/* @__PURE__ */ c(`span`,{className:`grid justify-items-center`,children:[/* @__PURE__ */ s(`span`,{"aria-hidden":E||void 0,className:e(`col-start-1 row-start-1`,E&&`invisible`),children:j}),/* @__PURE__ */ s(`span`,{"aria-hidden":!E||void 0,className:e(`col-start-1 row-start-1`,!E&&`invisible`),children:D})]}),H=/* @__PURE__ */ c(o,{children:[F&&(E?/* @__PURE__ */ s(`span`,{className:e(`pointer-events-none absolute top-1/2 -translate-y-1/2`,m[C]),children:/* @__PURE__ */ s(a,{label:null,className:e(`block size-full`,F,L)})}):/* @__PURE__ */ s(`span`,{"aria-hidden":`true`,className:e(`marker-bar pointer-events-none absolute top-1/2 -translate-y-1/2`,`transition-[clip-path,translate] duration-(--duration-base) ease-standard`,f[C],L,k?`bg-on-disabled`:[F,`group-hover:marker-arrow group-active:marker-arrow`,p[C]])})),z,V,B,S===`action`&&/* @__PURE__ */ c(o,{children:[/* @__PURE__ */ s(`span`,{"aria-hidden":`true`,className:e(`pointer-events-none absolute top-[17.5%] h-[65%]`,`transition-colors duration-(--duration-fast) ease-standard`,g[C],k?`bg-on-disabled/20`:[`bg-on-action/10 group-hover:bg-on-action/15 group-active:bg-on-action/20`,`forced-colors:group-hover:bg-[ButtonText] forced-colors:group-active:bg-[ButtonText]`],L)}),E&&/* @__PURE__ */ s(`span`,{className:e(`pointer-events-none absolute top-1/2 -translate-y-1/2`,_[C]),children:/* @__PURE__ */ s(a,{label:null,className:e(`block size-full`,L)})})]})]}),U={className:R,"data-variant":S,"data-size":C,"data-loading":E?``:void 0,"aria-busy":E||void 0};if(M.href!==void 0||M.render!==void 0){let{href:e,render:t,onClick:n,...i}=M,a=e=>{N?e.preventDefault():n?.(e)};return/* @__PURE__ */ s(r,{...i,...U,render:t,href:N?void 0:e,role:N?`link`:i.role,"aria-disabled":N||void 0,onClick:a,children:H})}let{href:W,render:G,onClick:K,type:q=`button`,...J}=M,Y=e=>{N?e.preventDefault():K?.(e)};return/* @__PURE__ */ s(`button`,{...J,...U,type:q,disabled:k,"aria-disabled":E||void 0,onClick:Y,children:H})}export{x as Button};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps } from "react";
|
|
3
|
+
//#region src/components/button/ButtonGroup.d.ts
|
|
4
|
+
export type ButtonGroupAlign = "start" | "end" | "between";
|
|
5
|
+
export type ButtonGroupOrientation = "horizontal" | "vertical";
|
|
6
|
+
export type ButtonGroupGap = "sm" | "md";
|
|
7
|
+
export type ButtonGroupProps = ComponentProps<"div"> & {
|
|
8
|
+
/** 横排时靠哪一边。默认 `end`:主要行动放在最右 */
|
|
9
|
+
align?: ButtonGroupAlign;
|
|
10
|
+
/** 竖排时按钮等宽,主要行动放在最下 */
|
|
11
|
+
orientation?: ButtonGroupOrientation;
|
|
12
|
+
/** 按钮之间 8px 或 12px */
|
|
13
|
+
gap?: ButtonGroupGap;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 并排的一组按钮。主要行动写在最后(最右或最下),一组里最多一个 `action`;
|
|
17
|
+
* "取消 + 确认"用 `light` + `control`,把黄色留给真正重要的时刻。
|
|
18
|
+
* 放不下时整组换行,不挤压按钮。
|
|
19
|
+
*/
|
|
20
|
+
export declare function ButtonGroup({ align, orientation, gap, className, ...props }: ButtonGroupProps): import("react").JSX.Element;
|
|
21
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{jsx as t}from"react/jsx-runtime";const n={start:`justify-start`,end:`justify-end`,between:`justify-between`},r={sm:`gap-2`,md:`gap-3`};function i({align:i=`end`,orientation:a=`horizontal`,gap:o=`md`,className:s,...c}){return/* @__PURE__ */ t(`div`,{role:`group`,...c,"data-orientation":a,className:e(`flex`,r[o],a===`vertical`?`flex-col items-stretch`:[`flex-wrap items-center`,n[i]],s)})}export{i as ButtonGroup};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
|
|
2
|
+
import { Button, ButtonProps, ButtonSize, ButtonVariant } from "./Button.js";
|
|
3
|
+
import { ButtonGroup, ButtonGroupAlign, ButtonGroupGap, ButtonGroupOrientation, ButtonGroupProps } from "./ButtonGroup.js";
|
|
4
|
+
export { Button, ButtonGroup, type ButtonGroupAlign, type ButtonGroupGap, type ButtonGroupOrientation, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps } from "react";
|
|
3
|
+
//#region src/components/calendar/Calendar.d.ts
|
|
4
|
+
/** 一段日期:`[起, 止]`,两头都包含。只有一天时两个一样 */
|
|
5
|
+
export type DateRange = [start: string, end: string];
|
|
6
|
+
type CalendarBaseProps = Omit<ComponentProps<"div">, "defaultValue" | "onChange"> & {
|
|
7
|
+
/** 现在显示的月份,`YYYY-MM`。不传时跟着选中的那一天(没选就是今天) */
|
|
8
|
+
month?: string;
|
|
9
|
+
defaultMonth?: string;
|
|
10
|
+
onMonthChange?: (month: string) => void;
|
|
11
|
+
/** 能选的最早一天 */
|
|
12
|
+
min?: string;
|
|
13
|
+
/** 能选的最晚一天 */
|
|
14
|
+
max?: string;
|
|
15
|
+
/** 返回真的日子不可选(比如周末、已经约满的日子) */
|
|
16
|
+
isDateDisabled?: (date: string) => boolean;
|
|
17
|
+
/** 一周从哪天开始:1 是星期一(默认),0 是星期日 */
|
|
18
|
+
weekStartsOn?: 0 | 1;
|
|
19
|
+
/** 月份标题、星期、读屏听到的日期名称按它走。默认 `zh-CN` */
|
|
20
|
+
locale?: string;
|
|
21
|
+
/** 哪一天算"今天"。默认取本地时间;服务端渲染或要一个固定的今天时自己传 */
|
|
22
|
+
today?: string;
|
|
23
|
+
previousLabel?: string;
|
|
24
|
+
nextLabel?: string;
|
|
25
|
+
};
|
|
26
|
+
export type CalendarSingleProps = CalendarBaseProps & {
|
|
27
|
+
range?: false;
|
|
28
|
+
/** 选中的那一天,`YYYY-MM-DD`;没选是 `null` */
|
|
29
|
+
value?: string | null;
|
|
30
|
+
defaultValue?: string | null;
|
|
31
|
+
onValueChange?: (value: string) => void;
|
|
32
|
+
startLabel?: never;
|
|
33
|
+
endLabel?: never;
|
|
34
|
+
pendingLabel?: never;
|
|
35
|
+
};
|
|
36
|
+
export type CalendarRangeProps = CalendarBaseProps & {
|
|
37
|
+
/** 选一段:点两下,第一下定起始日,第二下定结束日 */
|
|
38
|
+
range: true;
|
|
39
|
+
/** 选中的那一段,`[起, 止]`;没选是 `null` */
|
|
40
|
+
value?: DateRange | null;
|
|
41
|
+
defaultValue?: DateRange | null;
|
|
42
|
+
/** 只在一段选完时触发;后点的那天更早也会排成先后 */
|
|
43
|
+
onValueChange?: (value: DateRange) => void;
|
|
44
|
+
/** 读屏在两端那两天的名称后面听到的词,默认"起始日""结束日" */
|
|
45
|
+
startLabel?: string;
|
|
46
|
+
endLabel?: string;
|
|
47
|
+
/** 起始日定了之后的那句播报,默认"再选结束日" */
|
|
48
|
+
pendingLabel?: string;
|
|
49
|
+
};
|
|
50
|
+
export type CalendarProps = CalendarSingleProps | CalendarRangeProps;
|
|
51
|
+
/**
|
|
52
|
+
* 月历:选一天;加 `range` 是选一段。日期是 `YYYY-MM-DD` 的字符串。
|
|
53
|
+
* 要一个带面板的字段用 `DatePicker` / `DateRangePicker`。
|
|
54
|
+
*/
|
|
55
|
+
export declare function Calendar({ range, value: valueProp, defaultValue, onValueChange, month: monthProp, defaultMonth, onMonthChange, min, max, isDateDisabled, weekStartsOn, locale, today: todayProp, previousLabel, nextLabel, startLabel, endLabel, pendingLabel, className, ...props }: CalendarProps): import("react").JSX.Element;
|
|
56
|
+
//#endregion
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{focusRingInset as t}from"../../lib/focus-ring.js";import{useControllableState as n}from"../../hooks/useControllableState.js";import{ChevronLeft as r}from"../../icons/ChevronLeft.js";import{ChevronRight as i}from"../../icons/ChevronRight.js";import{IconButton as a}from"../icon-button/IconButton.js";import{addDays as o,addMonths as s,addMonthsToMonth as c,clampDate as l,dateParts as ee,monthGrid as u,monthOf as d,orderDates as f,startOfWeek as p,toDateObject as m,today as te}from"../../lib/date.js";import{useEffect as h,useId as ne,useLayoutEffect as re,useMemo as g,useRef as _,useState as v}from"react";import{jsx as y,jsxs as b}from"react/jsx-runtime";const x={timeZone:`UTC`},S=e=>e===null?``:typeof e==`string`?e:e.join(`/`);function ie(e,t,n){switch(e.key){case`ArrowLeft`:return o(t,-1);case`ArrowRight`:return o(t,1);case`ArrowUp`:return o(t,-7);case`ArrowDown`:return o(t,7);case`Home`:return p(t,n);case`End`:return o(p(t,n),6);case`PageUp`:return s(t,e.shiftKey?-12:-1);case`PageDown`:return s(t,e.shiftKey?12:1);default:return null}}function C({range:p=!1,value:C,defaultValue:ae=null,onValueChange:oe,month:se,defaultMonth:ce,onMonthChange:le,min:w,max:T,isDateDisabled:ue,weekStartsOn:E=1,locale:D=`zh-CN`,today:O,previousLabel:de=`上个月`,nextLabel:fe=`下个月`,startLabel:k=`起始日`,endLabel:pe=`结束日`,pendingLabel:me=`再选结束日`,className:he,...ge}){let A=ne(),j=_(null),[_e]=v(()=>O??te()),M=O??_e,[N,ve]=n({value:C,defaultValue:ae,onChange:e=>{e!==null&&oe?.(e)}}),P=N===null?null:typeof N==`string`?[N,N]:N,[F,I]=v(null),[ye,L]=v(null),[R,z]=v(()=>l(P?.[0]??M,w,T)),[B,V]=n({value:se,defaultValue:ce??d(R),onChange:le}),H=_(!1),U=S(N),W=_(U),G=P?.[0]??null;h(()=>{U!==W.current&&(W.current=U,I(null),G!==null&&(z(G),V(d(G))))},[U,G,V]),h(()=>{H.current&&(H.current=!1,j.current?.querySelector(`[data-date="${R}"]`)?.focus())},[R,B]);let be=_({month:B,until:0,length:0});re(()=>{let e=be.current;if(e.month===B)return;let t=B>e.month;e.month=B;let n=j.current;if(!n)return;let r=performance.now();if(delete n.dataset.turn,r<e.until){e.until=r+e.length;return}n.offsetWidth,n.dataset.turn=t?`next`:`previous`;let i=typeof n.getAnimations==`function`?n.getAnimations()[0]:void 0;e.length=Number(i?.effect?.getComputedTiming().endTime??0),e.until=r+e.length},[B]);let K=g(()=>u(B,E),[B,E]),q=g(()=>({title:new Intl.DateTimeFormat(D,{...x,year:`numeric`,month:`long`}),weekdayShort:new Intl.DateTimeFormat(D,{...x,weekday:`narrow`}),weekdayLong:new Intl.DateTimeFormat(D,{...x,weekday:`long`}),day:new Intl.DateTimeFormat(D,{...x,dateStyle:`full`})}),[D]),J=e=>w!==void 0&&e<w||T!==void 0&&e>T||(ue?.(e)??!1),xe=e=>{let t=l(e,w,T);H.current=!0,z(t),d(t)!==B&&V(d(t))},Y=e=>{W.current=S(e),ve(e)},Se=e=>{J(e)||(z(e),d(e)!==B&&V(d(e)),p?F===null?I(e):(I(null),Y(f(F,e))):Y(e))},X=e=>{let t=c(B,e);V(t),z(l(s(R,e),w,T))},Z=`${B}-01`,Ce=w!==void 0&&o(Z,-1)<w,we=T!==void 0&&s(Z,1)>T,Te=K.flat().includes(R)?R:Z,Q=F===null?P:[F,F],$=F===null?null:f(F,ye??R);return/* @__PURE__ */ b(`div`,{...ge,"data-month":B,"data-range":p?``:void 0,"data-pending":F===null?void 0:``,className:e(`inline-flex flex-col gap-1 text-ink`,he),children:[/* @__PURE__ */ b(`div`,{className:`flex items-center justify-between gap-2`,children:[/* @__PURE__ */ y(a,{size:`sm`,"aria-label":de,disabled:Ce,onClick:()=>X(-1),children:/* @__PURE__ */ y(r,{})}),/* @__PURE__ */ y(`div`,{id:A,"aria-live":`polite`,className:`text-sm font-bold tabular-nums`,children:q.title.format(m(Z))}),/* @__PURE__ */ y(a,{size:`sm`,"aria-label":fe,disabled:we,onClick:()=>X(1),children:/* @__PURE__ */ y(i,{})})]}),/* @__PURE__ */ b(`table`,{role:`grid`,"aria-labelledby":A,"aria-multiselectable":p||void 0,className:`border-separate border-spacing-0`,children:[/* @__PURE__ */ y(`thead`,{children:/* @__PURE__ */ y(`tr`,{children:K[0].map(e=>/* @__PURE__ */ y(`th`,{scope:`col`,abbr:q.weekdayLong.format(m(e)),className:`h-8 w-10 text-xs font-normal text-ink-tertiary`,children:q.weekdayShort.format(m(e))},e))})}),/* @__PURE__ */ y(`tbody`,{ref:j,className:`data-turn:animate-shift-in data-[turn=next]:[--shift-x:var(--motion-shift-lg)] data-[turn=previous]:[--shift-x:calc(var(--motion-shift-lg)*-1)]`,onPointerLeave:()=>L(null),onKeyDown:e=>{if(e.key===`Escape`&&F!==null){I(null);return}let t=ie(e,R,E);t!==null&&(e.preventDefault(),L(null),xe(t))},children:K.map(n=>/* @__PURE__ */ y(`tr`,{children:n.map(n=>{let r=Q!==null&&n===Q[0],i=Q!==null&&n===Q[1],a=r||i,o=Q!==null&&n>Q[0]&&n<Q[1],s=$!==null&&!a&&n>=$[0]&&n<=$[1],c=n===M,l=d(n)!==B,u=J(n),f=[q.day.format(m(n)),p&&r&&k,p&&i&&pe].filter(Boolean).join(`,`);return/* @__PURE__ */ y(`td`,{role:`gridcell`,"aria-selected":a||o,className:`p-0`,children:/* @__PURE__ */ y(`button`,{type:`button`,"data-date":n,"data-today":c?``:void 0,"data-outside":l?``:void 0,"data-range-start":p&&r?``:void 0,"data-range-end":p&&i?``:void 0,"data-in-range":o?``:void 0,"data-preview":s?``:void 0,tabIndex:n===Te?0:-1,"aria-label":f,"aria-current":c?`date`:void 0,"aria-disabled":u||void 0,onClick:()=>Se(n),onFocus:()=>z(n),onPointerEnter:p?()=>L(n):void 0,className:e(`relative flex size-10 items-center justify-center font-tech text-sm tabular-nums`,`transition-colors duration-(--duration-fast) ease-standard`,t,a?`bg-surface-inverse font-bold text-ink-inverse focus-visible:outline-accent-ink-inverse forced-colors:forced-color-adjust-none forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:focus-visible:-outline-offset-4 forced-colors:focus-visible:outline-[HighlightText]`:[o?`bg-ink/10 forced-colors:border-y-2 forced-colors:border-[Highlight]`:s&&`bg-ink/5`,u?`cursor-not-allowed text-ink-disabled line-through`:[l?`text-ink-tertiary`:`text-ink`,o?`hover:bg-ink/15`:`hover:bg-ink/5`]],c&&`after:absolute after:bottom-1.5 after:left-1/2 after:h-0.5 after:w-3 after:-translate-x-1/2 after:content-['']`,c&&(a?`after:bg-accent-ink-inverse forced-colors:after:bg-[HighlightText]`:`after:bg-accent-ink forced-colors:after:bg-[CanvasText]`)),children:ee(n).day})},n)})},n[0]))})]}),p&&/* @__PURE__ */ y(`div`,{"aria-live":`polite`,className:`sr-only`,children:F!==null&&`${q.day.format(m(F))},${k}。${me}`})]})}export{C as Calendar};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
|
|
2
|
+
import { ComponentProps, ReactNode } from "react";
|
|
3
|
+
//#region src/components/carousel/Carousel.d.ts
|
|
4
|
+
export type CarouselRatio = "16/9" | "4/3" | "1/1" | "3/4" | "21/9";
|
|
5
|
+
export type CarouselProps = Omit<ComponentProps<"section">, "aria-label" | "onChange"> & {
|
|
6
|
+
/** 这组媒体是什么,比如"玩法介绍" */
|
|
7
|
+
"aria-label": string;
|
|
8
|
+
/** 现在是第几张,从 0 起 */
|
|
9
|
+
index?: number;
|
|
10
|
+
defaultIndex?: number;
|
|
11
|
+
onIndexChange?: (index: number) => void;
|
|
12
|
+
/** 到头之后绕回另一头。默认到头时翻页钮禁用 */
|
|
13
|
+
loop?: boolean;
|
|
14
|
+
/** 媒体的宽高比,默认 `16/9` */
|
|
15
|
+
ratio?: CarouselRatio;
|
|
16
|
+
/** 计数旁边再加一排进度短横 */
|
|
17
|
+
indicator?: boolean;
|
|
18
|
+
previousLabel?: string;
|
|
19
|
+
nextLabel?: string;
|
|
20
|
+
/** 直接放 `CarouselSlide` */
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* 媒体轮播:一次看一张的大幅媒体,前后翻。不自动播放。
|
|
25
|
+
* 轨道是原生的横向滚动加滚动吸附,触屏滑动是浏览器自带的。
|
|
26
|
+
*/
|
|
27
|
+
export declare function Carousel({ index: indexProp, defaultIndex, onIndexChange, loop, ratio, indicator, previousLabel, nextLabel, className, children, ...props }: CarouselProps): import("react").JSX.Element;
|
|
28
|
+
export type CarouselSlideProps = Omit<ComponentProps<"div">, "title"> & {
|
|
29
|
+
/** 这一张的标题,显示在媒体下方 */
|
|
30
|
+
title?: ReactNode;
|
|
31
|
+
/** 标题下面的一段正文 */
|
|
32
|
+
description?: ReactNode;
|
|
33
|
+
/** 媒体:一张图或一段视频,铺满并裁切 */
|
|
34
|
+
children: ReactNode;
|
|
35
|
+
};
|
|
36
|
+
/** 轮播里的一张。直接放在 `Carousel` 里。 */
|
|
37
|
+
export declare function CarouselSlide({ title: _title, description: _description, className, children, ...props }: CarouselSlideProps): import("react").JSX.Element;
|
|
38
|
+
//#endregion
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import{cn as e}from"../../lib/cn.js";import{focusRing as t}from"../../lib/focus-ring.js";import{createLazyContext as n}from"../../lib/create-lazy-context.js";import{useControllableState as r}from"../../hooks/useControllableState.js";import{ChevronLeft as i}from"../../icons/ChevronLeft.js";import{ChevronRight as a}from"../../icons/ChevronRight.js";import{IconButton as o}from"../icon-button/IconButton.js";import{DashIndicator as s}from"../dash-indicator/DashIndicator.js";import{useSnapTrack as c}from"./snap-track.js";import{Children as l,isValidElement as u,useContext as d}from"react";import{jsx as f,jsxs as p}from"react/jsx-runtime";const m={"16/9":`aspect-video`,"4/3":`aspect-4/3`,"1/1":`aspect-square`,"3/4":`aspect-3/4`,"21/9":`aspect-21/9`},h=/* @__PURE__ */ n(null);function g({index:n,defaultIndex:d=0,onIndexChange:g,loop:_=!1,ratio:v=`16/9`,indicator:y=!1,previousLabel:b=`上一张`,nextLabel:x=`下一张`,className:S,children:C,...w}){let T=h(),E=l.toArray(C).filter(e=>u(e)),D=E.length,O=Math.max(0,D-1),[k,A]=r({value:n,defaultValue:d,onChange:g}),j=Math.min(Math.max(k,0),O),{trackRef:M,onScroll:N}=c({index:j,count:D,onSettle:A}),P=e=>{if(D===0)return;let t=_?(e+D)%D:Math.min(Math.max(e,0),O);A(t),!_&&(t===0||t===O)&&document.activeElement instanceof HTMLButtonElement&&M.current?.parentElement?.contains(document.activeElement)&&M.current.focus({preventScroll:!0})},F=e=>{let t={ArrowLeft:j-1,ArrowRight:j+1,Home:0,End:O}[e.key];t!==void 0&&(e.preventDefault(),P(t))},I=E[j],L=`第 ${j+1} 张,共 ${D} 张`;return/* @__PURE__ */ p(`section`,{...w,role:`group`,"aria-roledescription":`轮播`,"data-ratio":v,className:e(`flex flex-col gap-3 text-ink`,S),children:[/* @__PURE__ */ p(`div`,{className:`relative isolate`,children:[/* @__PURE__ */ f(`div`,{ref:M,tabIndex:0,onScroll:N,onKeyDown:e=>{e.target===e.currentTarget&&F(e)},className:e(`flex snap-x snap-mandatory overflow-x-auto overscroll-x-contain bg-surface-muted [scrollbar-width:none]`,t,m[v]),children:E.map((e,t)=>/* @__PURE__ */ f(T.Provider,{value:{position:t,count:D,current:t===j},children:e},t))}),/* @__PURE__ */ p(`div`,{onKeyDown:F,className:`absolute bottom-3 left-3 z-1 flex gap-2`,children:[/* @__PURE__ */ f(o,{variant:`floating`,"aria-label":b,disabled:!_&&j<=0,onClick:()=>P(j-1),children:/* @__PURE__ */ f(i,{})}),/* @__PURE__ */ f(o,{variant:`floating`,"aria-label":x,disabled:!_&&j>=O,onClick:()=>P(j+1),children:/* @__PURE__ */ f(a,{})})]})]}),/* @__PURE__ */ p(`div`,{className:`flex flex-col gap-1`,children:[/* @__PURE__ */ p(`div`,{"aria-hidden":`true`,className:`flex items-center gap-3`,children:[/* @__PURE__ */ f(`span`,{className:`shrink-0 font-tech text-xs whitespace-nowrap text-ink-secondary tabular-nums`,children:`${j+1} / ${D}`}),y&&/* @__PURE__ */ f(s,{count:D,index:j})]}),/* @__PURE__ */ p(`div`,{"aria-live":`polite`,className:`flex flex-col gap-1`,children:[/* @__PURE__ */ f(`span`,{className:`sr-only`,children:L}),I?.props.title&&/* @__PURE__ */ f(`p`,{className:`text-lg font-bold wrap-anywhere`,children:I.props.title}),I?.props.description&&/* @__PURE__ */ f(`p`,{className:`text-sm text-ink-secondary`,children:I.props.description})]})]})]})}function _({title:t,description:n,className:r,children:i,...a}){let o=d(h());if(!o)throw Error(`CarouselSlide 要直接放在 Carousel 里面`);return/* @__PURE__ */ f(`div`,{...a,role:`group`,"aria-roledescription":`幻灯片`,"aria-label":`第 ${o.position+1} 张,共 ${o.count} 张`,inert:!o.current,"data-current":o.current?``:void 0,className:e(`relative size-full shrink-0 snap-start overflow-clip *:size-full *:object-cover`,r),children:i})}export{g as Carousel,_ as CarouselSlide};
|