@kayord/ui 0.20.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/components/custom/avatar-group/avatar-group-etc.svelte +17 -0
  2. package/dist/components/custom/avatar-group/avatar-group-etc.svelte.d.ts +4 -0
  3. package/dist/components/custom/avatar-group/avatar-group-member.svelte +9 -0
  4. package/dist/components/custom/avatar-group/avatar-group-member.svelte.d.ts +4 -0
  5. package/dist/components/custom/avatar-group/avatar-group.svelte +24 -0
  6. package/dist/components/custom/avatar-group/avatar-group.svelte.d.ts +4 -0
  7. package/dist/components/custom/avatar-group/index.d.ts +6 -0
  8. package/dist/components/custom/avatar-group/index.js +5 -0
  9. package/dist/components/custom/avatar-group/types.d.ts +13 -0
  10. package/dist/components/custom/avatar-group/types.js +1 -0
  11. package/dist/components/custom/index.d.ts +1 -0
  12. package/dist/components/custom/index.js +1 -0
  13. package/dist/components/ui/accordion/accordion-content.svelte +2 -5
  14. package/dist/components/ui/accordion/accordion.svelte +7 -0
  15. package/dist/components/ui/accordion/accordion.svelte.d.ts +4 -0
  16. package/dist/components/ui/accordion/index.d.ts +1 -1
  17. package/dist/components/ui/accordion/index.js +1 -1
  18. package/dist/components/ui/calendar/calendar-caption.svelte +76 -0
  19. package/dist/components/ui/calendar/calendar-caption.svelte.d.ts +19 -0
  20. package/dist/components/ui/calendar/calendar-cell.svelte +1 -1
  21. package/dist/components/ui/calendar/calendar-day.svelte +13 -8
  22. package/dist/components/ui/calendar/calendar-grid.svelte +5 -1
  23. package/dist/components/ui/calendar/calendar-head-cell.svelte +1 -1
  24. package/dist/components/ui/calendar/calendar-header.svelte +1 -1
  25. package/dist/components/ui/calendar/calendar-heading.svelte +1 -1
  26. package/dist/components/ui/calendar/calendar-month-select.svelte +42 -0
  27. package/dist/components/ui/calendar/calendar-month-select.svelte.d.ts +4 -0
  28. package/dist/components/ui/calendar/calendar-month.svelte +15 -0
  29. package/dist/components/ui/calendar/calendar-month.svelte.d.ts +5 -0
  30. package/dist/components/ui/calendar/calendar-months.svelte +1 -5
  31. package/dist/components/ui/calendar/calendar-nav.svelte +19 -0
  32. package/dist/components/ui/calendar/calendar-nav.svelte.d.ts +5 -0
  33. package/dist/components/ui/calendar/calendar-next-button.svelte +12 -4
  34. package/dist/components/ui/calendar/calendar-next-button.svelte.d.ts +5 -1
  35. package/dist/components/ui/calendar/calendar-prev-button.svelte +12 -4
  36. package/dist/components/ui/calendar/calendar-prev-button.svelte.d.ts +5 -1
  37. package/dist/components/ui/calendar/calendar-year-select.svelte +41 -0
  38. package/dist/components/ui/calendar/calendar-year-select.svelte.d.ts +4 -0
  39. package/dist/components/ui/calendar/calendar.svelte +82 -28
  40. package/dist/components/ui/calendar/calendar.svelte.d.ts +16 -1
  41. package/dist/components/ui/calendar/index.d.ts +6 -1
  42. package/dist/components/ui/calendar/index.js +6 -1
  43. package/dist/components/ui/carousel/carousel-next.svelte +1 -1
  44. package/dist/components/ui/carousel/carousel-previous.svelte +1 -1
  45. package/dist/components/ui/carousel/carousel.svelte +10 -17
  46. package/dist/components/ui/carousel/context.d.ts +1 -2
  47. package/dist/components/ui/chart/chart-container.svelte +1 -4
  48. package/dist/components/ui/collapsible/collapsible.svelte +1 -1
  49. package/dist/components/ui/collapsible/index.d.ts +3 -15
  50. package/dist/components/ui/collapsible/index.js +3 -4
  51. package/dist/components/ui/dialog/dialog-content.svelte +10 -6
  52. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +1 -0
  53. package/dist/components/ui/drawer/drawer-content.svelte +1 -1
  54. package/dist/components/ui/drawer/drawer-footer.svelte +1 -1
  55. package/dist/components/ui/drawer/drawer-header.svelte +1 -1
  56. package/dist/components/ui/input/input.svelte +1 -1
  57. package/dist/components/ui/pagination/pagination-link.svelte +1 -1
  58. package/dist/components/ui/radio-group/radio-group-item.svelte +1 -1
  59. package/dist/components/ui/range-calendar/index.d.ts +6 -1
  60. package/dist/components/ui/range-calendar/index.js +6 -1
  61. package/dist/components/ui/range-calendar/range-calendar-caption.svelte +76 -0
  62. package/dist/components/ui/range-calendar/range-calendar-caption.svelte.d.ts +19 -0
  63. package/dist/components/ui/range-calendar/range-calendar-cell.svelte +1 -1
  64. package/dist/components/ui/range-calendar/range-calendar-day.svelte +16 -9
  65. package/dist/components/ui/range-calendar/range-calendar-grid.svelte +5 -1
  66. package/dist/components/ui/range-calendar/range-calendar-head-cell.svelte +1 -1
  67. package/dist/components/ui/range-calendar/range-calendar-header.svelte +1 -1
  68. package/dist/components/ui/range-calendar/range-calendar-heading.svelte +1 -1
  69. package/dist/components/ui/range-calendar/range-calendar-month-select.svelte +42 -0
  70. package/dist/components/ui/range-calendar/range-calendar-month-select.svelte.d.ts +4 -0
  71. package/dist/components/ui/range-calendar/range-calendar-month.svelte +15 -0
  72. package/dist/components/ui/range-calendar/range-calendar-month.svelte.d.ts +5 -0
  73. package/dist/components/ui/range-calendar/range-calendar-months.svelte +2 -6
  74. package/dist/components/ui/range-calendar/range-calendar-months.svelte.d.ts +1 -1
  75. package/dist/components/ui/range-calendar/range-calendar-nav.svelte +19 -0
  76. package/dist/components/ui/range-calendar/range-calendar-nav.svelte.d.ts +5 -0
  77. package/dist/components/ui/range-calendar/range-calendar-next-button.svelte +7 -4
  78. package/dist/components/ui/range-calendar/range-calendar-next-button.svelte.d.ts +5 -1
  79. package/dist/components/ui/range-calendar/range-calendar-prev-button.svelte +7 -4
  80. package/dist/components/ui/range-calendar/range-calendar-prev-button.svelte.d.ts +5 -1
  81. package/dist/components/ui/range-calendar/range-calendar-year-select.svelte +41 -0
  82. package/dist/components/ui/range-calendar/range-calendar-year-select.svelte.d.ts +4 -0
  83. package/dist/components/ui/range-calendar/range-calendar.svelte +83 -28
  84. package/dist/components/ui/range-calendar/range-calendar.svelte.d.ts +17 -1
  85. package/dist/components/ui/select/index.d.ts +2 -1
  86. package/dist/components/ui/select/index.js +3 -2
  87. package/dist/components/ui/select/select-group-heading.svelte +15 -2
  88. package/dist/components/ui/select/select-group-heading.svelte.d.ts +8 -2
  89. package/dist/components/ui/select/select-trigger.svelte +1 -1
  90. package/dist/components/ui/separator/separator.svelte +1 -1
  91. package/dist/hooks/is-mobile.svelte.d.ts +1 -1
  92. package/dist/hooks/is-mobile.svelte.js +3 -3
  93. package/package.json +11 -11
