@seed-design/react 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/lib/components/DatePicker/DatePicker.cjs +351 -0
  2. package/lib/components/DatePicker/DatePicker.d.ts +39 -0
  3. package/lib/components/DatePicker/DatePicker.d.ts.map +1 -0
  4. package/lib/components/DatePicker/DatePicker.js +345 -0
  5. package/lib/components/DatePicker/DatePicker.test.d.ts +2 -0
  6. package/lib/components/DatePicker/DatePicker.test.d.ts.map +1 -0
  7. package/lib/components/DatePicker/index.cjs +62 -0
  8. package/lib/components/DatePicker/index.d.ts +3 -0
  9. package/lib/components/DatePicker/index.d.ts.map +1 -0
  10. package/lib/components/DatePicker/index.js +3 -0
  11. package/lib/components/QuantityPicker/QuantityPicker.d.ts +13 -1
  12. package/lib/components/QuantityPicker/QuantityPicker.d.ts.map +1 -1
  13. package/lib/components/TimePicker/TimePicker.cjs +97 -0
  14. package/lib/components/TimePicker/TimePicker.d.ts +28 -0
  15. package/lib/components/TimePicker/TimePicker.d.ts.map +1 -0
  16. package/lib/components/TimePicker/TimePicker.js +94 -0
  17. package/lib/components/TimePicker/TimePicker.test.d.ts +2 -0
  18. package/lib/components/TimePicker/TimePicker.test.d.ts.map +1 -0
  19. package/lib/components/TimePicker/index.cjs +3 -0
  20. package/lib/components/TimePicker/index.d.ts +2 -0
  21. package/lib/components/TimePicker/index.d.ts.map +1 -0
  22. package/lib/components/TimePicker/index.js +2 -0
  23. package/lib/components/index.cjs +63 -1
  24. package/lib/components/index.d.ts +2 -0
  25. package/lib/components/index.d.ts.map +1 -1
  26. package/lib/components/index.js +5 -2
  27. package/lib/components/private/WheelPicker.cjs +64 -0
  28. package/lib/components/private/WheelPicker.d.ts +16 -0
  29. package/lib/components/private/WheelPicker.d.ts.map +1 -0
  30. package/lib/components/private/WheelPicker.js +59 -0
  31. package/lib/components/private/WheelPicker.test.d.ts +2 -0
  32. package/lib/components/private/WheelPicker.test.d.ts.map +1 -0
  33. package/lib/index.cjs +63 -1
  34. package/lib/index.js +5 -2
  35. package/package.json +5 -2
  36. package/src/components/DatePicker/DatePicker.test.tsx +234 -0
  37. package/src/components/DatePicker/DatePicker.tsx +574 -0
  38. package/src/components/DatePicker/index.ts +34 -0
  39. package/src/components/QuantityPicker/QuantityPicker.test.tsx +10 -0
  40. package/src/components/QuantityPicker/QuantityPicker.tsx +14 -2
  41. package/src/components/TimePicker/TimePicker.test.tsx +166 -0
  42. package/src/components/TimePicker/TimePicker.tsx +163 -0
  43. package/src/components/TimePicker/index.ts +6 -0
  44. package/src/components/index.ts +2 -0
  45. package/src/components/private/WheelPicker.test.tsx +54 -0
  46. package/src/components/private/WheelPicker.tsx +110 -0
package/lib/index.js CHANGED
@@ -31,6 +31,9 @@ import { ContentPlaceholder_namespace_exports } from "./components/ContentPlaceh
31
31
  import { ContextualFloatingButton } from "./components/ContextualFloatingButton/ContextualFloatingButton.js";
32
32
  import { ControlChip } from "./components/ControlChip/ControlChip.js";
33
33
  import { Count } from "./components/Count/Count.js";
34
+ import { ScrollFog } from "./components/ScrollFog/ScrollFog.js";
35
+ import { ContinuousDatePicker, DatePicker, TwoMonthDatePicker, WeekDatePicker } from "./components/DatePicker/DatePicker.js";
36
+ import { compareDates, dateKey, dateOnOrAfter, dateOnOrBefore, excludeDates, isSameDate, maxSelectionCount, rangeDayCountAtLeast, rangeDayCountAtMost } from "./components/DatePicker/index.js";
34
37
  import { DialogAction, DialogBackdrop, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogPositioner, DialogRoot, DialogTitle, DialogTrigger } from "./components/Dialog/Dialog.js";
35
38
  import { Dialog_namespace_exports } from "./components/Dialog/Dialog.namespace.js";
36
39
  import { Divider } from "./components/Divider/Divider.js";
