@youcan/celeste 0.7.3 → 0.8.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 (69) hide show
  1. package/dist/celeste.css +465 -0
  2. package/dist/cjs/calendar.cjs +2 -0
  3. package/dist/cjs/chunks/ComboboxContent.cjs +1 -1
  4. package/dist/cjs/chunks/DialogPortal.cjs +1 -1
  5. package/dist/cjs/chunks/DismissableLayer.cjs +0 -34
  6. package/dist/cjs/chunks/FocusScope.cjs +2 -2
  7. package/dist/cjs/chunks/MenuContentImpl.cjs +1 -1
  8. package/dist/cjs/chunks/SelectItemAlignedPosition.cjs +1 -1
  9. package/dist/cjs/chunks/calendar.cjs +923 -0
  10. package/dist/cjs/chunks/components.cjs +9 -1
  11. package/dist/cjs/chunks/counter-input.cjs +2 -13
  12. package/dist/cjs/chunks/date-picker.cjs +99 -0
  13. package/dist/cjs/chunks/defu.cjs +34 -0
  14. package/dist/cjs/chunks/popover-content.cjs +1 -1
  15. package/dist/cjs/chunks/range-calendar.cjs +1170 -0
  16. package/dist/cjs/chunks/range-picker.cjs +231 -0
  17. package/dist/cjs/chunks/tooltip-content.cjs +3 -2
  18. package/dist/cjs/chunks/useCalendar.cjs +2439 -0
  19. package/dist/cjs/chunks/useLocale.cjs +20 -0
  20. package/dist/cjs/date-picker.cjs +2 -0
  21. package/dist/cjs/index.cjs +9 -1
  22. package/dist/cjs/range-calendar.cjs +2 -0
  23. package/dist/cjs/range-picker.cjs +2 -0
  24. package/dist/components/calendar/calendar.d.ts +19 -0
  25. package/dist/components/calendar/index.d.ts +2 -0
  26. package/dist/components/date-picker/date-picker.d.ts +27 -0
  27. package/dist/components/date-picker/index.d.ts +2 -0
  28. package/dist/components/index.d.ts +4 -0
  29. package/dist/components/range-calendar/index.d.ts +2 -0
  30. package/dist/components/range-calendar/range-calendar.d.ts +24 -0
  31. package/dist/components/range-picker/index.d.ts +2 -0
  32. package/dist/components/range-picker/range-picker.d.ts +38 -0
  33. package/dist/components/rich-editor/rich-editor.d.ts +1 -1
  34. package/dist/es/calendar.js +2 -0
  35. package/dist/es/chunks/ComboboxContent.js +1 -1
  36. package/dist/es/chunks/DialogPortal.js +1 -1
  37. package/dist/es/chunks/DismissableLayer.js +1 -29
  38. package/dist/es/chunks/FocusScope.js +1 -1
  39. package/dist/es/chunks/MenuContentImpl.js +1 -1
  40. package/dist/es/chunks/SelectItemAlignedPosition.js +1 -1
  41. package/dist/es/chunks/calendar.js +916 -0
  42. package/dist/es/chunks/components.js +9 -1
  43. package/dist/es/chunks/counter-input.js +1 -12
  44. package/dist/es/chunks/date-picker.js +92 -0
  45. package/dist/es/chunks/defu.js +29 -0
  46. package/dist/es/chunks/popover-content.js +1 -1
  47. package/dist/es/chunks/range-calendar.js +1163 -0
  48. package/dist/es/chunks/range-picker.js +224 -0
  49. package/dist/es/chunks/tooltip-content.js +2 -1
  50. package/dist/es/chunks/useCalendar.js +2331 -0
  51. package/dist/es/chunks/useLocale.js +14 -0
  52. package/dist/es/date-picker.js +2 -0
  53. package/dist/es/index.js +6 -2
  54. package/dist/es/range-calendar.js +2 -0
  55. package/dist/es/range-picker.js +2 -0
  56. package/package.json +4 -3
  57. package/src/components/calendar/calendar.vue +305 -0
  58. package/src/components/calendar/index.ts +2 -0
  59. package/src/components/calendar/stories/calendar.stories.ts +76 -0
  60. package/src/components/date-picker/date-picker.vue +91 -0
  61. package/src/components/date-picker/index.ts +2 -0
  62. package/src/components/date-picker/stories/date-picker.stories.ts +92 -0
  63. package/src/components/index.ts +4 -0
  64. package/src/components/range-calendar/index.ts +2 -0
  65. package/src/components/range-calendar/range-calendar.vue +363 -0
  66. package/src/components/range-calendar/stories/range-calendar.stories.ts +46 -0
  67. package/src/components/range-picker/index.ts +2 -0
  68. package/src/components/range-picker/range-picker.vue +237 -0
  69. package/src/components/range-picker/stories/range-picker.stories.ts +97 -0
