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

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