@@ -113,7 +116,6 @@ import { SidePanelBackdrop, SidePanelBody, SidePanelCloseButton, SidePanelConten
113
116
  import { SidePanel_namespace_exports } from "./components/SidePanel/SidePanel.namespace.js";
114
117
  import { ResponsiveSidePanelBackdrop, ResponsiveSidePanelBody, ResponsiveSidePanelCloseButton, ResponsiveSidePanelContent, ResponsiveSidePanelDescription, ResponsiveSidePanelFooter, ResponsiveSidePanelHandle, ResponsiveSidePanelHeader, ResponsiveSidePanelPositioner, ResponsiveSidePanelRoot, ResponsiveSidePanelTitle, ResponsiveSidePanelTrigger, useResponsiveSidePanelContext } from "./components/ResponsiveSidePanel/ResponsiveSidePanel.js";
115
118
  import { ResponsiveSidePanel_namespace_exports } from "./components/ResponsiveSidePanel/ResponsiveSidePanel.namespace.js";
116
- import { ScrollFog } from "./components/ScrollFog/ScrollFog.js";
117
119
  import { SegmentedControlIndicator, SegmentedControlItem, SegmentedControlItemHiddenInput, SegmentedControlRoot } from "./components/SegmentedControl/SegmentedControl.js";
118
120
  import { SegmentedControl_namespace_exports } from "./components/SegmentedControl/SegmentedControl.namespace.js";
119
121
  import { SelectContent, SelectGroup, SelectGroupLabel, SelectHiddenSelect, SelectItem, SelectItemBody, SelectItemDescription, SelectItemIndicator, SelectItemLabel, SelectItemPrefixIcon, SelectPlaceholder, SelectPositioner, SelectPrefixIcon, SelectRoot, SelectScrollArea, SelectSuffixIcon, SelectTrigger, SelectValue } from "./components/Select/Select.js";
@@ -144,7 +146,8 @@ import { Text } from "./components/Text/Text.js";
144
146
  import { TextFieldInput, TextFieldPrefixIcon, TextFieldPrefixText, TextFieldRoot, TextFieldSuffixIcon, TextFieldSuffixText, TextFieldTextarea } from "./components/TextField/TextField.js";
145
147
  import { useTextFieldWithGraphemes } from "./components/TextField/useTextFieldWithGraphemes.js";
146
148
  import { TextField_namespace_exports } from "./components/TextField/TextField.namespace.js";
149
+ import { TimePicker } from "./components/TimePicker/TimePicker.js";
147
150
  import { ToggleButton } from "./components/ToggleButton/ToggleButton.js";
148
151
  import { VisuallyHidden } from "./components/VisuallyHidden/VisuallyHidden.js";
149
152
  import { BreakpointProvider } from "./providers/BreakpointProvider.js";
150
- export { Accordion_namespace_exports as Accordion, AccordionBody, AccordionContent, AccordionDescription, AccordionHeader, AccordionItem, AccordionPrefix, AccordionRoot, AccordionSuffixIcon, AccordionTitle, AccordionTrigger, ActionButton, ActionChip, ActionSheet_namespace_exports as ActionSheet, ActionSheetBackdrop, ActionSheetCloseButton, ActionSheetContent, ActionSheetDescription, ActionSheetHeader, ActionSheetItem, ActionSheetList, ActionSheetPositioner, ActionSheetRoot, ActionSheetTitle, ActionSheetTrigger, Article, AspectRatio, AttachmentDisplay_namespace_exports as AttachmentDisplay, AttachmentDisplayContainer, AttachmentDisplayContext, AttachmentDisplayControl, AttachmentDisplayDescription, AttachmentDisplayErrorMessage, AttachmentDisplayFooter, AttachmentDisplayHeader, AttachmentDisplayIndicatorText, AttachmentDisplayItem, AttachmentDisplayItemActionButton, AttachmentDisplayItemBackdrop, AttachmentDisplayItemBadge, AttachmentDisplayItemGroup, AttachmentDisplayItemImage, AttachmentDisplayItemMetadata, AttachmentDisplayItemRemoveButton, AttachmentDisplayItemThumbnail, AttachmentDisplayLabel, AttachmentDisplayRequiredIndicator, AttachmentDisplayRoot, AttachmentDisplayTrigger, AttachmentDisplayTriggerIcon, AttachmentDisplayTriggerItemCount, AttachmentInput_namespace_exports as AttachmentInput, AttachmentInputContainer, AttachmentInputContext, AttachmentInputDropzone, AttachmentInputDropzoneLabel, AttachmentInputHiddenInput, AttachmentInputItem, AttachmentInputItemActionButton, AttachmentInputItemBackdrop, AttachmentInputItemBadge, AttachmentInputItemGroup, AttachmentInputItemImage, AttachmentInputItemMetadata, AttachmentInputItemName, AttachmentInputItemRemoveButton, AttachmentInputItemSize, AttachmentInputItemThumbnail, AttachmentInputRoot, AttachmentInputTrigger, AttachmentInputTriggerIcon, AttachmentInputTriggerItemCount, Avatar_namespace_exports as Avatar, AvatarBadge, AvatarFallback, AvatarImage, AvatarRoot, AvatarStack, Badge, BottomSheet_namespace_exports as BottomSheet, BottomSheetBackdrop, BottomSheetBody, BottomSheetCloseButton, BottomSheetContent, BottomSheetDescription, BottomSheetFooter, BottomSheetHeader, BottomSheetPositioner, BottomSheetRoot, BottomSheetTitle, BottomSheetTrigger, Box, BreakpointProvider, Callout_namespace_exports as Callout, CalloutCloseButton, CalloutContent, CalloutDescription, CalloutLink, CalloutRoot, CalloutTitle, Celsius, CheckSelectBox_namespace_exports as CheckSelectBox, CheckSelectBoxBody, CheckSelectBoxCheckmarkControl, CheckSelectBoxCheckmarkIcon, CheckSelectBoxContent, CheckSelectBoxDescription, CheckSelectBoxFooter, CheckSelectBoxGroup, CheckSelectBoxHiddenInput, CheckSelectBoxLabel, CheckSelectBoxRoot, CheckSelectBoxTrigger, Checkbox_namespace_exports as Checkbox, CheckboxControl, CheckboxGroup, CheckboxHiddenInput, CheckboxIndicator, CheckboxLabel, CheckboxRoot, Chip_namespace_exports as Chip, ChipLabel, ChipPrefixAvatar, ChipPrefixIcon, ChipRoot, ChipSuffixIcon, ChipTabs_namespace_exports as ChipTabs, ChipTabsCarousel, ChipTabsCarouselCamera, ChipTabsContent, ChipTabsList, ChipTabsRoot, ChipTabsTrigger, Column, Columns, ConsistentWidth, ContentDialog_namespace_exports as ContentDialog, ContentDialogAction, ContentDialogBackdrop, ContentDialogBody, ContentDialogCloseButton, ContentDialogContent, ContentDialogDescription, ContentDialogFooter, ContentDialogHeader, ContentDialogPositioner, ContentDialogRoot, ContentDialogTitle, ContentDialogTrigger, ContentPlaceholder_namespace_exports as ContentPlaceholder, ContentPlaceholderAsset, ContentPlaceholderRoot, ContextualFloatingButton, ControlChip, Count, Dialog_namespace_exports as Dialog, DialogAction, DialogBackdrop, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogPositioner, DialogRoot, DialogTitle, DialogTrigger, Divider, ExtendedActionSheet_namespace_exports as ExtendedActionSheet, ExtendedActionSheetBackdrop, ExtendedActionSheetCloseButton, ExtendedActionSheetContent, ExtendedActionSheetFooter, ExtendedActionSheetGroup, ExtendedActionSheetHeader, ExtendedActionSheetItem, ExtendedActionSheetList, ExtendedActionSheetPositioner, ExtendedActionSheetRoot, ExtendedActionSheetTitle, ExtendedActionSheetTrigger, ExtendedFab, Fab, Field_namespace_exports as Field, FieldButton_namespace_exports as FieldButton, FieldButtonButton, FieldButtonClearButton, FieldButtonControl, FieldButtonDescription, FieldButtonErrorMessage, FieldButtonFooter, FieldButtonHeader, FieldButtonHiddenInput, FieldButtonIndicatorText, FieldButtonLabel, FieldButtonPlaceholder, FieldButtonPrefixIcon, FieldButtonPrefixText, FieldButtonRequiredIndicator, FieldButtonRoot, FieldButtonSuffixIcon, FieldButtonSuffixText, FieldButtonValue, FieldCharacterCount, FieldDescription, FieldErrorMessage, FieldFooter, FieldHeader, FieldIndicatorText, FieldLabel, FieldRequiredIndicator, FieldRoot, Fieldset_namespace_exports as Fieldset, FieldsetDescription, FieldsetErrorMessage, FieldsetFooter, FieldsetHeader, FieldsetIndicatorText, FieldsetLabel, FieldsetRequiredIndicator, FieldsetRoot, Flex, Float, FloatingActionButton_namespace_exports as FloatingActionButton, FloatingActionButtonIcon, FloatingActionButtonLabel, FloatingActionButtonRoot, Footer_namespace_exports as Footer, FooterLinkText, Grid, GridItem, HStack, HelpBubble_namespace_exports as HelpBubble, HelpBubbleAnchor, HelpBubbleArrow, HelpBubbleArrowTip, HelpBubbleBody, HelpBubbleCloseButton, HelpBubbleContent, HelpBubbleDescription, HelpBubblePositioner, HelpBubblePositionerPortal, HelpBubbleRoot, HelpBubbleTitle, HelpBubbleTooltip_namespace_exports as HelpBubbleTooltip, HelpBubbleTooltipArrow, HelpBubbleTooltipArrowTip, HelpBubbleTooltipBody, HelpBubbleTooltipContent, HelpBubbleTooltipDelayGroup, HelpBubbleTooltipDescription, HelpBubbleTooltipPositioner, HelpBubbleTooltipPositionerPortal, HelpBubbleTooltipRoot, HelpBubbleTooltipTitle, HelpBubbleTooltipTrigger, HelpBubbleTrigger, Icon, IdentityPlaceholder_namespace_exports as IdentityPlaceholder, IdentityPlaceholderImage, IdentityPlaceholderRoot, ImageFrame, ImageFrameBadge, ImageFrameFloater, ImageFrameIcon, ImageFrameIndicator, ImageFrameReactionButton, Inline, InlineBanner_namespace_exports as InlineBanner, InlineBannerCloseButton, InlineBannerContent, InlineBannerDescription, InlineBannerLink, InlineBannerRoot, InlineBannerTitle, Layout_namespace_exports as Layout, LayoutContent, LayoutRoot, LinkContent, List_namespace_exports as List, ListContent, ListDetail, ListHeader, ListItem, ListPrefix, ListRoot, ListSuffix, ListTitle, LoadingIndicator, MannerTemp, MannerTempBadge, MannerTempEmote, Menu_namespace_exports as Menu, MenuAnchor, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuItemBody, MenuItemDescription, MenuItemLabel, MenuPositioner, MenuRoot, MenuScrollArea, MenuSheet_namespace_exports as MenuSheet, MenuSheetBackdrop, MenuSheetCloseButton, MenuSheetContent, MenuSheetDescription, MenuSheetFooter, MenuSheetGroup, MenuSheetHeader, MenuSheetItem, MenuSheetItemContent, MenuSheetItemDescription, MenuSheetItemLabel, MenuSheetList, MenuSheetPositioner, MenuSheetRoot, MenuSheetTitle, MenuSheetTrigger, MenuTrigger, NavigationMenu_namespace_exports as NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuItemBody, NavigationMenuItemDescription, NavigationMenuItemLabel, NavigationMenuPositioner, NavigationMenuProvider, NavigationMenuRoot, NavigationMenuScrollArea, NavigationMenuTrigger, NotificationBadge, NotificationBadgePositioner, PageBanner_namespace_exports as PageBanner, PageBannerBody, PageBannerButton, PageBannerCloseButton, PageBannerContent, PageBannerDescription, PageBannerRoot, PageBannerTitle, Portal, PrefixIcon, ProgressCircle_namespace_exports as ProgressCircle, ProgressCircleRange, ProgressCircleRoot, ProgressCircleTrack, PullToRefresh_namespace_exports as PullToRefresh, PullToRefreshContent, PullToRefreshIndicator, PullToRefreshRoot, QuantityPicker_namespace_exports as QuantityPicker, QuantityPickerDecrementButton, QuantityPickerHiddenInput, QuantityPickerIncrementButton, QuantityPickerRoot, QuantityPickerValueDisplay, RadioGroup_namespace_exports as RadioGroup, RadioGroupField_namespace_exports as RadioGroupField, RadioGroupFieldDescription, RadioGroupFieldErrorMessage, RadioGroupFieldFooter, RadioGroupFieldHeader, RadioGroupFieldIndicatorText, RadioGroupFieldLabel, RadioGroupFieldRequiredIndicator, RadioGroupFieldRoot, RadioGroupItem, RadioGroupItemControl, RadioGroupItemHiddenInput, RadioGroupItemIndicator, RadioGroupItemLabel, RadioGroupRoot, RadioSelectBox_namespace_exports as RadioSelectBox, RadioSelectBoxBody, RadioSelectBoxContent, RadioSelectBoxDescription, RadioSelectBoxFooter, RadioSelectBoxGroup, RadioSelectBoxHiddenInput, RadioSelectBoxItem, RadioSelectBoxLabel, RadioSelectBoxTrigger, ReactionButton, ResponsiveDialog_namespace_exports as ResponsiveDialog, ResponsiveDialogAction, ResponsiveDialogBackdrop, ResponsiveDialogBody, ResponsiveDialogCloseButton, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogFooter, ResponsiveDialogHandle, ResponsiveDialogHeader, ResponsiveDialogPositioner, ResponsiveDialogRoot, ResponsiveDialogTitle, ResponsiveDialogTrigger, ResponsivePair, ResponsiveSidePanel_namespace_exports as ResponsiveSidePanel, ResponsiveSidePanelBackdrop, ResponsiveSidePanelBody, ResponsiveSidePanelCloseButton, ResponsiveSidePanelContent, ResponsiveSidePanelDescription, ResponsiveSidePanelFooter, ResponsiveSidePanelHandle, ResponsiveSidePanelHeader, ResponsiveSidePanelPositioner, ResponsiveSidePanelRoot, ResponsiveSidePanelTitle, ResponsiveSidePanelTrigger, ScrollFog, SegmentedControl_namespace_exports as SegmentedControl, SegmentedControlIndicator, SegmentedControlItem, SegmentedControlItemHiddenInput, SegmentedControlRoot, Select_namespace_exports as Select, SelectContent, SelectGroup, SelectGroupLabel, SelectHiddenSelect, SelectItem, SelectItemBody, SelectItemDescription, SelectItemIndicator, SelectItemLabel, SelectItemPrefixIcon, SelectPlaceholder, SelectPositioner, SelectPrefixIcon, SelectRoot, SelectScrollArea, SelectSuffixIcon, SelectTrigger, SelectValue, SideNavigation_namespace_exports as SideNavigation, SideNavigationContent, SideNavigationFooter, SideNavigationGroup, SideNavigationGroupLabel, SideNavigationHeader, SideNavigationInset, SideNavigationItem, SideNavigationItemCollapsibleContent, SideNavigationItemCollapsibleRoot, SideNavigationItemCollapsibleTrigger, SideNavigationItemLabel, SideNavigationItemPrefixIcon, SideNavigationItemSuffixIcon, SideNavigationProvider, SideNavigationRoot, SideNavigationTrigger, SidePanel_namespace_exports as SidePanel, SidePanelBackdrop, SidePanelBody, SidePanelCloseButton, SidePanelContent, SidePanelDescription, SidePanelFooter, SidePanelHeader, SidePanelPositioner, SidePanelRoot, SidePanelTitle, SidePanelTrigger, Skeleton, Slider_namespace_exports as Slider, SliderControl, SliderHiddenInput, SliderMarker, SliderMarkers, SliderRange, SliderRoot, SliderThumb, SliderTick, SliderTrack, SliderValueIndicatorArrow, SliderValueIndicatorArrowTip, SliderValueIndicatorLabel, SliderValueIndicatorRoot, Snackbar_namespace_exports as Snackbar, SnackbarActionButton, SnackbarAvoidOverlap, SnackbarHiddenCloseButton, SnackbarMessage, SnackbarPrefixIcon, SnackbarRegion, SnackbarRenderer, SnackbarRoot, SnackbarRootProvider, Stack, SuffixIcon, SwipeableMenuSheet_namespace_exports as SwipeableMenuSheet, SwipeableMenuSheetBackdrop, SwipeableMenuSheetCloseButton, SwipeableMenuSheetContent, SwipeableMenuSheetDescription, SwipeableMenuSheetFooter, SwipeableMenuSheetGroup, SwipeableMenuSheetHandle, SwipeableMenuSheetHeader, SwipeableMenuSheetItem, SwipeableMenuSheetItemContent, SwipeableMenuSheetItemDescription, SwipeableMenuSheetItemLabel, SwipeableMenuSheetList, SwipeableMenuSheetPositioner, SwipeableMenuSheetRoot, SwipeableMenuSheetTitle, SwipeableMenuSheetTrigger, Switch_namespace_exports as Switch, SwitchControl, SwitchHiddenInput, SwitchLabel, SwitchRoot, SwitchThumb, Tabs_namespace_exports as Tabs, TabsCarousel, TabsCarouselCamera, TabsContent, TabsIndicator, TabsList, TabsRoot, TabsTrigger, TagGroup_namespace_exports as TagGroup, TagGroupItem, TagGroupItemLabel, TagGroupRoot, Text, TextField_namespace_exports as TextField, TextFieldInput, TextFieldPrefixIcon, TextFieldPrefixText, TextFieldRoot, TextFieldSuffixIcon, TextFieldSuffixText, TextFieldTextarea, ToggleButton, VStack, VisuallyHidden, pullToRefreshPreventPull, tabsCarouselPreventDrag, useBreakpoint, useBreakpointValue, useResponsiveDialogContext, useResponsiveSidePanelContext, useSnackbarAdapter, useSnackbarContext, useTextFieldWithGraphemes };
153
+ export { Accordion_namespace_exports as Accordion, AccordionBody, AccordionContent, AccordionDescription, AccordionHeader, AccordionItem, AccordionPrefix, AccordionRoot, AccordionSuffixIcon, AccordionTitle, AccordionTrigger, ActionButton, ActionChip, ActionSheet_namespace_exports as ActionSheet, ActionSheetBackdrop, ActionSheetCloseButton, ActionSheetContent, ActionSheetDescription, ActionSheetHeader, ActionSheetItem, ActionSheetList, ActionSheetPositioner, ActionSheetRoot, ActionSheetTitle, ActionSheetTrigger, Article, AspectRatio, AttachmentDisplay_namespace_exports as AttachmentDisplay, AttachmentDisplayContainer, AttachmentDisplayContext, AttachmentDisplayControl, AttachmentDisplayDescription, AttachmentDisplayErrorMessage, AttachmentDisplayFooter, AttachmentDisplayHeader, AttachmentDisplayIndicatorText, AttachmentDisplayItem, AttachmentDisplayItemActionButton, AttachmentDisplayItemBackdrop, AttachmentDisplayItemBadge, AttachmentDisplayItemGroup, AttachmentDisplayItemImage, AttachmentDisplayItemMetadata, AttachmentDisplayItemRemoveButton, AttachmentDisplayItemThumbnail, AttachmentDisplayLabel, AttachmentDisplayRequiredIndicator, AttachmentDisplayRoot, AttachmentDisplayTrigger, AttachmentDisplayTriggerIcon, AttachmentDisplayTriggerItemCount, AttachmentInput_namespace_exports as AttachmentInput, AttachmentInputContainer, AttachmentInputContext, AttachmentInputDropzone, AttachmentInputDropzoneLabel, AttachmentInputHiddenInput, AttachmentInputItem, AttachmentInputItemActionButton, AttachmentInputItemBackdrop, AttachmentInputItemBadge, AttachmentInputItemGroup, AttachmentInputItemImage, AttachmentInputItemMetadata, AttachmentInputItemName, AttachmentInputItemRemoveButton, AttachmentInputItemSize, AttachmentInputItemThumbnail, AttachmentInputRoot, AttachmentInputTrigger, AttachmentInputTriggerIcon, AttachmentInputTriggerItemCount, Avatar_namespace_exports as Avatar, AvatarBadge, AvatarFallback, AvatarImage, AvatarRoot, AvatarStack, Badge, BottomSheet_namespace_exports as BottomSheet, BottomSheetBackdrop, BottomSheetBody, BottomSheetCloseButton, BottomSheetContent, BottomSheetDescription, BottomSheetFooter, BottomSheetHeader, BottomSheetPositioner, BottomSheetRoot, BottomSheetTitle, BottomSheetTrigger, Box, BreakpointProvider, Callout_namespace_exports as Callout, CalloutCloseButton, CalloutContent, CalloutDescription, CalloutLink, CalloutRoot, CalloutTitle, Celsius, CheckSelectBox_namespace_exports as CheckSelectBox, CheckSelectBoxBody, CheckSelectBoxCheckmarkControl, CheckSelectBoxCheckmarkIcon, CheckSelectBoxContent, CheckSelectBoxDescription, CheckSelectBoxFooter, CheckSelectBoxGroup, CheckSelectBoxHiddenInput, CheckSelectBoxLabel, CheckSelectBoxRoot, CheckSelectBoxTrigger, Checkbox_namespace_exports as Checkbox, CheckboxControl, CheckboxGroup, CheckboxHiddenInput, CheckboxIndicator, CheckboxLabel, CheckboxRoot, Chip_namespace_exports as Chip, ChipLabel, ChipPrefixAvatar, ChipPrefixIcon, ChipRoot, ChipSuffixIcon, ChipTabs_namespace_exports as ChipTabs, ChipTabsCarousel, ChipTabsCarouselCamera, ChipTabsContent, ChipTabsList, ChipTabsRoot, ChipTabsTrigger, Column, Columns, ConsistentWidth, ContentDialog_namespace_exports as ContentDialog, ContentDialogAction, ContentDialogBackdrop, ContentDialogBody, ContentDialogCloseButton, ContentDialogContent, ContentDialogDescription, ContentDialogFooter, ContentDialogHeader, ContentDialogPositioner, ContentDialogRoot, ContentDialogTitle, ContentDialogTrigger, ContentPlaceholder_namespace_exports as ContentPlaceholder, ContentPlaceholderAsset, ContentPlaceholderRoot, ContextualFloatingButton, ContinuousDatePicker, ControlChip, Count, DatePicker, Dialog_namespace_exports as Dialog, DialogAction, DialogBackdrop, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogPositioner, DialogRoot, DialogTitle, DialogTrigger, Divider, ExtendedActionSheet_namespace_exports as ExtendedActionSheet, ExtendedActionSheetBackdrop, ExtendedActionSheetCloseButton, ExtendedActionSheetContent, ExtendedActionSheetFooter, ExtendedActionSheetGroup, ExtendedActionSheetHeader, ExtendedActionSheetItem, ExtendedActionSheetList, ExtendedActionSheetPositioner, ExtendedActionSheetRoot, ExtendedActionSheetTitle, ExtendedActionSheetTrigger, ExtendedFab, Fab, Field_namespace_exports as Field, FieldButton_namespace_exports as FieldButton, FieldButtonButton, FieldButtonClearButton, FieldButtonControl, FieldButtonDescription, FieldButtonErrorMessage, FieldButtonFooter, FieldButtonHeader, FieldButtonHiddenInput, FieldButtonIndicatorText, FieldButtonLabel, FieldButtonPlaceholder, FieldButtonPrefixIcon, FieldButtonPrefixText, FieldButtonRequiredIndicator, FieldButtonRoot, FieldButtonSuffixIcon, FieldButtonSuffixText, FieldButtonValue, FieldCharacterCount, FieldDescription, FieldErrorMessage, FieldFooter, FieldHeader, FieldIndicatorText, FieldLabel, FieldRequiredIndicator, FieldRoot, Fieldset_namespace_exports as Fieldset, FieldsetDescription, FieldsetErrorMessage, FieldsetFooter, FieldsetHeader, FieldsetIndicatorText, FieldsetLabel, FieldsetRequiredIndicator, FieldsetRoot, Flex, Float, FloatingActionButton_namespace_exports as FloatingActionButton, FloatingActionButtonIcon, FloatingActionButtonLabel, FloatingActionButtonRoot, Footer_namespace_exports as Footer, FooterLinkText, Grid, GridItem, HStack, HelpBubble_namespace_exports as HelpBubble, HelpBubbleAnchor, HelpBubbleArrow, HelpBubbleArrowTip, HelpBubbleBody, HelpBubbleCloseButton, HelpBubbleContent, HelpBubbleDescription, HelpBubblePositioner, HelpBubblePositionerPortal, HelpBubbleRoot, HelpBubbleTitle, HelpBubbleTooltip_namespace_exports as HelpBubbleTooltip, HelpBubbleTooltipArrow, HelpBubbleTooltipArrowTip, HelpBubbleTooltipBody, HelpBubbleTooltipContent, HelpBubbleTooltipDelayGroup, HelpBubbleTooltipDescription, HelpBubbleTooltipPositioner, HelpBubbleTooltipPositionerPortal, HelpBubbleTooltipRoot, HelpBubbleTooltipTitle, HelpBubbleTooltipTrigger, HelpBubbleTrigger, Icon, IdentityPlaceholder_namespace_exports as IdentityPlaceholder, IdentityPlaceholderImage, IdentityPlaceholderRoot, ImageFrame, ImageFrameBadge, ImageFrameFloater, ImageFrameIcon, ImageFrameIndicator, ImageFrameReactionButton, Inline, InlineBanner_namespace_exports as InlineBanner, InlineBannerCloseButton, InlineBannerContent, InlineBannerDescription, InlineBannerLink, InlineBannerRoot, InlineBannerTitle, Layout_namespace_exports as Layout, LayoutContent, LayoutRoot, LinkContent, List_namespace_exports as List, ListContent, ListDetail, ListHeader, ListItem, ListPrefix, ListRoot, ListSuffix, ListTitle, LoadingIndicator, MannerTemp, MannerTempBadge, MannerTempEmote, Menu_namespace_exports as Menu, MenuAnchor, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuItemBody, MenuItemDescription, MenuItemLabel, MenuPositioner, MenuRoot, MenuScrollArea, MenuSheet_namespace_exports as MenuSheet, MenuSheetBackdrop, MenuSheetCloseButton, MenuSheetContent, MenuSheetDescription, MenuSheetFooter, MenuSheetGroup, MenuSheetHeader, MenuSheetItem, MenuSheetItemContent, MenuSheetItemDescription, MenuSheetItemLabel, MenuSheetList, MenuSheetPositioner, MenuSheetRoot, MenuSheetTitle, MenuSheetTrigger, MenuTrigger, NavigationMenu_namespace_exports as NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuItemBody, NavigationMenuItemDescription, NavigationMenuItemLabel, NavigationMenuPositioner, NavigationMenuProvider, NavigationMenuRoot, NavigationMenuScrollArea, NavigationMenuTrigger, NotificationBadge, NotificationBadgePositioner, PageBanner_namespace_exports as PageBanner, PageBannerBody, PageBannerButton, PageBannerCloseButton, PageBannerContent, PageBannerDescription, PageBannerRoot, PageBannerTitle, Portal, PrefixIcon, ProgressCircle_namespace_exports as ProgressCircle, ProgressCircleRange, ProgressCircleRoot, ProgressCircleTrack, PullToRefresh_namespace_exports as PullToRefresh, PullToRefreshContent, PullToRefreshIndicator, PullToRefreshRoot, QuantityPicker_namespace_exports as QuantityPicker, QuantityPickerDecrementButton, QuantityPickerHiddenInput, QuantityPickerIncrementButton, QuantityPickerRoot, QuantityPickerValueDisplay, RadioGroup_namespace_exports as RadioGroup, RadioGroupField_namespace_exports as RadioGroupField, RadioGroupFieldDescription, RadioGroupFieldErrorMessage, RadioGroupFieldFooter, RadioGroupFieldHeader, RadioGroupFieldIndicatorText, RadioGroupFieldLabel, RadioGroupFieldRequiredIndicator, RadioGroupFieldRoot, RadioGroupItem, RadioGroupItemControl, RadioGroupItemHiddenInput, RadioGroupItemIndicator, RadioGroupItemLabel, RadioGroupRoot, RadioSelectBox_namespace_exports as RadioSelectBox, RadioSelectBoxBody, RadioSelectBoxContent, RadioSelectBoxDescription, RadioSelectBoxFooter, RadioSelectBoxGroup, RadioSelectBoxHiddenInput, RadioSelectBoxItem, RadioSelectBoxLabel, RadioSelectBoxTrigger, ReactionButton, ResponsiveDialog_namespace_exports as ResponsiveDialog, ResponsiveDialogAction, ResponsiveDialogBackdrop, ResponsiveDialogBody, ResponsiveDialogCloseButton, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogFooter, ResponsiveDialogHandle, ResponsiveDialogHeader, ResponsiveDialogPositioner, ResponsiveDialogRoot, ResponsiveDialogTitle, ResponsiveDialogTrigger, ResponsivePair, ResponsiveSidePanel_namespace_exports as ResponsiveSidePanel, ResponsiveSidePanelBackdrop, ResponsiveSidePanelBody, ResponsiveSidePanelCloseButton, ResponsiveSidePanelContent, ResponsiveSidePanelDescription, ResponsiveSidePanelFooter, ResponsiveSidePanelHandle, ResponsiveSidePanelHeader, ResponsiveSidePanelPositioner, ResponsiveSidePanelRoot, ResponsiveSidePanelTitle, ResponsiveSidePanelTrigger, ScrollFog, SegmentedControl_namespace_exports as SegmentedControl, SegmentedControlIndicator, SegmentedControlItem, SegmentedControlItemHiddenInput, SegmentedControlRoot, Select_namespace_exports as Select, SelectContent, SelectGroup, SelectGroupLabel, SelectHiddenSelect, SelectItem, SelectItemBody, SelectItemDescription, SelectItemIndicator, SelectItemLabel, SelectItemPrefixIcon, SelectPlaceholder, SelectPositioner, SelectPrefixIcon, SelectRoot, SelectScrollArea, SelectSuffixIcon, SelectTrigger, SelectValue, SideNavigation_namespace_exports as SideNavigation, SideNavigationContent, SideNavigationFooter, SideNavigationGroup, SideNavigationGroupLabel, SideNavigationHeader, SideNavigationInset, SideNavigationItem, SideNavigationItemCollapsibleContent, SideNavigationItemCollapsibleRoot, SideNavigationItemCollapsibleTrigger, SideNavigationItemLabel, SideNavigationItemPrefixIcon, SideNavigationItemSuffixIcon, SideNavigationProvider, SideNavigationRoot, SideNavigationTrigger, SidePanel_namespace_exports as SidePanel, SidePanelBackdrop, SidePanelBody, SidePanelCloseButton, SidePanelContent, SidePanelDescription, SidePanelFooter, SidePanelHeader, SidePanelPositioner, SidePanelRoot, SidePanelTitle, SidePanelTrigger, Skeleton, Slider_namespace_exports as Slider, SliderControl, SliderHiddenInput, SliderMarker, SliderMarkers, SliderRange, SliderRoot, SliderThumb, SliderTick, SliderTrack, SliderValueIndicatorArrow, SliderValueIndicatorArrowTip, SliderValueIndicatorLabel, SliderValueIndicatorRoot, Snackbar_namespace_exports as Snackbar, SnackbarActionButton, SnackbarAvoidOverlap, SnackbarHiddenCloseButton, SnackbarMessage, SnackbarPrefixIcon, SnackbarRegion, SnackbarRenderer, SnackbarRoot, SnackbarRootProvider, Stack, SuffixIcon, SwipeableMenuSheet_namespace_exports as SwipeableMenuSheet, SwipeableMenuSheetBackdrop, SwipeableMenuSheetCloseButton, SwipeableMenuSheetContent, SwipeableMenuSheetDescription, SwipeableMenuSheetFooter, SwipeableMenuSheetGroup, SwipeableMenuSheetHandle, SwipeableMenuSheetHeader, SwipeableMenuSheetItem, SwipeableMenuSheetItemContent, SwipeableMenuSheetItemDescription, SwipeableMenuSheetItemLabel, SwipeableMenuSheetList, SwipeableMenuSheetPositioner, SwipeableMenuSheetRoot, SwipeableMenuSheetTitle, SwipeableMenuSheetTrigger, Switch_namespace_exports as Switch, SwitchControl, SwitchHiddenInput, SwitchLabel, SwitchRoot, SwitchThumb, Tabs_namespace_exports as Tabs, TabsCarousel, TabsCarouselCamera, TabsContent, TabsIndicator, TabsList, TabsRoot, TabsTrigger, TagGroup_namespace_exports as TagGroup, TagGroupItem, TagGroupItemLabel, TagGroupRoot, Text, TextField_namespace_exports as TextField, TextFieldInput, TextFieldPrefixIcon, TextFieldPrefixText, TextFieldRoot, TextFieldSuffixIcon, TextFieldSuffixText, TextFieldTextarea, TimePicker, ToggleButton, TwoMonthDatePicker, VStack, VisuallyHidden, WeekDatePicker, compareDates, dateKey, dateOnOrAfter, dateOnOrBefore, excludeDates, isSameDate, maxSelectionCount, pullToRefreshPreventPull, rangeDayCountAtLeast, rangeDayCountAtMost, tabsCarouselPreventDrag, useBreakpoint, useBreakpointValue, useResponsiveDialogContext, useResponsiveSidePanelContext, useSnackbarAdapter, useSnackbarContext, useTextFieldWithGraphemes };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-design/react",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/daangn/seed-design.git",
@@ -49,6 +49,7 @@
49
49
  "@seed-design/react-checkbox": "^2.0.1",
50
50
  "@seed-design/react-collapsible": "^1.0.1",
51
51
  "@seed-design/react-dialog": "^2.0.2",
52
+ "@seed-design/react-date-picker": "^1.0.0",
52
53
  "@seed-design/react-drawer": "^2.0.3",
53
54
  "@seed-design/react-field": "^2.0.1",
54
55
  "@seed-design/react-field-button": "^2.0.1",
@@ -73,13 +74,15 @@
73
74
  "@seed-design/react-switch": "^2.0.1",
74
75
  "@seed-design/react-tabs": "^2.0.1",
75
76
  "@seed-design/react-text-field": "^2.0.1",
77
+ "@seed-design/react-time-picker": "^1.0.0",
76
78
  "@seed-design/react-toggle": "^2.0.1",
77
79
  "@seed-design/react-tooltip": "^1.0.1",
80
+ "@seed-design/react-wheel-picker": "^1.0.0",
78
81
  "clsx": "^2.1.1",
79
82
  "unicode-segmenter": "^0.14.4"
80
83
  },
