@youcan/celeste 0.13.0 → 0.14.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 (65) hide show
  1. package/ai/component-registry.json +49 -2
  2. package/ai/component-registry.md +24 -2
  3. package/ai/icons.md +1 -1
  4. package/ai/tokens.md +1 -1
  5. package/dist/celeste.css +299 -86
  6. package/dist/cjs/chunks/calendar.cjs +71 -72
  7. package/dist/cjs/chunks/combobox-root.cjs +6 -6
  8. package/dist/cjs/chunks/components.cjs +2 -0
  9. package/dist/cjs/chunks/digit-input.cjs +13 -12
  10. package/dist/cjs/chunks/dropdown-menu.cjs +9 -6
  11. package/dist/cjs/chunks/mochi.cjs +168 -0
  12. package/dist/cjs/chunks/radio-group.cjs +4 -8
  13. package/dist/cjs/chunks/range-calendar.cjs +71 -72
  14. package/dist/cjs/chunks/scroll-area.cjs +16 -17
  15. package/dist/cjs/chunks/segmented-control.cjs +20 -21
  16. package/dist/cjs/chunks/select.cjs +8 -5
  17. package/dist/cjs/chunks/slider.cjs +14 -15
  18. package/dist/cjs/chunks/tab-menu.cjs +8 -9
  19. package/dist/cjs/command-root.cjs +8 -5
  20. package/dist/cjs/index.cjs +2 -0
  21. package/dist/cjs/mochi.cjs +2 -0
  22. package/dist/cjs/use-direction.cjs +4 -4
  23. package/dist/components/index.d.ts +1 -0
  24. package/dist/components/mochi/index.d.ts +2 -0
  25. package/dist/components/mochi/mochi.d.ts +22 -0
  26. package/dist/components/radio-group/radio-group.d.ts +2 -2
  27. package/dist/components/scroll-area/scroll-area.d.ts +2 -2
  28. package/dist/components/segmented-control/segmented-control.d.ts +2 -2
  29. package/dist/components/tab-menu/tab-menu.d.ts +2 -2
  30. package/dist/composables/use-direction.d.ts +2 -2
  31. package/dist/es/chunks/calendar.js +71 -72
  32. package/dist/es/chunks/combobox-root.js +6 -6
  33. package/dist/es/chunks/components.js +2 -0
  34. package/dist/es/chunks/digit-input.js +14 -13
  35. package/dist/es/chunks/dropdown-menu.js +9 -6
  36. package/dist/es/chunks/mochi.js +162 -0
  37. package/dist/es/chunks/radio-group.js +5 -9
  38. package/dist/es/chunks/range-calendar.js +71 -72
  39. package/dist/es/chunks/scroll-area.js +16 -17
  40. package/dist/es/chunks/segmented-control.js +21 -22
  41. package/dist/es/chunks/select.js +8 -5
  42. package/dist/es/chunks/slider.js +14 -15
  43. package/dist/es/chunks/tab-menu.js +9 -10
  44. package/dist/es/command-root.js +8 -5
  45. package/dist/es/index.js +2 -1
  46. package/dist/es/mochi.js +2 -0
  47. package/dist/es/use-direction.js +5 -5
  48. package/package.json +3 -3
  49. package/src/components/calendar/calendar.vue +62 -64
  50. package/src/components/combobox/combobox-root.vue +9 -5
  51. package/src/components/command/command-root.vue +10 -9
  52. package/src/components/digit-input/digit-input.vue +10 -11
  53. package/src/components/dropdown-menu/dropdown-menu.vue +9 -8
  54. package/src/components/index.ts +1 -0
  55. package/src/components/mochi/index.ts +2 -0
  56. package/src/components/mochi/mochi.vue +480 -0
  57. package/src/components/mochi/stories/mochi.stories.ts +105 -0
  58. package/src/components/radio-group/radio-group.vue +9 -10
  59. package/src/components/range-calendar/range-calendar.vue +63 -65
  60. package/src/components/scroll-area/scroll-area.vue +14 -15
  61. package/src/components/segmented-control/segmented-control.vue +20 -21
  62. package/src/components/select/select.vue +9 -8
  63. package/src/components/slider/slider.vue +16 -17
  64. package/src/components/tab-menu/tab-menu.vue +9 -10
  65. package/src/composables/use-direction.ts +6 -6
@@ -4,7 +4,6 @@ import type { HTMLAttributes } from 'vue';
4
4
  import { DateFormatter, getLocalTimeZone, isEqualDay } from '@internationalized/date';