@@ -0,0 +1,14 @@
1
+ import { t as injectConfigProviderContext } from "./ConfigProvider.js";
2
+ import { computed, ref } from "vue";
3
+ //#region ../../node_modules/.pnpm/reka-ui@2.10.1_vue@3.5.13_typescript@6.0.3_/node_modules/reka-ui/dist/shared/useLocale.js
4
+ /**
5
+ * The `useLocale` function provides a way to access the current locale in your application.
6
+ * @param {Ref<string | undefined>} [locale] - An optional ref containing the locale.
7
+ * @returns A computed ref holding the resolved locale.
8
+ */
9
+ function useLocale(locale) {
10
+ const context = injectConfigProviderContext({ locale: ref("en") });
11
+ return computed(() => locale?.value || context.locale?.value || "en");
12
+ }
13
+ //#endregion
14
+ export { useLocale as t };
@@ -0,0 +1,2 @@
1
+ import { t as date_picker_default } from "./chunks/date-picker.js";
2
+ export { date_picker_default as default };
package/dist/es/index.js CHANGED
@@ -5,13 +5,13 @@ import { t as badge_default } from "./chunks/badge.js";
5
5
  import { t as status_badge_default } from "./chunks/status-badge.js";
6
6
  import { n as sidebar_separator_default, t as components_exports } from "./chunks/components.js";
7
7
  import { t as tooltip_content_default } from "./chunks/tooltip-content.js";
8
- import { t as counter_input_default } from "./chunks/counter-input.js";
9
8
  import { t as collapsible_content_default } from "./chunks/collapsible-content.js";
10
9
  import { t as collapsible_trigger_default } from "./chunks/collapsible-trigger.js";
11
10
  import { t as combobox_anchor_default } from "./chunks/combobox-anchor.js";
12
11
  import { t as combobox_empty_default } from "./chunks/combobox-empty.js";
13
12
  import { t as combobox_list_default } from "./chunks/combobox-list.js";
14
13
  import { t as combobox_trigger_default } from "./chunks/combobox-trigger.js";
14
+ import { t as calendar_default } from "./chunks/calendar.js";
15
15
  import { t as checkbox_default } from "./chunks/checkbox.js";
16
16
  import { t as slider_default } from "./chunks/slider.js";
17
17
  import { t as dropdown_menu_item_default } from "./chunks/dropdown-menu-item.js";
@@ -22,9 +22,11 @@ import { t as dropdown_menu_sub_content_default } from "./chunks/dropdown-menu-s
22
22
  import { t as dropdown_menu_sub_trigger_default } from "./chunks/dropdown-menu-sub-trigger.js";
23
23
  import { t as popover_content_default } from "./chunks/popover-content.js";
24
24
  import { t as popover_trigger_default } from "./chunks/popover-trigger.js";
25
+ import { t as range_calendar_default } from "./chunks/range-calendar.js";
25
26
  import { t as dropdown_menu_group_default } from "./chunks/dropdown-menu-group.js";
26
27
  import { t as dropdown_menu_sub_default } from "./chunks/dropdown-menu-sub.js";
27
28
  import { t as dropdown_menu_trigger_default } from "./chunks/dropdown-menu-trigger.js";
29
+ import { t as counter_input_default } from "./chunks/counter-input.js";
28
30
  import { t as pagination_ellipsis_default } from "./chunks/pagination-ellipsis.js";
29
31
  import { t as pagination_first_default } from "./chunks/pagination-first.js";
30
32
  import { t as pagination_last_default } from "./chunks/pagination-last.js";
@@ -77,6 +79,7 @@ import { t as combobox_item_default } from "./chunks/combobox-item.js";
77
79
  import { t as combobox_root_default } from "./chunks/combobox-root.js";
78
80
  import { t as combobox_separator_default } from "./chunks/combobox-separator.js";
79
81
  import { t as combobox_default } from "./chunks/combobox.js";
82
+ import { t as date_picker_default } from "./chunks/date-picker.js";
80
83
  import { t as digit_input_group_default } from "./chunks/digit-input-group.js";
81
84
  import { t as digit_input_default } from "./chunks/digit-input.js";
82
85
  import { t as dropdown_menu_default } from "./chunks/dropdown-menu.js";
@@ -99,6 +102,7 @@ import { t as progress_circle_default } from "./chunks/progress-circle.js";
99
102
  import { t as radio_group_card_default } from "./chunks/radio-group-card.js";
100
103
  import { t as radio_group_label_default } from "./chunks/radio-group-label.js";
101
104
  import { t as radio_group_default } from "./chunks/radio-group.js";
105
+ import { t as range_picker_default } from "./chunks/range-picker.js";
102
106
  import { t as rich_editor_default } from "./chunks/rich-editor.js";
103
107
  import { SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WIDTH_MOBILE, provideSidebarContext, useSidebar } from "./use-sidebar.js";
104
108
  import { t as segmented_control_default } from "./chunks/segmented-control.js";
@@ -209,4 +213,4 @@ var Celeste = { install(vue) {
209
213
  });
210
214
  } };
211
215
  //#endregion