81
84
  "peerDependencies": {
82
- "@seed-design/css": "^2.3.0",
85
+ "@seed-design/css": "^2.4.0",
83
86
  "react": ">=18.0.0",
84
87
  "react-dom": ">=18.0.0"
85
88
  },
@@ -0,0 +1,234 @@
1
+ import { act, fireEvent, render, waitFor } from "@testing-library/react";
2
+ import { describe, expect, it, mock } from "bun:test";
3
+ import * as React from "react";
4
+ import {
5
+ ContinuousDatePicker,
6
+ DatePicker,
7
+ type DatePickerActions,
8
+ TwoMonthDatePicker,
9
+ WeekDatePicker,
10
+ } from "./DatePicker";
11
+
12
+ const commonProps = {
13
+ today: { year: 2026, month: 7, day: 30 },
14
+ yearRange: { start: 2025, end: 2027 },
15
+ defaultViewDate: { year: 2026, month: 7, day: 1 },
16
+ } as const;
17
+
18
+ describe("DatePicker", () => {
19
+ it("날짜 grid와 locale에 맞는 기본 접근성 이름을 제공한다", () => {
20
+ const { getByRole, getAllByRole, rerender } = render(<DatePicker {...commonProps} />);
21
+
22
+ expect(getByRole("group")).toHaveAccessibleName("날짜 선택");
23
+ expect(getByRole("grid")).toHaveAccessibleName("2026년 7월");
24
+ expect(getAllByRole("columnheader")).toHaveLength(7);
25
+ expect(getAllByRole("columnheader")[0]?.closest('[role="grid"]')).toBe(getByRole("grid"));
26
+
27
+ rerender(<DatePicker {...commonProps} locale="en-US" />);
28
+ expect(getByRole("group")).toHaveAccessibleName("Select date");
29
+
30
+ rerender(<DatePicker {...commonProps} ariaLabels={{ root: "예약 날짜 선택" }} />);
31
+ expect(getByRole("group")).toHaveAccessibleName("예약 날짜 선택");
32
+
33
+ rerender(
34
+ <DatePicker
35
+ {...commonProps}
36
+ aria-label="체크인 날짜 선택"
37
+ ariaLabels={{ root: "예약 날짜 선택" }}
38
+ />,
39
+ );
40
+ expect(getByRole("group")).toHaveAccessibleName("체크인 날짜 선택");
41
+ });
42
+
43
+ it("날짜를 선택하고 onValueChange를 호출한다", () => {
44
+ const onValueChange = mock(() => {});
45
+ const { getByRole } = render(<DatePicker {...commonProps} onValueChange={onValueChange} />);
46
+
47
+ fireEvent.click(getByRole("button", { name: /2026년 7월 15일/ }));
48
+
49
+ expect(onValueChange).toHaveBeenCalledWith({ year: 2026, month: 7, day: 15 });
50
+ });
51
+
52
+ it("renderDateCellContent는 SEED가 소유한 날짜 버튼 안의 콘텐츠만 교체한다", () => {
53
+ const { getByRole } = render(
54
+ <DatePicker
55
+ {...commonProps}
56
+ renderDateCellContent={({ formattedDay, date }) => (
57
+ <>
58
+ <span>{formattedDay}</span>
59
+ <span>{date.day === 15 ? "12만원" : "예약 가능"}</span>
60
+ </>
61
+ )}
62
+ />,
63
+ );
64
+ const dateButton = getByRole("button", { name: /2026년 7월 15일/ });
65
+
66
+ expect(dateButton).toHaveTextContent("15");
67
+ expect(dateButton).toHaveTextContent("12만원");
68
+ expect(dateButton.closest('[role="gridcell"]')).not.toBeNull();
69
+ expect(dateButton.querySelector("[data-date-picker-day]")).toBeNull();
70
+ });
71
+
72
+ it("renderDateCellSupplement는 기본 날짜 숫자 아래에 콘텐츠를 추가한다", () => {
73
+ const { getByRole } = render(
74
+ <DatePicker
75
+ {...commonProps}
76
+ renderDateCellSupplement={({ date }) => (
77
+ <span>{date.day === 15 ? "12만원" : "예약 가능"}</span>
78
+ )}
79
+ />,
80
+ );
81
+ const dateButton = getByRole("button", { name: /2026년 7월 15일/ });
82
+
83
+ expect(dateButton).toHaveTextContent("15");
84
+ expect(dateButton).toHaveTextContent("12만원");
85
+ expect(dateButton.querySelector("[data-date-picker-day]")).toHaveTextContent("15");
86
+ });
87
+
88
+ it("constraint에 실패한 날짜는 aria-disabled를 유지하며 클릭을 무시한다", () => {
89
+ const onValueChange = mock(() => {});
90
+ const { getByRole } = render(
91
+ <DatePicker
92
+ {...commonProps}
93
+ constraints={[(date) => date.day >= 10]}
94
+ onValueChange={onValueChange}
95
+ />,
96
+ );
97
+ const unavailable = getByRole("button", { name: /2026년 7월 9일/ });
98
+
99
+ expect(unavailable).toHaveAttribute("aria-disabled", "true");
100
+ expect(unavailable).not.toBeDisabled();
101
+ fireEvent.click(unavailable);
102
+ expect(onValueChange).not.toHaveBeenCalled();
103
+ });
104
+
105
+ it("월·연도 제목을 누르면 Wheel Picker로 전환한다", () => {
106
+ const { getByRole, getAllByRole, queryByRole } = render(<DatePicker {...commonProps} />);
107
+
108
+ const grid = getByRole("grid");
109
+ expect(grid).toBeInTheDocument();
110
+ fireEvent.click(getByRole("button", { name: "2026년 7월" }));
111
+
112
+ expect(queryByRole("grid")).not.toBeInTheDocument();
113
+ expect(grid.closest("[data-wheel-open]")).toHaveAttribute("aria-hidden", "true");
114
+ expect(getAllByRole("spinbutton")).toHaveLength(2);
115
+ expect(getByRole("spinbutton", { name: "연도" })).toBeInTheDocument();
116
+ expect(getByRole("spinbutton", { name: "월" })).toBeInTheDocument();
117
+
118
+ const wheelRoot = getByRole("spinbutton", { name: "연도" }).closest('[role="group"]');
119
+ expect(wheelRoot).toBeInstanceOf(HTMLElement);
120
+ if (!(wheelRoot instanceof HTMLElement))
121
+ throw new Error("Wheel Picker 루트를 찾지 못했습니다.");
122
+ expect(wheelRoot.style.getPropertyValue("--seed-wheel-picker-item-size")).toBe("44px");
123
+ expect(wheelRoot.style.getPropertyValue("--seed-wheel-picker-visible-item-count")).toBe("7");
124
+ expect(wheelRoot.style.getPropertyValue("--seed-wheel-picker-viewport-size")).toBe("308px");
125
+ expect(wheelRoot.querySelector("[data-wheel-picker-scroll-fog]")).toHaveStyle({
126
+ "--scroll-fog-size-top": "102px",
127
+ "--scroll-fog-size-bottom": "102px",
128
+ });
129
+ expect(
130
+ getByRole("button", { name: "2026년 7월" }).querySelector("[data-date-picker-header-label]"),
131
+ ).toBeInTheDocument();
132
+ });
133
+
134
+ it("헤더 아이콘에 Icon의 크기와 접근성 속성을 전달한다", () => {
135
+ const { getByRole } = render(<DatePicker {...commonProps} />);
136
+
137
+ const headerIcon = getByRole("button", { name: "2026년 7월" }).querySelector("svg");
138
+ const previousIcon = getByRole("button", { name: "이전 달" }).querySelector("svg");
139
+ const nextIcon = getByRole("button", { name: "다음 달" }).querySelector("svg");
140
+
141
+ for (const icon of [headerIcon, previousIcon, nextIcon]) {
142
+ expect(icon).toHaveClass("seed-icon");
143
+ expect(icon).toHaveAttribute("aria-hidden", "true");
144
+ }
145
+ });
146
+
147
+ it("레이아웃별 공개 컴포넌트가 고정된 달력 범위를 렌더링한다", () => {
148
+ const twoMonths = render(<TwoMonthDatePicker {...commonProps} />);
149
+ expect(twoMonths.getAllByRole("grid")).toHaveLength(2);
150
+ twoMonths.unmount();
151
+
152
+ const week = render(<WeekDatePicker {...commonProps} />);
153
+ expect(week.getByRole("grid").querySelectorAll('[role="row"]')).toHaveLength(2);
154
+ week.unmount();
155
+
156
+ const continuous = render(<ContinuousDatePicker {...commonProps} height="400px" />);
157
+ expect(continuous.getByRole("group")).toHaveAttribute("data-visible-range", "continuous");
158
+ const spacers = continuous.container.querySelectorAll<HTMLElement>(
159
+ "[data-date-picker-continuous-spacer]",
160
+ );
161
+ expect(spacers).toHaveLength(2);
162
+ for (const spacer of spacers) {
163
+ expect(spacer.style.getPropertyValue("--seed-date-picker-continuous-spacer-height")).toMatch(
164
+ /px$/,
165
+ );
166
+ }
167
+ });
168
+
169
+ it("navigateToDate는 외부 포커스를 유지하고 오늘을 다음 tab 진입점으로 지정한다", () => {
170
+ const actionsRef = React.createRef<DatePickerActions>();
171
+ const { getByRole } = render(
172
+ <>
173
+ <button type="button" onClick={() => actionsRef.current?.navigateToDate(commonProps.today)}>
174
+ 오늘로 이동
175
+ </button>
176
+ <DatePicker {...commonProps} actionsRef={actionsRef} />
177
+ </>,
178
+ );
179
+ const todayButton = getByRole("button", { name: "오늘로 이동" });
180
+
181
+ expect(actionsRef.current).not.toBeNull();
182
+ todayButton.focus();
183
+ fireEvent.click(todayButton);
184
+
185
+ expect(document.activeElement).toBe(todayButton);
186
+ expect(getByRole("button", { name: /2026년 7월 30일/ }).getAttribute("tabindex")).toBe("0");
187
+ });
188
+
189
+ it("focusDate는 다른 달로 이동한 뒤 대상 날짜 셀에 DOM 포커스를 둔다", async () => {
190
+ const actionsRef = React.createRef<DatePickerActions>();
191
+ const onViewDateChange = mock(() => {});
192
+ const { getByRole } = render(
193
+ <DatePicker {...commonProps} actionsRef={actionsRef} onViewDateChange={onViewDateChange} />,
194
+ );
195
+
196
+ expect(actionsRef.current).not.toBeNull();
197
+ act(() => {
198
+ actionsRef.current?.focusDate({ year: 2026, month: 8, day: 15 });
199
+ });
200
+ expect(onViewDateChange).toHaveBeenCalledWith({ year: 2026, month: 8, day: 1 });
201
+
202
+ await waitFor(() => {
203
+ expect(document.activeElement).toBe(getByRole("button", { name: /2026년 8월 15일/ }));
204
+ });
205
+ });
206
+
207
+ it("focusDate는 표시 날짜와 roving focus 대상이 이미 같아도 DOM 포커스를 이동한다", async () => {
208
+ const actionsRef = React.createRef<DatePickerActions>();
209
+ const { getByRole } = render(
210
+ <>
211
+ <button type="button" onClick={() => actionsRef.current?.navigateToDate(commonProps.today)}>
212
+ 오늘로 이동
213
+ </button>
214
+ <button type="button" onClick={() => actionsRef.current?.focusDate(commonProps.today)}>
215
+ 오늘에 포커스
216
+ </button>
217
+ <DatePicker {...commonProps} actionsRef={actionsRef} />
218
+ </>,
219
+ );
220
+ const navigateButton = getByRole("button", { name: "오늘로 이동" });
221
+ const focusButton = getByRole("button", { name: "오늘에 포커스" });
222
+
223
+ navigateButton.focus();
224
+ fireEvent.click(navigateButton);
225
+ expect(document.activeElement).toBe(navigateButton);
226
+
227
+ focusButton.focus();
228
+ fireEvent.click(focusButton);
229
+
230
+ await waitFor(() => {
231
+ expect(document.activeElement).toBe(getByRole("button", { name: /2026년 7월 30일/ }));
232
+ });
233
+ });
234
+ });