@bolio-ui/core 3.0.0-alpha.0 → 3.0.0-alpha.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 (206) hide show
  1. package/dist/BolioUIProvider/index.js +3 -3
  2. package/dist/Calendar/Calendar.d.ts +1 -0
  3. package/dist/Calendar/index.js +2 -2
  4. package/dist/Carousel/Carousel.d.ts +21 -0
  5. package/dist/Carousel/index.d.ts +3 -0
  6. package/dist/Carousel/index.js +14 -0
  7. package/dist/Collapse/Collapse.d.ts +3 -0
  8. package/dist/Collapse/index.js +3 -3
  9. package/dist/ColorInput/ColorInput.d.ts +24 -0
  10. package/dist/ColorInput/index.d.ts +3 -0
  11. package/dist/ColorInput/index.js +20 -0
  12. package/dist/ColorPicker/ColorPicker.d.ts +17 -0
  13. package/dist/ColorPicker/color-utils.d.ts +10 -0
  14. package/dist/ColorPicker/index.d.ts +3 -0
  15. package/dist/ColorPicker/index.js +14 -0
  16. package/dist/Command/index.js +4 -4
  17. package/dist/ContextMenu/ContextMenu.d.ts +13 -0
  18. package/dist/ContextMenu/index.d.ts +3 -0
  19. package/dist/ContextMenu/index.js +25 -0
  20. package/dist/CssBaseline/index.js +2 -2
  21. package/dist/DatePicker/index.js +3 -3
  22. package/dist/DateRangePicker/DateRangePicker.d.ts +29 -0
  23. package/dist/DateRangePicker/index.d.ts +3 -0
  24. package/dist/DateRangePicker/index.js +19 -0
  25. package/dist/Drawer/index.js +2 -2
  26. package/dist/Dropzone/Dropzone.d.ts +25 -0
  27. package/dist/Dropzone/DropzoneThumbnail.d.ts +9 -0
  28. package/dist/Dropzone/index.d.ts +3 -0
  29. package/dist/Dropzone/index.js +14 -0
  30. package/dist/Menu/index.js +3 -3
  31. package/dist/Modal/index.js +2 -2
  32. package/dist/PinInput/PinInput.d.ts +25 -0
  33. package/dist/PinInput/index.d.ts +3 -0
  34. package/dist/PinInput/index.js +16 -0
  35. package/dist/SegmentedControl/SegmentedControl.d.ts +16 -0
  36. package/dist/SegmentedControl/SegmentedControlContext.d.ts +10 -0
  37. package/dist/SegmentedControl/SegmentedControlItem.d.ts +13 -0
  38. package/dist/SegmentedControl/index.d.ts +10 -0
  39. package/dist/SegmentedControl/index.js +14 -0
  40. package/dist/Select/SelectDropdown.d.ts +2 -0
  41. package/dist/Select/index.js +6 -6
  42. package/dist/Slider/index.js +3 -3
  43. package/dist/Table/index.js +1 -1
  44. package/dist/TagsInput/TagsInput.d.ts +26 -0
  45. package/dist/TagsInput/index.d.ts +3 -0
  46. package/dist/TagsInput/index.js +17 -0
  47. package/dist/Tree/Tree.d.ts +17 -0
  48. package/dist/Tree/TreeContext.d.ts +17 -0
  49. package/dist/Tree/TreeNode.d.ts +8 -0
  50. package/dist/Tree/index.d.ts +3 -0
  51. package/dist/Tree/index.js +14 -0
  52. package/dist/chunk-2A4BSQ66.js +130 -0
  53. package/dist/{chunk-HIFS4JIO.js → chunk-2EYJZXS4.js} +7 -7
  54. package/dist/chunk-4X4ELIMQ.js +231 -0
  55. package/dist/{chunk-UVVBMWR4.js → chunk-AG2NWQYL.js} +18 -4
  56. package/dist/chunk-AVO2SK2I.js +109 -0
  57. package/dist/{chunk-YHZFOVVI.js → chunk-DIMJQLWY.js} +27 -37
  58. package/dist/chunk-G4KB56RO.js +217 -0
  59. package/dist/chunk-GYFW5NLU.js +257 -0
  60. package/dist/chunk-IJGIEX5J.js +211 -0
  61. package/dist/chunk-K6UULETP.js +244 -0
  62. package/dist/chunk-MDSRXACM.js +212 -0
  63. package/dist/chunk-OKZRHSSG.js +271 -0
  64. package/dist/{chunk-IBC5BABS.js → chunk-P245HSVB.js} +190 -155
  65. package/dist/{chunk-6KMHJRCY.js → chunk-TDJGMSGT.js} +1 -0
  66. package/dist/{chunk-FQU5SKDF.js → chunk-WFGUAR7K.js} +58 -24
  67. package/dist/chunk-X4TPC7HS.js +160 -0
  68. package/dist/{chunk-6BCLZSSK.js → chunk-XLPOECCE.js} +2 -2
  69. package/dist/css/Button-ButtonIcon.css +3 -2
  70. package/dist/css/ButtonGroup.css +1 -0
  71. package/dist/css/Calendar.css +12 -1
  72. package/dist/css/Carousel.css +128 -0
  73. package/dist/css/Collapse.css +29 -9
  74. package/dist/css/ColorInput.css +97 -0
  75. package/dist/css/ColorPicker.css +186 -0
  76. package/dist/css/Combobox.css +2 -0
  77. package/dist/css/ContextMenu.css +17 -0
  78. package/dist/css/DatePicker.css +4 -1
  79. package/dist/css/DateRangePicker.css +110 -0
  80. package/dist/css/Dropzone.css +163 -0
  81. package/dist/css/Fieldset-FieldsetGroup.css +1 -0
  82. package/dist/css/Input.css +4 -3
  83. package/dist/css/Menu-MenuList.css +1 -0
  84. package/dist/css/NumberInput.css +5 -4
  85. package/dist/css/PinInput.css +41 -0
  86. package/dist/css/Radio.css +1 -0
  87. package/dist/css/SegmentedControl-SegmentedControlItem.css +65 -0
  88. package/dist/css/SegmentedControl.css +14 -0
  89. package/dist/css/Select-SelectDropdown.css +5 -2
  90. package/dist/css/Select-SelectMultipleValue.css +1 -0
  91. package/dist/css/Select-SelectOption.css +28 -7
  92. package/dist/css/Select.css +3 -1
  93. package/dist/css/TagsInput.css +101 -0
  94. package/dist/css/Textarea.css +1 -0
  95. package/dist/css/Toggle.css +1 -0
  96. package/dist/css/Tree.css +88 -0
  97. package/dist/css/use-toasts-toast-item.css +1 -0
  98. package/dist/index.d.ts +20 -0
  99. package/dist/index.js +80 -40
  100. package/dist/styles.css +3494 -2400
  101. package/esm/BolioUIProvider/index.js +2 -2
  102. package/esm/Calendar/Calendar.d.ts +1 -0
  103. package/esm/Calendar/index.js +1 -1
  104. package/esm/Carousel/Carousel.d.ts +21 -0
  105. package/esm/Carousel/index.d.ts +3 -0
  106. package/esm/Carousel/index.js +14 -0
  107. package/esm/Collapse/Collapse.d.ts +3 -0
  108. package/esm/Collapse/index.js +2 -2
  109. package/esm/ColorInput/ColorInput.d.ts +24 -0
  110. package/esm/ColorInput/index.d.ts +3 -0
  111. package/esm/ColorInput/index.js +20 -0
  112. package/esm/ColorPicker/ColorPicker.d.ts +17 -0
  113. package/esm/ColorPicker/color-utils.d.ts +10 -0
  114. package/esm/ColorPicker/index.d.ts +3 -0
  115. package/esm/ColorPicker/index.js +14 -0
  116. package/esm/Command/index.js +4 -4
  117. package/esm/ContextMenu/ContextMenu.d.ts +13 -0
  118. package/esm/ContextMenu/index.d.ts +3 -0
  119. package/esm/ContextMenu/index.js +25 -0
  120. package/esm/CssBaseline/index.js +1 -1
  121. package/esm/DatePicker/index.js +2 -2
  122. package/esm/DateRangePicker/DateRangePicker.d.ts +29 -0
  123. package/esm/DateRangePicker/index.d.ts +3 -0
  124. package/esm/DateRangePicker/index.js +19 -0
  125. package/esm/Drawer/index.js +2 -2
  126. package/esm/Dropzone/Dropzone.d.ts +25 -0
  127. package/esm/Dropzone/DropzoneThumbnail.d.ts +9 -0
  128. package/esm/Dropzone/index.d.ts +3 -0
  129. package/esm/Dropzone/index.js +14 -0
  130. package/esm/Menu/index.js +2 -2
  131. package/esm/Modal/index.js +2 -2
  132. package/esm/PinInput/PinInput.d.ts +25 -0
  133. package/esm/PinInput/index.d.ts +3 -0
  134. package/esm/PinInput/index.js +16 -0
  135. package/esm/SegmentedControl/SegmentedControl.d.ts +16 -0
  136. package/esm/SegmentedControl/SegmentedControlContext.d.ts +10 -0
  137. package/esm/SegmentedControl/SegmentedControlItem.d.ts +13 -0
  138. package/esm/SegmentedControl/index.d.ts +10 -0
  139. package/esm/SegmentedControl/index.js +14 -0
  140. package/esm/Select/SelectDropdown.d.ts +2 -0
  141. package/esm/Select/index.js +5 -5
  142. package/esm/Slider/index.js +2 -2
  143. package/esm/Table/index.js +1 -1
  144. package/esm/TagsInput/TagsInput.d.ts +26 -0
  145. package/esm/TagsInput/index.d.ts +3 -0
  146. package/esm/TagsInput/index.js +17 -0
  147. package/esm/Tree/Tree.d.ts +17 -0
  148. package/esm/Tree/TreeContext.d.ts +17 -0
  149. package/esm/Tree/TreeNode.d.ts +8 -0
  150. package/esm/Tree/index.d.ts +3 -0
  151. package/esm/Tree/index.js +14 -0
  152. package/esm/chunk-2A4BSQ66.js +130 -0
  153. package/esm/{chunk-HIFS4JIO.js → chunk-2EYJZXS4.js} +4 -4
  154. package/esm/chunk-4X4ELIMQ.js +231 -0
  155. package/esm/{chunk-UVVBMWR4.js → chunk-AG2NWQYL.js} +18 -4
  156. package/esm/chunk-AVO2SK2I.js +109 -0
  157. package/esm/{chunk-YHZFOVVI.js → chunk-DIMJQLWY.js} +27 -37
  158. package/esm/chunk-G4KB56RO.js +217 -0
  159. package/esm/chunk-GYFW5NLU.js +257 -0
  160. package/esm/chunk-IJGIEX5J.js +211 -0
  161. package/esm/chunk-K6UULETP.js +244 -0
  162. package/esm/chunk-MDSRXACM.js +212 -0
  163. package/esm/chunk-OKZRHSSG.js +271 -0
  164. package/esm/chunk-P245HSVB.js +450 -0
  165. package/esm/{chunk-6KMHJRCY.js → chunk-TDJGMSGT.js} +1 -0
  166. package/esm/{chunk-FQU5SKDF.js → chunk-WFGUAR7K.js} +60 -26
  167. package/esm/chunk-X4TPC7HS.js +160 -0
  168. package/esm/{chunk-6BCLZSSK.js → chunk-XLPOECCE.js} +1 -1
  169. package/esm/css/Button-ButtonIcon.css +3 -2
  170. package/esm/css/ButtonGroup.css +1 -0
  171. package/esm/css/Calendar.css +12 -1
  172. package/esm/css/Carousel.css +128 -0
  173. package/esm/css/Collapse.css +29 -9
  174. package/esm/css/ColorInput.css +97 -0
  175. package/esm/css/ColorPicker.css +186 -0
  176. package/esm/css/Combobox.css +2 -0
  177. package/esm/css/ContextMenu.css +17 -0
  178. package/esm/css/DatePicker.css +4 -1
  179. package/esm/css/DateRangePicker.css +110 -0
  180. package/esm/css/Dropzone.css +163 -0
  181. package/esm/css/Fieldset-FieldsetGroup.css +1 -0
  182. package/esm/css/Input.css +4 -3
  183. package/esm/css/Menu-MenuList.css +1 -0
  184. package/esm/css/NumberInput.css +5 -4
  185. package/esm/css/PinInput.css +41 -0
  186. package/esm/css/Radio.css +1 -0
  187. package/esm/css/SegmentedControl-SegmentedControlItem.css +65 -0
  188. package/esm/css/SegmentedControl.css +14 -0
  189. package/esm/css/Select-SelectDropdown.css +5 -2
  190. package/esm/css/Select-SelectMultipleValue.css +1 -0
  191. package/esm/css/Select-SelectOption.css +28 -7
  192. package/esm/css/Select.css +3 -1
  193. package/esm/css/TagsInput.css +101 -0
  194. package/esm/css/Textarea.css +1 -0
  195. package/esm/css/Toggle.css +1 -0
  196. package/esm/css/Tree.css +88 -0
  197. package/esm/css/use-toasts-toast-item.css +1 -0
  198. package/esm/index.d.ts +20 -0
  199. package/esm/index.js +93 -53
  200. package/esm/styles.css +3470 -2376
  201. package/package.json +3 -3
  202. package/esm/chunk-IBC5BABS.js +0 -415
  203. package/dist/{chunk-2PRUFY2Q.js → chunk-4ZGR7UMX.js} +2 -2
  204. package/dist/{chunk-FLK7EAOE.js → chunk-IUZV5Y27.js} +2 -2
  205. package/esm/{chunk-2PRUFY2Q.js → chunk-4ZGR7UMX.js} +3 -3
  206. package/esm/{chunk-FLK7EAOE.js → chunk-IUZV5Y27.js} +3 -3
