@svelte-atoms/core 1.0.0-alpha.27 → 1.0.0-alpha.28

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 (163) hide show
  1. package/README.md +856 -645
  2. package/dist/components/accordion/accordion-root.svelte +61 -61
  3. package/dist/components/accordion/item/accordion-item-body.svelte +42 -42
  4. package/dist/components/accordion/item/accordion-item-header.svelte +50 -50
  5. package/dist/components/accordion/item/accordion-item-indicator.svelte +50 -50
  6. package/dist/components/accordion/item/accordion-item-root.svelte +65 -65
  7. package/dist/components/alert/alert-actions.svelte +2 -1
  8. package/dist/components/alert/alert-close-button.svelte +18 -20
  9. package/dist/components/alert/alert-content.svelte +2 -1
  10. package/dist/components/alert/alert-description.svelte +2 -1
  11. package/dist/components/alert/alert-icon.svelte +2 -1
  12. package/dist/components/alert/alert-root.svelte +3 -2
  13. package/dist/components/alert/alert-title.svelte +2 -1
  14. package/dist/components/alert/alert.stories.svelte +401 -40
  15. package/dist/components/alert/alert.stories.svelte.d.ts +2 -5
  16. package/dist/components/atom/html-atom.svelte +205 -201
  17. package/dist/components/atom/snippet-renderer.svelte +5 -0
  18. package/dist/components/atom/snippet-renderer.svelte.d.ts +5 -0
  19. package/dist/components/avatar/avatar.stories.svelte.d.ts +1 -1
  20. package/dist/components/badge/badge.stories.svelte.d.ts +1 -1
  21. package/dist/components/breadcrumb/breadcrumb.stories.svelte.d.ts +1 -1
  22. package/dist/components/button/button.stories.svelte +60 -57
  23. package/dist/components/calendar/atoms.d.ts +5 -0
  24. package/dist/components/calendar/atoms.js +5 -0
  25. package/dist/components/calendar/bond.svelte.d.ts +72 -0
  26. package/dist/components/calendar/bond.svelte.js +132 -0
  27. package/dist/components/calendar/calendar-body.svelte +107 -0
  28. package/dist/components/calendar/calendar-body.svelte.d.ts +8 -0
  29. package/dist/components/calendar/calendar-day.svelte +97 -0
  30. package/dist/components/calendar/calendar-day.svelte.d.ts +4 -0
  31. package/dist/components/calendar/calendar-header.svelte +33 -0
  32. package/dist/components/calendar/calendar-header.svelte.d.ts +7 -0
  33. package/dist/components/calendar/calendar-root.svelte +208 -0
  34. package/dist/components/calendar/calendar-root.svelte.d.ts +8 -0
  35. package/dist/components/calendar/calendar-week-day.svelte +34 -0
  36. package/dist/components/calendar/calendar-week-day.svelte.d.ts +9 -0
  37. package/dist/components/calendar/calendar.css +26 -0
  38. package/dist/components/calendar/calendar.stories.svelte +36 -0
  39. package/dist/components/calendar/calendar.stories.svelte.d.ts +6 -0
  40. package/dist/components/calendar/index.d.ts +4 -0
  41. package/dist/components/calendar/index.js +4 -0
  42. package/dist/components/calendar/runes.svelte.d.ts +3 -0
  43. package/dist/components/calendar/runes.svelte.js +25 -0
  44. package/dist/components/calendar/types.d.ts +62 -0
  45. package/dist/components/calendar/types.js +1 -0
  46. package/dist/components/card/card-body.svelte +39 -39
  47. package/dist/components/card/card-description.svelte +41 -41
  48. package/dist/components/card/card-footer.svelte +41 -41
  49. package/dist/components/card/card-header.svelte +41 -41
  50. package/dist/components/card/card-media.svelte +41 -41
  51. package/dist/components/card/card-root.svelte +91 -91
  52. package/dist/components/card/card-subtitle.svelte +41 -41
  53. package/dist/components/card/card-title.svelte +45 -45
  54. package/dist/components/collapsible/collapsible-body.svelte +39 -39
  55. package/dist/components/collapsible/collapsible-header.svelte +39 -39
  56. package/dist/components/collapsible/collapsible-indicator.svelte +50 -50
  57. package/dist/components/collapsible/collapsible-root.svelte +66 -66
  58. package/dist/components/combobox/combobox-root.svelte +65 -65
  59. package/dist/components/container/container.stories.svelte.d.ts +1 -1
  60. package/dist/components/contextmenu/contextmenu-trigger.svelte.d.ts +1 -1
  61. package/dist/components/datagrid/bond.svelte.d.ts +2 -2
  62. package/dist/components/datagrid/datagrid-body.svelte +37 -37
  63. package/dist/components/datagrid/datagrid-checkbox.svelte +101 -101
  64. package/dist/components/datagrid/datagrid-footer.svelte +34 -34
  65. package/dist/components/datagrid/datagrid-header.svelte +49 -49
  66. package/dist/components/datagrid/datagrid-root.svelte +59 -59
  67. package/dist/components/datagrid/td/datagrid-td.svelte +66 -66
  68. package/dist/components/datagrid/th/datagrid-th.svelte +106 -106
  69. package/dist/components/datagrid/tr/datagrid-tr.svelte +88 -88
  70. package/dist/components/date-picker/atoms.d.ts +7 -0
  71. package/dist/components/date-picker/atoms.js +7 -0
  72. package/dist/components/date-picker/bond.svelte.d.ts +67 -0
  73. package/dist/components/date-picker/bond.svelte.js +174 -0
  74. package/dist/components/date-picker/date-picker-calendar.svelte +42 -0
  75. package/dist/components/date-picker/date-picker-calendar.svelte.d.ts +7 -0
  76. package/dist/components/date-picker/date-picker-header.svelte +105 -0
  77. package/dist/components/date-picker/date-picker-header.svelte.d.ts +7 -0
  78. package/dist/components/date-picker/date-picker-months.svelte +150 -0
  79. package/dist/components/date-picker/date-picker-months.svelte.d.ts +7 -0
  80. package/dist/components/date-picker/date-picker-root.svelte +94 -0
  81. package/dist/components/date-picker/date-picker-root.svelte.d.ts +17 -0
  82. package/dist/components/date-picker/date-picker-years.svelte +214 -0
  83. package/dist/components/date-picker/date-picker-years.svelte.d.ts +7 -0
  84. package/dist/components/date-picker/date-picker.stories.svelte +51 -0
  85. package/dist/components/date-picker/date-picker.stories.svelte.d.ts +3 -0
  86. package/dist/components/date-picker/index.d.ts +3 -0
  87. package/dist/components/date-picker/index.js +3 -0
  88. package/dist/components/date-picker/types.d.ts +1 -0
  89. package/dist/components/date-picker/types.js +1 -0
  90. package/dist/components/dialog/dialog-body.svelte +39 -39
  91. package/dist/components/dialog/dialog-close-button.svelte +58 -58
  92. package/dist/components/dialog/dialog-content.svelte +62 -62
  93. package/dist/components/dialog/dialog-description.svelte +40 -40
  94. package/dist/components/dialog/dialog-footer.svelte +39 -39
  95. package/dist/components/dialog/dialog-header.svelte +39 -39
  96. package/dist/components/dialog/dialog-root.svelte +110 -110
  97. package/dist/components/dialog/dialog-title.svelte +41 -41
  98. package/dist/components/drawer/drawer-backdrop.svelte +38 -38
  99. package/dist/components/drawer/drawer-body.svelte +42 -42
  100. package/dist/components/drawer/drawer-content.svelte +42 -42
  101. package/dist/components/drawer/drawer-description.svelte +44 -44
  102. package/dist/components/drawer/drawer-footer.svelte +41 -41
  103. package/dist/components/drawer/drawer-header.svelte +43 -43
  104. package/dist/components/drawer/drawer-root.svelte +93 -93
  105. package/dist/components/drawer/drawer-title.svelte +44 -44
  106. package/dist/components/dropdown/dropdown-query.svelte +54 -54
  107. package/dist/components/dropdown/dropdown-root.svelte +59 -59
  108. package/dist/components/dropdown/dropdown-trigger.svelte +41 -41
  109. package/dist/components/dropdown/dropdown-value.svelte +60 -60
  110. package/dist/components/element/html-element.svelte +85 -85
  111. package/dist/components/form/bond.svelte.d.ts +1 -1
  112. package/dist/components/form/field/field-control.svelte +48 -48
  113. package/dist/components/form/field/field-label.svelte +24 -24
  114. package/dist/components/form/field/field-root.svelte +59 -59
  115. package/dist/components/icon/icon.svelte +44 -44
  116. package/dist/components/image/image.stories.svelte.d.ts +1 -1
  117. package/dist/components/index.d.ts +3 -0
  118. package/dist/components/index.js +3 -0
  119. package/dist/components/input/input-control.svelte +103 -103
  120. package/dist/components/label/label.svelte +25 -25
  121. package/dist/components/popover/popover-arrow.svelte +111 -111
  122. package/dist/components/popover/popover-content.svelte +46 -7
  123. package/dist/components/popover/popover-root.svelte +48 -49
  124. package/dist/components/popover/popover.stories.svelte +52 -67
  125. package/dist/components/portal/portal-root.svelte +83 -83
  126. package/dist/components/portal/teleport.svelte +50 -50
  127. package/dist/components/qr-code/index.d.ts +1 -0
  128. package/dist/components/qr-code/index.js +1 -0
  129. package/dist/components/qr-code/qr-code.stories.svelte +24 -0
  130. package/dist/components/qr-code/qr-code.stories.svelte.d.ts +26 -0
  131. package/dist/components/qr-code/qr-code.svelte +25 -0
  132. package/dist/components/qr-code/qr-code.svelte.d.ts +6 -0
  133. package/dist/components/radio/radio.svelte +109 -109
  134. package/dist/components/radio/types.svelte.d.ts +1 -1
  135. package/dist/components/scrollable/scrollable-container.svelte +82 -82
  136. package/dist/components/scrollable/scrollable-content.svelte +41 -41
  137. package/dist/components/scrollable/scrollable-root.svelte +100 -100
  138. package/dist/components/scrollable/scrollable-thumb.svelte +75 -75
  139. package/dist/components/scrollable/scrollable-track.svelte +59 -59
  140. package/dist/components/scrollable/scrollable.stories.svelte.d.ts +1 -1
  141. package/dist/components/tabs/tab/tab-body.svelte +52 -52
  142. package/dist/components/tabs/tab/tab-description.svelte +41 -41
  143. package/dist/components/tabs/tab/tab-header.svelte +71 -71
  144. package/dist/components/tabs/tab/tab-root.svelte +86 -86
  145. package/dist/components/toast/toast-description.svelte +38 -38
  146. package/dist/components/toast/toast-root.svelte +61 -61
  147. package/dist/components/toast/toast-title.svelte +35 -35
  148. package/dist/components/tree/tree-body.svelte +39 -39
  149. package/dist/components/tree/tree-header.svelte +54 -54
  150. package/dist/components/tree/tree-indicator.svelte +40 -40
  151. package/dist/components/tree/tree-root.svelte +65 -65
  152. package/dist/components/virtual/virtual-root.svelte +239 -239
  153. package/dist/context/preset.svelte.d.ts +1 -1
  154. package/dist/icons/icon-arrow-down.svelte.d.ts +1 -1
  155. package/dist/icons/icon-checkmark.svelte.d.ts +1 -1
  156. package/dist/icons/icon-close.svelte.d.ts +1 -1
  157. package/dist/icons/icon-more-vert.svelte.d.ts +1 -1
  158. package/dist/runes/container.svelte.d.ts +2 -2
  159. package/dist/shared/bond.svelte.d.ts +1 -1
  160. package/dist/utils/state.d.ts +1 -1
  161. package/dist/utils/state.js +2 -1
  162. package/llm/variants.md +1261 -712
  163. package/package.json +464 -437
