@aleph-alpha/ui-library 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/mcp/cli.js +21588 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/scripts/generate-component-meta.js +236 -0
- package/dist/mcp/server.js +21456 -0
- package/dist/system/index-CkH7HQaa.js +7 -0
- package/dist/system/index-CuHwEAQ_.js +7 -0
- package/dist/system/index.d.ts +1322 -318
- package/dist/system/lib.js +8839 -6993
- package/mcp/components-meta.json +1172 -0
- package/package.json +12 -2
- package/src/@types/shims-vue.d.ts +5 -0
- package/src/__tests__/placeholder.test.ts +7 -0
- package/src/compositions/UiCompositionPlaceholder/UiCompositionPlaceholder.vue +9 -0
- package/src/compositions/UiCompositionPlaceholder/index.ts +1 -0
- package/src/compositions/UiCompositionPlaceholder/types.ts +8 -0
- package/src/compositions/UiDataTable/UiDataTable.mock.ts +104 -0
- package/src/compositions/UiDataTable/UiDataTable.stories.ts +1575 -0
- package/src/compositions/UiDataTable/UiDataTable.vue +129 -0
- package/src/compositions/UiDataTable/UiDataTableColumnHeader.vue +97 -0
- package/src/compositions/UiDataTable/UiDataTablePagination.vue +147 -0
- package/src/compositions/UiDataTable/UiDataTableToolbar.vue +85 -0
- package/src/compositions/UiDataTable/__tests__/UiDataTable.test.ts +372 -0
- package/src/compositions/UiDataTable/__tests__/UiDataTableColumnHeader.test.ts +217 -0
- package/src/compositions/UiDataTable/__tests__/UiDataTablePagination.test.ts +274 -0
- package/src/compositions/UiDataTable/__tests__/UiDataTableToolbar.test.ts +198 -0
- package/src/compositions/UiDataTable/constants.ts +77 -0
- package/src/compositions/UiDataTable/index.ts +6 -0
- package/src/compositions/UiDataTable/types.ts +39 -0
- package/src/compositions/UiDatePicker/UiDatePicker.stories.ts +976 -0
- package/src/compositions/UiDatePicker/UiDatePicker.vue +193 -0
- package/src/compositions/UiDatePicker/__tests__/UiDatePicker.test.ts +325 -0
- package/src/compositions/UiDatePicker/index.ts +14 -0
- package/src/compositions/UiDatePicker/types.ts +220 -0
- package/src/compositions/index.ts +8 -0
- package/src/foundations/UiPlaceholder/UiPlaceholder.vue +9 -0
- package/src/foundations/UiPlaceholder/index.ts +1 -0
- package/src/foundations/UiPlaceholder/types.ts +8 -0
- package/src/foundations/index.ts +6 -0
- package/src/index.ts +27 -0
- package/src/lib/utils.ts +6 -0
- package/src/primitives/UiAccordion/UiAccordion.stories.ts +476 -0
- package/src/primitives/UiAccordion/UiAccordion.vue +31 -0
- package/src/primitives/UiAccordion/UiAccordionContent.vue +16 -0
- package/src/primitives/UiAccordion/UiAccordionItem.vue +16 -0
- package/src/primitives/UiAccordion/UiAccordionTrigger.vue +23 -0
- package/src/primitives/UiAccordion/__tests__/UiAccordion.test.ts +198 -0
- package/src/primitives/UiAccordion/index.ts +6 -0
- package/src/primitives/UiAccordion/types.ts +95 -0
- package/src/primitives/UiAlert/UiAlert.stories.ts +199 -0
- package/src/primitives/UiAlert/UiAlert.vue +27 -0
- package/src/primitives/UiAlert/UiAlertDescription.vue +13 -0
- package/src/primitives/UiAlert/UiAlertTitle.vue +13 -0
- package/src/primitives/UiAlert/__tests__/UiAlert.test.ts +20 -0
- package/src/primitives/UiAlert/constants.ts +3 -0
- package/src/primitives/UiAlert/index.ts +5 -0
- package/src/primitives/UiAlert/types.ts +14 -0
- package/src/primitives/UiAlertDialog/UiAlertDialog.stories.ts +186 -0
- package/src/primitives/UiAlertDialog/UiAlertDialog.vue +18 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogAction.vue +16 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogCancel.vue +16 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogContent.vue +26 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogDescription.vue +16 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogFooter.vue +13 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogHeader.vue +16 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogTitle.vue +16 -0
- package/src/primitives/UiAlertDialog/UiAlertDialogTrigger.vue +17 -0
- package/src/primitives/UiAlertDialog/__tests__/UiAlertDialog.test.ts +184 -0
- package/src/primitives/UiAlertDialog/index.ts +9 -0
- package/src/primitives/UiAlertDialog/types.ts +83 -0
- package/src/primitives/UiAvatar/UiAvatar.stories.ts +194 -0
- package/src/primitives/UiAvatar/UiAvatar.vue +13 -0
- package/src/primitives/UiAvatar/UiAvatarFallback.vue +13 -0
- package/src/primitives/UiAvatar/UiAvatarImage.vue +14 -0
- package/src/primitives/UiAvatar/__tests__/UiAvatar.test.ts +36 -0
- package/src/primitives/UiAvatar/index.ts +3 -0
- package/src/primitives/UiAvatar/types.ts +17 -0
- package/src/primitives/UiBadge/UiBadge.stories.ts +373 -0
- package/src/primitives/UiBadge/UiBadge.vue +21 -0
- package/src/primitives/UiBadge/__tests__/UiBadge.test.ts +44 -0
- package/src/primitives/UiBadge/constants.ts +3 -0
- package/src/primitives/UiBadge/index.ts +2 -0
- package/src/primitives/UiBadge/types.ts +48 -0
- package/src/primitives/UiButton/UiButton.stories.ts +537 -0
- package/src/primitives/UiButton/UiButton.vue +72 -0
- package/src/primitives/UiButton/__tests__/UiButton.test.ts +133 -0
- package/src/primitives/UiButton/index.ts +2 -0
- package/src/primitives/UiButton/types.ts +87 -0
- package/src/primitives/UiCalendar/UiCalendar.stories.ts +797 -0
- package/src/primitives/UiCalendar/UiCalendar.vue +67 -0
- package/src/primitives/UiCalendar/__tests__/UiCalendar.test.ts +45 -0
- package/src/primitives/UiCalendar/index.ts +15 -0
- package/src/primitives/UiCalendar/types.ts +236 -0
- package/src/primitives/UiCard/UiCard.stories.ts +197 -0
- package/src/primitives/UiCard/UiCard.vue +13 -0
- package/src/primitives/UiCard/UiCardAction.vue +13 -0
- package/src/primitives/UiCard/UiCardContent.vue +13 -0
- package/src/primitives/UiCard/UiCardDescription.vue +13 -0
- package/src/primitives/UiCard/UiCardFooter.vue +13 -0
- package/src/primitives/UiCard/UiCardHeader.vue +13 -0
- package/src/primitives/UiCard/UiCardTitle.vue +13 -0
- package/src/primitives/UiCard/__tests__/UiCard.test.ts +19 -0
- package/src/primitives/UiCard/__tests__/UiCardAction.test.ts +19 -0
- package/src/primitives/UiCard/__tests__/UiCardContent.test.ts +19 -0
- package/src/primitives/UiCard/__tests__/UiCardDescription.test.ts +19 -0
- package/src/primitives/UiCard/__tests__/UiCardFooter.test.ts +19 -0
- package/src/primitives/UiCard/__tests__/UiCardHeader.test.ts +19 -0
- package/src/primitives/UiCard/__tests__/UiCardTitle.test.ts +19 -0
- package/src/primitives/UiCard/index.ts +7 -0
- package/src/primitives/UiCard/types.ts +10 -0
- package/src/primitives/UiCheckbox/UiCheckbox.stories.ts +231 -0
- package/src/primitives/UiCheckbox/UiCheckbox.vue +19 -0
- package/src/primitives/UiCheckbox/__tests__/UiCheckbox.test.ts +29 -0
- package/src/primitives/UiCheckbox/index.ts +2 -0
- package/src/primitives/UiCheckbox/types.ts +30 -0
- package/src/primitives/UiDrawer/UiDrawer.stories.ts +602 -0
- package/src/primitives/UiDrawer/UiDrawer.vue +19 -0
- package/src/primitives/UiDrawer/UiDrawerClose.vue +16 -0
- package/src/primitives/UiDrawer/UiDrawerContent.vue +29 -0
- package/src/primitives/UiDrawer/UiDrawerDescription.vue +16 -0
- package/src/primitives/UiDrawer/UiDrawerFooter.vue +16 -0
- package/src/primitives/UiDrawer/UiDrawerHeader.vue +16 -0
- package/src/primitives/UiDrawer/UiDrawerTitle.vue +16 -0
- package/src/primitives/UiDrawer/UiDrawerTrigger.vue +16 -0
- package/src/primitives/UiDrawer/__tests__/UiDrawer.test.ts +229 -0
- package/src/primitives/UiDrawer/index.ts +8 -0
- package/src/primitives/UiDrawer/types.ts +96 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenu.stories.ts +760 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenu.vue +25 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuCheckboxItem.vue +29 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuContent.vue +27 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuGroup.vue +13 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuItem.vue +26 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuLabel.vue +18 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuRadioGroup.vue +20 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuRadioItem.vue +26 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuSeparator.vue +11 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuShortcut.vue +13 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuSub.vue +26 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuSubContent.vue +23 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuSubTrigger.vue +24 -0
- package/src/primitives/UiDropdownMenu/UiDropdownMenuTrigger.vue +24 -0
- package/src/primitives/UiDropdownMenu/__tests__/UiDropdownMenu.test.ts +557 -0
- package/src/primitives/UiDropdownMenu/index.ts +16 -0
- package/src/primitives/UiDropdownMenu/types.ts +219 -0
- package/src/primitives/UiField/UiField.stories.ts +1496 -0
- package/src/primitives/UiField/UiField.vue +18 -0
- package/src/primitives/UiField/UiFieldContent.vue +13 -0
- package/src/primitives/UiField/UiFieldDescription.vue +13 -0
- package/src/primitives/UiField/UiFieldError.vue +20 -0
- package/src/primitives/UiField/UiFieldGroup.vue +13 -0
- package/src/primitives/UiField/UiFieldLabel.vue +16 -0
- package/src/primitives/UiField/UiFieldLegend.vue +13 -0
- package/src/primitives/UiField/UiFieldSeparator.vue +13 -0
- package/src/primitives/UiField/UiFieldSet.vue +13 -0
- package/src/primitives/UiField/UiFieldTitle.vue +13 -0
- package/src/primitives/UiField/__tests__/UiFieldError.test.ts +35 -0
- package/src/primitives/UiField/index.ts +10 -0
- package/src/primitives/UiField/types.ts +47 -0
- package/src/primitives/UiIcon/UiIcon.stories.ts +95 -0
- package/src/primitives/UiIcon/UiIcon.vue +14 -0
- package/src/primitives/UiIcon/__tests__/UiIcon.test.ts +24 -0
- package/src/primitives/UiIcon/index.ts +1 -0
- package/src/primitives/UiIcon/types.ts +23 -0
- package/src/primitives/UiIconButton/UiIconButton.stories.ts +446 -0
- package/src/primitives/UiIconButton/UiIconButton.vue +63 -0
- package/src/primitives/UiIconButton/__tests__/UiIconButton.test.ts +102 -0
- package/src/primitives/UiIconButton/index.ts +2 -0
- package/src/primitives/UiIconButton/types.ts +67 -0
- package/src/primitives/UiInput/UiInput.stories.ts +193 -0
- package/src/primitives/UiInput/UiInput.vue +19 -0
- package/src/primitives/UiInput/__tests__/UiInput.test.ts +38 -0
- package/src/primitives/UiInput/index.ts +2 -0
- package/src/primitives/UiInput/types.ts +31 -0
- package/src/primitives/UiPopover/UiPopover.stories.ts +394 -0
- package/src/primitives/UiPopover/UiPopover.vue +17 -0
- package/src/primitives/UiPopover/UiPopoverContent.vue +27 -0
- package/src/primitives/UiPopover/UiPopoverTrigger.vue +16 -0
- package/src/primitives/UiPopover/__tests__/UiPopover.test.ts +87 -0
- package/src/primitives/UiPopover/index.ts +5 -0
- package/src/primitives/UiPopover/types.ts +86 -0
- package/src/primitives/UiProgress/UiProgress.stories.ts +92 -0
- package/src/primitives/UiProgress/UiProgress.vue +25 -0
- package/src/primitives/UiProgress/__tests__/UiProgress.test.ts +46 -0
- package/src/primitives/UiProgress/index.ts +2 -0
- package/src/primitives/UiProgress/types.ts +16 -0
- package/src/primitives/UiRadioGroup/UiRadioGroup.stories.ts +291 -0
- package/src/primitives/UiRadioGroup/UiRadioGroup.vue +43 -0
- package/src/primitives/UiRadioGroup/UiRadioGroupItem.vue +18 -0
- package/src/primitives/UiRadioGroup/__tests__/UiRadioGroup.test.ts +404 -0
- package/src/primitives/UiRadioGroup/index.ts +4 -0
- package/src/primitives/UiRadioGroup/types.ts +66 -0
- package/src/primitives/UiRangeCalendar/UiRangeCalendar.stories.ts +609 -0
- package/src/primitives/UiRangeCalendar/UiRangeCalendar.vue +50 -0
- package/src/primitives/UiRangeCalendar/__tests__/UiRangeCalendar.test.ts +35 -0
- package/src/primitives/UiRangeCalendar/index.ts +13 -0
- package/src/primitives/UiRangeCalendar/types.ts +184 -0
- package/src/primitives/UiSelect/UiSelect.stories.ts +425 -0
- package/src/primitives/UiSelect/UiSelect.vue +47 -0
- package/src/primitives/UiSelect/UiSelectContent.vue +30 -0
- package/src/primitives/UiSelect/UiSelectGroup.vue +13 -0
- package/src/primitives/UiSelect/UiSelectItem.vue +19 -0
- package/src/primitives/UiSelect/UiSelectLabel.vue +13 -0
- package/src/primitives/UiSelect/UiSelectSeparator.vue +11 -0
- package/src/primitives/UiSelect/UiSelectTrigger.vue +30 -0
- package/src/primitives/UiSelect/UiSelectValue.vue +18 -0
- package/src/primitives/UiSelect/__tests__/UiSelect.test.ts +211 -0
- package/src/primitives/UiSelect/__tests__/UiSelectContent.test.ts +30 -0
- package/src/primitives/UiSelect/__tests__/UiSelectGroup.test.ts +85 -0
- package/src/primitives/UiSelect/__tests__/UiSelectItem.test.ts +79 -0
- package/src/primitives/UiSelect/__tests__/UiSelectLabel.test.ts +83 -0
- package/src/primitives/UiSelect/__tests__/UiSelectSeparator.test.ts +82 -0
- package/src/primitives/UiSelect/__tests__/UiSelectTrigger.test.ts +54 -0
- package/src/primitives/UiSelect/__tests__/UiSelectValue.test.ts +39 -0
- package/src/primitives/UiSelect/index.ts +10 -0
- package/src/primitives/UiSelect/types.ts +93 -0
- package/src/primitives/UiSlider/UiSlider.stories.ts +226 -0
- package/src/primitives/UiSlider/UiSlider.vue +44 -0
- package/src/primitives/UiSlider/__tests__/UiSlider.test.ts +76 -0
- package/src/primitives/UiSlider/index.ts +1 -0
- package/src/primitives/UiSlider/types.ts +101 -0
- package/src/primitives/UiSpinner/UiSpinner.stories.ts +143 -0
- package/src/primitives/UiSpinner/UiSpinner.vue +16 -0
- package/src/primitives/UiSpinner/__tests__/UiSpinner.test.ts +19 -0
- package/src/primitives/UiSpinner/index.ts +2 -0
- package/src/primitives/UiSpinner/types.ts +16 -0
- package/src/primitives/UiSwitch/UiSwitch.stories.ts +120 -0
- package/src/primitives/UiSwitch/UiSwitch.vue +21 -0
- package/src/primitives/UiSwitch/__tests__/UiSwitch.test.ts +47 -0
- package/src/primitives/UiSwitch/index.ts +2 -0
- package/src/primitives/UiSwitch/types.ts +25 -0
- package/src/primitives/UiTable/UiTable.stories.ts +505 -0
- package/src/primitives/UiTable/UiTable.vue +13 -0
- package/src/primitives/UiTable/UiTableBody.vue +13 -0
- package/src/primitives/UiTable/UiTableCaption.vue +13 -0
- package/src/primitives/UiTable/UiTableCell.vue +16 -0
- package/src/primitives/UiTable/UiTableEmpty.vue +18 -0
- package/src/primitives/UiTable/UiTableFooter.vue +13 -0
- package/src/primitives/UiTable/UiTableHead.vue +18 -0
- package/src/primitives/UiTable/UiTableHeader.vue +13 -0
- package/src/primitives/UiTable/UiTableRow.vue +18 -0
- package/src/primitives/UiTable/__tests__/UiTable.test.ts +19 -0
- package/src/primitives/UiTable/__tests__/UiTableBody.test.ts +19 -0
- package/src/primitives/UiTable/__tests__/UiTableCaption.test.ts +19 -0
- package/src/primitives/UiTable/__tests__/UiTableCell.test.ts +26 -0
- package/src/primitives/UiTable/__tests__/UiTableEmpty.test.ts +32 -0
- package/src/primitives/UiTable/__tests__/UiTableFooter.test.ts +19 -0
- package/src/primitives/UiTable/__tests__/UiTableHead.test.ts +43 -0
- package/src/primitives/UiTable/__tests__/UiTableHeader.test.ts +19 -0
- package/src/primitives/UiTable/__tests__/UiTableRow.test.ts +32 -0
- package/src/primitives/UiTable/index.ts +16 -0
- package/src/primitives/UiTable/types.ts +68 -0
- package/src/primitives/UiTabs/UiTabs.stories.ts +456 -0
- package/src/primitives/UiTabs/UiTabs.vue +31 -0
- package/src/primitives/UiTabs/UiTabsContent.vue +16 -0
- package/src/primitives/UiTabs/UiTabsList.vue +16 -0
- package/src/primitives/UiTabs/UiTabsTrigger.vue +16 -0
- package/src/primitives/UiTabs/__tests__/UiTabs.test.ts +122 -0
- package/src/primitives/UiTabs/index.ts +6 -0
- package/src/primitives/UiTabs/types.ts +68 -0
- package/src/primitives/UiTextarea/UiTextarea.stories.ts +107 -0
- package/src/primitives/UiTextarea/UiTextarea.vue +19 -0
- package/src/primitives/UiTextarea/__tests__/UiTextarea.test.ts +40 -0
- package/src/primitives/UiTextarea/index.ts +2 -0
- package/src/primitives/UiTextarea/types.ts +30 -0
- package/src/primitives/UiTooltip/UiTooltip.stories.ts +550 -0
- package/src/primitives/UiTooltip/UiTooltip.vue +42 -0
- package/src/primitives/UiTooltip/__tests__/UiTooltip.test.ts +78 -0
- package/src/primitives/UiTooltip/index.ts +2 -0
- package/src/primitives/UiTooltip/types.ts +53 -0
- package/src/primitives/index.ts +33 -0
- package/src/primitives/shadcn/accordion/Accordion.vue +15 -0
- package/src/primitives/shadcn/accordion/AccordionContent.vue +23 -0
- package/src/primitives/shadcn/accordion/AccordionItem.vue +24 -0
- package/src/primitives/shadcn/accordion/AccordionTrigger.vue +35 -0
- package/src/primitives/shadcn/accordion/index.ts +4 -0
- package/src/primitives/shadcn/alert/Alert.vue +17 -0
- package/src/primitives/shadcn/alert/AlertDescription.vue +22 -0
- package/src/primitives/shadcn/alert/AlertTitle.vue +17 -0
- package/src/primitives/shadcn/alert/index.ts +24 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialog.vue +15 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogAction.vue +18 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogCancel.vue +21 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogContent.vue +44 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogDescription.vue +21 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogFooter.vue +17 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogHeader.vue +17 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogTitle.vue +21 -0
- package/src/primitives/shadcn/alert-dialog/AlertDialogTrigger.vue +12 -0
- package/src/primitives/shadcn/alert-dialog/index.ts +9 -0
- package/src/primitives/shadcn/avatar/Avatar.vue +18 -0
- package/src/primitives/shadcn/avatar/AvatarFallback.vue +21 -0
- package/src/primitives/shadcn/avatar/AvatarImage.vue +12 -0
- package/src/primitives/shadcn/avatar/index.ts +3 -0
- package/src/primitives/shadcn/badge/Badge.vue +28 -0
- package/src/primitives/shadcn/badge/index.ts +24 -0
- package/src/primitives/shadcn/button/Button.vue +29 -0
- package/src/primitives/shadcn/button/index.ts +36 -0
- package/src/primitives/shadcn/calendar/Calendar.vue +206 -0
- package/src/primitives/shadcn/calendar/CalendarCell.vue +28 -0
- package/src/primitives/shadcn/calendar/CalendarCellTrigger.vue +44 -0
- package/src/primitives/shadcn/calendar/CalendarGrid.vue +23 -0
- package/src/primitives/shadcn/calendar/CalendarGridBody.vue +12 -0
- package/src/primitives/shadcn/calendar/CalendarGridHead.vue +13 -0
- package/src/primitives/shadcn/calendar/CalendarGridRow.vue +23 -0
- package/src/primitives/shadcn/calendar/CalendarHeadCell.vue +23 -0
- package/src/primitives/shadcn/calendar/CalendarHeader.vue +23 -0
- package/src/primitives/shadcn/calendar/CalendarHeading.vue +30 -0
- package/src/primitives/shadcn/calendar/CalendarNextButton.vue +33 -0
- package/src/primitives/shadcn/calendar/CalendarPrevButton.vue +33 -0
- package/src/primitives/shadcn/calendar/index.ts +14 -0
- package/src/primitives/shadcn/card/Card.vue +22 -0
- package/src/primitives/shadcn/card/CardAction.vue +17 -0
- package/src/primitives/shadcn/card/CardContent.vue +14 -0
- package/src/primitives/shadcn/card/CardDescription.vue +14 -0
- package/src/primitives/shadcn/card/CardFooter.vue +14 -0
- package/src/primitives/shadcn/card/CardHeader.vue +22 -0
- package/src/primitives/shadcn/card/CardTitle.vue +14 -0
- package/src/primitives/shadcn/card/index.ts +7 -0
- package/src/primitives/shadcn/checkbox/Checkbox.vue +38 -0
- package/src/primitives/shadcn/checkbox/index.ts +1 -0
- package/src/primitives/shadcn/drawer/Drawer.vue +15 -0
- package/src/primitives/shadcn/drawer/DrawerClose.vue +12 -0
- package/src/primitives/shadcn/drawer/DrawerContent.vue +52 -0
- package/src/primitives/shadcn/drawer/DrawerDescription.vue +20 -0
- package/src/primitives/shadcn/drawer/DrawerFooter.vue +17 -0
- package/src/primitives/shadcn/drawer/DrawerHeader.vue +17 -0
- package/src/primitives/shadcn/drawer/DrawerTitle.vue +20 -0
- package/src/primitives/shadcn/drawer/DrawerTrigger.vue +12 -0
- package/src/primitives/shadcn/drawer/index.ts +8 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenu.vue +15 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +41 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuContent.vue +40 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuItem.vue +41 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuLabel.vue +25 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuRadioGroup.vue +15 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuRadioItem.vue +38 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuSeparator.vue +23 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuShortcut.vue +17 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuSub.vue +15 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuSubContent.vue +29 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
- package/src/primitives/shadcn/dropdown-menu/DropdownMenuTrigger.vue +14 -0
- package/src/primitives/shadcn/dropdown-menu/index.ts +16 -0
- package/src/primitives/shadcn/field/Field.vue +22 -0
- package/src/primitives/shadcn/field/FieldContent.vue +17 -0
- package/src/primitives/shadcn/field/FieldDescription.vue +24 -0
- package/src/primitives/shadcn/field/FieldError.vue +69 -0
- package/src/primitives/shadcn/field/FieldGroup.vue +22 -0
- package/src/primitives/shadcn/field/FieldLabel.vue +28 -0
- package/src/primitives/shadcn/field/FieldLegend.vue +26 -0
- package/src/primitives/shadcn/field/FieldSeparator.vue +28 -0
- package/src/primitives/shadcn/field/FieldSet.vue +23 -0
- package/src/primitives/shadcn/field/FieldTitle.vue +22 -0
- package/src/primitives/shadcn/field/index.ts +39 -0
- package/src/primitives/shadcn/icon/Icon.vue +38 -0
- package/src/primitives/shadcn/icon/index.ts +1 -0
- package/src/primitives/shadcn/index.ts +3 -0
- package/src/primitives/shadcn/input/Input.vue +35 -0
- package/src/primitives/shadcn/input/index.ts +1 -0
- package/src/primitives/shadcn/label/Label.vue +28 -0
- package/src/primitives/shadcn/label/index.ts +1 -0
- package/src/primitives/shadcn/native-select/NativeSelect.vue +56 -0
- package/src/primitives/shadcn/native-select/NativeSelectOptGroup.vue +18 -0
- package/src/primitives/shadcn/native-select/NativeSelectOption.vue +18 -0
- package/src/primitives/shadcn/native-select/index.ts +3 -0
- package/src/primitives/shadcn/popover/Popover.vue +19 -0
- package/src/primitives/shadcn/popover/PopoverContent.vue +41 -0
- package/src/primitives/shadcn/popover/PopoverTrigger.vue +11 -0
- package/src/primitives/shadcn/popover/index.ts +4 -0
- package/src/primitives/shadcn/progress/Progress.vue +30 -0
- package/src/primitives/shadcn/progress/index.ts +1 -0
- package/src/primitives/shadcn/radio-group/RadioGroup.vue +25 -0
- package/src/primitives/shadcn/radio-group/RadioGroupItem.vue +38 -0
- package/src/primitives/shadcn/radio-group/index.ts +2 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendar.vue +73 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarCell.vue +28 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarCellTrigger.vue +46 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarGrid.vue +23 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarGridBody.vue +12 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarGridHead.vue +12 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarGridRow.vue +23 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarHeadCell.vue +23 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarHeader.vue +23 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarHeading.vue +30 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarNextButton.vue +34 -0
- package/src/primitives/shadcn/range-calendar/RangeCalendarPrevButton.vue +34 -0
- package/src/primitives/shadcn/range-calendar/index.ts +12 -0
- package/src/primitives/shadcn/select/Select.vue +15 -0
- package/src/primitives/shadcn/select/SelectContent.vue +55 -0
- package/src/primitives/shadcn/select/SelectGroup.vue +12 -0
- package/src/primitives/shadcn/select/SelectItem.vue +39 -0
- package/src/primitives/shadcn/select/SelectItemText.vue +12 -0
- package/src/primitives/shadcn/select/SelectLabel.vue +17 -0
- package/src/primitives/shadcn/select/SelectScrollDownButton.vue +26 -0
- package/src/primitives/shadcn/select/SelectScrollUpButton.vue +26 -0
- package/src/primitives/shadcn/select/SelectSeparator.vue +19 -0
- package/src/primitives/shadcn/select/SelectTrigger.vue +37 -0
- package/src/primitives/shadcn/select/SelectValue.vue +12 -0
- package/src/primitives/shadcn/select/index.ts +11 -0
- package/src/primitives/shadcn/separator/Separator.vue +27 -0
- package/src/primitives/shadcn/separator/index.ts +1 -0
- package/src/primitives/shadcn/slider/Slider.vue +45 -0
- package/src/primitives/shadcn/slider/index.ts +1 -0
- package/src/primitives/shadcn/spinner/Spinner.vue +18 -0
- package/src/primitives/shadcn/spinner/index.ts +1 -0
- package/src/primitives/shadcn/switch/Switch.vue +40 -0
- package/src/primitives/shadcn/switch/index.ts +1 -0
- package/src/primitives/shadcn/table/Table.vue +16 -0
- package/src/primitives/shadcn/table/TableBody.vue +14 -0
- package/src/primitives/shadcn/table/TableCaption.vue +14 -0
- package/src/primitives/shadcn/table/TableCell.vue +26 -0
- package/src/primitives/shadcn/table/TableEmpty.vue +29 -0
- package/src/primitives/shadcn/table/TableFooter.vue +17 -0
- package/src/primitives/shadcn/table/TableHead.vue +28 -0
- package/src/primitives/shadcn/table/TableHeader.vue +14 -0
- package/src/primitives/shadcn/table/TableRow.vue +21 -0
- package/src/primitives/shadcn/table/index.ts +9 -0
- package/src/primitives/shadcn/table/utils.ts +8 -0
- package/src/primitives/shadcn/tabs/Tabs.vue +24 -0
- package/src/primitives/shadcn/tabs/TabsContent.vue +21 -0
- package/src/primitives/shadcn/tabs/TabsList.vue +26 -0
- package/src/primitives/shadcn/tabs/TabsTrigger.vue +28 -0
- package/src/primitives/shadcn/tabs/index.ts +4 -0
- package/src/primitives/shadcn/textarea/Textarea.vue +33 -0
- package/src/primitives/shadcn/textarea/index.ts +1 -0
- package/src/primitives/shadcn/tooltip/Tooltip.vue +15 -0
- package/src/primitives/shadcn/tooltip/TooltipContent.vue +40 -0
- package/src/primitives/shadcn/tooltip/TooltipProvider.vue +12 -0
- package/src/primitives/shadcn/tooltip/TooltipTrigger.vue +12 -0
- package/src/primitives/shadcn/tooltip/index.ts +4 -0
- package/src/styles/global.css +1 -0
- package/src/templates/UiTemplatePlaceholder/UiTemplatePlaceholder.vue +9 -0
- package/src/templates/UiTemplatePlaceholder/index.ts +1 -0
- package/src/templates/UiTemplatePlaceholder/types.ts +8 -0
- package/src/templates/index.ts +6 -0
|
@@ -0,0 +1,976 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3-vite';
|
|
2
|
+
import { CalendarDate, getLocalTimeZone, today } from '@internationalized/date';
|
|
3
|
+
import type { DateRange, DateValue } from 'reka-ui';
|
|
4
|
+
import { ref, watch } from 'vue';
|
|
5
|
+
import UiDatePicker from './UiDatePicker.vue';
|
|
6
|
+
|
|
7
|
+
const meta: Meta<typeof UiDatePicker> = {
|
|
8
|
+
title: 'Compositions/UiDatePicker',
|
|
9
|
+
component: UiDatePicker,
|
|
10
|
+
tags: ['autodocs'],
|
|
11
|
+
decorators: [
|
|
12
|
+
() => ({
|
|
13
|
+
template: '<div class="inline-block"><story /></div>',
|
|
14
|
+
}),
|
|
15
|
+
],
|
|
16
|
+
argTypes: {
|
|
17
|
+
mode: {
|
|
18
|
+
control: 'select',
|
|
19
|
+
options: ['single', 'range'],
|
|
20
|
+
description: 'The selection mode: single date or date range.',
|
|
21
|
+
},
|
|
22
|
+
placeholder: {
|
|
23
|
+
control: 'text',
|
|
24
|
+
description: 'Placeholder text when no date is selected.',
|
|
25
|
+
},
|
|
26
|
+
disabled: {
|
|
27
|
+
control: 'boolean',
|
|
28
|
+
description: 'Whether the date picker is disabled.',
|
|
29
|
+
},
|
|
30
|
+
readonly: {
|
|
31
|
+
control: 'boolean',
|
|
32
|
+
description: 'Whether the date picker is read-only.',
|
|
33
|
+
},
|
|
34
|
+
locale: {
|
|
35
|
+
control: 'select',
|
|
36
|
+
options: ['en', 'de', 'fr', 'es', 'pl'],
|
|
37
|
+
description: 'The locale to use for formatting dates.',
|
|
38
|
+
},
|
|
39
|
+
weekStartsOn: {
|
|
40
|
+
control: 'select',
|
|
41
|
+
options: [0, 1, 2, 3, 4, 5, 6],
|
|
42
|
+
description: 'The day of the week to start on. 0 = Sunday, 1 = Monday, etc.',
|
|
43
|
+
},
|
|
44
|
+
numberOfMonths: {
|
|
45
|
+
control: { type: 'number', min: 1, max: 3 },
|
|
46
|
+
description: 'The number of months to display at once.',
|
|
47
|
+
},
|
|
48
|
+
pagedNavigation: {
|
|
49
|
+
control: 'boolean',
|
|
50
|
+
description:
|
|
51
|
+
'Whether to navigate by page (all visible months) or by single month. Only applies in range mode.',
|
|
52
|
+
},
|
|
53
|
+
weekdayFormat: {
|
|
54
|
+
control: 'select',
|
|
55
|
+
options: ['narrow', 'short', 'long'],
|
|
56
|
+
description: 'The format to use for weekday labels.',
|
|
57
|
+
},
|
|
58
|
+
fixedWeeks: {
|
|
59
|
+
control: 'boolean',
|
|
60
|
+
description: 'Whether to always show 6 weeks in the calendar.',
|
|
61
|
+
},
|
|
62
|
+
layout: {
|
|
63
|
+
control: 'select',
|
|
64
|
+
options: [undefined, 'month-and-year', 'month-only', 'year-only'],
|
|
65
|
+
description: 'Layout mode for the calendar header dropdowns. Only applies in single mode.',
|
|
66
|
+
},
|
|
67
|
+
preventDeselect: {
|
|
68
|
+
control: 'boolean',
|
|
69
|
+
description: 'Whether to prevent deselecting a date.',
|
|
70
|
+
},
|
|
71
|
+
closeOnSelect: {
|
|
72
|
+
control: 'boolean',
|
|
73
|
+
description: 'Whether to close the popover after selecting a date (or date range).',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
args: {
|
|
77
|
+
mode: 'single',
|
|
78
|
+
disabled: false,
|
|
79
|
+
readonly: false,
|
|
80
|
+
locale: 'en',
|
|
81
|
+
weekStartsOn: 0,
|
|
82
|
+
numberOfMonths: 1,
|
|
83
|
+
pagedNavigation: false,
|
|
84
|
+
weekdayFormat: 'narrow',
|
|
85
|
+
fixedWeeks: false,
|
|
86
|
+
layout: undefined,
|
|
87
|
+
preventDeselect: false,
|
|
88
|
+
closeOnSelect: true,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export default meta;
|
|
93
|
+
|
|
94
|
+
type Story = StoryObj<typeof UiDatePicker>;
|
|
95
|
+
|
|
96
|
+
const defaultTemplateSource = `<script setup lang="ts">
|
|
97
|
+
import { ref } from 'vue'
|
|
98
|
+
import type { DateValue } from '@internationalized/date'
|
|
99
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
100
|
+
|
|
101
|
+
const date = ref<DateValue>()
|
|
102
|
+
</script>
|
|
103
|
+
|
|
104
|
+
<template>
|
|
105
|
+
<UiDatePicker v-model="date" />
|
|
106
|
+
</template>`;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Basic date picker with default settings.
|
|
110
|
+
* Click the button to open the calendar and select a date.
|
|
111
|
+
*/
|
|
112
|
+
export const Default: Story = {
|
|
113
|
+
render: (args) => ({
|
|
114
|
+
components: { UiDatePicker },
|
|
115
|
+
setup() {
|
|
116
|
+
const date = ref<DateValue>();
|
|
117
|
+
watch(
|
|
118
|
+
() => args.modelValue,
|
|
119
|
+
(val) => {
|
|
120
|
+
date.value = val;
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
return { date, args };
|
|
124
|
+
},
|
|
125
|
+
template: `<UiDatePicker
|
|
126
|
+
v-model="date"
|
|
127
|
+
:placeholder="args.placeholder"
|
|
128
|
+
:disabled="args.disabled"
|
|
129
|
+
:readonly="args.readonly"
|
|
130
|
+
:locale="args.locale"
|
|
131
|
+
:week-starts-on="args.weekStartsOn"
|
|
132
|
+
:number-of-months="args.numberOfMonths"
|
|
133
|
+
:weekday-format="args.weekdayFormat"
|
|
134
|
+
:fixed-weeks="args.fixedWeeks"
|
|
135
|
+
:layout="args.layout"
|
|
136
|
+
:prevent-deselect="args.preventDeselect"
|
|
137
|
+
:close-on-select="args.closeOnSelect"
|
|
138
|
+
/>`,
|
|
139
|
+
}),
|
|
140
|
+
parameters: {
|
|
141
|
+
docs: {
|
|
142
|
+
source: {
|
|
143
|
+
code: defaultTemplateSource,
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const withPreselectedDateTemplateSource = `<script setup lang="ts">
|
|
150
|
+
import { ref } from 'vue'
|
|
151
|
+
import type { DateValue } from '@internationalized/date'
|
|
152
|
+
import { getLocalTimeZone, today } from '@internationalized/date'
|
|
153
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
154
|
+
|
|
155
|
+
const date = ref<DateValue>(today(getLocalTimeZone()))
|
|
156
|
+
</script>
|
|
157
|
+
|
|
158
|
+
<template>
|
|
159
|
+
<UiDatePicker v-model="date" />
|
|
160
|
+
</template>`;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Date picker with a pre-selected date (today).
|
|
164
|
+
*/
|
|
165
|
+
export const WithPreselectedDate: Story = {
|
|
166
|
+
render: (args) => ({
|
|
167
|
+
components: { UiDatePicker },
|
|
168
|
+
setup() {
|
|
169
|
+
const date = ref<DateValue>(today(getLocalTimeZone()));
|
|
170
|
+
return { date, args };
|
|
171
|
+
},
|
|
172
|
+
template: `<UiDatePicker
|
|
173
|
+
v-model="date"
|
|
174
|
+
:locale="args.locale"
|
|
175
|
+
:disabled="args.disabled"
|
|
176
|
+
/>`,
|
|
177
|
+
}),
|
|
178
|
+
parameters: {
|
|
179
|
+
docs: {
|
|
180
|
+
source: {
|
|
181
|
+
code: withPreselectedDateTemplateSource,
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const withMonthYearDropdownsTemplateSource = `<script setup lang="ts">
|
|
188
|
+
import { ref } from 'vue'
|
|
189
|
+
import type { DateValue } from '@internationalized/date'
|
|
190
|
+
import { CalendarDate } from '@internationalized/date'
|
|
191
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
192
|
+
|
|
193
|
+
const date = ref<DateValue>()
|
|
194
|
+
const minValue = new CalendarDate(1925, 1, 1)
|
|
195
|
+
const maxValue = new CalendarDate(2035, 1, 1)
|
|
196
|
+
</script>
|
|
197
|
+
|
|
198
|
+
<template>
|
|
199
|
+
<UiDatePicker
|
|
200
|
+
v-model="date"
|
|
201
|
+
layout="month-and-year"
|
|
202
|
+
:min-value="minValue"
|
|
203
|
+
:max-value="maxValue"
|
|
204
|
+
placeholder="Select birth date"
|
|
205
|
+
/>
|
|
206
|
+
</template>`;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Date picker with month and year dropdown selectors.
|
|
210
|
+
* Useful for date-of-birth pickers or when users need to navigate far from the current date.
|
|
211
|
+
*/
|
|
212
|
+
export const WithMonthYearDropdowns: Story = {
|
|
213
|
+
args: {
|
|
214
|
+
layout: 'month-and-year',
|
|
215
|
+
placeholder: 'Select birth date',
|
|
216
|
+
},
|
|
217
|
+
render: (args) => ({
|
|
218
|
+
components: { UiDatePicker },
|
|
219
|
+
setup() {
|
|
220
|
+
const date = ref<DateValue>();
|
|
221
|
+
const minValue = new CalendarDate(1925, 1, 1);
|
|
222
|
+
const maxValue = new CalendarDate(2035, 1, 1);
|
|
223
|
+
return { date, minValue, maxValue, args };
|
|
224
|
+
},
|
|
225
|
+
template: `<UiDatePicker
|
|
226
|
+
v-model="date"
|
|
227
|
+
:layout="args.layout"
|
|
228
|
+
:min-value="minValue"
|
|
229
|
+
:max-value="maxValue"
|
|
230
|
+
:placeholder="args.placeholder"
|
|
231
|
+
:disabled="args.disabled"
|
|
232
|
+
:locale="args.locale"
|
|
233
|
+
/>`,
|
|
234
|
+
}),
|
|
235
|
+
parameters: {
|
|
236
|
+
docs: {
|
|
237
|
+
source: {
|
|
238
|
+
code: withMonthYearDropdownsTemplateSource,
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
const withDateRangeTemplateSource = `<script setup lang="ts">
|
|
245
|
+
import { ref } from 'vue'
|
|
246
|
+
import type { DateValue } from '@internationalized/date'
|
|
247
|
+
import { getLocalTimeZone, today } from '@internationalized/date'
|
|
248
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
249
|
+
|
|
250
|
+
const date = ref<DateValue>()
|
|
251
|
+
const minValue = today(getLocalTimeZone())
|
|
252
|
+
const maxValue = today(getLocalTimeZone()).add({ months: 3 })
|
|
253
|
+
</script>
|
|
254
|
+
|
|
255
|
+
<template>
|
|
256
|
+
<UiDatePicker
|
|
257
|
+
v-model="date"
|
|
258
|
+
:min-value="minValue"
|
|
259
|
+
:max-value="maxValue"
|
|
260
|
+
placeholder="Select appointment"
|
|
261
|
+
/>
|
|
262
|
+
</template>`;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Date picker with min and max date constraints.
|
|
266
|
+
* Only dates within the next 3 months are selectable.
|
|
267
|
+
*/
|
|
268
|
+
export const WithDateRange: Story = {
|
|
269
|
+
args: {
|
|
270
|
+
placeholder: 'Select appointment',
|
|
271
|
+
},
|
|
272
|
+
render: (args) => ({
|
|
273
|
+
components: { UiDatePicker },
|
|
274
|
+
setup() {
|
|
275
|
+
const date = ref<DateValue>();
|
|
276
|
+
const todayDate = today(getLocalTimeZone());
|
|
277
|
+
const minValue = todayDate;
|
|
278
|
+
const maxValue = todayDate.add({ months: 3 });
|
|
279
|
+
return { date, minValue, maxValue, args };
|
|
280
|
+
},
|
|
281
|
+
template: `<UiDatePicker
|
|
282
|
+
v-model="date"
|
|
283
|
+
:min-value="minValue"
|
|
284
|
+
:max-value="maxValue"
|
|
285
|
+
:placeholder="args.placeholder"
|
|
286
|
+
:disabled="args.disabled"
|
|
287
|
+
:locale="args.locale"
|
|
288
|
+
/>`,
|
|
289
|
+
}),
|
|
290
|
+
parameters: {
|
|
291
|
+
docs: {
|
|
292
|
+
source: {
|
|
293
|
+
code: withDateRangeTemplateSource,
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const disabledWeekendsTemplateSource = `<script setup lang="ts">
|
|
300
|
+
import { ref } from 'vue'
|
|
301
|
+
import type { DateValue } from '@internationalized/date'
|
|
302
|
+
import { getLocalTimeZone } from '@internationalized/date'
|
|
303
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
304
|
+
|
|
305
|
+
const date = ref<DateValue>()
|
|
306
|
+
|
|
307
|
+
// Disable weekends (Sunday = 0, Saturday = 6)
|
|
308
|
+
const isDateDisabled = (date: DateValue) => {
|
|
309
|
+
const dayOfWeek = date.toDate(getLocalTimeZone()).getDay()
|
|
310
|
+
return dayOfWeek === 0 || dayOfWeek === 6
|
|
311
|
+
}
|
|
312
|
+
</script>
|
|
313
|
+
|
|
314
|
+
<template>
|
|
315
|
+
<UiDatePicker
|
|
316
|
+
v-model="date"
|
|
317
|
+
:is-date-disabled="isDateDisabled"
|
|
318
|
+
placeholder="Select weekday"
|
|
319
|
+
/>
|
|
320
|
+
</template>`;
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Date picker with weekends disabled.
|
|
324
|
+
* Use the `isDateDisabled` function to disable specific dates based on custom logic.
|
|
325
|
+
*/
|
|
326
|
+
export const DisabledWeekends: Story = {
|
|
327
|
+
args: {
|
|
328
|
+
placeholder: 'Select weekday',
|
|
329
|
+
},
|
|
330
|
+
render: (args) => ({
|
|
331
|
+
components: { UiDatePicker },
|
|
332
|
+
setup() {
|
|
333
|
+
const date = ref<DateValue>();
|
|
334
|
+
|
|
335
|
+
// Disable weekends (Sunday = 0, Saturday = 6 in JavaScript's getDay())
|
|
336
|
+
const isDateDisabled = (d: DateValue) => {
|
|
337
|
+
const dayOfWeek = d.toDate(getLocalTimeZone()).getDay();
|
|
338
|
+
return dayOfWeek === 0 || dayOfWeek === 6;
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
return { date, isDateDisabled, args };
|
|
342
|
+
},
|
|
343
|
+
template: `<UiDatePicker
|
|
344
|
+
v-model="date"
|
|
345
|
+
:is-date-disabled="isDateDisabled"
|
|
346
|
+
:placeholder="args.placeholder"
|
|
347
|
+
:disabled="args.disabled"
|
|
348
|
+
:locale="args.locale"
|
|
349
|
+
/>`,
|
|
350
|
+
}),
|
|
351
|
+
parameters: {
|
|
352
|
+
docs: {
|
|
353
|
+
source: {
|
|
354
|
+
code: disabledWeekendsTemplateSource,
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
const germanLocaleTemplateSource = `<script setup lang="ts">
|
|
361
|
+
import { ref } from 'vue'
|
|
362
|
+
import type { DateValue } from '@internationalized/date'
|
|
363
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
364
|
+
|
|
365
|
+
const date = ref<DateValue>()
|
|
366
|
+
</script>
|
|
367
|
+
|
|
368
|
+
<template>
|
|
369
|
+
<UiDatePicker
|
|
370
|
+
v-model="date"
|
|
371
|
+
locale="de"
|
|
372
|
+
:week-starts-on="1"
|
|
373
|
+
weekday-format="short"
|
|
374
|
+
placeholder="Datum auswählen"
|
|
375
|
+
/>
|
|
376
|
+
</template>`;
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Date picker with German locale and week starting on Monday.
|
|
380
|
+
* Demonstrates i18n capabilities.
|
|
381
|
+
*/
|
|
382
|
+
export const GermanLocale: Story = {
|
|
383
|
+
args: {
|
|
384
|
+
locale: 'de',
|
|
385
|
+
weekStartsOn: 1,
|
|
386
|
+
weekdayFormat: 'short',
|
|
387
|
+
placeholder: 'Datum auswählen',
|
|
388
|
+
},
|
|
389
|
+
render: (args) => ({
|
|
390
|
+
components: { UiDatePicker },
|
|
391
|
+
setup() {
|
|
392
|
+
const date = ref<DateValue>();
|
|
393
|
+
return { date, args };
|
|
394
|
+
},
|
|
395
|
+
template: `<UiDatePicker
|
|
396
|
+
v-model="date"
|
|
397
|
+
:locale="args.locale"
|
|
398
|
+
:week-starts-on="args.weekStartsOn"
|
|
399
|
+
:weekday-format="args.weekdayFormat"
|
|
400
|
+
:placeholder="args.placeholder"
|
|
401
|
+
:disabled="args.disabled"
|
|
402
|
+
/>`,
|
|
403
|
+
}),
|
|
404
|
+
parameters: {
|
|
405
|
+
docs: {
|
|
406
|
+
source: {
|
|
407
|
+
code: germanLocaleTemplateSource,
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const disabledTemplateSource = `<script setup lang="ts">
|
|
414
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
415
|
+
</script>
|
|
416
|
+
|
|
417
|
+
<template>
|
|
418
|
+
<UiDatePicker disabled placeholder="Date picker disabled" />
|
|
419
|
+
</template>`;
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Disabled date picker state.
|
|
423
|
+
* Users cannot interact with the date picker.
|
|
424
|
+
*/
|
|
425
|
+
export const Disabled: Story = {
|
|
426
|
+
args: {
|
|
427
|
+
disabled: true,
|
|
428
|
+
placeholder: 'Date picker disabled',
|
|
429
|
+
},
|
|
430
|
+
render: (args) => ({
|
|
431
|
+
components: { UiDatePicker },
|
|
432
|
+
setup() {
|
|
433
|
+
return { args };
|
|
434
|
+
},
|
|
435
|
+
template: `<UiDatePicker
|
|
436
|
+
:disabled="args.disabled"
|
|
437
|
+
:placeholder="args.placeholder"
|
|
438
|
+
/>`,
|
|
439
|
+
}),
|
|
440
|
+
parameters: {
|
|
441
|
+
docs: {
|
|
442
|
+
source: {
|
|
443
|
+
code: disabledTemplateSource,
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
const customWidthTemplateSource = `<script setup lang="ts">
|
|
450
|
+
import { ref } from 'vue'
|
|
451
|
+
import type { DateValue } from '@internationalized/date'
|
|
452
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
453
|
+
|
|
454
|
+
const date = ref<DateValue>()
|
|
455
|
+
</script>
|
|
456
|
+
|
|
457
|
+
<template>
|
|
458
|
+
<div class="w-[320px]">
|
|
459
|
+
<UiDatePicker v-model="date" class="w-full" />
|
|
460
|
+
</div>
|
|
461
|
+
</template>`;
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Date picker with custom width.
|
|
465
|
+
* The `class` prop overrides the default width (240px for single, 300px for range).
|
|
466
|
+
* Useful for responsive forms and full-width layouts.
|
|
467
|
+
*/
|
|
468
|
+
export const CustomWidth: Story = {
|
|
469
|
+
render: (args) => ({
|
|
470
|
+
components: { UiDatePicker },
|
|
471
|
+
setup() {
|
|
472
|
+
const date = ref<DateValue>();
|
|
473
|
+
return { date, args };
|
|
474
|
+
},
|
|
475
|
+
template: `<div class="w-[320px]">
|
|
476
|
+
<UiDatePicker
|
|
477
|
+
v-model="date"
|
|
478
|
+
class="w-full"
|
|
479
|
+
:disabled="args.disabled"
|
|
480
|
+
:locale="args.locale"
|
|
481
|
+
/>
|
|
482
|
+
</div>`,
|
|
483
|
+
}),
|
|
484
|
+
parameters: {
|
|
485
|
+
docs: {
|
|
486
|
+
source: {
|
|
487
|
+
code: customWidthTemplateSource,
|
|
488
|
+
},
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
const keepOpenOnSelectTemplateSource = `<script setup lang="ts">
|
|
494
|
+
import { ref } from 'vue'
|
|
495
|
+
import type { DateValue } from '@internationalized/date'
|
|
496
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
497
|
+
|
|
498
|
+
const date = ref<DateValue>()
|
|
499
|
+
</script>
|
|
500
|
+
|
|
501
|
+
<template>
|
|
502
|
+
<UiDatePicker
|
|
503
|
+
v-model="date"
|
|
504
|
+
:close-on-select="false"
|
|
505
|
+
placeholder="Stays open on select"
|
|
506
|
+
/>
|
|
507
|
+
</template>`;
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Date picker that stays open after selecting a date.
|
|
511
|
+
* Useful when users might want to change their selection.
|
|
512
|
+
*/
|
|
513
|
+
export const KeepOpenOnSelect: Story = {
|
|
514
|
+
args: {
|
|
515
|
+
closeOnSelect: false,
|
|
516
|
+
placeholder: 'Stays open on select',
|
|
517
|
+
},
|
|
518
|
+
render: (args) => ({
|
|
519
|
+
components: { UiDatePicker },
|
|
520
|
+
setup() {
|
|
521
|
+
const date = ref<DateValue>();
|
|
522
|
+
return { date, args };
|
|
523
|
+
},
|
|
524
|
+
template: `<UiDatePicker
|
|
525
|
+
v-model="date"
|
|
526
|
+
:close-on-select="args.closeOnSelect"
|
|
527
|
+
:placeholder="args.placeholder"
|
|
528
|
+
:disabled="args.disabled"
|
|
529
|
+
:locale="args.locale"
|
|
530
|
+
/>`,
|
|
531
|
+
}),
|
|
532
|
+
parameters: {
|
|
533
|
+
docs: {
|
|
534
|
+
source: {
|
|
535
|
+
code: keepOpenOnSelectTemplateSource,
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
},
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
const twoMonthsTemplateSource = `<script setup lang="ts">
|
|
542
|
+
import { ref } from 'vue'
|
|
543
|
+
import type { DateValue } from '@internationalized/date'
|
|
544
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
545
|
+
|
|
546
|
+
const date = ref<DateValue>()
|
|
547
|
+
</script>
|
|
548
|
+
|
|
549
|
+
<template>
|
|
550
|
+
<UiDatePicker
|
|
551
|
+
v-model="date"
|
|
552
|
+
:number-of-months="2"
|
|
553
|
+
placeholder="Select date (2 months view)"
|
|
554
|
+
/>
|
|
555
|
+
</template>`;
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Date picker displaying two months side by side.
|
|
559
|
+
* Provides more context for date selection.
|
|
560
|
+
*/
|
|
561
|
+
export const TwoMonthsView: Story = {
|
|
562
|
+
args: {
|
|
563
|
+
numberOfMonths: 2,
|
|
564
|
+
placeholder: 'Select date (2 months view)',
|
|
565
|
+
},
|
|
566
|
+
render: (args) => ({
|
|
567
|
+
components: { UiDatePicker },
|
|
568
|
+
setup() {
|
|
569
|
+
const date = ref<DateValue>();
|
|
570
|
+
return { date, args };
|
|
571
|
+
},
|
|
572
|
+
template: `<UiDatePicker
|
|
573
|
+
v-model="date"
|
|
574
|
+
:number-of-months="args.numberOfMonths"
|
|
575
|
+
:placeholder="args.placeholder"
|
|
576
|
+
:disabled="args.disabled"
|
|
577
|
+
:locale="args.locale"
|
|
578
|
+
/>`,
|
|
579
|
+
}),
|
|
580
|
+
parameters: {
|
|
581
|
+
docs: {
|
|
582
|
+
source: {
|
|
583
|
+
code: twoMonthsTemplateSource,
|
|
584
|
+
},
|
|
585
|
+
},
|
|
586
|
+
},
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
const formExampleTemplateSource = `<script setup lang="ts">
|
|
590
|
+
import { ref } from 'vue'
|
|
591
|
+
import type { DateValue } from '@internationalized/date'
|
|
592
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
593
|
+
|
|
594
|
+
const appointmentDate = ref<DateValue>()
|
|
595
|
+
</script>
|
|
596
|
+
|
|
597
|
+
<template>
|
|
598
|
+
<div class="space-y-2">
|
|
599
|
+
<label class="text-sm font-medium">Appointment Date</label>
|
|
600
|
+
<UiDatePicker
|
|
601
|
+
v-model="appointmentDate"
|
|
602
|
+
placeholder="Select appointment date"
|
|
603
|
+
class="w-full"
|
|
604
|
+
aria-label="Select appointment date"
|
|
605
|
+
/>
|
|
606
|
+
<p class="text-xs text-muted-foreground">
|
|
607
|
+
Choose a date for your appointment.
|
|
608
|
+
</p>
|
|
609
|
+
</div>
|
|
610
|
+
</template>`;
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Date picker used in a form context with label and helper text.
|
|
614
|
+
* Demonstrates proper accessibility with aria-label.
|
|
615
|
+
*/
|
|
616
|
+
export const FormExample: Story = {
|
|
617
|
+
render: (args) => ({
|
|
618
|
+
components: { UiDatePicker },
|
|
619
|
+
setup() {
|
|
620
|
+
const appointmentDate = ref<DateValue>();
|
|
621
|
+
return { appointmentDate, args };
|
|
622
|
+
},
|
|
623
|
+
template: `<div class="space-y-2">
|
|
624
|
+
<label class="text-sm font-medium">Appointment Date</label>
|
|
625
|
+
<UiDatePicker
|
|
626
|
+
v-model="appointmentDate"
|
|
627
|
+
placeholder="Select appointment date"
|
|
628
|
+
class="w-full"
|
|
629
|
+
aria-label="Select appointment date"
|
|
630
|
+
:disabled="args.disabled"
|
|
631
|
+
:locale="args.locale"
|
|
632
|
+
/>
|
|
633
|
+
<p class="text-xs text-muted-foreground">
|
|
634
|
+
Choose a date for your appointment.
|
|
635
|
+
</p>
|
|
636
|
+
</div>`,
|
|
637
|
+
}),
|
|
638
|
+
parameters: {
|
|
639
|
+
docs: {
|
|
640
|
+
source: {
|
|
641
|
+
code: formExampleTemplateSource,
|
|
642
|
+
},
|
|
643
|
+
},
|
|
644
|
+
},
|
|
645
|
+
};
|
|
646
|
+
|
|
647
|
+
const rangeTemplateSource = `<script setup lang="ts">
|
|
648
|
+
import { ref } from 'vue'
|
|
649
|
+
import type { DateRange } from '@aleph-alpha/ui-library'
|
|
650
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
651
|
+
|
|
652
|
+
const dateRange = ref<DateRange>()
|
|
653
|
+
</script>
|
|
654
|
+
|
|
655
|
+
<template>
|
|
656
|
+
<UiDatePicker v-model="dateRange" mode="range" />
|
|
657
|
+
</template>`;
|
|
658
|
+
|
|
659
|
+
/**
|
|
660
|
+
* Date picker in range mode for selecting a date range.
|
|
661
|
+
* Click a start date, then click an end date to complete the range.
|
|
662
|
+
*/
|
|
663
|
+
export const RangeMode: Story = {
|
|
664
|
+
args: {
|
|
665
|
+
mode: 'range',
|
|
666
|
+
},
|
|
667
|
+
render: (args) => ({
|
|
668
|
+
components: { UiDatePicker },
|
|
669
|
+
setup() {
|
|
670
|
+
const dateRange = ref<DateRange>();
|
|
671
|
+
return { dateRange, args };
|
|
672
|
+
},
|
|
673
|
+
template: `<UiDatePicker
|
|
674
|
+
v-model="dateRange"
|
|
675
|
+
mode="range"
|
|
676
|
+
:disabled="args.disabled"
|
|
677
|
+
:locale="args.locale"
|
|
678
|
+
/>`,
|
|
679
|
+
}),
|
|
680
|
+
parameters: {
|
|
681
|
+
docs: {
|
|
682
|
+
source: {
|
|
683
|
+
code: rangeTemplateSource,
|
|
684
|
+
},
|
|
685
|
+
},
|
|
686
|
+
},
|
|
687
|
+
};
|
|
688
|
+
|
|
689
|
+
const rangeTwoMonthsTemplateSource = `<script setup lang="ts">
|
|
690
|
+
import { ref } from 'vue'
|
|
691
|
+
import type { DateRange } from '@aleph-alpha/ui-library'
|
|
692
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
693
|
+
|
|
694
|
+
const dateRange = ref<DateRange>()
|
|
695
|
+
</script>
|
|
696
|
+
|
|
697
|
+
<template>
|
|
698
|
+
<UiDatePicker
|
|
699
|
+
v-model="dateRange"
|
|
700
|
+
mode="range"
|
|
701
|
+
:number-of-months="2"
|
|
702
|
+
paged-navigation
|
|
703
|
+
placeholder="Select date range"
|
|
704
|
+
/>
|
|
705
|
+
</template>`;
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Range date picker with two months displayed side by side.
|
|
709
|
+
* Ideal for selecting longer date ranges with better context.
|
|
710
|
+
* Uses paged navigation to move both months together.
|
|
711
|
+
*/
|
|
712
|
+
export const RangeTwoMonths: Story = {
|
|
713
|
+
args: {
|
|
714
|
+
mode: 'range',
|
|
715
|
+
numberOfMonths: 2,
|
|
716
|
+
pagedNavigation: true,
|
|
717
|
+
placeholder: 'Select date range',
|
|
718
|
+
},
|
|
719
|
+
render: (args) => ({
|
|
720
|
+
components: { UiDatePicker },
|
|
721
|
+
setup() {
|
|
722
|
+
const dateRange = ref<DateRange>();
|
|
723
|
+
return { dateRange, args };
|
|
724
|
+
},
|
|
725
|
+
template: `<UiDatePicker
|
|
726
|
+
v-model="dateRange"
|
|
727
|
+
mode="range"
|
|
728
|
+
:number-of-months="2"
|
|
729
|
+
paged-navigation
|
|
730
|
+
placeholder="Select date range"
|
|
731
|
+
:disabled="args.disabled"
|
|
732
|
+
:locale="args.locale"
|
|
733
|
+
/>`,
|
|
734
|
+
}),
|
|
735
|
+
parameters: {
|
|
736
|
+
docs: {
|
|
737
|
+
source: {
|
|
738
|
+
code: rangeTwoMonthsTemplateSource,
|
|
739
|
+
},
|
|
740
|
+
},
|
|
741
|
+
},
|
|
742
|
+
};
|
|
743
|
+
|
|
744
|
+
const rangeWithConstraintsTemplateSource = `<script setup lang="ts">
|
|
745
|
+
import { ref } from 'vue'
|
|
746
|
+
import type { DateRange } from '@aleph-alpha/ui-library'
|
|
747
|
+
import { getLocalTimeZone, today } from '@aleph-alpha/ui-library'
|
|
748
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
749
|
+
|
|
750
|
+
const dateRange = ref<DateRange>()
|
|
751
|
+
const minValue = today(getLocalTimeZone())
|
|
752
|
+
const maxValue = today(getLocalTimeZone()).add({ months: 6 })
|
|
753
|
+
</script>
|
|
754
|
+
|
|
755
|
+
<template>
|
|
756
|
+
<UiDatePicker
|
|
757
|
+
v-model="dateRange"
|
|
758
|
+
mode="range"
|
|
759
|
+
:min-value="minValue"
|
|
760
|
+
:max-value="maxValue"
|
|
761
|
+
placeholder="Select vacation dates"
|
|
762
|
+
/>
|
|
763
|
+
</template>`;
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* Range date picker with date constraints.
|
|
767
|
+
* Only dates within the next 6 months are selectable.
|
|
768
|
+
* Perfect for vacation planning or booking systems.
|
|
769
|
+
*/
|
|
770
|
+
export const RangeWithConstraints: Story = {
|
|
771
|
+
args: {
|
|
772
|
+
mode: 'range',
|
|
773
|
+
placeholder: 'Select vacation dates',
|
|
774
|
+
},
|
|
775
|
+
render: (args) => ({
|
|
776
|
+
components: { UiDatePicker },
|
|
777
|
+
setup() {
|
|
778
|
+
const dateRange = ref<DateRange>();
|
|
779
|
+
const todayDate = today(getLocalTimeZone());
|
|
780
|
+
const minValue = todayDate;
|
|
781
|
+
const maxValue = todayDate.add({ months: 6 });
|
|
782
|
+
return { dateRange, minValue, maxValue, args };
|
|
783
|
+
},
|
|
784
|
+
template: `<UiDatePicker
|
|
785
|
+
v-model="dateRange"
|
|
786
|
+
mode="range"
|
|
787
|
+
:min-value="minValue"
|
|
788
|
+
:max-value="maxValue"
|
|
789
|
+
placeholder="Select vacation dates"
|
|
790
|
+
:disabled="args.disabled"
|
|
791
|
+
:locale="args.locale"
|
|
792
|
+
/>`,
|
|
793
|
+
}),
|
|
794
|
+
parameters: {
|
|
795
|
+
docs: {
|
|
796
|
+
source: {
|
|
797
|
+
code: rangeWithConstraintsTemplateSource,
|
|
798
|
+
},
|
|
799
|
+
},
|
|
800
|
+
},
|
|
801
|
+
};
|
|
802
|
+
|
|
803
|
+
const rangePreselectedTemplateSource = `<script setup lang="ts">
|
|
804
|
+
import { ref } from 'vue'
|
|
805
|
+
import type { DateRange } from '@aleph-alpha/ui-library'
|
|
806
|
+
import { getLocalTimeZone, today } from '@aleph-alpha/ui-library'
|
|
807
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
808
|
+
|
|
809
|
+
const todayDate = today(getLocalTimeZone())
|
|
810
|
+
const dateRange = ref<DateRange>({
|
|
811
|
+
start: todayDate,
|
|
812
|
+
end: todayDate.add({ days: 7 }),
|
|
813
|
+
})
|
|
814
|
+
</script>
|
|
815
|
+
|
|
816
|
+
<template>
|
|
817
|
+
<UiDatePicker v-model="dateRange" mode="range" :number-of-months="2" />
|
|
818
|
+
</template>`;
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* Range date picker with a pre-selected 7-day range starting from today.
|
|
822
|
+
* Shows both months for better visualization of the selected range.
|
|
823
|
+
*/
|
|
824
|
+
export const RangePreselected: Story = {
|
|
825
|
+
args: {
|
|
826
|
+
mode: 'range',
|
|
827
|
+
numberOfMonths: 2,
|
|
828
|
+
},
|
|
829
|
+
render: (args) => ({
|
|
830
|
+
components: { UiDatePicker },
|
|
831
|
+
setup() {
|
|
832
|
+
const todayDate = today(getLocalTimeZone());
|
|
833
|
+
const dateRange = ref<DateRange>({
|
|
834
|
+
start: todayDate,
|
|
835
|
+
end: todayDate.add({ days: 7 }),
|
|
836
|
+
});
|
|
837
|
+
return { dateRange, args };
|
|
838
|
+
},
|
|
839
|
+
template: `<UiDatePicker
|
|
840
|
+
v-model="dateRange"
|
|
841
|
+
mode="range"
|
|
842
|
+
:number-of-months="2"
|
|
843
|
+
:disabled="args.disabled"
|
|
844
|
+
:locale="args.locale"
|
|
845
|
+
/>`,
|
|
846
|
+
}),
|
|
847
|
+
parameters: {
|
|
848
|
+
docs: {
|
|
849
|
+
source: {
|
|
850
|
+
code: rangePreselectedTemplateSource,
|
|
851
|
+
},
|
|
852
|
+
},
|
|
853
|
+
},
|
|
854
|
+
};
|
|
855
|
+
|
|
856
|
+
const rangeFormExampleTemplateSource = `<script setup lang="ts">
|
|
857
|
+
import { ref } from 'vue'
|
|
858
|
+
import type { DateRange } from '@aleph-alpha/ui-library'
|
|
859
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
860
|
+
|
|
861
|
+
const travelDates = ref<DateRange>()
|
|
862
|
+
</script>
|
|
863
|
+
|
|
864
|
+
<template>
|
|
865
|
+
<div class="space-y-2 max-w-sm">
|
|
866
|
+
<label for="travel-dates" class="text-sm font-medium">
|
|
867
|
+
Travel Dates
|
|
868
|
+
</label>
|
|
869
|
+
<UiDatePicker
|
|
870
|
+
id="travel-dates"
|
|
871
|
+
v-model="travelDates"
|
|
872
|
+
mode="range"
|
|
873
|
+
:number-of-months="2"
|
|
874
|
+
placeholder="Select dates"
|
|
875
|
+
aria-label="Select travel dates"
|
|
876
|
+
/>
|
|
877
|
+
<p class="text-xs text-muted-foreground">
|
|
878
|
+
Choose your check-in and check-out dates.
|
|
879
|
+
</p>
|
|
880
|
+
</div>
|
|
881
|
+
</template>`;
|
|
882
|
+
|
|
883
|
+
/**
|
|
884
|
+
* Range date picker in a form context for travel booking.
|
|
885
|
+
* Shows how to use range mode with proper labels and helper text.
|
|
886
|
+
*/
|
|
887
|
+
export const RangeFormExample: Story = {
|
|
888
|
+
args: {
|
|
889
|
+
mode: 'range',
|
|
890
|
+
numberOfMonths: 2,
|
|
891
|
+
placeholder: 'Select dates',
|
|
892
|
+
},
|
|
893
|
+
render: (args) => ({
|
|
894
|
+
components: { UiDatePicker },
|
|
895
|
+
setup() {
|
|
896
|
+
const travelDates = ref<DateRange>();
|
|
897
|
+
return { travelDates, args };
|
|
898
|
+
},
|
|
899
|
+
template: `<div class="space-y-2 max-w-sm">
|
|
900
|
+
<label for="travel-dates" class="text-sm font-medium">
|
|
901
|
+
Travel Dates
|
|
902
|
+
</label>
|
|
903
|
+
<UiDatePicker
|
|
904
|
+
id="travel-dates"
|
|
905
|
+
v-model="travelDates"
|
|
906
|
+
mode="range"
|
|
907
|
+
:number-of-months="2"
|
|
908
|
+
placeholder="Select dates"
|
|
909
|
+
aria-label="Select travel dates"
|
|
910
|
+
:disabled="args.disabled"
|
|
911
|
+
:locale="args.locale"
|
|
912
|
+
/>
|
|
913
|
+
<p class="text-xs text-muted-foreground">
|
|
914
|
+
Choose your check-in and check-out dates.
|
|
915
|
+
</p>
|
|
916
|
+
</div>`,
|
|
917
|
+
}),
|
|
918
|
+
parameters: {
|
|
919
|
+
docs: {
|
|
920
|
+
source: {
|
|
921
|
+
code: rangeFormExampleTemplateSource,
|
|
922
|
+
},
|
|
923
|
+
},
|
|
924
|
+
},
|
|
925
|
+
};
|
|
926
|
+
|
|
927
|
+
const rangeKeepOpenTemplateSource = `<script setup lang="ts">
|
|
928
|
+
import { ref } from 'vue'
|
|
929
|
+
import type { DateRange } from '@aleph-alpha/ui-library'
|
|
930
|
+
import { UiDatePicker } from '@aleph-alpha/ui-library'
|
|
931
|
+
|
|
932
|
+
const dateRange = ref<DateRange>()
|
|
933
|
+
</script>
|
|
934
|
+
|
|
935
|
+
<template>
|
|
936
|
+
<UiDatePicker
|
|
937
|
+
v-model="dateRange"
|
|
938
|
+
mode="range"
|
|
939
|
+
:close-on-select="false"
|
|
940
|
+
placeholder="Stays open after selection"
|
|
941
|
+
/>
|
|
942
|
+
</template>`;
|
|
943
|
+
|
|
944
|
+
/**
|
|
945
|
+
* Range date picker that stays open after selecting both dates.
|
|
946
|
+
* Useful when users might want to adjust their date range selection.
|
|
947
|
+
*/
|
|
948
|
+
export const RangeKeepOpen: Story = {
|
|
949
|
+
args: {
|
|
950
|
+
mode: 'range',
|
|
951
|
+
closeOnSelect: false,
|
|
952
|
+
placeholder: 'Stays open after selection',
|
|
953
|
+
},
|
|
954
|
+
render: (args) => ({
|
|
955
|
+
components: { UiDatePicker },
|
|
956
|
+
setup() {
|
|
957
|
+
const dateRange = ref<DateRange>();
|
|
958
|
+
return { dateRange, args };
|
|
959
|
+
},
|
|
960
|
+
template: `<UiDatePicker
|
|
961
|
+
v-model="dateRange"
|
|
962
|
+
mode="range"
|
|
963
|
+
:close-on-select="args.closeOnSelect"
|
|
964
|
+
:placeholder="args.placeholder"
|
|
965
|
+
:disabled="args.disabled"
|
|
966
|
+
:locale="args.locale"
|
|
967
|
+
/>`,
|
|
968
|
+
}),
|
|
969
|
+
parameters: {
|
|
970
|
+
docs: {
|
|
971
|
+
source: {
|
|
972
|
+
code: rangeKeepOpenTemplateSource,
|
|
973
|
+
},
|
|
974
|
+
},
|
|
975
|
+
},
|
|
976
|
+
};
|