@@ -0,0 +1,450 @@
1
+ import {
2
+ use_scale_default,
3
+ with_scale_default
4
+ } from "./chunk-MAICNLTY.js";
5
+ import {
6
+ use_theme_default
7
+ } from "./chunk-V5I4ORQQ.js";
8
+ import {
9
+ joinClasses,
10
+ use_classes_default
11
+ } from "./chunk-5KUROAEP.js";
12
+
13
+ // core/Calendar/Calendar.tsx
14
+ import React, { useEffect, useId, useMemo, useRef, useState } from "react";
15
+
16
+ // core/Calendar/date-utils.ts
17
+ var startOfDay = (date) => new Date(date.getFullYear(), date.getMonth(), date.getDate());
18
+ var addDays = (date, amount) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount);
19
+ var addMonths = (date, amount) => {
20
+ const target = new Date(date.getFullYear(), date.getMonth() + amount, 1);
21
+ const lastDay = new Date(
22
+ target.getFullYear(),
23
+ target.getMonth() + 1,
24
+ 0
25
+ ).getDate();
26
+ return new Date(
27
+ target.getFullYear(),
28
+ target.getMonth(),
29
+ Math.min(date.getDate(), lastDay)
30
+ );
31
+ };
32
+ var isSameDay = (a, b) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
33
+ var clampDate = (date, min, max) => {
34
+ if (min && date < min) return min;
35
+ if (max && date > max) return max;
36
+ return date;
37
+ };
38
+ var pad = (value) => String(value).padStart(2, "0");
39
+ var toISO = (date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
40
+ var fromISO = (text) => {
41
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(text.trim());
42
+ if (!match) return null;
43
+ const [year, month, day] = [+match[1], +match[2], +match[3]];
44
+ const date = new Date(year, month - 1, day);
45
+ const isReal = date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;
46
+ return isReal ? date : null;
47
+ };
48
+ var getISOWeek = (date) => {
49
+ const thursday = addDays(date, 3 - (date.getDay() + 6) % 7);
50
+ const firstThursday = new Date(thursday.getFullYear(), 0, 4);
51
+ const weekOne = addDays(firstThursday, 3 - (firstThursday.getDay() + 6) % 7);
52
+ return 1 + Math.round((thursday.getTime() - weekOne.getTime()) / 6048e5);
53
+ };
54
+
55
+ // css-module-source:/Users/brunnoandrade/Desktop/BolioUI/bolio-ui/core/Calendar/Calendar.module.css.bolio-css-module-source
56
+ var Calendar_module_css_default = { "calendar": "Calendar-module_calendar__KlHdi", "months": "Calendar-module_months__vypnr", "header": "Calendar-module_header__d6VGN", "navSpacer": "Calendar-module_navSpacer__TcVxJ", "title": "Calendar-module_title__r0GX1", "table": "Calendar-module_table__q-H-S", "th": "Calendar-module_th__N9m4h", "td": "Calendar-module_td__YyI6L", "button": "Calendar-module_button__h3ZK-", "navButton": "Calendar-module_navButton__jmnwu", "dayButton": "Calendar-module_dayButton__-4eeR", "today": "Calendar-module_today__fx9vj", "selected": "Calendar-module_selected__kIUsl", "outside": "Calendar-module_outside__cSs5z", "inRange": "Calendar-module_inRange__0XK-F", "rangeStart": "Calendar-module_rangeStart__T1amH", "rangeEnd": "Calendar-module_rangeEnd__B55oD", "weekNumber": "Calendar-module_weekNumber__J1hkP" };
57
+
58
+ // core/Calendar/Calendar.tsx
59
+ import { jsx, jsxs } from "react/jsx-runtime";
60
+ var CalendarComponent = React.forwardRef(
61
+ ({
62
+ mode = "single",
63
+ value: customValue,
64
+ onChange,
65
+ maxSelected,
66
+ min,
67
+ max,
68
+ shouldDisableDate,
69
+ locale = "en-US",
70
+ weekStartsOn = 0,
71
+ showOutsideDays = false,
72
+ showWeekNumbers = false,
73
+ numberOfMonths = 1,
74
+ month: customMonth,
75
+ defaultMonth,
76
+ onMonthChange,
77
+ autoFocus = false,
78
+ previousLabel = "Previous month",
79
+ nextLabel = "Next month",
80
+ weekLabel = "Week",
81
+ className = "",
82
+ style,
83
+ ...props
84
+ }, ref) => {
85
+ const theme = use_theme_default();
86
+ const { SCALES } = use_scale_default();
87
+ const headingId = useId();
88
+ const minDay = useMemo(() => min ? startOfDay(min) : void 0, [min]);
89
+ const maxDay = useMemo(() => max ? startOfDay(max) : void 0, [max]);
90
+ const [selfValue, setSelfValue] = useState(
91
+ mode === "multiple" ? [] : mode === "range" ? [null, null] : null
92
+ );
93
+ const current = customValue !== void 0 ? customValue : selfValue;
94
+ const isRange = mode === "range";
95
+ const [rangeStart, rangeEnd] = isRange ? current : [];
96
+ const selectedDays = isRange ? [rangeStart, rangeEnd].filter(Boolean) : mode === "multiple" ? current : current ? [current] : [];
97
+ const anchor = selectedDays[0] || null;
98
+ const [hovered, setHovered] = useState(null);
99
+ const [focused, setFocused] = useState(
100
+ () => clampDate(
101
+ startOfDay(anchor || customMonth || defaultMonth || /* @__PURE__ */ new Date()),
102
+ minDay,
103
+ maxDay
104
+ )
105
+ );
106
+ const count = Math.max(1, Math.floor(numberOfMonths));
107
+ const focusedIndex = focused.getFullYear() * 12 + focused.getMonth();
108
+ const [viewStart, setViewStart] = useState(focusedIndex);
109
+ let first = viewStart;
110
+ if (focusedIndex < first) first = focusedIndex;
111
+ else if (focusedIndex > first + count - 1)
112
+ first = focusedIndex - (count - 1);
113
+ if (first !== viewStart) setViewStart(first);
114
+ const gridRef = useRef(null);
115
+ const moveFocus = useRef(autoFocus);
116
+ const time = anchor ? anchor.getTime() : null;
117
+ useEffect(() => {
118
+ if (time === null) return;
119
+ setFocused(clampDate(startOfDay(new Date(time)), minDay, maxDay));
120
+ }, [time, minDay, maxDay]);
121
+ const monthTime = customMonth ? new Date(customMonth.getFullYear(), customMonth.getMonth(), 1).getTime() : null;
122
+ useEffect(() => {
123
+ if (monthTime === null) return;
124
+ const target = new Date(monthTime);
125
+ setViewStart(target.getFullYear() * 12 + target.getMonth());
126
+ setFocused(
127
+ (last) => last.getFullYear() === target.getFullYear() && last.getMonth() === target.getMonth() ? last : clampDate(target, minDay, maxDay)
128
+ );
129
+ }, [monthTime, minDay, maxDay]);
130
+ useEffect(() => {
131
+ var _a, _b;
132
+ if (!moveFocus.current) return;
133
+ moveFocus.current = false;
134
+ (_b = (_a = gridRef.current) == null ? void 0 : _a.querySelector(`[data-date="${toISO(focused)}"]`)) == null ? void 0 : _b.focus();
135
+ }, [focused]);
136
+ const formats = useMemo(
137
+ () => ({
138
+ month: new Intl.DateTimeFormat(locale, {
139
+ month: "long",
140
+ year: "numeric"
141
+ }),
142
+ day: new Intl.DateTimeFormat(locale, {
143
+ weekday: "long",
144
+ year: "numeric",
145
+ month: "long",
146
+ day: "numeric"
147
+ }),
148
+ short: new Intl.DateTimeFormat(locale, { weekday: "short" }),
149
+ long: new Intl.DateTimeFormat(locale, { weekday: "long" })
150
+ }),
151
+ [locale]
152
+ );
153
+ const weekdays = useMemo(
154
+ () => Array.from({ length: 7 }, (_, index) => {
155
+ const date = new Date(2023, 0, 1 + (weekStartsOn + index) % 7);
156
+ return {
157
+ short: formats.short.format(date),
158
+ long: formats.long.format(date)
159
+ };
160
+ }),
161
+ [formats, weekStartsOn]
162
+ );
163
+ const outsideDays = showOutsideDays && count === 1;
164
+ const monthViews = useMemo(
165
+ () => Array.from({ length: count }, (_, step) => {
166
+ const index = first + step;
167
+ const year = Math.floor(index / 12);
168
+ const month = index % 12;
169
+ const offset = (new Date(year, month, 1).getDay() - weekStartsOn + 7) % 7;
170
+ const total = new Date(year, month + 1, 0).getDate();
171
+ const cells = [
172
+ ...Array.from(
173
+ { length: offset },
174
+ (_2, cell) => outsideDays ? new Date(year, month, cell - offset + 1) : null
175
+ ),
176
+ ...Array.from(
177
+ { length: total },
178
+ (_2, cell) => new Date(year, month, cell + 1)
179
+ )
180
+ ];
181
+ while (cells.length % 7)
182
+ cells.push(
183
+ outsideDays ? new Date(year, month, cells.length - offset + 1) : null
184
+ );
185
+ const weeks = Array.from(
186
+ { length: cells.length / 7 },
187
+ (_2, row) => cells.slice(row * 7, row * 7 + 7)
188
+ );
189
+ return { year, month, date: new Date(year, month, 1), weeks };
190
+ }),
191
+ [first, count, weekStartsOn, outsideDays]
192
+ );
193
+ const firstMonth = monthViews[0];
194
+ const lastMonthView = monthViews[count - 1];
195
+ const lastMonth = useRef(first);
196
+ useEffect(() => {
197
+ if (first === lastMonth.current) return;
198
+ lastMonth.current = first;
199
+ if (onMonthChange) onMonthChange(firstMonth.date);
200
+ }, [first]);
201
+ const isDisabled = (date) => Boolean(
202
+ minDay && date < minDay || maxDay && date > maxDay || shouldDisableDate && shouldDisableDate(date)
203
+ );
204
+ const today = /* @__PURE__ */ new Date();
205
+ const previousDisabled = Boolean(
206
+ minDay && new Date(firstMonth.year, firstMonth.month, 0) < minDay
207
+ );
208
+ const nextDisabled = Boolean(
209
+ maxDay && new Date(lastMonthView.year, lastMonthView.month + 1, 1) > maxDay
210
+ );
211
+ const goToMonth = (step) => {
212
+ setViewStart(first + step);
213
+ setFocused(clampDate(addMonths(focused, step), minDay, maxDay));
214
+ };
215
+ const commit = (next) => {
216
+ if (customValue === void 0) setSelfValue(next);
217
+ if (onChange) onChange(next);
218
+ };
219
+ const select = (date) => {
220
+ if (isDisabled(date)) return;
221
+ setFocused(date);
222
+ if (isRange) {
223
+ const start = rangeStart;
224
+ const startsNew = !start || rangeEnd || date < start;
225
+ return commit(startsNew ? [date, null] : [start, date]);
226
+ }
227
+ if (mode === "multiple") {
228
+ const list = current;
229
+ if (list.some((item) => isSameDay(item, date)))
230
+ return commit(list.filter((item) => !isSameDay(item, date)));
231
+ if (maxSelected !== void 0 && list.length >= maxSelected) return;
232
+ return commit([...list, date].sort((a, b) => +a - +b));
233
+ }
234
+ commit(date);
235
+ };
236
+ const isSelected = (date) => selectedDays.some((item) => isSameDay(item, date));
237
+ const previewEnd = isRange ? rangeEnd || hovered : null;
238
+ const [low, high] = rangeStart && previewEnd ? rangeStart <= previewEnd ? [rangeStart, previewEnd] : [previewEnd, rangeStart] : [null, null];
239
+ const isInRange = (date) => Boolean(low && high && date > low && date < high);
240
+ const keyDownHandler = (event, date) => {
241
+ if (event.key === "Enter" || event.key === " ") {
242
+ event.preventDefault();
243
+ return select(date);
244
+ }
245
+ const weekIndex = (date.getDay() - weekStartsOn + 7) % 7;
246
+ const targets = {
247
+ ArrowLeft: addDays(date, -1),
248
+ ArrowRight: addDays(date, 1),
249
+ ArrowUp: addDays(date, -7),
250
+ ArrowDown: addDays(date, 7),
251
+ Home: addDays(date, -weekIndex),
252
+ End: addDays(date, 6 - weekIndex),
253
+ PageUp: addMonths(date, event.shiftKey ? -12 : -1),
254
+ PageDown: addMonths(date, event.shiftKey ? 12 : 1)
255
+ };
256
+ if (!(event.key in targets)) return;
257
+ event.preventDefault();
258
+ moveFocus.current = true;
259
+ setFocused(clampDate(targets[event.key], minDay, maxDay));
260
+ };
261
+ const calendarStyle = {
262
+ "--calendar-font-size": SCALES.font(1),
263
+ "--calendar-text-color": theme.palette.foreground,
264
+ "--calendar-width": SCALES.width(1, "auto"),
265
+ "--calendar-height": SCALES.height(1, "auto"),
266
+ "--calendar-padding-top": SCALES.pt(0),
267
+ "--calendar-padding-right": SCALES.pr(0),
268
+ "--calendar-padding-bottom": SCALES.pb(0),
269
+ "--calendar-padding-left": SCALES.pl(0),
270
+ "--calendar-margin-top": SCALES.mt(0),
271
+ "--calendar-margin-right": SCALES.mr(0),
272
+ "--calendar-margin-bottom": SCALES.mb(0),
273
+ "--calendar-margin-left": SCALES.ml(0),
274
+ "--calendar-weekday-color": theme.palette.accents_5,
275
+ "--calendar-radius": theme.layout.radius,
276
+ "--calendar-hover-bg": theme.palette.accents_2,
277
+ "--calendar-focus-outline": theme.palette.primary,
278
+ "--calendar-disabled-color": theme.palette.accents_3,
279
+ "--calendar-today-border": theme.palette.accents_4,
280
+ "--calendar-selected-color": "#fff",
281
+ "--calendar-selected-bg": theme.palette.primary,
282
+ "--calendar-range-bg": `color-mix(in srgb, ${theme.palette.primary} 18%, transparent)`,
283
+ "--calendar-outside-color": theme.palette.accents_4,
284
+ "--calendar-week-color": theme.palette.accents_4,
285
+ ...style
286
+ };
287
+ return /* @__PURE__ */ jsx(
288
+ "div",
289
+ {
290
+ ref,
291
+ className: use_classes_default(Calendar_module_css_default.calendar, className),
292
+ style: calendarStyle,
293
+ ...props,
294
+ children: /* @__PURE__ */ jsx(
295
+ "div",
296
+ {
297
+ ref: gridRef,
298
+ className: Calendar_module_css_default.months,
299
+ onMouseLeave: () => setHovered(null),
300
+ children: monthViews.map(({ month, date: monthDate, weeks }, step) => /* @__PURE__ */ jsxs("div", { className: Calendar_module_css_default.month, children: [
301
+ /* @__PURE__ */ jsxs("div", { className: Calendar_module_css_default.header, children: [
302
+ step === 0 ? /* @__PURE__ */ jsx(
303
+ "button",
304
+ {
305
+ type: "button",
306
+ className: joinClasses(Calendar_module_css_default.button, Calendar_module_css_default.navButton),
307
+ "aria-label": previousLabel,
308
+ disabled: previousDisabled,
309
+ onClick: () => goToMonth(-1),
310
+ children: "\u2039"
311
+ }
312
+ ) : /* @__PURE__ */ jsx("span", { className: Calendar_module_css_default.navSpacer, "aria-hidden": "true" }),
313
+ /* @__PURE__ */ jsx(
314
+ "div",
315
+ {
316
+ id: `${headingId}-${step}`,
317
+ className: Calendar_module_css_default.title,
318
+ "aria-live": "polite",
319
+ children: formats.month.format(monthDate)
320
+ }
321
+ ),
322
+ step === count - 1 ? /* @__PURE__ */ jsx(
323
+ "button",
324
+ {
325
+ type: "button",
326
+ className: joinClasses(Calendar_module_css_default.button, Calendar_module_css_default.navButton),
327
+ "aria-label": nextLabel,
328
+ disabled: nextDisabled,
329
+ onClick: () => goToMonth(1),
330
+ children: "\u203A"
331
+ }
332
+ ) : /* @__PURE__ */ jsx("span", { className: Calendar_module_css_default.navSpacer, "aria-hidden": "true" })
333
+ ] }),
334
+ /* @__PURE__ */ jsxs(
335
+ "table",
336
+ {
337
+ role: "grid",
338
+ "aria-labelledby": `${headingId}-${step}`,
339
+ className: Calendar_module_css_default.table,
340
+ "aria-multiselectable": mode !== "single" || void 0,
341
+ children: [
342
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { role: "row", children: [
343
+ showWeekNumbers && /* @__PURE__ */ jsx("th", { role: "columnheader", className: Calendar_module_css_default.th }),
344
+ weekdays.map((weekday) => /* @__PURE__ */ jsx(
345
+ "th",
346
+ {
347
+ role: "columnheader",
348
+ scope: "col",
349
+ className: Calendar_module_css_default.th,
350
+ children: /* @__PURE__ */ jsx("abbr", { title: weekday.long, children: weekday.short })
351
+ },
352
+ weekday.long
353
+ ))
354
+ ] }) }),
355
+ /* @__PURE__ */ jsx("tbody", { children: weeks.map((week, index) => {
356
+ const reference = week.find(Boolean);
357
+ const weekNumber = getISOWeek(
358
+ addDays(reference, 3 - week.indexOf(reference))
359
+ );
360
+ return /* @__PURE__ */ jsxs("tr", { role: "row", children: [
361
+ showWeekNumbers && /* @__PURE__ */ jsx(
362
+ "th",
363
+ {
364
+ role: "rowheader",
365
+ scope: "row",
366
+ className: Calendar_module_css_default.weekNumber,
367
+ "aria-label": `${weekLabel} ${weekNumber}`,
368
+ children: weekNumber
369
+ }
370
+ ),
371
+ week.map((date, cell) => {
372
+ if (!date)
373
+ return /* @__PURE__ */ jsx(
374
+ "td",
375
+ {
376
+ role: "gridcell",
377
+ className: Calendar_module_css_default.td,
378
+ "aria-hidden": "true"
379
+ },
380
+ cell
381
+ );
382
+ const selectedDay = isSelected(date);
383
+ const outside = date.getMonth() !== month;
384
+ return /* @__PURE__ */ jsx(
385
+ "td",
386
+ {
387
+ role: "gridcell",
388
+ className: joinClasses(Calendar_module_css_default.td, {
389
+ [Calendar_module_css_default.inRange]: isInRange(date),
390
+ [Calendar_module_css_default.rangeStart]: Boolean(
391
+ low && isSameDay(date, low) && high
392
+ ),
393
+ [Calendar_module_css_default.rangeEnd]: Boolean(
394
+ high && isSameDay(date, high) && low
395
+ )
396
+ }),
397
+ "aria-selected": selectedDay || isInRange(date),
398
+ children: /* @__PURE__ */ jsx(
399
+ "button",
400
+ {
401
+ type: "button",
402
+ "data-date": toISO(date),
403
+ "aria-label": formats.day.format(date),
404
+ "aria-current": isSameDay(date, today) ? "date" : void 0,
405
+ className: joinClasses(
406
+ Calendar_module_css_default.button,
407
+ Calendar_module_css_default.dayButton,
408
+ {
409
+ [Calendar_module_css_default.selected]: selectedDay,
410
+ [Calendar_module_css_default.today]: isSameDay(date, today),
411
+ [Calendar_module_css_default.outside]: outside
412
+ }
413
+ ),
414
+ tabIndex: isSameDay(date, focused) ? 0 : -1,
415
+ disabled: isDisabled(date),
416
+ onClick: () => select(date),
417
+ onMouseEnter: () => isRange && setHovered(date),
418
+ onKeyDown: (event) => keyDownHandler(event, date),
419
+ children: date.getDate()
420
+ }
421
+ )
422
+ },
423
+ cell
424
+ );
425
+ })
426
+ ] }, index);
427
+ }) })
428
+ ]
429
+ }
430
+ )
431
+ ] }, step))
432
+ }
433
+ )
434
+ }
435
+ );
436
+ }
437
+ );
438
+ CalendarComponent.displayName = "BolioUICalendar";
439
+ var Calendar = with_scale_default(CalendarComponent);
440
+ var Calendar_default = Calendar;
441
+
442
+ // core/Calendar/index.ts
443
+ var Calendar_default2 = Calendar_default;
444
+
445
+ export {
446
+ startOfDay,
447
+ toISO,
448
+ fromISO,
449
+ Calendar_default2 as Calendar_default
450
+ };
@@ -25,6 +25,7 @@ var CssBaseline = ({
25
25
  html {
26
26
  font-size: 16px;
27
27
  --bolioui-icons-background: ${theme.palette.background};
28
+ box-sizing: border-box;
28
29
  }
29
30
 
30
31
  body {
@@ -4,12 +4,12 @@ import {
4
4
  import {
5
5
  log_warning_default
6
6
  } from "./chunk-AXYDJGTN.js";
7
- import {
8
- use_latest_default
9
- } from "./chunk-ZRORQ2WH.js";
10
7
  import {
11
8
  use_current_state_default
12
9
  } from "./chunk-33BUV2RX.js";
10
+ import {
11
+ use_latest_default
12
+ } from "./chunk-ZRORQ2WH.js";
13
13
  import {
14
14
  use_scale_default,
15
15
  with_scale_default
@@ -25,7 +25,7 @@ import {
25
25
  } from "./chunk-5KUROAEP.js";
26
26
 
27
27
  // core/Collapse/Collapse.tsx
28
- import React4, { useEffect as useEffect2 } from "react";
28
+ import React4, { useEffect as useEffect2, useId } from "react";
29
29
 
30
30
  // core/Collapse/CollapseIcon.tsx
31
31
  import React from "react";
@@ -127,7 +127,7 @@ var CollapseContext = React3.createContext(defaultContext);
127
127
  var useCollapseContext = () => React3.useContext(CollapseContext);
128
128
 
129
129
  // css-module-source:/Users/brunnoandrade/Desktop/BolioUI/bolio-ui/core/Collapse/Collapse.module.css.bolio-css-module-source
130
- var Collapse_module_css_default = { "view": "Collapse-module_view__wymqp", "title": "Collapse-module_title__ceZ1h", "subtitle": "Collapse-module_subtitle__wv5KS", "content": "Collapse-module_content__xZkpG" };
130
+ var Collapse_module_css_default = { "view": "Collapse-module_view__wymqp", "title": "Collapse-module_title__ceZ1h", "trigger": "Collapse-module_trigger__0Q0YR", "label": "Collapse-module_label__tdCh3", "subtitle": "Collapse-module_subtitle__wv5KS", "content": "Collapse-module_content__xZkpG" };
131
131
 
132
132
  // core/Collapse/Collapse.tsx
133
133
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
@@ -137,6 +137,9 @@ var CollapseComponent = React4.forwardRef(
137
137
  title,
138
138
  subtitle,
139
139
  initialVisible = false,
140
+ visible: controlledVisible,
141
+ onVisibleChange,
142
+ disabled = false,
140
143
  shadow = false,
141
144
  className = "",
142
145
  index,
@@ -146,7 +149,12 @@ var CollapseComponent = React4.forwardRef(
146
149
  const theme = use_theme_default();
147
150
  const { SCALES } = use_scale_default();
148
151
  const { values, updateValues } = useCollapseContext();
149
- const [visible, setVisible, visibleRef] = use_current_state_default(initialVisible);
152
+ const [selfVisible, setVisible, visibleRef] = use_current_state_default(initialVisible);
153
+ const isControlled = controlledVisible !== void 0;
154
+ const visible = isControlled ? controlledVisible : selfVisible;
155
+ const baseId = useId();
156
+ const triggerId = `${baseId}-trigger`;
157
+ const panelId = `${baseId}-panel`;
150
158
  if (!title) {
151
159
  log_warning_default('"title" is required.', "Collapse");
152
160
  }
@@ -156,15 +164,12 @@ var CollapseComponent = React4.forwardRef(
156
164
  setVisible(isActive);
157
165
  }, [index, setVisible, values]);
158
166
  const clickHandler = () => {
159
- const next = !visibleRef.current;
160
- setVisible(next);
167
+ if (disabled) return;
168
+ const next = !(isControlled ? controlledVisible : visibleRef.current);
169
+ if (!isControlled) setVisible(next);
170
+ if (onVisibleChange) onVisibleChange(next);
161
171
  if (updateValues) updateValues(index, next);
162
172
  };
163
- const keyDownHandler = (event) => {
164
- if (event.key !== "Enter" && event.key !== " ") return;
165
- event.preventDefault();
166
- clickHandler();
167
- };
168
173
  const collapseStyle = shadow ? {
169
174
  boxShadow: theme.expressiveness.shadowSmall,
170
175
  border: "none",
@@ -195,27 +200,29 @@ var CollapseComponent = React4.forwardRef(
195
200
  "div",
196
201
  {
197
202
  className: Collapse_module_css_default.view,
198
- role: "button",
199
- tabIndex: 0,
200
- "aria-expanded": visible,
201
203
  onClick: clickHandler,
202
- onKeyDown: keyDownHandler,
203
204
  style: {
204
- "--collapse-focus-color": theme.palette.primary
205
+ "--collapse-focus-color": theme.palette.primary,
206
+ cursor: disabled ? "not-allowed" : void 0
205
207
  },
206
208
  children: [
207
- /* @__PURE__ */ jsxs(
208
- "div",
209
+ /* @__PURE__ */ jsx3("h3", { className: Collapse_module_css_default.title, children: /* @__PURE__ */ jsxs(
210
+ "button",
209
211
  {
210
- className: Collapse_module_css_default.title,
212
+ type: "button",
213
+ id: triggerId,
214
+ className: Collapse_module_css_default.trigger,
215
+ "data-collapse-trigger": "",
216
+ "aria-expanded": visible,
217
+ "aria-controls": panelId,
218
+ disabled,
211
219
  style: { color: theme.palette.foreground },
212
220
  children: [
213
- /* @__PURE__ */ jsx3("h3", { children: title }),
214
- " ",
221
+ /* @__PURE__ */ jsx3("span", { className: Collapse_module_css_default.label, children: title }),
215
222
  /* @__PURE__ */ jsx3(CollapseIcon_default, { active: visible })
216
223
  ]
217
224
  }
218
- ),
225
+ ) }),
219
226
  subtitle && /* @__PURE__ */ jsx3(
220
227
  "div",
221
228
  {
@@ -230,9 +237,10 @@ var CollapseComponent = React4.forwardRef(
230
237
  /* @__PURE__ */ jsx3(expand_default, { isExpanded: visible, children: /* @__PURE__ */ jsx3(
231
238
  "div",
232
239
  {
240
+ id: panelId,
233
241
  className: Collapse_module_css_default.content,
234
242
  style: {
235
- padding: `${SCALES.pt(1.2)} ${SCALES.pr(0)} ${SCALES.pb(1.2)} ${SCALES.pl(0)}`
243
+ padding: `${SCALES.pt(0.6)} ${SCALES.pr(0)} ${SCALES.pb(0)} ${SCALES.pl(0)}`
236
244
  },
237
245
  children
238
246
  }
@@ -259,6 +267,7 @@ function CollapseGroupComponent({
259
267
  accordion = true,
260
268
  className = "",
261
269
  style,
270
+ onKeyDown,
262
271
  ...props
263
272
  }) {
264
273
  const { SCALES } = use_scale_default();
@@ -290,6 +299,22 @@ function CollapseGroupComponent({
290
299
  () => setChildrenIndex(children, [Collapse_default]),
291
300
  [children]
292
301
  );
302
+ const keyDownHandler = (event) => {
303
+ if (onKeyDown) onKeyDown(event);
304
+ const { key } = event;
305
+ if (!["ArrowDown", "ArrowUp", "Home", "End"].includes(key)) return;
306
+ const triggers = Array.from(
307
+ event.currentTarget.querySelectorAll(
308
+ "[data-collapse-trigger]"
309
+ )
310
+ ).filter((trigger) => !trigger.disabled);
311
+ const current = triggers.indexOf(event.target);
312
+ if (current < 0) return;
313
+ event.preventDefault();
314
+ const last = triggers.length - 1;
315
+ const next = key === "Home" ? 0 : key === "End" ? last : key === "ArrowDown" ? (current + 1) % triggers.length : (current + last) % triggers.length;
316
+ triggers[next].focus();
317
+ };
293
318
  const groupStyle = {
294
319
  width: SCALES.width(1, "auto"),
295
320
  height: SCALES.height(1, "auto"),
@@ -297,7 +322,16 @@ function CollapseGroupComponent({
297
322
  margin: `${SCALES.mt(0)} ${SCALES.mr(0)} ${SCALES.mb(0)} ${SCALES.ml(0)}`,
298
323
  ...style
299
324
  };
300
- return /* @__PURE__ */ jsx4(CollapseContext.Provider, { value: initialValue, children: /* @__PURE__ */ jsx4("div", { className: classes, ...props, style: groupStyle, children: hasIndexChildren }) });
325
+ return /* @__PURE__ */ jsx4(CollapseContext.Provider, { value: initialValue, children: /* @__PURE__ */ jsx4(
326
+ "div",
327
+ {
328
+ className: classes,
329
+ ...props,
330
+ onKeyDown: keyDownHandler,
331
+ style: groupStyle,
332
+ children: hasIndexChildren
333
+ }
334
+ ) });
301
335
  }
302
336
  CollapseGroupComponent.displayName = "BolioUICollapseGroup";
303
337
  var CollapseGroup = with_scale_default(CollapseGroupComponent);