@@ -0,0 +1,132 @@
1
+ import { Bond, BondState } from '../../shared/bond.svelte';
2
+ import { getContext, setContext } from 'svelte';
3
+ import { createAttachmentKey } from 'svelte/attachments';
4
+ export class CalendarBond extends Bond {
5
+ static CONTEXT_KEY = '@atoms/context/calendar';
6
+ constructor(s) {
7
+ super(s);
8
+ }
9
+ share() {
10
+ return CalendarBond.set(this);
11
+ }
12
+ root() {
13
+ return {
14
+ id: `calendar-root-${this.id}`,
15
+ 'aria-label': 'Calendar',
16
+ 'aria-disabled': this.state.props.disabled ?? false,
17
+ role: 'application',
18
+ [createAttachmentKey()]: (node) => {
19
+ this.elements.root = node;
20
+ }
21
+ };
22
+ }
23
+ body() {
24
+ return {
25
+ id: `calendar-month-${this.id}`,
26
+ role: 'grid',
27
+ 'aria-labelledby': `calendar-month-label-${this.id}`,
28
+ [createAttachmentKey()]: (node) => {
29
+ this.elements.body = node;
30
+ }
31
+ };
32
+ }
33
+ day(day) {
34
+ return {
35
+ id: `calendar-day-${this.id}-${day.id}`,
36
+ role: 'gridcell',
37
+ 'aria-selected': this.state.isDaySelected(day),
38
+ 'aria-disabled': day.disabled,
39
+ tabindex: day.disabled ? -1 : 0
40
+ };
41
+ }
42
+ weekDay() {
43
+ return {
44
+ id: `calendar-weekday-${this.id}`,
45
+ role: 'columnheader'
46
+ };
47
+ }
48
+ header() {
49
+ return {
50
+ id: `calendar-weekdays-${this.id}`,
51
+ role: 'row',
52
+ [createAttachmentKey()]: (node) => {
53
+ this.elements.header = node;
54
+ }
55
+ };
56
+ }
57
+ static get() {
58
+ return getContext(this.CONTEXT_KEY);
59
+ }
60
+ static set(bond) {
61
+ return setContext(this.CONTEXT_KEY, bond);
62
+ }
63
+ }
64
+ export class CalendarBondState extends BondState {
65
+ constructor(props) {
66
+ super(props);
67
+ }
68
+ selectDate(date) {
69
+ // if (this.props.range) {
70
+ // } else {
71
+ // this.props.value = date;
72
+ // }
73
+ if (!this.props.start) {
74
+ this.props.range[0] = date;
75
+ }
76
+ else if (!this.props.end) {
77
+ this.props.range[1] = date;
78
+ }
79
+ else {
80
+ this.props.range[0] = date;
81
+ this.props.range[1] = undefined;
82
+ }
83
+ this.props.range = [...this.props.range];
84
+ }
85
+ selectStart(date) {
86
+ this.props.range[0] = date;
87
+ this.props.range = [...this.props.range];
88
+ }
89
+ selectEnd(date) {
90
+ this.props.range[1] = date;
91
+ this.props.range = [...this.props.range];
92
+ }
93
+ unselect() {
94
+ this.props.range = [undefined, undefined];
95
+ this.props.range = [...this.props.range];
96
+ }
97
+ unselectStart() {
98
+ this.props.range[0] = undefined;
99
+ this.props.range = [...this.props.range];
100
+ }
101
+ unselectEnd() {
102
+ this.props.range[1] = undefined;
103
+ this.props.range = [...this.props.range];
104
+ }
105
+ nextMonth() {
106
+ if (this.props.pivote) {
107
+ const current = this.props.pivote;
108
+ this.props.pivote = new Date(current.getFullYear(), current.getMonth() + 1, 1);
109
+ }
110
+ }
111
+ previousMonth() {
112
+ if (this.props.pivote) {
113
+ const current = this.props.pivote;
114
+ this.props.pivote = new Date(current.getFullYear(), current.getMonth() - 1, 1);
115
+ }
116
+ }
117
+ isDaySelected(day) {
118
+ if (this.props.range) {
119
+ const start = this.props.range[0];
120
+ const end = this.props.range[1];
121
+ if (!start)
122
+ return false;
123
+ const dayTime = day.date.getTime();
124
+ const startTime = start.getTime();
125
+ if (!end)
126
+ return dayTime === startTime;
127
+ const endTime = end.getTime();
128
+ return dayTime >= startTime && dayTime <= endTime;
129
+ }
130
+ return this.props.value?.getTime() === day.date.getTime();
131
+ }
132
+ }
@@ -0,0 +1,107 @@
1
+ <script lang="ts">
2
+ import { backInOut } from 'svelte/easing';
3
+ import CalendarDay from './calendar-day.svelte';
4
+ import { CalendarBond } from './bond.svelte';
5
+ import { cn } from '../../utils';
6
+ import { HtmlAtom } from '../atom';
7
+
8
+ const calendarBond = CalendarBond.get();
9
+
10
+ const currentMonth = $derived(calendarBond?.state.props.currentMonth);
11
+
12
+ let {
13
+ class: klass = '',
14
+ weekday,
15
+ preset = 'calendar.body',
16
+ children = undefined,
17
+ ...restProps
18
+ } = $props();
19
+
20
+ const bodyProps = $derived({
21
+ ...calendarBond?.body(),
22
+ ...restProps
23
+ });
24
+
25
+ // const generator = function (pivot: Date, start: Date, end?: Date) {
26
+ // const firstDay = new Date(pivot.getFullYear(), pivot.getMonth(), 1).getDay();
27
+ // const lastMonthDaysCount = monthDays(pivot.getMonth() - 1, pivot.getFullYear());
28
+ // const sample = new Date(
29
+ // pivot.getFullYear(),
30
+ // pivot.getMonth() - 1,
31
+ // lastMonthDaysCount - firstDay
32
+ // );
33
+
34
+ // const array = [];
35
+ // let next = false,
36
+ // prec = false;
37
+
38
+ // for (let index = 0; index < 42; index++) {
39
+ // sample.setDate(sample.getDate() + 1);
40
+
41
+ // prec = pivot.getMonth() > sample.getMonth() || pivot.getFullYear() > sample.getFullYear();
42
+ // next =
43
+ // (pivot.getMonth() < sample.getMonth() && pivot.getFullYear() === sample.getFullYear()) ||
44
+ // (pivot.getMonth() > sample.getMonth() && pivot.getFullYear() < sample.getFullYear());
45
+
46
+ // array.push({
47
+ // id: sample.getTime(),
48
+ // date: sample.getDate(),
49
+ // offmonth: next || prec,
50
+ // next,
51
+ // prec,
52
+ // today: isToday(sample),
53
+ // week: Math.floor(index / 7),
54
+ // month: sample.getMonth(),
55
+ // disabled: false,
56
+ // weekend: sample.getDay() == 0,
57
+ // name: format(sample, 'iiiii'),
58
+ // selected: start?.getTime() === sample.getTime()
59
+ // });
60
+ // }
61
+
62
+ // return array;
63
+ // };
64
+
65
+ // const days = $derived(
66
+ // generator(
67
+ // context_calendar.derived.data.pivote,
68
+ // context_calendar.derived.data.start ?? new Date(),
69
+ // context_calendar.derived.data.end
70
+ // )
71
+ // );
72
+
73
+ function monthDays(month: number, year = 2020) {
74
+ return new Date(year, month + 1, 0).getDate();
75
+ }
76
+
77
+ function scle(node: HTMLElement, { delay = 0, duration = 400, easing = backInOut }) {
78
+ return {
79
+ delay,
80
+ duration,
81
+ easing,
82
+ css: (_, u) => {
83
+ return `transform: scale(${u})`;
84
+ }
85
+ };
86
+ }
87
+ </script>
88
+
89
+ <HtmlAtom
90
+ class={cn('col-span-full grid h-full w-full grid-cols-subgrid', klass)}
91
+ {preset}
92
+ {...bodyProps}
93
+ >
94
+ {#each currentMonth?.days ?? [] as day (day.id)}
95
+ {#if children}
96
+ {@render children?.({ day })}
97
+ {:else}
98
+ <CalendarDay
99
+ {day}
100
+ onclick={() => {
101
+ console.log('day clicked', day.date);
102
+ calendarBond?.state.selectStart(new Date(day.date));
103
+ }}
104
+ />
105
+ {/if}
106
+ {/each}
107
+ </HtmlAtom>
@@ -0,0 +1,8 @@
1
+ declare const CalendarBody: import("svelte").Component<{
2
+ class?: string;
3
+ weekday: any;
4
+ preset?: string;
5
+ children?: any;
6
+ } & Record<string, any>, {}, "">;
7
+ type CalendarBody = ReturnType<typeof CalendarBody>;
8
+ export default CalendarBody;
@@ -0,0 +1,97 @@
1
+ <script lang="ts">
2
+ import { isBefore, isSameDay, isWithinInterval } from 'date-fns';
3
+ import { cn } from '../../utils';
4
+ import { CalendarBond } from './bond.svelte';
5
+ import type { CalendarDayProps } from './types';
6
+ import { HtmlAtom } from '../atom';
7
+
8
+ const calendarBond = CalendarBond.get();
9
+
10
+ const selectedDateStart = $derived(calendarBond?.state.props.start);
11
+ const selectedDateEnd = $derived(calendarBond?.state.props.end);
12
+ const isRange = $derived(Array.isArray(calendarBond?.state.props.type === 'range'));
13
+
14
+ let {
15
+ class: klass = '',
16
+ preset = 'calendar.day',
17
+ day,
18
+ as = 'button',
19
+ children = undefined,
20
+ onclick = handleClick,
21
+ ...restProps
22
+ }: CalendarDayProps = $props();
23
+
24
+ const dayProps = $derived({
25
+ ...calendarBond?.day(day),
26
+ ...restProps
27
+ });
28
+
29
+ const isSelected = $derived.by(() => {
30
+ if (selectedDateEnd && selectedDateStart) {
31
+ return isWithinInterval(day.date, { end: selectedDateEnd, start: selectedDateStart });
32
+ }
33
+
34
+ return selectedDateStart && isSameDay(day.date, selectedDateStart);
35
+ });
36
+
37
+ function handleClick() {
38
+ if (isRange) {
39
+ const start = calendarBond?.state.props.start;
40
+ if (!start) {
41
+ calendarBond?.state.selectStart(new Date(day.date));
42
+ return;
43
+ }
44
+
45
+ if (isBefore(new Date(day.date), new Date(start))) {
46
+ calendarBond?.state.selectStart(new Date(day.date));
47
+ return;
48
+ }
49
+
50
+ calendarBond?.state.selectEnd(new Date(day.date));
51
+ } else {
52
+ calendarBond?.state.selectStart(new Date(day.date));
53
+ }
54
+ }
55
+ </script>
56
+
57
+ <HtmlAtom
58
+ {as}
59
+ {preset}
60
+ class={[
61
+ 'calendar-day text-foreground border-border hover:bg-accent hover:text-accent-foreground h-12 cursor-pointer border-b border-l p-1 transition-colors',
62
+ day.offmonth && 'text-muted-foreground bg-muted/30',
63
+ day.weekend && 'bg-muted/50',
64
+ isSelected &&
65
+ 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground',
66
+ isSelected && day.offmonth && 'bg-primary/70',
67
+ day.today && !isSelected && 'border-primary border-2 font-semibold',
68
+ day.disabled && 'pointer-events-none opacity-50',
69
+ klass
70
+ ]}
71
+ data-disabled={day.disabled}
72
+ data-prec={day.fromPreviousMonth}
73
+ data-next={day.fromNextMonth}
74
+ data-offmonth={day.offmonth}
75
+ data-weekend={day.weekend}
76
+ data-today={day.today}
77
+ data-selected={isSelected}
78
+ {onclick}
79
+ {...dayProps}
80
+ >
81
+ {#if children}
82
+ {@render children({
83
+ calendar: calendarBond!
84
+ })}
85
+ {:else}
86
+ <span class="value">{day.dayOfMonth}</span>
87
+ {/if}
88
+ </HtmlAtom>
89
+
90
+ <style>
91
+ :global(.calendar-day):nth-child(7n + 1) {
92
+ border-left: none;
93
+ }
94
+ :global(.calendar-day):nth-last-child(-n + 7) {
95
+ border-bottom: none;
96
+ }
97
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { CalendarDayProps } from './types';
2
+ declare const CalendarDay: import("svelte").Component<CalendarDayProps, {}, "">;
3
+ type CalendarDay = ReturnType<typeof CalendarDay>;
4
+ export default CalendarDay;
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils';
3
+ import { HtmlAtom } from '../atom';
4
+ import { CalendarBond } from './bond.svelte';
5
+ import CalendarWeekDay from './calendar-week-day.svelte';
6
+
7
+ const calendarBond = CalendarBond.get();
8
+ const currentMonth = $derived(calendarBond?.state.props.currentMonth);
9
+
10
+ let { class: klass = '', preset = 'calendar.header', children, ...restProps } = $props();
11
+
12
+ const headerProps = $derived({
13
+ ...calendarBond?.header(),
14
+ ...restProps
15
+ });
16
+ </script>
17
+
18
+ <HtmlAtom
19
+ {preset}
20
+ class={cn(
21
+ 'calendar-header border-border col-span-full grid h-fit grid-cols-subgrid border-b',
22
+ klass
23
+ )}
24
+ {...headerProps}
25
+ >
26
+ {#each (currentMonth?.days ?? []).filter((d) => d.week == 1) as day}
27
+ {#if children}
28
+ {@render children?.(day)}
29
+ {:else}
30
+ <CalendarWeekDay isWeekend={day.weekend}>{day.name}</CalendarWeekDay>
31
+ {/if}
32
+ {/each}
33
+ </HtmlAtom>
@@ -0,0 +1,7 @@
1
+ declare const CalendarHeader: import("svelte").Component<{
2
+ class?: string;
3
+ preset?: string;
4
+ children: any;
5
+ } & Record<string, any>, {}, "">;
6
+ type CalendarHeader = ReturnType<typeof CalendarHeader>;
7
+ export default CalendarHeader;
@@ -0,0 +1,208 @@
1
+ <script lang="ts">
2
+ import { cn, defineProperty, defineState } from '../../utils';
3
+ import { addMonths, format, isToday, startOfDay, subMonths } from 'date-fns';
4
+ import type { CalendarRange, CalendarRootProps, Day, Month } from './types';
5
+ import { CalendarBond, CalendarBondState, type CalendarBondProps } from './bond.svelte';
6
+ import { HtmlAtom } from '../atom';
7
+
8
+ import './calendar.css';
9
+
10
+ let {
11
+ class: klass = '',
12
+ preset = 'calendar',
13
+ value = $bindable(),
14
+ range = $bindable([undefined, undefined]),
15
+ pivote = $bindable(new Date()),
16
+ start = $bindable(startOfDay(new Date())),
17
+ end = $bindable(),
18
+ min = undefined,
19
+ max = undefined,
20
+ type = 'single',
21
+ extend = {},
22
+ onchange = undefined,
23
+ factory = _factory,
24
+ children = undefined,
25
+ ...restProps
26
+ }: CalendarRootProps = $props();
27
+
28
+ const monthCurrentDays = $derived(generator(pivote));
29
+
30
+ $inspect(min, max, monthCurrentDays);
31
+
32
+ const monthCurrent: Month = $derived.by(() => {
33
+ const start = monthCurrentDays.at(0) as Day;
34
+ const end = monthCurrentDays.at(-1) as Day;
35
+
36
+ return {
37
+ start: start?.date,
38
+ end: end?.date,
39
+ days: monthCurrentDays,
40
+ name: start ? format(start.date, 'MM') : '',
41
+ fullname: start ? format(start.date, 'MMM') : ''
42
+ };
43
+ });
44
+
45
+ const monthPreviousDays = $derived(generator(subMonths(pivote, 1)));
46
+ const monthPrevious: Month = $derived.by(() => {
47
+ const start = monthPreviousDays.at(0) as Day;
48
+ const end = monthPreviousDays.at(-1) as Day;
49
+
50
+ return {
51
+ start: start?.date,
52
+ end: end?.date,
53
+ days: monthPreviousDays,
54
+ name: start ? format(start.date, 'MM') : '',
55
+ fullname: start ? format(start.date, 'MMM') : ''
56
+ };
57
+ });
58
+
59
+ const monthNextDays = $derived(generator(addMonths(pivote, 1)));
60
+
61
+ const monthNext: Month = $derived.by(() => {
62
+ const start = monthNextDays.at(0) as Day;
63
+ const end = monthNextDays.at(-1) as Day;
64
+
65
+ return {
66
+ start: start?.date,
67
+ end: end?.date,
68
+ days: monthNextDays,
69
+ name: start ? format(start.date, 'MM') : '',
70
+ fullname: start ? format(start.date, 'MMM') : ''
71
+ };
72
+ });
73
+
74
+ function generator(pivot: Date): Day[] {
75
+ const firstDay = new Date(pivot.getFullYear(), pivot.getMonth(), 1).getDay();
76
+ const lastMonthDaysCount = monthDays(pivot.getMonth() - 1, pivot.getFullYear());
77
+ const sample = startOfDay(
78
+ new Date(pivot.getFullYear(), pivot.getMonth() - 1, lastMonthDaysCount - firstDay)
79
+ );
80
+
81
+ const array: Day[] = [];
82
+
83
+ for (let index = 0; index < 42; index++) {
84
+ sample.setDate(sample.getDate() + 1);
85
+
86
+ const prec =
87
+ pivot.getMonth() > sample.getMonth() || pivot.getFullYear() > sample.getFullYear();
88
+ const next =
89
+ (pivot.getMonth() < sample.getMonth() && pivot.getFullYear() === sample.getFullYear()) ||
90
+ (pivot.getMonth() > sample.getMonth() && pivot.getFullYear() < sample.getFullYear());
91
+
92
+ const disabled =
93
+ (min ? sample < startOfDay(min) : false) || (max ? sample > startOfDay(max) : false);
94
+
95
+ array.push({
96
+ id: sample.getTime(),
97
+ date: new Date(sample),
98
+ get offmonth() {
99
+ return next || prec;
100
+ },
101
+ dayOfMonth: sample.getDate(),
102
+ today: isToday(sample),
103
+ week: Math.floor(index / 7),
104
+ month: sample.getMonth(),
105
+ disabled: disabled,
106
+ weekend: sample.getDay() == 0,
107
+ name: format(sample, 'iii'),
108
+ fullname: format(sample, 'iiiii'),
109
+ get fromNextMonth() {
110
+ return next;
111
+ },
112
+ get fromPreviousMonth() {
113
+ return prec;
114
+ }
115
+ });
116
+ }
117
+
118
+ return array;
119
+ }
120
+
121
+ function monthDays(month: number, year = 2020) {
122
+ return new Date(year, month + 1, 0).getDate();
123
+ }
124
+
125
+ const bondProps = defineState<CalendarBondProps>(
126
+ [
127
+ defineProperty(
128
+ 'range',
129
+ () => range,
130
+ (v: CalendarRange) => {
131
+ range = v;
132
+ onchange?.(new CustomEvent('change'), { range, pivote });
133
+ }
134
+ ),
135
+ defineProperty(
136
+ 'value',
137
+ () => range?.[0],
138
+ (v) => {
139
+ if (range?.[0]) {
140
+ range[0] = v;
141
+ }
142
+ onchange?.(new CustomEvent('change'), { range, pivote });
143
+ }
144
+ ),
145
+ defineProperty(
146
+ 'pivote',
147
+ () => pivote,
148
+ (v: Date) => {
149
+ pivote = v;
150
+ onchange?.(new CustomEvent('change'), { range, pivote });
151
+ }
152
+ ),
153
+ defineProperty(
154
+ 'start',
155
+ () => range?.[0],
156
+ (v: Date) => {
157
+ range[0] = v;
158
+ onchange?.(new CustomEvent('change'), { range, pivote });
159
+ }
160
+ ),
161
+ defineProperty(
162
+ 'end',
163
+ () => range?.[1],
164
+ (v: Date | undefined) => {
165
+ range[1] = v;
166
+ onchange?.(new CustomEvent('change'), { range, pivote });
167
+ }
168
+ ),
169
+ defineProperty(
170
+ 'min',
171
+ () => min,
172
+ (v: Date | undefined) => (min = v)
173
+ ),
174
+ defineProperty(
175
+ 'max',
176
+ () => max,
177
+ (v: Date | undefined) => (max = v)
178
+ ),
179
+ defineProperty('type', () => type ?? 'single'),
180
+ defineProperty('nextMonth', () => monthNext),
181
+ defineProperty('currentMonth', () => monthCurrent),
182
+ defineProperty('previousMonth', () => monthPrevious)
183
+ ],
184
+ () => ({ extend })
185
+ );
186
+
187
+ const bond = factory(bondProps).share();
188
+
189
+ const rootProps = $derived({
190
+ ...bond.root(),
191
+ ...restProps
192
+ });
193
+
194
+ function _factory(props: typeof bondProps) {
195
+ const popoverState = new CalendarBondState(() => props);
196
+ const popoverBond = new CalendarBond(popoverState);
197
+
198
+ return popoverBond;
199
+ }
200
+
201
+ export function getBond() {
202
+ return bond;
203
+ }
204
+ </script>
205
+
206
+ <HtmlAtom {preset} class={cn('h-full w-full', klass)} data-atom="calendar-root" {...rootProps}>
207
+ {@render children?.({ calendar: bond })}
208
+ </HtmlAtom>
@@ -0,0 +1,8 @@
1
+ import type { CalendarRootProps } from './types';
2
+ import { CalendarBond, CalendarBondState, type CalendarBondProps } from './bond.svelte';
3
+ import './calendar.css';
4
+ declare const CalendarRoot: import("svelte").Component<CalendarRootProps, {
5
+ getBond: () => CalendarBond<CalendarBondProps, CalendarBondState<CalendarBondProps>>;
6
+ }, "value" | "end" | "range" | "start" | "pivote">;
7
+ type CalendarRoot = ReturnType<typeof CalendarRoot>;
8
+ export default CalendarRoot;
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils';
3
+ import { HtmlAtom } from '../atom';
4
+ import { CalendarBond } from './bond.svelte';
5
+
6
+ const calendarBond = CalendarBond.get();
7
+
8
+ let {
9
+ class: klass = '',
10
+ preset = 'calendar.weekday',
11
+ isWeekend,
12
+ element = $bindable(undefined),
13
+ children = undefined,
14
+ ...restProps
15
+ } = $props();
16
+
17
+ const weekDayProps = $derived({
18
+ ...calendarBond?.weekDay(),
19
+ ...restProps
20
+ });
21
+ </script>
22
+
23
+ <HtmlAtom
24
+ {preset}
25
+ class={cn(
26
+ 'calendar-week-day h-fit px-2 py-2 text-center text-sm font-medium',
27
+ isWeekend ? 'text-primary' : '',
28
+ klass
29
+ )}
30
+ data-weekend={isWeekend}
31
+ {...weekDayProps}
32
+ >
33
+ {@render children?.()}
34
+ </HtmlAtom>
@@ -0,0 +1,9 @@
1
+ declare const CalendarWeekDay: import("svelte").Component<{
2
+ class?: string;
3
+ preset?: string;
4
+ isWeekend: any;
5
+ element?: any;
6
+ children?: any;
7
+ } & Record<string, any>, {}, "element">;
8
+ type CalendarWeekDay = ReturnType<typeof CalendarWeekDay>;
9
+ export default CalendarWeekDay;
@@ -0,0 +1,26 @@
1
+ [data-atom='calendar-root'] {
2
+ display: grid;
3
+ grid-template-columns: repeat(7, 1fr);
4
+ grid-template-rows: auto 1fr;
5
+ /*
6
+ --icare-root-background-color: color-mix(in srgb, black 5%, white 100%);
7
+ --icare-root-background-color-hover: color-mix(in srgb, black 5%, white 100%);
8
+ --icare-root-background-color-active: color-mix(in srgb, black 5%, white 100%);
9
+
10
+ --icare-root-text-color: black;
11
+
12
+ --icare-disabled-background-color: black;
13
+ --icare-disabled-text-color: black;
14
+
15
+ --icare-selected-background-color: black;
16
+ --icare-selected-text-color: white;
17
+
18
+ --icare-today-background-color: black;
19
+ --icare-today-text-color: black;
20
+
21
+ --icare-weekend-background-color: black;
22
+ --icare-weekend-text-color: black;
23
+
24
+ --icare-offmonth-background-color: black;
25
+ --icare-offmonth-text-color: black; */
26
+ }