@endfield-ui/react 1.1.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/NOTICE.md +4 -3
- package/README.md +32 -5
- 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/assets/splash_bg.jpg +0 -0
- package/dist/game/assets/splash_bg_portrait.jpg +0 -0
- package/dist/game/assets/splash_deco.svg +4 -0
- package/dist/game/assets/splash_logo.svg +1 -0
- package/dist/game/assets/splash_triangles.svg +4 -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/resource-provenance.json +70 -1
- 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/styles.css +1 -1
- package/dist/game.d.ts +29 -371
- package/dist/game.js +1 -2041
- 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 -3505
- package/dist/index.js +1 -9625
- 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/dist/styles.css +1 -1
- package/package.json +17 -11
- package/src/components/accordion/Accordion.tsx +13 -5
- package/src/components/alert/Alert.tsx +1 -1
- 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 -3
- package/src/components/dropdown-menu/DropdownMenu.tsx +7 -4
- package/src/components/dropdown-menu/menu-style.ts +9 -3
- package/src/components/field/Field.tsx +10 -6
- package/src/components/file-upload/FileUpload.tsx +5 -2
- package/src/components/flyout-bar/FlyoutBar.tsx +1 -1
- package/src/components/image-viewer/ImageViewer.tsx +6 -5
- package/src/components/input/control-box.ts +30 -10
- 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/otp-input/OtpInput.tsx +35 -43
- package/src/components/radio/Radio.tsx +7 -5
- package/src/components/schedule/Schedule.tsx +7 -5
- package/src/components/segmented-control/SegmentedControl.tsx +9 -7
- package/src/components/select/Select.tsx +11 -11
- package/src/components/side-rail/SideRail.tsx +15 -9
- package/src/components/side-rail/SideRailSub.tsx +12 -7
- package/src/components/splash-screen/SplashScreen.tsx +340 -0
- package/src/components/splash-screen/index.ts +1 -0
- 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/tag-input/TagInput.tsx +5 -2
- package/src/components/toast/Toast.tsx +12 -8
- 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/index.ts +1 -0
- package/src/lib/cn.ts +1 -1
- package/src/lib/create-lazy-context.ts +6 -0
- package/src/styles/theme.css +33 -0
- package/src/styles/utilities.css +8 -0
- package/src/components/README.md +0 -190
- 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 -74
package/NOTICE.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
## Game 实机风格入口的官方图片
|
|
23
23
|
|
|
24
|
-
组件库有一个单独的入口 `@endfield-ui/react/game`(源码在 `packages/ui/src/game
|
|
24
|
+
组件库有一个单独的入口 `@endfield-ui/react/game`(源码在 `packages/ui/src/game`),收的是照游戏内界面复刻的一组控件,和一个官网的开屏页。**它带着 30 张官方图片**,这是本仓库里唯一有官方素材的地方:
|
|
25
25
|
|
|
26
26
|
| 用在哪 | 张数 | 位置(相对 `packages/ui/src/game`) | 随 npm 包 |
|
|
27
27
|
| --- | --- | --- | --- |
|
|
@@ -29,11 +29,12 @@
|
|
|
29
29
|
| `BannerAlert`、`FullWidthAlert` 的横幅、底图与标志底图 | 4 | `banner-alert/assets/` | 是 |
|
|
30
30
|
| `ItemCard` 的亮暗背景与稀有度底边 | 12 | `item-card/assets/` | 是 |
|
|
31
31
|
| `ItemTooltipCard` 的标题纹理、详情入口图标、正文底图 | 3 | `item-tooltip-card/assets/` | 是 |
|
|
32
|
+
| `EndfieldSplashScreen` 的底图(横、竖各一张)、游戏标志、微标与三角标 | 5 | `splash-screen/assets/` | 是 |
|
|
32
33
|
| 预览站里物品示例用的图标 | 5 | `item-card/assets/` | 否 |
|
|
33
34
|
|
|
34
|
-
-
|
|
35
|
+
- 前四行和最后一行的 25 张取自游戏界面与物品图,经社区项目 [EndfieldMap](https://github.com/ArkEndfield/EndfieldMap) 和 EndfieldWiki 转来;`EndfieldSplashScreen` 的 5 张是 2026-10-14 直接从[官网](https://endfield.hypergryph.com/)首页的加载页取的,原样存。**本仓库没有取得授权**,两个上游仓库也没有为它们标明许可。
|
|
35
36
|
- 它们的权利归鹰角网络及其权利人。**MIT 许可不覆盖这些图片**,本仓库不宣称对它们有任何权利,也给不了使用方使用它们的权利。
|
|
36
|
-
- 其中 `banner-alert/assets/deco_common_logo_bg.png` 里是官方的「终末地 / ENDFIELD INDUSTRIES」标志;`AnimatedDialog` 的装饰条上有代码画的 `ARKNIGHTS:ENDFIELD`、`ENDFIELD`
|
|
37
|
+
- 其中 `splash-screen/assets/splash_logo.svg` 就是游戏的标志「明日方舟:终末地 / ARKNIGHTS ENDFIELD」;`banner-alert/assets/deco_common_logo_bg.png` 里是官方的「终末地 / ENDFIELD INDUSTRIES」标志;`AnimatedDialog` 的装饰条上有代码画的 `ARKNIGHTS:ENDFIELD`、`ENDFIELD` 字样;`EndfieldSplashScreen` 默认的标语是官网的 `OVER THE FRONTIER / INTO THE FRONT`。前三处涉及商标。
|
|
37
38
|
- 逐张的路径、尺寸、字节数、SHA256 和来源登记在 [`packages/ui/src/game/resource-provenance.json`](packages/ui/src/game/resource-provenance.json),随包在 `dist/game/resource-provenance.json`。发布的包里,这些图片只在 `dist/game/assets/` 一处。
|
|
38
39
|
- 主入口(`@endfield-ui/react`)、主样式、令牌和母题工具类里没有它们。不引 `@endfield-ui/react/game` 和 `@endfield-ui/react/game.css`,就不会加载其中任何一张。
|
|
39
40
|
- 使用方可以整类关掉这些图片(在 `<html>` 上写 `data-ef-game-images="off"`,控件退回代码画的样子),也可以经变量逐张换成自己的。
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| 基础 | Button / ButtonGroup、IconButton、Toolbar、Tag / TagPair、Badge、Kbd、SectionTitle、BracketTitle、Tabs、Panel |
|
|
10
10
|
| 表单 | Field、Input、OtpInput、Textarea、Select、Combobox、TagInput、DatePicker / DateRangePicker / Calendar、FileUpload / FileItem、Checkbox、Radio / RadioGroup、SegmentedControl、Switch、Stepper、Slider、FilterChip |
|
|
11
|
-
| 反馈 | Alert、Toast、Progress / ProgressRing、Spinner、Skeleton、EmptyState、Loader、CompletionBanner、RecIndicator |
|
|
11
|
+
| 反馈 | Alert、Toast、Progress / ProgressRing、Spinner、Skeleton、EmptyState、Loader、SplashScreen、CompletionBanner、RecIndicator |
|
|
12
12
|
| 浮层 | Tooltip、Popover、HoverCard、Dialog、Drawer、DropdownMenu、ContextMenu、FlyoutBar |
|
|
13
13
|
| 展示 | Table(行能展开)、Stat、RollingNumber、Sparkline、DataRowList / DataRow、List / ListRow、Accordion、ScrollArea、MediaCard、PlayButton / PlayMark、Carousel、ImageViewer、ItemSlot / ItemGrid、Avatar、Timeline、Schedule、Term、ResourceChip、Countdown、Marquee、ScrollHint |
|
|
14
14
|
| 导航 | SideRail(含二级)、TopBar、NavMenu、NavAction、PageHeader、Breadcrumb、Pagination、Navigator、AvatarSwitcher、DashIndicator、Steps、Toc、BackToTop |
|
|
@@ -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
|
## 使用
|
|
@@ -321,6 +321,27 @@ import { Loader } from "@endfield-ui/react";
|
|
|
321
321
|
|
|
322
322
|
不知道真实进度就不传 `value`。只想盖住页面的一块区域时加 `fullscreen={false}`,并让那块区域带 `relative` 与 `overflow-hidden`。
|
|
323
323
|
|
|
324
|
+
### 开屏页
|
|
325
|
+
|
|
326
|
+
`SplashScreen` 是官网首次载入的那一页:一根贴边的进度条,读数跟着它的末端走,画面偏右是标志和标语;就绪后黄色铺满整屏,再整层淡出。库里不带任何图,标志和底图放你自己的:
|
|
327
|
+
|
|
328
|
+
```tsx
|
|
329
|
+
import { SplashScreen } from "@endfield-ui/react";
|
|
330
|
+
|
|
331
|
+
<SplashScreen
|
|
332
|
+
value={progress}
|
|
333
|
+
open={!ready}
|
|
334
|
+
logo={<img src="/brand/mark.svg" alt="第七勘探队" />}
|
|
335
|
+
tagline="SEVENTH SURVEY TEAM / FIELD ARCHIVE"
|
|
336
|
+
backdrop={<img src="/brand/scene.jpg" alt="" />}
|
|
337
|
+
onReveal={() => setEntered(true)}
|
|
338
|
+
/>;
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
- 退场是照官网走的,从 `open` 变成 `false` 到卸载一共 2.4 秒;页面到开始淡出的那一刻(第 1.4 秒)才放开,`onReveal` 同时触发——页面自己的入场从这里起。只要一块简单的整页等待,用上面的 `Loader`。
|
|
342
|
+
- 横排还是竖排,看的是它所在那一块自己的宽高比,尺寸跟着那一块的宽度等比缩放;放进插槽的东西可以用 `--ef-splash-unit`(横排是宽度的 1/160)跟着缩。
|
|
343
|
+
- `caption` 是标语上方那组微标里的微文字;整组微标可以用 `decor` 换掉,传 `null` 是不要。读数下面的状态字用 `status` 换,默认是 `LOADING`。
|
|
344
|
+
|
|
324
345
|
### 浮层
|
|
325
346
|
|
|
326
347
|
文字提示、气泡卡片、悬浮卡、弹窗、抽屉、下拉菜单、展开条、下拉选择、轻提示。焦点的进出与锁定、键盘、定位与翻转都交给 Base UI,这里只管长相;用的时候不用自己拼部件。触发元素作为一个 React 元素传进去:
|
|
@@ -824,6 +845,7 @@ import {
|
|
|
824
845
|
| `BannerAlert`、`FullWidthAlert` | 紧凑卡片与通栏面板两种确认提示,确认、取消都能异步否决 | [确认提示](https://github.com/icaruszezen/endfield-ui/blob/main/docs/design/game/confirmation-alerts.md) |
|
|
825
846
|
| `ItemCard`、`ItemIcon` | 带稀有度、库存的物品卡片与分层图标 | [物品卡片](https://github.com/icaruszezen/endfield-ui/blob/main/docs/design/game/item-cards.md) |
|
|
826
847
|
| `ItemTooltipCard`、`ItemHoverCard`、`ItemHoverCardLayer` | 物品详情卡,单个控件或整片网格的悬浮预览 | [物品悬浮卡](https://github.com/icaruszezen/endfield-ui/blob/main/docs/design/game/item-hover-cards.md) |
|
|
848
|
+
| `EndfieldSplashScreen` | 官网首次载入的开屏页:上面的 `SplashScreen` 填上官方的标志、底图和微标 | [官网开屏页](https://github.com/icaruszezen/endfield-ui/blob/main/docs/design/game/splash-screen.md) |
|
|
827
849
|
|
|
828
850
|
- `game.css` 用不用 Tailwind 都是这一份,**和主样式一起引**(`tailwind.css` 或 `styles.css`)。从脚本里 `import`,让打包工具去处理里面图片的相对地址。
|
|
829
851
|
- 规则都在 `components` 层:你在 `className`、`classNames` 里写的工具类盖得掉默认值;和主样式谁先加载都一样。
|
|
@@ -831,7 +853,7 @@ import {
|
|
|
831
853
|
- 不想加载官方图片:在 `<html>` 上写 `data-ef-game-images="off"`,整类退回代码画的样子;每张图也能经 `--ef-game-*` 变量单独换掉,变量表见[换掉或关掉图片](https://github.com/icaruszezen/endfield-ui/blob/main/docs/design/game/README.md#换掉或关掉图片)。
|
|
832
854
|
- 主库里名字相近的 `Dialog`、`Select`、`Button`、`SegmentedControl`、`Switch`、`Alert`、`ItemSlot`、`HoverCard` 不因为它而变。
|
|
833
855
|
|
|
834
|
-
> **这个入口带着 25
|
|
856
|
+
> **这个入口带着 30 张官方图片**(界面纹理、卡片背景、开屏页的底图,和两张官方标志——其中一张是游戏的标志本身;25 张随包发在 `dist/game/assets`),没有取得授权,MIT 许可不覆盖它们。权利人提出异议时我们会撤下并发补丁版本——这些图片不在语义化版本的承诺之内。不引这个入口,你的产物里不会有其中任何一张,但 npm 包里仍然带着这些文件。用之前请读[风险与处理](https://github.com/icaruszezen/endfield-ui/blob/main/docs/design/game/README.md#风险与处理)。
|
|
835
857
|
|
|
836
858
|
### 主题
|
|
837
859
|
|
|
@@ -920,10 +942,11 @@ packages/ui/
|
|
|
920
942
|
| --- | --- |
|
|
921
943
|
| `pnpm dev` | 启动 Storybook(`http://localhost:6106`),直接读本包源码,改了即热更新 |
|
|
922
944
|
| `pnpm test` | 跑单元测试 |
|
|
945
|
+
| `pnpm test:package` | 先 `pnpm build`,再检查发布产物、主入口与 Game 共享上下文,以及 Rollup 按需打包(模块版和重新合并的单文件版) |
|
|
923
946
|
| `pnpm test:browser` | 在真的浏览器里测键盘、焦点与布局(先 `pnpm build:docs`),见 [apps/docs](https://github.com/icaruszezen/endfield-ui/blob/main/apps/docs/README.md#浏览器实测) |
|
|
924
947
|
| `pnpm typecheck` | 类型检查全部工作区包 |
|
|
925
948
|
| `pnpm lint` | 用 oxlint 查写错的地方:漏掉的 `await`、钩子的用法、已弃用的接口等 |
|
|
926
|
-
| `pnpm build` |
|
|
949
|
+
| `pnpm build` | 按源码模块结构输出 JS 与类型声明;保留 `dist/index.js`、`dist/game.js` 两个公共入口,以及主库和 Game 的样式、图片、来源清单 |
|
|
927
950
|
| `pnpm format` | 用 Prettier 格式化全仓库;`pnpm format:check` 只检查不改,CI 跑的是它 |
|
|
928
951
|
|
|
929
952
|
格式用 Prettier 的默认配置,提交前跑一次 `pnpm format`。Markdown 不在它的范围里(它会把表格逐列补空格对齐);Tailwind 的类名顺序也不归它管。
|
|
@@ -932,11 +955,15 @@ packages/ui/
|
|
|
932
955
|
|
|
933
956
|
TypeScript 用的是 7.0。tsdown 在这个版本下生成类型声明时会提示"API 尚不稳定",目前产物正常;如果以后出问题,退路是 `tsc --emitDeclarationOnly`。
|
|
934
957
|
|
|
958
|
+
构建保留模块边界并压缩 JS,公共导入路径保持兼容。Context 统一通过 `createLazyContext` 缓存,纯工厂调用保留 tree-shaking 标记。源码用于 Tailwind 扫描,发布包只将 CSS 标为副作用。
|
|
959
|
+
|
|
960
|
+
`pnpm test:package` 检查真实 npm tarball 的导出、类型、共享上下文,以及六种用量下的模块版和单文件版按需打包,已接入 CI 和 `prepublishOnly`。测量范围与数据见 [PACKAGING.md](PACKAGING.md)。
|
|
961
|
+
|
|
935
962
|
### 发布
|
|
936
963
|
|
|
937
964
|
1. 改本目录 `package.json` 里的 `version`,在根目录的 [CHANGELOG.md](https://github.com/icaruszezen/endfield-ui/blob/main/CHANGELOG.md) 里写上这一版改了什么,提交并推到 `main`,等 CI 跑完。
|
|
938
965
|
2. 打一个和版本号对应的标签推上去:`git tag v1.0.0`,`git push origin v1.0.0`。
|
|
939
|
-
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。
|
|
940
967
|
|
|
941
968
|
认证用的是 npm 的 Trusted Publishing,仓库里不存 token:npm 上这个包的设置里登记了本仓库和 `publish.yml` 这个文件名,两边任何一个改名都要同步。
|
|
942
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 };
|