@@ -2,6 +2,9 @@
2
2
  import { Calendar as CalendarPrimitive } from "bits-ui";
3
3
  import * as Calendar from "./index.js";
4
4
  import { cn, type WithoutChildrenOrChild } from "../../../utils.js";
5
+ import type { ButtonVariant } from "../button/button.svelte";
6
+ import { isEqualMonth, type DateValue } from "@internationalized/date";
7
+ import type { Snippet } from "svelte";
5
8
 
6
9
  let {
7
10
  ref = $bindable(null),
@@ -9,8 +12,31 @@
9
12
  placeholder = $bindable(),
10
13
  class: className,
11
14
  weekdayFormat = "short",
15
+ buttonVariant = "ghost",
16
+ captionLayout = "label",
17
+ locale = "en-US",
18
+ months: monthsProp,
19
+ years,
20
+ monthFormat: monthFormatProp,
21
+ yearFormat = "numeric",
22
+ day,
23
+ disableDaysOutsideMonth = false,
12
24
  ...restProps
13
- }: WithoutChildrenOrChild<CalendarPrimitive.RootProps> = $props();
25
+ }: WithoutChildrenOrChild<CalendarPrimitive.RootProps> & {
26
+ buttonVariant?: ButtonVariant;
27
+ captionLayout?: "dropdown" | "dropdown-months" | "dropdown-years" | "label";
28
+ months?: CalendarPrimitive.MonthSelectProps["months"];
29
+ years?: CalendarPrimitive.YearSelectProps["years"];
30
+ monthFormat?: CalendarPrimitive.MonthSelectProps["monthFormat"];
31
+ yearFormat?: CalendarPrimitive.YearSelectProps["yearFormat"];
32
+ day?: Snippet<[{ day: DateValue; outsideMonth: boolean }]>;
33
+ } = $props();
34
+
35
+ const monthFormat = $derived.by(() => {
36
+ if (monthFormatProp) return monthFormatProp;
37
+ if (captionLayout.startsWith("dropdown")) return "short";
38
+ return "long";
39
+ });
14
40
  </script>
15
41
 
16
42
  <!--
@@ -22,39 +48,67 @@ get along, so we shut typescript up by casting `value` to `never`.
22
48
  bind:ref
23
49
  bind:placeholder
24
50
  {weekdayFormat}