5
5
  import clsx from 'clsx';
6
6
  import {
7
- ConfigProvider,
8
7
  RangeCalendarCell,
9
8
  RangeCalendarCellTrigger,
10
9
  RangeCalendarGrid,
@@ -38,7 +37,7 @@ const emits = defineEmits<RangeCalendarRootEmits>();
38
37
  const delegatedProps = useDelegatedProps(props, ['class', 'markedDates']);
39
38
  const forwarded = useForwardPropsEmits(delegatedProps, emits);
40
39
 
41
- const direction = useDirection();
40
+ const dir = useDirection(() => props.dir);
42
41
 
43
42
  const monthFormatter = computed(
44
43
  () => new DateFormatter(props.locale ?? 'en-US', { month: 'long', year: 'numeric' }),
@@ -58,72 +57,71 @@ function weekdayLabel(day: string): string {
58
57
  </script>
59
58
 
60
59
  <template>
61
- <ConfigProvider :dir="props.dir ?? direction">
62
- <RangeCalendarRoot
63
- v-slot="{ weekDays, grid }"
64
- v-bind="forwarded"
65
- :class="clsx('celeste-range-calendar', props.class)"
66
- >
67
- <div class="celeste-range-calendar-months">
68
- <div
69
- v-for="month in grid"
70
- :key="month.value.toString()"
71
- class="celeste-range-calendar-month"
72
- >
73
- <div class="celeste-range-calendar-header">
74
- <RangeCalendarPrev as-child>
75
- <button type="button" class="celeste-range-calendar-nav">
76
- <i class="i-celeste-arrow-left-s-line" />
77
- </button>
78
- </RangeCalendarPrev>
79
- <span class="celeste-range-calendar-heading">{{ formatMonth(month.value) }}</span>
80
- <RangeCalendarNext as-child>
81
- <button type="button" class="celeste-range-calendar-nav">
82
- <i class="i-celeste-arrow-right-s-line" />
83
- </button>
84
- </RangeCalendarNext>
85
- </div>
86
-
87
- <RangeCalendarGrid class="celeste-range-calendar-grid">
88
- <RangeCalendarGridHead>
89
- <RangeCalendarGridRow class="celeste-range-calendar-week">
90
- <RangeCalendarHeadCell
91
- v-for="day in weekDays"
92
- :key="day"
93
- class="celeste-range-calendar-weekday"
94
- >
95
- {{ weekdayLabel(day) }}
96
- </RangeCalendarHeadCell>
97
- </RangeCalendarGridRow>
98
- </RangeCalendarGridHead>
99
- <RangeCalendarGridBody class="celeste-range-calendar-body">
100
- <RangeCalendarGridRow
101
- v-for="(weekDates, index) in month.rows"
102
- :key="`week-${index}`"
103
- class="celeste-range-calendar-week"
60
+ <RangeCalendarRoot
61
+ v-slot="{ weekDays, grid }"
62
+ v-bind="forwarded"
63
+ :class="clsx('celeste-range-calendar', props.class)"
64
+ :dir="dir"
65
+ >
66
+ <div class="celeste-range-calendar-months">
67
+ <div
68
+ v-for="month in grid"
69
+ :key="month.value.toString()"
70
+ class="celeste-range-calendar-month"
71
+ >
72
+ <div class="celeste-range-calendar-header">
73
+ <RangeCalendarPrev as-child>
74
+ <button type="button" class="celeste-range-calendar-nav">
75
+ <i class="i-celeste-arrow-left-s-line" />
76
+ </button>
77
+ </RangeCalendarPrev>
78
+ <span class="celeste-range-calendar-heading">{{ formatMonth(month.value) }}</span>
79
+ <RangeCalendarNext as-child>
80
+ <button type="button" class="celeste-range-calendar-nav">
81
+ <i class="i-celeste-arrow-right-s-line" />
82
+ </button>
83
+ </RangeCalendarNext>
84
+ </div>
85
+
86
+ <RangeCalendarGrid class="celeste-range-calendar-grid">
87
+ <RangeCalendarGridHead>
88
+ <RangeCalendarGridRow class="celeste-range-calendar-week">
89
+ <RangeCalendarHeadCell
90
+ v-for="day in weekDays"
91
+ :key="day"
92
+ class="celeste-range-calendar-weekday"
104
93
  >
105
- <RangeCalendarCell
106
- v-for="weekDate in weekDates"
107
- :key="weekDate.toString()"
108
- :date="weekDate"
109
- class="celeste-range-calendar-cell"
94
+ {{ weekdayLabel(day) }}
95
+ </RangeCalendarHeadCell>
96
+ </RangeCalendarGridRow>
97
+ </RangeCalendarGridHead>
98
+ <RangeCalendarGridBody class="celeste-range-calendar-body">
99
+ <RangeCalendarGridRow
100
+ v-for="(weekDates, index) in month.rows"
101
+ :key="`week-${index}`"
102
+ class="celeste-range-calendar-week"
103
+ >
104
+ <RangeCalendarCell
105
+ v-for="weekDate in weekDates"
106
+ :key="weekDate.toString()"
107
+ :date="weekDate"
108
+ class="celeste-range-calendar-cell"
109
+ >
110
+ <RangeCalendarCellTrigger
111
+ :day="weekDate"
112
+ :month="month.value"
113
+ class="celeste-range-calendar-day"
114
+ :data-marked="isMarked(weekDate) ? '' : undefined"
110
115
  >
111
- <RangeCalendarCellTrigger
112
- :day="weekDate"
113
- :month="month.value"
114
- class="celeste-range-calendar-day"
115
- :data-marked="isMarked(weekDate) ? '' : undefined"
116
- >
117
- <span class="celeste-range-calendar-day-number">{{ weekDate.day }}</span>
118
- </RangeCalendarCellTrigger>
119
- </RangeCalendarCell>
120
- </RangeCalendarGridRow>
121
- </RangeCalendarGridBody>
122
- </RangeCalendarGrid>
123
- </div>
116
+ <span class="celeste-range-calendar-day-number">{{ weekDate.day }}</span>
117
+ </RangeCalendarCellTrigger>
118
+ </RangeCalendarCell>
119
+ </RangeCalendarGridRow>
120
+ </RangeCalendarGridBody>
121
+ </RangeCalendarGrid>
124
122
  </div>
125
- </RangeCalendarRoot>
126
- </ConfigProvider>
123
+ </div>
124
+ </RangeCalendarRoot>
127
125
  </template>
128
126
 
129
127
  <style scoped lang="scss">
@@ -2,7 +2,7 @@
2
2
  import type { ScrollAreaRootProps } from 'reka-ui';
3
3
  import type { HTMLAttributes } from 'vue';
4
4
  import clsx from 'clsx';
5
- import { ConfigProvider, ScrollAreaCorner, ScrollAreaRoot, ScrollAreaViewport } from 'reka-ui';
5
+ import { ScrollAreaCorner, ScrollAreaRoot, ScrollAreaViewport } from 'reka-ui';
6
6
  import { useDelegatedProps, useDirection } from '@/composables';
7
7
  import ScrollBar from './scroll-bar.vue';
8
8
 
@@ -10,23 +10,22 @@ const props = defineProps<ScrollAreaRootProps & { class?: HTMLAttributes['class'
10
10
 
11
11
  const delegatedProps = useDelegatedProps(props, 'class');
12
12
 
13
- const direction = useDirection();
13
+ const dir = useDirection(() => props.dir);
14
14
  </script>
15
15
 
16
16
  <template>
17
- <ConfigProvider :dir="props.dir ?? direction">
18
- <ScrollAreaRoot
19
- v-bind="delegatedProps"
20
- :class="clsx('celeste-scroll-area', props.class)"
21
- >
22
- <ScrollAreaViewport class="celeste-scroll-area-viewport">
23
- <slot />
24
- </ScrollAreaViewport>
25
- <ScrollBar />
26
- <ScrollBar orientation="horizontal" />
27
- <ScrollAreaCorner />
28
- </ScrollAreaRoot>
29
- </ConfigProvider>
17
+ <ScrollAreaRoot
18
+ v-bind="delegatedProps"
19
+ :class="clsx('celeste-scroll-area', props.class)"
20
+ :dir="dir"
21
+ >
22
+ <ScrollAreaViewport class="celeste-scroll-area-viewport">
23
+ <slot />
24
+ </ScrollAreaViewport>
25
+ <ScrollBar />
26
+ <ScrollBar orientation="horizontal" />
27
+ <ScrollAreaCorner />
28
+ </ScrollAreaRoot>
30
29
  </template>
31
30
 
32
31
  <style scoped lang="scss">
@@ -2,7 +2,7 @@
2
2
  import type { ToggleGroupRootEmits, ToggleGroupRootProps } from 'reka-ui';
3
3
  import type { HTMLAttributes } from 'vue';
4
4
  import clsx from 'clsx';
5
- import { ConfigProvider, ToggleGroupRoot as SegmentedControlRoot, useForwardPropsEmits } from 'reka-ui';
5
+ import { ToggleGroupRoot as SegmentedControlRoot, useForwardPropsEmits } from 'reka-ui';
6
6
  import { useDelegatedProps } from '@/composables/use-delegated-props';
7
7
  import { useDirection } from '@/composables/use-direction';
8
8
  import { useTabObserver } from '@/composables/use-tab-observer';
@@ -13,31 +13,30 @@ const emits = defineEmits<ToggleGroupRootEmits>();
13
13
  const delegatedProps = useDelegatedProps(props, 'class');
14
14
  const forwarded = useForwardPropsEmits(delegatedProps, emits);
15
15
 
16
- const direction = useDirection();
16
+ const dir = useDirection(() => props.dir);
17
17
 
18
18
  const { listRef, indicator, ready } = useTabObserver('[data-state="on"]');
19
19
  </script>
20
20
 
21
21
  <template>
22
- <ConfigProvider :dir="props.dir ?? direction">
23
- <SegmentedControlRoot
24
- ref="listRef"
25
- :class="clsx('celeste-segmented-control', props.class)"
26
- v-bind="forwarded"
27
- type="single"
28
- >
29
- <slot />
30
- <div
31
- :hidden="!ready"
32
- class="celeste-segmented-control-indicator"
33
- :style="{
34
- width: `${indicator.width}px`,
35
- height: `${indicator.height}px`,
36
- transform: `translate3d(${indicator.left}px, ${indicator.top}px, 0)`,
37
- }"
38
- />
39
- </SegmentedControlRoot>
40
- </ConfigProvider>
22
+ <SegmentedControlRoot
23
+ ref="listRef"
24
+ :class="clsx('celeste-segmented-control', props.class)"
25
+ v-bind="forwarded"
26
+ type="single"
27
+ :dir="dir"
28
+ >
29
+ <slot />
30
+ <div
31
+ :hidden="!ready"
32
+ class="celeste-segmented-control-indicator"
33
+ :style="{
34
+ width: `${indicator.width}px`,
35
+ height: `${indicator.height}px`,
36
+ transform: `translate3d(${indicator.left}px, ${indicator.top}px, 0)`,
37
+ }"
38
+ />
39
+ </SegmentedControlRoot>
41
40
  </template>
42
41
 
43
42
  <style scoped>
@@ -12,16 +12,17 @@ const emits = defineEmits<SelectRootEmits>();
12
12
  const delegatedProps = useDelegatedProps(props, 'class');
13
13
  const forwarded = useForwardPropsEmits(delegatedProps, emits);
14
14
 
15
- const direction = useDirection();
15
+ const dir = useDirection(() => props.dir);
16
16
  </script>
17
17
 
18
18
  <template>
19
- <ConfigProvider :dir="props.dir ?? direction">
20
- <SelectRoot
21
- v-bind="forwarded"
22
- :class="clsx('celeste-select', props.class)"
23
- >
19
+ <SelectRoot
20
+ v-bind="forwarded"
21
+ :class="clsx('celeste-select', props.class)"
22
+ :dir="dir"
23
+ >
24
+ <ConfigProvider :dir="dir">
24
25
  <slot />
25
- </SelectRoot>
26
- </ConfigProvider>
26
+ </ConfigProvider>
27
+ </SelectRoot>
27
28
  </template>
@@ -2,7 +2,7 @@
2
2
  import type { SliderRootEmits, SliderRootProps } from 'reka-ui';
3
3
  import type { HTMLAttributes } from 'vue';
4
4
  import clsx from 'clsx';
5
- import { ConfigProvider, SliderRange, SliderRoot, SliderThumb, SliderTrack, useForwardPropsEmits } from 'reka-ui';
5
+ import { SliderRange, SliderRoot, SliderThumb, SliderTrack, useForwardPropsEmits } from 'reka-ui';
6
6
  import { useDelegatedProps } from '@/composables/use-delegated-props';
7
7
  import { useDirection } from '@/composables/use-direction';
8
8
 
@@ -12,26 +12,25 @@ const emits = defineEmits<SliderRootEmits>();
12
12
  const delegatedProps = useDelegatedProps(props, 'class');
13
13
  const forwarded = useForwardPropsEmits(delegatedProps, emits);
14
14
 
15
- const direction = useDirection();
15
+ const dir = useDirection(() => props.dir);
16
16
  </script>
17
17
 
18
18
  <template>
19
- <ConfigProvider :dir="props.dir ?? direction">
20
- <SliderRoot
21
- v-bind="forwarded"
22
- :class="clsx('celeste-slider', props.class)"
23
- >
24
- <SliderTrack class="celeste-slider-track">
25
- <SliderRange class="celeste-slider-range" />
26
- </SliderTrack>
19
+ <SliderRoot
20
+ v-bind="forwarded"
21
+ :class="clsx('celeste-slider', props.class)"
22
+ :dir="dir"
23
+ >
24
+ <SliderTrack class="celeste-slider-track">
25
+ <SliderRange class="celeste-slider-range" />
26
+ </SliderTrack>
27
27
 
28
- <SliderThumb
29
- v-for="(_, key) in modelValue"
30
- :key="key"
31
- class="celeste-slider-thumb"
32
- />
33
- </SliderRoot>
34
- </ConfigProvider>
28
+ <SliderThumb
29
+ v-for="(_, key) in modelValue"
30
+ :key="key"
31
+ class="celeste-slider-thumb"
32
+ />
33
+ </SliderRoot>
35
34
  </template>
36
35
 
37
36
  <style lang="scss">
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import type { TabsRootEmits, TabsRootProps } from 'reka-ui';
3
- import { ConfigProvider, TabsRoot, useForwardPropsEmits } from 'reka-ui';
3
+ import { TabsRoot, useForwardPropsEmits } from 'reka-ui';
4
4
  import { useDirection } from '@/composables/use-direction';
5
5
 
6
6
  const props = defineProps<TabsRootProps>();
@@ -8,18 +8,17 @@ const emits = defineEmits<TabsRootEmits>();
8
8
 
9
9
  const forwarded = useForwardPropsEmits(props, emits);
10
10
 
11
- const direction = useDirection();
11
+ const dir = useDirection(() => props.dir);
12
12
  </script>
13
13
 
14
14
  <template>
15
- <ConfigProvider :dir="props.dir ?? direction">
16
- <TabsRoot
17
- v-bind="forwarded"
18
- class="celeste-tab-menu-root"
19
- >
20
- <slot />
21
- </TabsRoot>
22
- </ConfigProvider>
15
+ <TabsRoot
16
+ v-bind="forwarded"
17
+ class="celeste-tab-menu-root"
18
+ :dir="dir"
19
+ >
20
+ <slot />
21
+ </TabsRoot>
23
22
  </template>
24
23
 
25
24
  <style scoped>
@@ -1,6 +1,6 @@
1
1
  import type { Direction } from 'reka-ui';
2
- import type { Ref } from 'vue';
3
- import { getCurrentInstance, onMounted, ref, watch } from 'vue';
2
+ import type { ComputedRef, MaybeRefOrGetter } from 'vue';
3
+ import { computed, getCurrentInstance, onMounted, ref, toValue, watch } from 'vue';
4
4
 
5
5
  const revision = ref(0);
6
6
 
@@ -18,9 +18,9 @@ function documentDirection(): Direction {
18
18
  return typeof document !== 'undefined' && document.documentElement.dir === 'rtl' ? 'rtl' : 'ltr';
19
19
  }
20
20
 
21
- export function useDirection(): Ref<Direction> {
21
+ export function useDirection(override?: MaybeRefOrGetter<Direction | undefined>): ComputedRef<Direction> {
22
22
  const instance = getCurrentInstance();
23
- const direction = ref<Direction>(documentDirection());
23
+ const resolved = ref<Direction>(documentDirection());
24
24
 
25
25
  observeDocument();
26
26
 
@@ -28,7 +28,7 @@ export function useDirection(): Ref<Direction> {
28
28
  const node = instance?.vnode.el as Node | null | undefined;
29
29
  const element = node instanceof HTMLElement ? node : node?.parentElement;
30
30
 
31
- direction.value = element
31
+ resolved.value = element
32
32
  ? getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr'
33
33
  : documentDirection();
34
34
  }
@@ -36,5 +36,5 @@ export function useDirection(): Ref<Direction> {
36
36
  onMounted(read);
37
37
  watch(revision, read);
38
38
 
39
- return direction;
39
+ return computed(() => toValue(override) ?? resolved.value);
40
40
  }