212
- export { alert_default as Alert, alpha_slider_default as AlphaSlider, badge_default as Badge, button_default as Button, COLOR_NUMBER_VALIDATION_PATTERN, Celeste, checkbox_default as Checkbox, checkbox_card_default as CheckboxCard, checkbox_label_default as CheckboxLabel, collapsible_default as Collapsible, collapsible_content_default as CollapsibleContent, collapsible_trigger_default as CollapsibleTrigger, color_area_default as ColorArea, color_picker_default as ColorPicker, color_swatch_default as ColorSwatch, combobox_default as Combobox, combobox_anchor_default as ComboboxAnchor, combobox_empty_default as ComboboxEmpty, combobox_group_default as ComboboxGroup, combobox_input_default as ComboboxInput, combobox_item_default as ComboboxItem, combobox_list_default as ComboboxList, combobox_root_default as ComboboxRoot, combobox_separator_default as ComboboxSeparator, combobox_trigger_default as ComboboxTrigger, compact_button_default as CompactButton, content_divider_default as ContentDivider, counter_input_default as CounterInput, DEFAULT_SWATCH, digit_input_default as DigitInput, digit_input_group_default as DigitInputGroup, digit_input_slot_default as DigitInputSlot, dropdown_menu_default as DropdownMenu, dropdown_menu_content_default as DropdownMenuContent, dropdown_menu_group_default as DropdownMenuGroup, dropdown_menu_item_default as DropdownMenuItem, dropdown_menu_label_default as DropdownMenuLabel, dropdown_menu_separator_default as DropdownMenuSeparator, dropdown_menu_sub_default as DropdownMenuSub, dropdown_menu_sub_content_default as DropdownMenuSubContent, dropdown_menu_sub_trigger_default as DropdownMenuSubTrigger, dropdown_menu_trigger_default as DropdownMenuTrigger, fancy_button_default as FancyButton, file_upload_area_default as FileUploadArea, HEX_VALIDATION_PATTERN, hint_text_default as HintText, hue_slider_default as HueSlider, label_default as Label, link_button_default as LinkButton, modal_default as Modal, modal_body_default as ModalBody, modal_close_default as ModalClose, modal_content_default as ModalContent, modal_footer_default as ModalFooter, modal_header_default as ModalHeader, modal_trigger_default as ModalTrigger, pagination_default as Pagination, pagination_content_default as PaginationContent, pagination_ellipsis_default as PaginationEllipsis, pagination_first_default as PaginationFirst, pagination_item_default as PaginationItem, pagination_last_default as PaginationLast, pagination_next_default as PaginationNext, pagination_previous_default as PaginationPrevious, popover_default as Popover, popover_content_default as PopoverContent, popover_trigger_default as PopoverTrigger, progress_bar_default as ProgressBar, progress_circle_default as ProgressCircle, radio_group_default as RadioGroup, radio_group_card_default as RadioGroupCard, radio_group_item_default as RadioGroupItem, radio_group_label_default as RadioGroupLabel, rich_editor_default as RichEditor, SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WIDTH_MOBILE, scroll_area_default as ScrollArea, segmented_control_default as SegmentedControl, segmented_control_item_default as SegmentedControlItem, select_default as Select, select_content_default as SelectContent, select_group_default as SelectGroup, select_icon_default as SelectIcon, select_item_default as SelectItem, select_label_default as SelectLabel, select_separator_default as SelectSeparator, select_trigger_default as SelectTrigger, select_value_default as SelectValue, sheet_default as Sheet, sheet_close_default as SheetClose, sheet_content_default as SheetContent, sheet_description_default as SheetDescription, sheet_footer_default as SheetFooter, sheet_header_default as SheetHeader, sheet_title_default as SheetTitle, sheet_trigger_default as SheetTrigger, sidebar_default as Sidebar, sidebar_content_default as SidebarContent, sidebar_element_default as SidebarElement, sidebar_footer_default as SidebarFooter, sidebar_group_default as SidebarGroup, sidebar_group_content_default as SidebarGroupContent, sidebar_group_label_default as SidebarGroupLabel, sidebar_header_default as SidebarHeader, sidebar_menu_default as SidebarMenu, sidebar_menu_action_default as SidebarMenuAction, sidebar_menu_badge_default as SidebarMenuBadge, sidebar_menu_button_default as SidebarMenuButton, sidebar_menu_item_default as SidebarMenuItem, sidebar_menu_sub_default as SidebarMenuSub, sidebar_menu_sub_button_default as SidebarMenuSubButton, sidebar_menu_sub_item_default as SidebarMenuSubItem, sidebar_provider_default as SidebarProvider, sidebar_separator_default as SidebarSeparator, sidebar_trigger_default as SidebarTrigger, slider_default as Slider, social_button_default as SocialButton, sonner_default as Sonner, sonner_alert_default as SonnerAlert, status_badge_default as StatusBadge, switch_default as Switch, tab_menu_default as TabMenu, tab_menu_content_default as TabMenuContent, tab_menu_item_default as TabMenuItem, tab_menu_list_default as TabMenuList, table_default as Table, table_body_default as TableBody, table_caption_default as TableCaption, table_cell_default as TableCell, table_empty_default as TableEmpty, table_footer_default as TableFooter, table_head_default as TableHead, table_header_default as TableHeader, table_row_default as TableRow, tag_default as Tag, text_input_default as TextInput, text_input_affix_default as TextInputAffix, text_input_button_default as TextInputButton, textarea_default as Textarea, tooltip_default as Tooltip, tooltip_content_default as TooltipContent, tooltip_provider_default as TooltipProvider, tooltip_root_default as TooltipRoot, tooltip_trigger_default as TooltipTrigger, bumpColorValue, clamp, getAbsolutePosition, getColorConstraints, getFractionDigit, getPageXYFromEvent, getScrollXY, provideSidebarContext, resolveArrowDirection, toast, truncColorValue, uid, useDelegatedProps, useSidebar };
216
+ export { alert_default as Alert, alpha_slider_default as AlphaSlider, badge_default as Badge, button_default as Button, COLOR_NUMBER_VALIDATION_PATTERN, calendar_default as Calendar, Celeste, checkbox_default as Checkbox, checkbox_card_default as CheckboxCard, checkbox_label_default as CheckboxLabel, collapsible_default as Collapsible, collapsible_content_default as CollapsibleContent, collapsible_trigger_default as CollapsibleTrigger, color_area_default as ColorArea, color_picker_default as ColorPicker, color_swatch_default as ColorSwatch, combobox_default as Combobox, combobox_anchor_default as ComboboxAnchor, combobox_empty_default as ComboboxEmpty, combobox_group_default as ComboboxGroup, combobox_input_default as ComboboxInput, combobox_item_default as ComboboxItem, combobox_list_default as ComboboxList, combobox_root_default as ComboboxRoot, combobox_separator_default as ComboboxSeparator, combobox_trigger_default as ComboboxTrigger, compact_button_default as CompactButton, content_divider_default as ContentDivider, counter_input_default as CounterInput, DEFAULT_SWATCH, date_picker_default as DatePicker, digit_input_default as DigitInput, digit_input_group_default as DigitInputGroup, digit_input_slot_default as DigitInputSlot, dropdown_menu_default as DropdownMenu, dropdown_menu_content_default as DropdownMenuContent, dropdown_menu_group_default as DropdownMenuGroup, dropdown_menu_item_default as DropdownMenuItem, dropdown_menu_label_default as DropdownMenuLabel, dropdown_menu_separator_default as DropdownMenuSeparator, dropdown_menu_sub_default as DropdownMenuSub, dropdown_menu_sub_content_default as DropdownMenuSubContent, dropdown_menu_sub_trigger_default as DropdownMenuSubTrigger, dropdown_menu_trigger_default as DropdownMenuTrigger, fancy_button_default as FancyButton, file_upload_area_default as FileUploadArea, HEX_VALIDATION_PATTERN, hint_text_default as HintText, hue_slider_default as HueSlider, label_default as Label, link_button_default as LinkButton, modal_default as Modal, modal_body_default as ModalBody, modal_close_default as ModalClose, modal_content_default as ModalContent, modal_footer_default as ModalFooter, modal_header_default as ModalHeader, modal_trigger_default as ModalTrigger, pagination_default as Pagination, pagination_content_default as PaginationContent, pagination_ellipsis_default as PaginationEllipsis, pagination_first_default as PaginationFirst, pagination_item_default as PaginationItem, pagination_last_default as PaginationLast, pagination_next_default as PaginationNext, pagination_previous_default as PaginationPrevious, popover_default as Popover, popover_content_default as PopoverContent, popover_trigger_default as PopoverTrigger, progress_bar_default as ProgressBar, progress_circle_default as ProgressCircle, radio_group_default as RadioGroup, radio_group_card_default as RadioGroupCard, radio_group_item_default as RadioGroupItem, radio_group_label_default as RadioGroupLabel, range_calendar_default as RangeCalendar, range_picker_default as RangePicker, rich_editor_default as RichEditor, SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WIDTH_MOBILE, scroll_area_default as ScrollArea, segmented_control_default as SegmentedControl, segmented_control_item_default as SegmentedControlItem, select_default as Select, select_content_default as SelectContent, select_group_default as SelectGroup, select_icon_default as SelectIcon, select_item_default as SelectItem, select_label_default as SelectLabel, select_separator_default as SelectSeparator, select_trigger_default as SelectTrigger, select_value_default as SelectValue, sheet_default as Sheet, sheet_close_default as SheetClose, sheet_content_default as SheetContent, sheet_description_default as SheetDescription, sheet_footer_default as SheetFooter, sheet_header_default as SheetHeader, sheet_title_default as SheetTitle, sheet_trigger_default as SheetTrigger, sidebar_default as Sidebar, sidebar_content_default as SidebarContent, sidebar_element_default as SidebarElement, sidebar_footer_default as SidebarFooter, sidebar_group_default as SidebarGroup, sidebar_group_content_default as SidebarGroupContent, sidebar_group_label_default as SidebarGroupLabel, sidebar_header_default as SidebarHeader, sidebar_menu_default as SidebarMenu, sidebar_menu_action_default as SidebarMenuAction, sidebar_menu_badge_default as SidebarMenuBadge, sidebar_menu_button_default as SidebarMenuButton, sidebar_menu_item_default as SidebarMenuItem, sidebar_menu_sub_default as SidebarMenuSub, sidebar_menu_sub_button_default as SidebarMenuSubButton, sidebar_menu_sub_item_default as SidebarMenuSubItem, sidebar_provider_default as SidebarProvider, sidebar_separator_default as SidebarSeparator, sidebar_trigger_default as SidebarTrigger, slider_default as Slider, social_button_default as SocialButton, sonner_default as Sonner, sonner_alert_default as SonnerAlert, status_badge_default as StatusBadge, switch_default as Switch, tab_menu_default as TabMenu, tab_menu_content_default as TabMenuContent, tab_menu_item_default as TabMenuItem, tab_menu_list_default as TabMenuList, table_default as Table, table_body_default as TableBody, table_caption_default as TableCaption, table_cell_default as TableCell, table_empty_default as TableEmpty, table_footer_default as TableFooter, table_head_default as TableHead, table_header_default as TableHeader, table_row_default as TableRow, tag_default as Tag, text_input_default as TextInput, text_input_affix_default as TextInputAffix, text_input_button_default as TextInputButton, textarea_default as Textarea, tooltip_default as Tooltip, tooltip_content_default as TooltipContent, tooltip_provider_default as TooltipProvider, tooltip_root_default as TooltipRoot, tooltip_trigger_default as TooltipTrigger, bumpColorValue, clamp, getAbsolutePosition, getColorConstraints, getFractionDigit, getPageXYFromEvent, getScrollXY, provideSidebarContext, resolveArrowDirection, toast, truncColorValue, uid, useDelegatedProps, useSidebar };
@@ -0,0 +1,2 @@
1
+ import { t as range_calendar_default } from "./chunks/range-calendar.js";
2
+ export { range_calendar_default as default };
@@ -0,0 +1,2 @@
1
+ import { t as range_picker_default } from "./chunks/range-picker.js";
2
+ export { range_picker_default as default };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@youcan/celeste",
3
3
  "type": "module",