25
- class={cn("p-3", className)}
51
+ {disableDaysOutsideMonth}
52
+ class={cn(
53
+ "bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
54
+ className
55
+ )}
56
+ {locale}
57
+ {monthFormat}
58
+ {yearFormat}
26
59
  {...restProps}
27
60
  >
28
61
  {#snippet children({ months, weekdays })}
29
- <Calendar.Header>
30
- <Calendar.PrevButton />
31
- <Calendar.Heading />
32
- <Calendar.NextButton />
33
- </Calendar.Header>
34
62
  <Calendar.Months>
35
- {#each months as month (month)}
36
- <Calendar.Grid>
37
- <Calendar.GridHead>
38
- <Calendar.GridRow class="flex">
39
- {#each weekdays as weekday (weekday)}
40
- <Calendar.HeadCell>
41
- {weekday.slice(0, 2)}
42
- </Calendar.HeadCell>
43
- {/each}
44
- </Calendar.GridRow>
45
- </Calendar.GridHead>
46
- <Calendar.GridBody>
47
- {#each month.weeks as weekDates (weekDates)}
48
- <Calendar.GridRow class="mt-2 w-full">
49
- {#each weekDates as date (date)}
50
- <Calendar.Cell {date} month={month.value}>
51
- <Calendar.Day />
52
- </Calendar.Cell>
63
+ <Calendar.Nav>
64
+ <Calendar.PrevButton variant={buttonVariant} />
65
+ <Calendar.NextButton variant={buttonVariant} />
66
+ </Calendar.Nav>
67
+ {#each months as month, monthIndex (month)}
68
+ <Calendar.Month>
69
+ <Calendar.Header>
70
+ <Calendar.Caption
71
+ {captionLayout}
72
+ months={monthsProp}
73
+ {monthFormat}
74
+ {years}
75
+ {yearFormat}
76
+ month={month.value}
77
+ bind:placeholder
78
+ {locale}
79
+ {monthIndex}
80
+ />
81
+ </Calendar.Header>
82
+ <Calendar.Grid>
83
+ <Calendar.GridHead>
84
+ <Calendar.GridRow class="select-none">
85
+ {#each weekdays as weekday (weekday)}
86
+ <Calendar.HeadCell>
87
+ {weekday.slice(0, 2)}
88
+ </Calendar.HeadCell>
53
89
  {/each}
54
90
  </Calendar.GridRow>
55
- {/each}
56
- </Calendar.GridBody>
57
- </Calendar.Grid>
91
+ </Calendar.GridHead>
92
+ <Calendar.GridBody>
93
+ {#each month.weeks as weekDates (weekDates)}
94
+ <Calendar.GridRow class="mt-2 w-full">
95
+ {#each weekDates as date (date)}
96
+ <Calendar.Cell {date} month={month.value}>
97
+ {#if day}
98
+ {@render day({
99
+ day: date,
100
+ outsideMonth: !isEqualMonth(date, month.value),
101
+ })}
102
+ {:else}
103
+ <Calendar.Day />
104
+ {/if}
105
+ </Calendar.Cell>
106
+ {/each}
107
+ </Calendar.GridRow>
108
+ {/each}
109
+ </Calendar.GridBody>
110
+ </Calendar.Grid>
111
+ </Calendar.Month>
58
112
  {/each}
59
113
  </Calendar.Months>
60
114
  {/snippet}
@@ -1,6 +1,21 @@
1
1
  import { Calendar as CalendarPrimitive } from "bits-ui";
2
2
  import * as Calendar from "./index.js";
3
3
  import { type WithoutChildrenOrChild } from "../../../utils.js";
4
- declare const Calendar: import("svelte").Component<WithoutChildrenOrChild<CalendarPrimitive.RootProps>, {}, "value" | "placeholder" | "ref">;
4
+ import type { ButtonVariant } from "../button/button.svelte";
5
+ import { type DateValue } from "@internationalized/date";
6
+ import type { Snippet } from "svelte";
7
+ type $$ComponentProps = WithoutChildrenOrChild<CalendarPrimitive.RootProps> & {
8
+ buttonVariant?: ButtonVariant;
9
+ captionLayout?: "dropdown" | "dropdown-months" | "dropdown-years" | "label";
10
+ months?: CalendarPrimitive.MonthSelectProps["months"];
11
+ years?: CalendarPrimitive.YearSelectProps["years"];
12
+ monthFormat?: CalendarPrimitive.MonthSelectProps["monthFormat"];
13
+ yearFormat?: CalendarPrimitive.YearSelectProps["yearFormat"];
14
+ day?: Snippet<[{
15
+ day: DateValue;
16
+ outsideMonth: boolean;
17
+ }]>;
18
+ };
19
+ declare const Calendar: import("svelte").Component<$$ComponentProps, {}, "value" | "placeholder" | "ref">;
5
20
  type Calendar = ReturnType<typeof Calendar>;
6
21
  export default Calendar;
@@ -11,4 +11,9 @@ import GridHead from "./calendar-grid-head.svelte";
11
11
  import HeadCell from "./calendar-head-cell.svelte";
12
12
  import NextButton from "./calendar-next-button.svelte";
13
13
  import PrevButton from "./calendar-prev-button.svelte";
14
- export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton, Root as Calendar, };
14
+ import MonthSelect from "./calendar-month-select.svelte";
15
+ import YearSelect from "./calendar-year-select.svelte";
16
+ import Month from "./calendar-month.svelte";
17
+ import Nav from "./calendar-nav.svelte";
18
+ import Caption from "./calendar-caption.svelte";
19
+ export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton, Nav, Month, YearSelect, MonthSelect, Caption, Root as Calendar, };
@@ -11,6 +11,11 @@ import GridHead from "./calendar-grid-head.svelte";
11
11
  import HeadCell from "./calendar-head-cell.svelte";
12
12
  import NextButton from "./calendar-next-button.svelte";
13
13
  import PrevButton from "./calendar-prev-button.svelte";
14
- export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton,
14
+ import MonthSelect from "./calendar-month-select.svelte";
15
+ import YearSelect from "./calendar-year-select.svelte";
16
+ import Month from "./calendar-month.svelte";
17
+ import Nav from "./calendar-nav.svelte";
18
+ import Caption from "./calendar-caption.svelte";
19
+ export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton, Nav, Month, YearSelect, MonthSelect, Caption,
15
20
  //
16
21
  Root as Calendar, };
@@ -20,6 +20,7 @@
20
20
  data-slot="carousel-next"
21
21
  {variant}
22
22
  {size}
23
+ aria-disabled={!emblaCtx.canScrollNext}
23
24
  class={cn(
24
25
  "absolute size-8 rounded-full",
25
26
  emblaCtx.orientation === "horizontal"
@@ -27,7 +28,6 @@
27
28
  : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
28
29
  className
29
30
  )}
30
- disabled={!emblaCtx.canScrollNext}
31
31
  onclick={emblaCtx.scrollNext}
32
32
  onkeydown={emblaCtx.handleKeyDown}
33
33
  bind:ref
@@ -20,6 +20,7 @@
20
20
  data-slot="carousel-previous"
21
21
  {variant}
22
22
  {size}
23
+ disabled={!emblaCtx.canScrollPrev}
23
24
  class={cn(
24
25
  "absolute size-8 rounded-full",
25
26
  emblaCtx.orientation === "horizontal"
@@ -27,7 +28,6 @@
27
28
  : "-top-12 left-1/2 -translate-x-1/2 rotate-90",
28
29
  className
29
30
  )}
30
- disabled={!emblaCtx.canScrollPrev}
31
31
  onclick={emblaCtx.scrollPrev}
32
32
  onkeydown={emblaCtx.handleKeyDown}
33
33
  {...restProps}
@@ -34,28 +34,22 @@
34
34
  function scrollPrev() {
35
35
  carouselState.api?.scrollPrev();
36
36
  }
37
+
37
38
  function scrollNext() {
38
39
  carouselState.api?.scrollNext();
39
40
  }
41
+
40
42
  function scrollTo(index: number, jump?: boolean) {
41
43
  carouselState.api?.scrollTo(index, jump);
42
44
  }
43
45
 
44
- function onSelect(api: CarouselAPI) {
45
- if (!api) return;
46
- carouselState.canScrollPrev = api.canScrollPrev();
47
- carouselState.canScrollNext = api.canScrollNext();
48
- carouselState.selectedIndex = api.selectedScrollSnap();
46
+ function onSelect() {
47
+ if (!carouselState.api) return;
48
+ carouselState.selectedIndex = carouselState.api.selectedScrollSnap();
49
+ carouselState.canScrollNext = carouselState.api.canScrollNext();
50
+ carouselState.canScrollPrev = carouselState.api.canScrollPrev();
49
51
  }
50
52
 
51
- $effect(() => {
52
- if (carouselState.api) {
53
- onSelect(carouselState.api);
54
- carouselState.api.on("select", onSelect);
55
- carouselState.api.on("reInit", onSelect);
56
- }
57
- });
58
-
59
53
  function handleKeyDown(e: KeyboardEvent) {
60
54
  if (e.key === "ArrowLeft") {
61
55
  e.preventDefault();
@@ -66,14 +60,13 @@
66
60
  }
67
61
  }
68
62
 
69
- $effect(() => {
70
- setApi(carouselState.api);
71
- });
72
-
73
63
  function onInit(event: CustomEvent<CarouselAPI>) {
74
64
  carouselState.api = event.detail;
65
+ setApi(carouselState.api);
75
66
 
76
67
  carouselState.scrollSnaps = carouselState.api.scrollSnapList();
68
+ carouselState.api.on("select", onSelect);
69
+ onSelect();
77
70
  }
78
71
 
79
72
  $effect(() => {
@@ -1,6 +1,5 @@
1
1
  import type { WithElementRef } from "../../../utils.js";
2
- import type { EmblaCarouselSvelteType } from "embla-carousel-svelte";
3
- import type emblaCarouselSvelte from "embla-carousel-svelte";
2
+ import type { EmblaCarouselSvelteType, default as emblaCarouselSvelte } from "embla-carousel-svelte";
4
3
  import type { HTMLAttributes } from "svelte/elements";
5
4
  export type CarouselAPI = NonNullable<NonNullable<EmblaCarouselSvelteType["$$_attributes"]>["on:emblaInit"]> extends (evt: CustomEvent<infer CarouselAPI>) => void ? CarouselAPI : never;
6
5
  type EmblaCarouselConfig = NonNullable<Parameters<typeof emblaCarouselSvelte>[1]>;
@@ -42,12 +42,9 @@
42
42
  // by default, layerchart shows a line intersecting the point when hovering, this hides that
43
43
  "[&_.lc-highlight-line]:stroke-0",
44
44
 
45
- // prevent text from being cut off
46
- "[&_.lc-text-svg]:overflow-visible",
47
-
48
45
  // by default, when you hover a point on a stacked series chart, it will drop the opacity
49
46
  // of the other series, this overrides that
50
- "[&_.lc-area-path]:opacity-100 [&_.lc-highlight-line]:opacity-100 [&_.lc-highlight-point]:opacity-100 [&_.lc-spline-path]:opacity-100 [&_.lc-text]:text-xs",
47
+ "[&_.lc-area-path]:opacity-100 [&_.lc-highlight-line]:opacity-100 [&_.lc-highlight-point]:opacity-100 [&_.lc-spline-path]:opacity-100 [&_.lc-text]:text-xs [&_.lc-text-svg]:overflow-visible",
51
48
 
52
49
  // We don't want the little tick lines between the axis labels and the chart, so we remove
53
50
  // the stroke. The alternative is to manually disable `tickMarks` on the x/y axis of every
@@ -4,4 +4,4 @@
4
4
  let { ref = $bindable(null), open = $bindable(false), ...restProps }: CollapsiblePrimitive.RootProps = $props();
5
5
  </script>
6
6
 
7
- <CollapsiblePrimitive.Root bind:ref data-slot="collapsible" {...restProps} />
7
+ <CollapsiblePrimitive.Root bind:ref bind:open data-slot="collapsible" {...restProps} />
@@ -1,16 +1,4 @@
1
- import { Collapsible as CollapsiblePrimitive } from "bits-ui";
2
- declare const Root: import("svelte").Component<CollapsiblePrimitive.RootProps, {}, "ref" | "open">;
3
- declare const Trigger: import("svelte").Component<CollapsiblePrimitive.TriggerProps, {}, "ref">;
4
- declare const Content: import("svelte").Component<Omit<{
5
- forceMount?: boolean;
6
- }, "child" | "children"> & {
7
- child?: import("svelte").Snippet<[import("bits-ui").CollapsibleContentSnippetProps & {
8
- props: Record<string, unknown>;
9
- }]> | undefined;
10
- children?: import("svelte").Snippet;
11
- style?: import("bits-ui").StyleProperties | string | null | undefined;
12
- ref?: HTMLElement | null | undefined;
13
- } & import("bits-ui").Without<import("bits-ui").BitsPrimitiveDivAttributes, import("bits-ui").CollapsibleContentPropsWithoutHTML> & {
14
- forceMount?: boolean;
15
- }, {}, "ref">;
1
+ import Root from "./collapsible.svelte";
2
+ import Trigger from "./collapsible-trigger.svelte";
3
+ import Content from "./collapsible-content.svelte";
16
4
  export { Root, Content, Trigger, Root as Collapsible, Content as CollapsibleContent, Trigger as CollapsibleTrigger, };
@@ -1,7 +1,6 @@
1
- import { Collapsible as CollapsiblePrimitive } from "bits-ui";
2
- const Root = CollapsiblePrimitive.Root;
3
- const Trigger = CollapsiblePrimitive.Trigger;
4
- const Content = CollapsiblePrimitive.Content;
1
+ import Root from "./collapsible.svelte";
2
+ import Trigger from "./collapsible-trigger.svelte";
3
+ import Content from "./collapsible-content.svelte";
5
4
  export { Root, Content, Trigger,
6
5
  //
7
6
  Root as Collapsible, Content as CollapsibleContent, Trigger as CollapsibleTrigger, };
@@ -10,10 +10,12 @@
10
10
  class: className,
11
11
  portalProps,
12
12
  children,
13
+ showCloseButton = true,
13
14
  ...restProps
14
15
  }: WithoutChildrenOrChild<DialogPrimitive.ContentProps> & {
15
16
  portalProps?: DialogPrimitive.PortalProps;
16
17
  children: Snippet;
18
+ showCloseButton?: boolean;
17
19
  } = $props();
18
20
  </script>
19
21
 
@@ -29,11 +31,13 @@
29
31
  {...restProps}
30
32
  >
31
33
  {@render children?.()}
32
- <DialogPrimitive.Close
33
- class="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
34
- >
35
- <XIcon />
36
- <span class="sr-only">Close</span>
37
- </DialogPrimitive.Close>
34
+ {#if showCloseButton}
35
+ <DialogPrimitive.Close
36
+ class="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
37
+ >
38
+ <XIcon />
39
+ <span class="sr-only">Close</span>
40
+ </DialogPrimitive.Close>
41
+ {/if}
38
42
  </DialogPrimitive.Content>
39
43
  </Dialog.Portal>
@@ -4,6 +4,7 @@ import { type WithoutChildrenOrChild } from "../../../utils.js";
4
4
  type $$ComponentProps = WithoutChildrenOrChild<DialogPrimitive.ContentProps> & {
5
5
  portalProps?: DialogPrimitive.PortalProps;
6
6
  children: Snippet;
7
+ showCloseButton?: boolean;
7
8
  };
8
9
  declare const DialogContent: import("svelte").Component<$$ComponentProps, {}, "ref">;
9
10
  type DialogContent = ReturnType<typeof DialogContent>;
@@ -20,7 +20,7 @@
20
20
  bind:ref
21
21
  data-slot="drawer-content"
22
22
  class={cn(
23
- "group/drawer-content bg-background fixed z-50 flex h-auto flex-col gap-4 p-4",
23
+ "group/drawer-content bg-background fixed z-50 flex h-auto flex-col",
24
24
  "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b",
25
25
  "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t",
26
26
  "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm",
@@ -10,6 +10,6 @@
10
10
  }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
11
11
  </script>
12
12
 
13
- <div bind:this={ref} data-slot="drawer-footer" class={cn("mt-auto flex flex-col gap-2", className)} {...restProps}>
13
+ <div bind:this={ref} data-slot="drawer-footer" class={cn("mt-auto flex flex-col gap-2 p-4", className)} {...restProps}>
14
14
  {@render children?.()}
15
15
  </div>
@@ -10,6 +10,6 @@
10
10
  }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
11
11
  </script>
12
12
 
13
- <div bind:this={ref} data-slot="drawer-header" class={cn("flex flex-col gap-1.5", className)} {...restProps}>
13
+ <div bind:this={ref} data-slot="drawer-header" class={cn("flex flex-col gap-1.5 p-4", className)} {...restProps}>
14
14
  {@render children?.()}
15
15
  </div>
@@ -23,7 +23,7 @@
23
23
  bind:this={ref}
24
24
  data-slot="input"
25
25
  class={cn(
26
- "selection:bg-primary dark:bg-input/30 selection:text-primary-foreground border-input ring-offset-background placeholder:text-muted-foreground flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-2 text-sm font-medium shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
26
+ "selection:bg-primary dark:bg-input/30 selection:text-primary-foreground border-input ring-offset-background placeholder:text-muted-foreground flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 pt-1.5 text-sm font-medium shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
27
27
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
28
28
  "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
29
29
  className
@@ -7,7 +7,7 @@
7
7
  ref = $bindable(null),
8
8
  class: className,
9
9
  size = "icon",
10
- isActive = false,
10
+ isActive,
11
11
  page,
12
12
  children,
13
13
  ...restProps
@@ -22,7 +22,7 @@
22
22
  {#snippet children({ checked })}
23
23
  <div data-slot="radio-group-indicator" class="relative flex items-center justify-center">
24
24
  {#if checked}
25
- <CircleIcon class="fill-primary text-primary-foreground size-2.5" />
25
+ <CircleIcon class="fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" />
26
26
  {/if}
27
27
  </div>
28
28
  {/snippet}
@@ -10,6 +10,11 @@ import Heading from "./range-calendar-heading.svelte";
10
10
  import HeadCell from "./range-calendar-head-cell.svelte";
11
11
  import NextButton from "./range-calendar-next-button.svelte";
12
12
  import PrevButton from "./range-calendar-prev-button.svelte";
13
+ import MonthSelect from "./range-calendar-month-select.svelte";
14
+ import YearSelect from "./range-calendar-year-select.svelte";
15
+ import Caption from "./range-calendar-caption.svelte";
16
+ import Nav from "./range-calendar-nav.svelte";
17
+ import Month from "./range-calendar-month.svelte";
13
18
  declare const GridHead: import("svelte").Component<RangeCalendarPrimitive.GridHeadProps, {}, "ref">;
14
19
  declare const GridBody: import("svelte").Component<RangeCalendarPrimitive.GridBodyProps, {}, "ref">;
15
- export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton, Root as RangeCalendar, };
20
+ export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton, MonthSelect, YearSelect, Caption, Nav, Month, Root as RangeCalendar, };
@@ -10,8 +10,13 @@ import Heading from "./range-calendar-heading.svelte";
10
10
  import HeadCell from "./range-calendar-head-cell.svelte";
11
11
  import NextButton from "./range-calendar-next-button.svelte";
12
12
  import PrevButton from "./range-calendar-prev-button.svelte";
13
+ import MonthSelect from "./range-calendar-month-select.svelte";
14
+ import YearSelect from "./range-calendar-year-select.svelte";
15
+ import Caption from "./range-calendar-caption.svelte";
16
+ import Nav from "./range-calendar-nav.svelte";
17
+ import Month from "./range-calendar-month.svelte";
13
18
  const GridHead = RangeCalendarPrimitive.GridHead;
14
19
  const GridBody = RangeCalendarPrimitive.GridBody;
15
- export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton,
20
+ export { Day, Cell, Grid, Header, Months, GridRow, Heading, GridBody, GridHead, HeadCell, NextButton, PrevButton, MonthSelect, YearSelect, Caption, Nav, Month,
16
21
  //
17
22
  Root as RangeCalendar, };
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from "svelte";
3
+ import type RangeCalendar from "./range-calendar.svelte";
4
+ import RangeCalendarMonthSelect from "./range-calendar-month-select.svelte";
5
+ import RangeCalendarYearSelect from "./range-calendar-year-select.svelte";
6
+ import { DateFormatter, getLocalTimeZone, type DateValue } from "@internationalized/date";
7
+
8
+ let {
9
+ captionLayout,
10
+ months,
11
+ monthFormat,
12
+ years,
13
+ yearFormat,
14
+ month,
15
+ locale,
16
+ placeholder = $bindable(),
17
+ monthIndex = 0,
18
+ }: {
19
+ captionLayout: ComponentProps<typeof RangeCalendar>["captionLayout"];
20
+ months: ComponentProps<typeof RangeCalendarMonthSelect>["months"];
21
+ monthFormat: ComponentProps<typeof RangeCalendarMonthSelect>["monthFormat"];
22
+ years: ComponentProps<typeof RangeCalendarYearSelect>["years"];
23
+ yearFormat: ComponentProps<typeof RangeCalendarYearSelect>["yearFormat"];
24
+ month: DateValue;
25
+ placeholder: DateValue | undefined;
26
+ locale: string;
27
+ monthIndex: number;
28
+ } = $props();
29
+
30
+ function formatYear(date: DateValue) {
31
+ const dateObj = date.toDate(getLocalTimeZone());
32
+ if (typeof yearFormat === "function") return yearFormat(dateObj.getFullYear());
33
+ return new DateFormatter(locale, { year: yearFormat }).format(dateObj);
34
+ }
35
+
36
+ function formatMonth(date: DateValue) {
37
+ const dateObj = date.toDate(getLocalTimeZone());
38
+ if (typeof monthFormat === "function") return monthFormat(dateObj.getMonth() + 1);
39
+ return new DateFormatter(locale, { month: monthFormat }).format(dateObj);
40
+ }
41
+ </script>
42
+
43
+ {#snippet MonthSelect()}
44
+ <RangeCalendarMonthSelect
45
+ {months}
46
+ {monthFormat}
47
+ value={month.month}
48
+ onchange={(e) => {
49
+ if (!placeholder) return;
50
+ const v = Number.parseInt(e.currentTarget.value);
51
+ const newPlaceholder = placeholder.set({ month: v });
52
+ placeholder = newPlaceholder.subtract({ months: monthIndex });
53
+ }}
54
+ />
55
+ {/snippet}
56
+
57
+ {#snippet YearSelect()}
58
+ <RangeCalendarYearSelect {years} {yearFormat} value={month.year} />
59
+ {/snippet}
60
+
61
+ {#if captionLayout === "dropdown"}
62
+ {@render MonthSelect()}
63
+ {@render YearSelect()}
64
+ {:else if captionLayout === "dropdown-months"}
65
+ {@render MonthSelect()}
66
+ {#if placeholder}
67
+ {formatYear(placeholder)}
68
+ {/if}
69
+ {:else if captionLayout === "dropdown-years"}
70
+ {#if placeholder}
71
+ {formatMonth(placeholder)}
72
+ {/if}
73
+ {@render YearSelect()}
74
+ {:else}
75
+ {formatMonth(month)} {formatYear(month)}
76
+ {/if}
@@ -0,0 +1,19 @@
1
+ import type { ComponentProps } from "svelte";
2
+ import type RangeCalendar from "./range-calendar.svelte";
3
+ import RangeCalendarMonthSelect from "./range-calendar-month-select.svelte";
4
+ import RangeCalendarYearSelect from "./range-calendar-year-select.svelte";
5
+ import { type DateValue } from "@internationalized/date";
6
+ type $$ComponentProps = {
7
+ captionLayout: ComponentProps<typeof RangeCalendar>["captionLayout"];
8
+ months: ComponentProps<typeof RangeCalendarMonthSelect>["months"];
9
+ monthFormat: ComponentProps<typeof RangeCalendarMonthSelect>["monthFormat"];
10
+ years: ComponentProps<typeof RangeCalendarYearSelect>["years"];
11
+ yearFormat: ComponentProps<typeof RangeCalendarYearSelect>["yearFormat"];
12
+ month: DateValue;
13
+ placeholder: DateValue | undefined;
14
+ locale: string;
15
+ monthIndex: number;
16
+ };
17
+ declare const RangeCalendarCaption: import("svelte").Component<$$ComponentProps, {}, "placeholder">;
18
+ type RangeCalendarCaption = ReturnType<typeof RangeCalendarCaption>;
19
+ export default RangeCalendarCaption;
@@ -8,7 +8,7 @@
8
8
  <RangeCalendarPrimitive.Cell
9
9
  bind:ref
10
10
  class={cn(
11
- "[&:has([data-selected])]:bg-accent [&:has([data-selected][data-outside-month])]:bg-accent/50 relative size-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 data-highlighted:rounded-r-md first:[&:has([data-selected])]:rounded-l-md last:[&:has([data-selected])]:rounded-r-md [&:has([data-selected][data-selection-end])]:rounded-r-md [&:has([data-selected][data-selection-start])]:rounded-l-md",
11
+ "dark:[&:has([data-range-start])]:hover:bg-accent dark:[&:has([data-range-end])]:hover:bg-accent [&:has([data-range-middle])]:bg-accent dark:[&:has([data-range-middle])]:hover:bg-accent/50 [&:has([data-selected])]:bg-accent relative size-(--cell-size) p-0 text-center text-sm focus-within:z-20 data-[range-middle]:rounded-r-md [&:first-child[data-selected]_[data-bits-day]]:rounded-l-md [&:has([data-range-end])]:rounded-r-md [&:has([data-range-middle])]:rounded-none first:[&:has([data-range-middle])]:rounded-l-md last:[&:has([data-range-middle])]:rounded-r-md [&:has([data-range-start])]:rounded-l-md [&:last-child[data-selected]_[data-bits-day]]:rounded-r-md",
12
12
  className
13
13
  )}
14
14
  {...restProps}
@@ -10,18 +10,25 @@
10
10
  bind:ref
11
11
  class={cn(
12
12
  buttonVariants({ variant: "ghost" }),
13
- "size-8 p-0 font-normal select-none data-[selected]:opacity-100",
14
- "[&[data-today]:not([data-selected])]:bg-accent [&[data-today]:not([data-selected])]:text-accent-foreground",
15
- // Selection Start
16
- "data-[selection-start]:bg-primary data-[selection-start]:text-primary-foreground data-[selection-start]:hover:bg-primary data-[selection-start]:hover:text-primary-foreground data-[selection-start]:focus:bg-primary data-[selection-start]:focus:text-primary-foreground dark:data-[selection-start]:hover:bg-primary dark:data-[selection-start]:focus:bg-primary",
17
- // Selection End
18
- "data-[selection-end]:bg-primary data-[selection-end]:text-primary-foreground data-[selection-end]:hover:bg-primary data-[selection-end]:hover:text-primary-foreground data-[selection-end]:focus:bg-primary data-[selection-end]:focus:text-primary-foreground dark:data-[selection-end]:hover:bg-primary dark:data-[selection-end]:focus:bg-primary",
13
+ "flex size-(--cell-size) flex-col items-center justify-center gap-1 p-0 leading-none font-normal whitespace-nowrap select-none",
14
+ "[&[data-today]:not([data-selected])]:bg-accent [&[data-today]:not([data-selected])]:text-accent-foreground [&[data-today][data-disabled]]:text-muted-foreground data-[range-middle]:rounded-none",
15
+ // range Start
16
+ "data-[range-start]:bg-primary dark:data-[range-start]:hover:bg-accent data-[range-start]:text-primary-foreground",
17
+ // range End
18
+ "data-[range-end]:bg-primary dark:data-[range-end]:hover:bg-accent data-[range-end]:text-primary-foreground",
19
19
  // Outside months
20
- "data-[outside-month]:text-muted-foreground [&[data-outside-month][data-selected]]:bg-accent/50 [&[data-outside-month][data-selected]]:text-muted-foreground data-[outside-month]:pointer-events-none data-[outside-month]:opacity-50 [&[data-outside-month][data-selected]]:opacity-30",
20
+ "[&[data-outside-month]:not([data-selected])]:text-muted-foreground [&[data-outside-month]:not([data-selected])]:hover:text-accent-foreground",
21
21
  // Disabled
22
- "data-[disabled]:text-muted-foreground data-[disabled]:opacity-50",
22
+ "data-[disabled]:text-muted-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
23
23
  // Unavailable
24
- "data-[unavailable]:text-destructive-foreground data-[unavailable]:line-through",
24
+ "data-[unavailable]:line-through",
25
+ "dark:data-[range-middle]:hover:bg-accent/0",
26
+ // hover
27
+ "dark:hover:text-accent-foreground",
28
+ // focus
29
+ "focus:border-ring focus:ring-ring/50 focus:relative",
30
+ // inner spans
31
+ "[&>span]:text-xs [&>span]:opacity-70",
25
32
  className
26
33
  )}
27
34
  {...restProps}
@@ -5,4 +5,8 @@
5
5
  let { ref = $bindable(null), class: className, ...restProps }: RangeCalendarPrimitive.GridProps = $props();
6
6
  </script>
7
7
 
8
- <RangeCalendarPrimitive.Grid bind:ref class={cn("w-full border-collapse space-y-1", className)} {...restProps} />
8
+ <RangeCalendarPrimitive.Grid
9
+ bind:ref
10
+ class={cn("mt-4 flex w-full border-collapse flex-col gap-1", className)}
11
+ {...restProps}
12
+ />
@@ -7,6 +7,6 @@
7
7
 
8
8
  <RangeCalendarPrimitive.HeadCell
9
9
  bind:ref
10
- class={cn("text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal", className)}
10
+ class={cn("text-muted-foreground w-(--cell-size) rounded-md text-[0.8rem] font-normal", className)}
11
11
  {...restProps}
12
12
  />