4
- "version": "0.7.3",
4
+ "version": "0.8.0",
5
5
  "author": "YouCan <tech@youcan.shop>",
6
6
  "repository": {
7
7
  "type": "git",
@@ -33,6 +33,7 @@
33
33
  "vue": "^3.5.13"
34
34
  },
35
35
  "dependencies": {
36
+ "@internationalized/date": "^3.6.0",
36
37
  "@tiptap/core": "^3.11.0",
37
38
  "@tiptap/extension-bubble-menu": "^3.11.0",
38
39
  "@tiptap/extension-color": "^3.11.0",
@@ -48,8 +49,8 @@
48
49
  "reka-ui": "^2.10.1",
49
50
  "tinycolor2": "^1.6.0",
50
51
  "vue-sonner": "^2.0.9",
51
- "@youcan/celeste-tokens": "0.7.3",
52
- "@youcan/celeste-icons": "0.7.3"
52
+ "@youcan/celeste-icons": "0.8.0",
53
+ "@youcan/celeste-tokens": "0.8.0"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@chromatic-com/storybook": "^4.1.3",
@@ -0,0 +1,305 @@
1
+ <script setup lang="ts">
2
+ import type { CalendarRootEmits, CalendarRootProps, DateValue } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { isEqualDay } from '@internationalized/date';
5
+ import clsx from 'clsx';
6
+ import {
7
+ CalendarCell,
8
+ CalendarCellTrigger,
9
+ CalendarGrid,
10
+ CalendarGridBody,
11
+ CalendarGridHead,
12
+ CalendarGridRow,
13
+ CalendarHeadCell,
14
+ CalendarHeading,
15
+ CalendarNext,
16
+ CalendarPrev,
17
+ CalendarRoot,
18
+ useForwardPropsEmits,
19
+ } from 'reka-ui';
20
+ import { useDelegatedProps } from '@/composables/use-delegated-props';
21
+
22
+ export interface CalendarProps extends CalendarRootProps {
23
+ class?: HTMLAttributes['class'];
24
+ markedDates?: DateValue[];
25
+ }
26
+
27
+ const props = withDefaults(defineProps<CalendarProps>(), {
28
+ weekStartsOn: 1,
29
+ weekdayFormat: 'short',
30
+ fixedWeeks: true,
31
+ });
32
+
33
+ const emits = defineEmits<CalendarRootEmits>();
34
+
35
+ const delegatedProps = useDelegatedProps(props, ['class', 'markedDates']);
36
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
37
+
38
+ function isMarked(date: DateValue): boolean {
39
+ return props.markedDates?.some(marked => isEqualDay(marked, date)) ?? false;
40
+ }
41
+
42
+ function weekdayLabel(day: string): string {
43
+ return /^[a-z]/i.test(day.trim()) ? day.slice(0, 2) : day;
44
+ }
45
+ </script>
46
+
47
+ <template>
48
+ <CalendarRoot
49
+ v-slot="{ weekDays, grid }"
50
+ v-bind="forwarded"
51
+ :class="clsx('celeste-calendar', props.class)"
52
+ >
53
+ <div class="celeste-calendar-header">
54
+ <CalendarPrev as-child>
55
+ <button type="button" class="celeste-calendar-nav">
56
+ <i class="i-celeste-arrow-left-s-line" />
57
+ </button>
58
+ </CalendarPrev>
59
+ <CalendarHeading class="celeste-calendar-heading" />
60
+ <CalendarNext as-child>
61
+ <button type="button" class="celeste-calendar-nav">
62
+ <i class="i-celeste-arrow-right-s-line" />
63
+ </button>
64
+ </CalendarNext>
65
+ </div>
66
+
67
+ <div class="celeste-calendar-months">
68
+ <CalendarGrid
69
+ v-for="month in grid"
70
+ :key="month.value.toString()"
71
+ class="celeste-calendar-grid"
72
+ >
73
+ <CalendarGridHead>
74
+ <CalendarGridRow class="celeste-calendar-week">
75
+ <CalendarHeadCell
76
+ v-for="day in weekDays"
77
+ :key="day"
78
+ class="celeste-calendar-weekday"
79
+ >
80
+ {{ weekdayLabel(day) }}
81
+ </CalendarHeadCell>
82
+ </CalendarGridRow>
83
+ </CalendarGridHead>
84
+ <CalendarGridBody class="celeste-calendar-body">
85
+ <CalendarGridRow
86
+ v-for="(weekDates, index) in month.rows"
87
+ :key="`week-${index}`"
88
+ class="celeste-calendar-week"
89
+ >
90
+ <CalendarCell
91
+ v-for="weekDate in weekDates"
92
+ :key="weekDate.toString()"
93
+ :date="weekDate"
94
+ class="celeste-calendar-cell"
95
+ >
96
+ <CalendarCellTrigger
97
+ :day="weekDate"
98
+ :month="month.value"
99
+ class="celeste-calendar-day"
100
+ :data-marked="isMarked(weekDate) ? '' : undefined"
101
+ >
102
+ <span class="celeste-calendar-day-number">{{ weekDate.day }}</span>
103
+ </CalendarCellTrigger>
104
+ </CalendarCell>
105
+ </CalendarGridRow>
106
+ </CalendarGridBody>
107
+ </CalendarGrid>
108
+ </div>
109
+ </CalendarRoot>
110
+ </template>
111
+
112
+ <style scoped lang="scss">
113
+ .celeste-calendar {
114
+ display: flex;
115
+ box-sizing: border-box;
116
+ flex-direction: column;
117
+ color: var(--color-text-sub-600);
118
+ gap: var(--spacing-8);
119
+ }
120
+
121
+ .celeste-calendar-header {
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ padding: var(--spacing-6);
126
+ gap: var(--spacing-6);
127
+ border-radius: var(--radius-8);
128
+ background-color: var(--color-bg-weak-50);
129
+ }
130
+
131
+ .celeste-calendar-heading {
132
+ flex: 1;
133
+ color: var(--color-text-sub-600);
134
+ font: var(--label-sm);
135
+ text-align: center;
136
+ }
137
+
138
+ .celeste-calendar-nav {
139
+ display: inline-flex;
140
+ box-sizing: border-box;
141
+ align-items: center;
142
+ justify-content: center;
143
+ width: 24px;
144
+ height: 24px;
145
+ padding: 2px;
146
+ transition-property: background-color, color, box-shadow;
147
+ transition-duration: var(--animation-fast);
148
+ transition-timing-function: ease-out;
149
+ border: none;
150
+ border-radius: var(--radius-6);
151
+ background-color: var(--color-bg-white-0);
152
+ box-shadow: var(--shadow-regular-xs);
153
+ color: var(--color-icon-sub-600);
154
+ cursor: pointer;
155
+
156
+ i {
157
+ width: 20px;
158
+ height: 20px;
159
+ }
160
+
161
+ &:dir(rtl) i {
162
+ transform: scaleX(-1);
163
+ }
164
+
165
+ &:hover {
166
+ color: var(--color-icon-strong-950);
167
+ }
168
+
169
+ &:focus-visible {
170
+ outline: none;
171
+ box-shadow: var(--shadow-buttons-important-focus);
172
+ }
173
+
174
+ &[data-disabled] {
175
+ background-color: transparent;
176
+ box-shadow: none;
177
+ color: var(--color-icon-disabled-300);
178
+ cursor: default;
179
+ pointer-events: none;
180
+ }
181
+ }
182
+
183
+ .celeste-calendar-months {
184
+ display: flex;
185
+ gap: var(--spacing-16);
186
+ }
187
+
188
+ .celeste-calendar-grid {
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: var(--spacing-8);
192
+ width: 100%;
193
+ border-collapse: collapse;
194
+ }
195
+
196
+ .celeste-calendar-body {
197
+ display: flex;
198
+ flex-direction: column;
199
+ gap: var(--spacing-8);
200
+ }
201
+
202
+ .celeste-calendar-week {
203
+ display: flex;
204
+ align-items: center;
205
+ gap: var(--spacing-8);
206
+ }
207
+
208
+ .celeste-calendar-weekday {
209
+ flex: 1;
210
+ padding-block: var(--spacing-10);
211
+ color: var(--color-text-soft-400);
212
+ font: var(--label-sm);
213
+ text-align: center;
214
+ text-transform: uppercase;
215
+ }
216
+
217
+ .celeste-calendar-cell {
218
+ position: relative;
219
+ flex: 1;
220
+ min-width: 0;
221
+ }
222
+
223
+ .celeste-calendar-day {
224
+ display: flex;
225
+ position: relative;
226
+ box-sizing: border-box;
227
+ align-items: center;
228
+ justify-content: center;
229
+ width: 100%;
230
+ padding-block: var(--spacing-10);
231
+ transition-property: background-color, color;
232
+ transition-duration: var(--animation-fast);
233
+ transition-timing-function: ease-out;
234
+ border-radius: var(--radius-8);
235
+ background-color: var(--color-bg-white-0);
236
+ color: var(--color-text-sub-600);
237
+ font: var(--label-sm);
238
+ cursor: pointer;
239
+ user-select: none;
240
+
241
+ &:hover {
242
+ background-color: var(--color-bg-weak-50);
243
+ color: var(--color-text-strong-950);
244
+ }
245
+
246
+ &:focus-visible {
247
+ outline: none;
248
+ box-shadow: var(--shadow-buttons-important-focus);
249
+ }
250
+
251
+ &[data-outside-view],
252
+ &[data-outside-visible-view] {
253
+ color: var(--color-text-disabled-300);
254
+
255
+ &:hover {
256
+ background-color: var(--color-bg-white-0);
257
+ color: var(--color-text-disabled-300);
258
+ }
259
+ }
260
+
261
+ &[data-disabled] {
262
+ color: var(--color-text-disabled-300);
263
+ cursor: default;
264
+ pointer-events: none;
265
+ }
266
+
267
+ &[data-unavailable] {
268
+ color: var(--color-text-disabled-300);
269
+ text-decoration: line-through;
270
+ pointer-events: none;
271
+ }
272
+
273
+ &[data-selected] {
274
+ background-color: var(--color-primary-base);
275
+ color: var(--color-text-white-0);
276
+
277
+ &:hover {
278
+ background-color: var(--color-primary-base);
279
+ color: var(--color-text-white-0);
280
+ }
281
+ }
282
+ }
283
+
284
+ .celeste-calendar-day-number {
285
+ position: relative;
286
+ }
287
+
288
+ .celeste-calendar-day[data-today]::after,
289
+ .celeste-calendar-day[data-marked]::after {
290
+ content: '';
291
+ position: absolute;
292
+ bottom: 6px;
293
+ left: 50%;
294
+ width: 3px;
295
+ height: 3px;
296
+ transform: translateX(-50%);
297
+ border-radius: var(--radius-full);
298
+ background-color: var(--color-primary-base);
299
+ }
300
+
301
+ .celeste-calendar-day[data-selected][data-today]::after,
302
+ .celeste-calendar-day[data-selected][data-marked]::after {
303
+ background-color: var(--color-text-white-0);
304
+ }
305
+ </style>
@@ -0,0 +1,2 @@
1
+ export * from './calendar.vue';
2
+ export { default as Calendar } from './calendar.vue';
@@ -0,0 +1,76 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import { CalendarDate } from '@internationalized/date';
3
+ import { ref } from 'vue';
4
+ import Calendar from '../calendar.vue';
5
+
6
+ const meta: Meta<typeof Calendar> = {
7
+ title: 'Components/Calendar',
8
+ component: Calendar,
9
+ parameters: { layout: 'centered' },
10
+ argTypes: {
11
+ weekStartsOn: {
12
+ control: { type: 'select' },
13
+ options: [0, 1, 2, 3, 4, 5, 6],
14
+ description: 'First day of the week (0 = Sunday, 1 = Monday).',
15
+ },
16
+ weekdayFormat: {
17
+ control: { type: 'select' },
18
+ options: ['narrow', 'short', 'long'],
19
+ description: 'Formatting used to derive the weekday labels.',
20
+ },
21
+ fixedWeeks: {
22
+ control: { type: 'boolean' },
23
+ description: 'Always render 6 weeks so the calendar height stays stable.',
24
+ },
25
+ locale: {
26
+ control: { type: 'text' },
27
+ description: 'BCP-47 locale used for the heading and weekday labels.',
28
+ },
29
+ },
30
+ args: {
31
+ weekStartsOn: 1,
32
+ weekdayFormat: 'short',
33
+ fixedWeeks: true,
34
+ locale: 'en-US',
35
+ },
36
+ };
37
+
38
+ export default meta;
39
+ type Story = StoryObj<typeof Calendar>;
40
+
41
+ export const Default: Story = {
42
+ render: args => ({
43
+ components: { Calendar },
44
+ setup() {
45
+ const value = ref(new CalendarDate(2024, 1, 11));
46
+ const markedDates = [new CalendarDate(2024, 1, 16)];
47
+ return { args, value, markedDates };
48
+ },
49
+ template: `
50
+ <div style="width: 328px;">
51
+ <Calendar v-model="value" v-bind="args" :marked-dates="markedDates" />
52
+ </div>
53
+ `,
54
+ }),
55
+ };
56
+
57
+ export const Arabic: Story = {
58
+ args: {
59
+ locale: 'ar',
60
+ dir: 'rtl',
61
+ weekStartsOn: 2,
62
+ },
63
+ render: args => ({
64
+ components: { Calendar },
65
+ setup() {
66
+ const value = ref(new CalendarDate(2024, 1, 11));
67
+ const markedDates = [new CalendarDate(2024, 1, 16)];
68
+ return { args, value, markedDates };
69
+ },
70
+ template: `
71
+ <div dir="rtl" style="width: 328px;">
72
+ <Calendar v-model="value" v-bind="args" :marked-dates="markedDates" />
73
+ </div>
74
+ `,
75
+ }),
76
+ };
@@ -0,0 +1,91 @@
1
+ <script setup lang="ts">
2
+ import type { DateValue } from 'reka-ui';
3
+ import type { CalendarProps } from '@/components/calendar/calendar.vue';
4
+ import clsx from 'clsx';
5
+ import { computed } from 'vue';
6
+ import Button from '@/components/button/button.vue';
7
+ import Calendar from '@/components/calendar/calendar.vue';
8
+ import { useDelegatedProps } from '@/composables/use-delegated-props';
9
+
10
+ export interface DatePickerProps extends Omit<CalendarProps, 'modelValue'> {
11
+ footer?: boolean;
12
+ cancelLabel?: string;
13
+ applyLabel?: string;
14
+ }
15
+
16
+ const props = withDefaults(defineProps<DatePickerProps>(), {
17
+ footer: true,
18
+ cancelLabel: 'Cancel',
19
+ applyLabel: 'Apply',
20
+ });
21
+
22
+ const emits = defineEmits<{
23
+ apply: [value: DateValue | undefined];
24
+ cancel: [];
25
+ }>();
26
+
27
+ const modelValue = defineModel<DateValue>();
28
+
29
+ const calendarProps = useDelegatedProps(props, ['class', 'footer', 'cancelLabel', 'applyLabel']);
30
+
31
+ const cardClass = computed(() => clsx('celeste-date-picker', props.class));
32
+ </script>
33
+
34
+ <template>
35
+ <div :class="cardClass">
36
+ <div class="celeste-date-picker-body">
37
+ <Calendar v-model="modelValue" v-bind="calendarProps" />
38
+ </div>
39
+
40
+ <div v-if="footer" class="celeste-date-picker-footer">
41
+ <Button
42
+ class="celeste-date-picker-action"
43
+ variant="stroke"
44
+ intent="neutral"
45
+ @click="emits('cancel')"
46
+ >
47
+ {{ cancelLabel }}
48
+ </Button>
49
+ <Button
50
+ class="celeste-date-picker-action"
51
+ variant="fill"
52
+ intent="primary"
53
+ @click="emits('apply', modelValue)"
54
+ >
55
+ {{ applyLabel }}
56
+ </Button>
57
+ </div>
58
+ </div>
59
+ </template>
60
+
61
+ <style scoped lang="scss">
62
+ .celeste-date-picker {
63
+ display: flex;
64
+ box-sizing: border-box;
65
+ flex-direction: column;
66
+ width: 368px;
67
+ max-width: 100%;
68
+ overflow: hidden;
69
+ border: 1px solid var(--color-stroke-soft-200);
70
+ border-radius: var(--radius-20);
71
+ background-color: var(--color-bg-white-0);
72
+ box-shadow: var(--shadow-regular-md);
73
+ }
74
+
75
+ .celeste-date-picker-body {
76
+ padding: 20px;
77
+ border-block-end: 1px solid var(--color-stroke-soft-200);
78
+ }
79
+
80
+ .celeste-date-picker-footer {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ padding: var(--spacing-16);
85
+ gap: var(--spacing-16);
86
+ }
87
+
88
+ .celeste-date-picker-action {
89
+ flex: 1;
90
+ }
91
+ </style>
@@ -0,0 +1,2 @@
1
+ export * from './date-picker.vue';
2
+ export { default as DatePicker } from './date-picker.vue';