linear-react-components-ui 2.2.0-beta.8 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/lib/assets/styles/datepicker2.css +81 -11
  2. package/lib/hooks/useScrollEndReached/index.d.ts +1 -1
  3. package/lib/hooks/useScrollEndReached/index.js +14 -3
  4. package/lib/hooks/useScrollEndReached/index.js.map +1 -1
  5. package/lib/hooks/useScrollEndReached/types.d.ts +1 -0
  6. package/lib/inputs/select/Dropdown.js +4 -2
  7. package/lib/inputs/select/Dropdown.js.map +1 -1
  8. package/lib/inputs/select/multiple/index.js +3 -2
  9. package/lib/inputs/select/multiple/index.js.map +1 -1
  10. package/lib/inputs/select/simple/index.js +3 -2
  11. package/lib/inputs/select/simple/index.js.map +1 -1
  12. package/lib/inputs2/date/calendarbox.d.ts +23 -0
  13. package/lib/inputs2/date/calendarbox.js +254 -0
  14. package/lib/inputs2/date/calendarbox.js.map +1 -0
  15. package/lib/inputs2/date/datefield/base.js +691 -214
  16. package/lib/inputs2/date/datefield/base.js.map +1 -1
  17. package/lib/inputs2/date/datefield/triggers.js +4 -4
  18. package/lib/inputs2/date/datefield/triggers.js.map +1 -1
  19. package/lib/inputs2/date/datefield/types.d.ts +5 -12
  20. package/lib/inputs2/date/dateperiodfield/base.js +694 -809
  21. package/lib/inputs2/date/dateperiodfield/base.js.map +1 -1
  22. package/lib/inputs2/date/dateperiodfield/triggers.js +21 -9
  23. package/lib/inputs2/date/dateperiodfield/triggers.js.map +1 -1
  24. package/lib/inputs2/date/dateperiodfield/types.d.ts +13 -23
  25. package/lib/inputs2/date/helpers.d.ts +44 -4
  26. package/lib/inputs2/date/helpers.js +200 -4
  27. package/lib/inputs2/date/helpers.js.map +1 -1
  28. package/lib/inputs2/date/{base/constants.d.ts → hooks/useCalendarPosition.d.ts} +1 -1
  29. package/lib/inputs2/date/hooks/useCalendarPosition.js +93 -0
  30. package/lib/inputs2/date/hooks/useCalendarPosition.js.map +1 -0
  31. package/lib/inputs2/date/hooks/useDateCalendarState.d.ts +14 -0
  32. package/lib/inputs2/date/hooks/useDateCalendarState.js +250 -0
  33. package/lib/inputs2/date/hooks/useDateCalendarState.js.map +1 -0
  34. package/lib/inputs2/date/hooks/useDateMask.d.ts +22 -0
  35. package/lib/inputs2/date/hooks/useDateMask.js +143 -0
  36. package/lib/inputs2/date/hooks/useDateMask.js.map +1 -0
  37. package/lib/inputs2/date/timeselector.d.ts +17 -0
  38. package/lib/inputs2/date/timeselector.js +226 -0
  39. package/lib/inputs2/date/timeselector.js.map +1 -0
  40. package/lib/inputs2/date/types.d.ts +22 -1
  41. package/lib/inputs2/date/types.js.map +1 -1
  42. package/lib/inputs2/selectfield/base.js +2 -1
  43. package/lib/inputs2/selectfield/base.js.map +1 -1
  44. package/lib/inputs2/selectfield/listbox.js +3 -1
  45. package/lib/inputs2/selectfield/listbox.js.map +1 -1
  46. package/lib/node_modules/moment/dist/locale/pt-br.js +54 -0
  47. package/lib/node_modules/moment/dist/locale/pt-br.js.map +1 -0
  48. package/lib/panel/Content.js +18 -15
  49. package/lib/panel/Content.js.map +1 -1
  50. package/lib/panel/Default.d.ts +1 -1
  51. package/lib/panel/Default.js +60 -54
  52. package/lib/panel/Default.js.map +1 -1
  53. package/package.json +1 -1
  54. package/lib/inputs2/date/base/constants.js +0 -69
  55. package/lib/inputs2/date/base/constants.js.map +0 -1
  56. package/lib/inputs2/date/datefield/calendarbox.d.ts +0 -6
  57. package/lib/inputs2/date/datefield/calendarbox.js +0 -228
  58. package/lib/inputs2/date/datefield/calendarbox.js.map +0 -1
  59. package/lib/inputs2/date/dateperiodfield/calendarbox.d.ts +0 -6
  60. package/lib/inputs2/date/dateperiodfield/calendarbox.js +0 -282
  61. package/lib/inputs2/date/dateperiodfield/calendarbox.js.map +0 -1
@@ -1,10 +1,191 @@
1
- import "../../node_modules/moment/dist/moment.js";
1
+ import _ from "../../_virtual/lodash.js";
2
+ import hooks from "../../node_modules/moment/dist/moment.js";
2
3
  import memoize from "../../_virtual/memoize.js";
3
4
  import { OPTIONS_ON_DENIED } from "../../permissionValidations.js";
4
5
  import { Keys } from "./types.js";
5
- const TOKEN_MASK = "00/00/0000";
6
+ import "../../node_modules/moment/dist/locale/pt-br.js";
7
+ hooks.locale("pt-br");
6
8
  const TOKEN_ISO_FORMAT = "YYYY-MM-DD";
7
9
  const TOKEN_PTBR_FORMAT = "DD/MM/YYYY";
10
+ const TOKEN_ISO_DATETIME_FORMAT = "YYYY-MM-DDTHH:mm";
11
+ const TOKEN_PTBR_DATETIME_FORMAT = "DD/MM/YYYY HH:mm";
12
+ const ACCEPTED_BOUNDARY_FORMATS = [TOKEN_ISO_FORMAT, TOKEN_ISO_DATETIME_FORMAT];
13
+ const ACCEPTED_VALUE_FORMATS = [...ACCEPTED_BOUNDARY_FORMATS, hooks.ISO_8601];
14
+ const getDateFormats = (variant) => variant === "datetime" ? {
15
+ isoFormat: TOKEN_ISO_DATETIME_FORMAT,
16
+ ptbrFormat: TOKEN_PTBR_DATETIME_FORMAT,
17
+ digits: 12
18
+ } : {
19
+ isoFormat: TOKEN_ISO_FORMAT,
20
+ ptbrFormat: TOKEN_PTBR_FORMAT,
21
+ digits: 8
22
+ };
23
+ const parseDateValue = (value, variant) => variant === "datetime" ? hooks(_.toString(value), ACCEPTED_VALUE_FORMATS, true) : hooks(_.toString(value), TOKEN_ISO_FORMAT);
24
+ const getMaskSegments = memoize((format) => {
25
+ const segments = [];
26
+ let start = 0;
27
+ while (start < format.length) {
28
+ let end = start;
29
+ while (end < format.length && format[end] === format[start]) end++;
30
+ if (/[a-z]/i.test(format[start])) segments.push({
31
+ start,
32
+ end,
33
+ key: format[start]
34
+ });
35
+ start = end;
36
+ }
37
+ return segments;
38
+ });
39
+ const MASK_BLOCK_RANGES = {
40
+ D: {
41
+ from: 1,
42
+ to: 31,
43
+ length: 2,
44
+ pad: true
45
+ },
46
+ M: {
47
+ from: 1,
48
+ to: 12,
49
+ length: 2,
50
+ pad: true
51
+ },
52
+ Y: {
53
+ from: 1900,
54
+ to: 2099,
55
+ length: 4,
56
+ pad: false
57
+ },
58
+ H: {
59
+ from: 0,
60
+ to: 23,
61
+ length: 2,
62
+ pad: true
63
+ },
64
+ m: {
65
+ from: 0,
66
+ to: 59,
67
+ length: 2,
68
+ pad: true
69
+ }
70
+ };
71
+ const fitsBlockRange = (digits, block) => {
72
+ if (!digits) return true;
73
+ if (digits.length > block.length) return false;
74
+ const lowest = Number(digits.padEnd(block.length, "0"));
75
+ const highest = Number(digits.padEnd(block.length, "9"));
76
+ return highest >= block.from && lowest <= block.to;
77
+ };
78
+ const canSegmentAcceptDigits = (digits, key) => {
79
+ const block = MASK_BLOCK_RANGES[key];
80
+ if (!block) return true;
81
+ if (fitsBlockRange(digits, block)) return true;
82
+ const padDigit = String(block.from).padStart(block.length, "0")[0];
83
+ return block.pad && digits.length < block.length && fitsBlockRange(`${padDigit}${digits}`, block);
84
+ };
85
+ const getTimeSelection = (unmaskedValue, variant) => {
86
+ const digits = _.toString(unmaskedValue).replace(/\D/g, "");
87
+ const hasDate = _.size(digits) >= 8;
88
+ if (variant !== "datetime") return {
89
+ hour: null,
90
+ minute: null,
91
+ hasDate,
92
+ isComplete: hasDate
93
+ };
94
+ const hour = _.size(digits) >= 10 ? Number(digits.slice(8, 10)) : null;
95
+ const minute = _.size(digits) >= 12 ? Number(digits.slice(10, 12)) : null;
96
+ return {
97
+ hour,
98
+ minute,
99
+ hasDate,
100
+ isComplete: hasDate && !_.isNull(hour) && !_.isNull(minute)
101
+ };
102
+ };
103
+ const padTimeUnit = (unit) => _.padStart(String(unit), 2, "0");
104
+ const formatPartialDateTime = (date, hour, minute) => {
105
+ const datePart = date.format(TOKEN_PTBR_FORMAT);
106
+ if (_.isNull(hour)) return datePart;
107
+ if (_.isNull(minute)) return `${datePart} ${padTimeUnit(hour)}`;
108
+ return `${datePart} ${padTimeUnit(hour)}:${padTimeUnit(minute)}`;
109
+ };
110
+ const parseBoundary = (value) => {
111
+ if (!value) return void 0;
112
+ const boundary = hooks(value, ACCEPTED_BOUNDARY_FORMATS, true);
113
+ return boundary.isValid() ? boundary : void 0;
114
+ };
115
+ const clampDateToBounds = (date, min, max) => {
116
+ if (min && date.isBefore(min)) return min.clone();
117
+ if (max && date.isAfter(max)) return max.clone();
118
+ return date;
119
+ };
120
+ const resolveAssumedTime = (params) => {
121
+ const {
122
+ date,
123
+ hour,
124
+ minute,
125
+ min,
126
+ max
127
+ } = params;
128
+ const assumedDate = date.clone().hour(hour ?? 0).minute(minute ?? 0).second(0);
129
+ const fitToBoundary = (boundary) => {
130
+ if (_.isNull(hour)) assumedDate.hour(boundary.hour());
131
+ if (_.isNull(minute) && assumedDate.hour() === boundary.hour()) {
132
+ assumedDate.minute(boundary.minute());
133
+ }
134
+ };
135
+ if (min && assumedDate.isSame(min, "day") && assumedDate.isBefore(min)) fitToBoundary(min);
136
+ if (max && assumedDate.isSame(max, "day") && assumedDate.isAfter(max)) fitToBoundary(max);
137
+ return assumedDate;
138
+ };
139
+ const completePartialDateTime = (params) => {
140
+ const {
141
+ unmaskedValue,
142
+ variant,
143
+ min,
144
+ max
145
+ } = params;
146
+ if (variant !== "datetime") return null;
147
+ const {
148
+ hasDate,
149
+ isComplete,
150
+ hour,
151
+ minute
152
+ } = getTimeSelection(unmaskedValue, variant);
153
+ if (!hasDate || isComplete) return null;
154
+ const date = hooks(_.toString(unmaskedValue).replace(/\D/g, "").slice(0, 8), "DDMMYYYY", true);
155
+ if (!date.isValid()) return null;
156
+ return resolveAssumedTime({
157
+ date,
158
+ hour,
159
+ minute,
160
+ min,
161
+ max
162
+ });
163
+ };
164
+ const isDayOutOfBounds = (day, min, max) => {
165
+ if (min && day.isBefore(min, "day")) return true;
166
+ return Boolean(max && day.isAfter(max, "day"));
167
+ };
168
+ const getPredefinedPeriodRange = (period) => {
169
+ const range = (start, end) => ({
170
+ initialDate: start.startOf("day"),
171
+ finalDate: end.endOf("day")
172
+ });
173
+ switch (period) {
174
+ case "today":
175
+ return range(hooks(), hooks());
176
+ case "week":
177
+ return range(hooks().startOf("week"), hooks().endOf("week"));
178
+ case "lastweek":
179
+ return range(hooks().add(-1, "week").startOf("week"), hooks().add(-1, "week").endOf("week"));
180
+ case "last15":
181
+ return range(hooks().add(-14, "d"), hooks());
182
+ case "month":
183
+ return range(hooks().startOf("month"), hooks().endOf("month"));
184
+ case "lastmonth":
185
+ default:
186
+ return range(hooks().add(-1, "month").startOf("month"), hooks().add(-1, "month").endOf("month"));
187
+ }
188
+ };
8
189
  const options = [OPTIONS_ON_DENIED.disabled, OPTIONS_ON_DENIED.unvisible, OPTIONS_ON_DENIED.readOnly, OPTIONS_ON_DENIED.hideContent];
9
190
  const NAVIGATION_KEYS = [Keys.arrowLeft, Keys.arrowRight, Keys.arrowUp, Keys.arrowDown, Keys.pageUp, Keys.pageDown, Keys.home, Keys.end, Keys.escape, Keys.enter];
10
191
  const PERIOD_OPTIONS_LIST = [{
@@ -42,12 +223,27 @@ const generateCalendarWeeks = memoize((monthSelected) => {
42
223
  return weeks;
43
224
  }, (monthSelected) => monthSelected.format("YYYY-MM"));
44
225
  export {
226
+ ACCEPTED_BOUNDARY_FORMATS,
227
+ ACCEPTED_VALUE_FORMATS,
45
228
  NAVIGATION_KEYS,
46
229
  PERIOD_OPTIONS_LIST,
230
+ TOKEN_ISO_DATETIME_FORMAT,
47
231
  TOKEN_ISO_FORMAT,
48
- TOKEN_MASK,
232
+ TOKEN_PTBR_DATETIME_FORMAT,
49
233
  TOKEN_PTBR_FORMAT,
234
+ canSegmentAcceptDigits,
235
+ clampDateToBounds,
236
+ completePartialDateTime,
237
+ formatPartialDateTime,
50
238
  generateCalendarWeeks,
51
- options
239
+ getDateFormats,
240
+ getMaskSegments,
241
+ getPredefinedPeriodRange,
242
+ getTimeSelection,
243
+ isDayOutOfBounds,
244
+ options,
245
+ parseBoundary,
246
+ parseDateValue,
247
+ resolveAssumedTime
52
248
  };
53
249
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/lib/inputs2/date/helpers.ts"],"sourcesContent":["import moment, { type Moment } from 'moment';\nimport memoize from 'lodash/memoize';\nimport { OPTIONS_ON_DENIED } from '../../permissionValidations';\nimport type { PeriodOptions } from './dateperiodfield/types';\nimport { Keys } from './types';\n\nexport const TOKEN_MASK = '00/00/0000';\nexport const TOKEN_ISO_FORMAT = 'YYYY-MM-DD';\nexport const TOKEN_PTBR_FORMAT = 'DD/MM/YYYY';\nexport const options = [\n OPTIONS_ON_DENIED.disabled,\n OPTIONS_ON_DENIED.unvisible,\n OPTIONS_ON_DENIED.readOnly,\n OPTIONS_ON_DENIED.hideContent,\n];\nexport const NAVIGATION_KEYS: string[] = [\n Keys.arrowLeft, Keys.arrowRight, Keys.arrowUp, Keys.arrowDown,\n Keys.pageUp, Keys.pageDown, Keys.home, Keys.end, Keys.escape,\n Keys.enter,\n];\nexport const PERIOD_OPTIONS_LIST: PeriodOptions[] = [\n { id: 'today', label: 'Hoje' },\n { id: 'week', label: 'Semana Atual' },\n { id: 'lastweek', label: 'Última Semana' },\n { id: 'last15', label: 'Últimos 15 dias' },\n { id: 'month', label: 'Mês atual' },\n { id: 'lastmonth', label: 'Último Mês' },\n];\nexport const isWithinBounds = (date: Moment, minDate?: string, maxDate?: string): boolean => {\n if (minDate) {\n const min = moment(minDate, TOKEN_ISO_FORMAT);\n if (date.isBefore(min, 'day')) return false;\n }\n if (maxDate) {\n const max = moment(maxDate, TOKEN_ISO_FORMAT);\n if (date.isAfter(max, 'day')) return false;\n }\n return true;\n};\nexport const generateCalendarWeeks = memoize((monthSelected: Moment): Moment[][] => {\n const startOfCalendar = monthSelected.clone().startOf('month').startOf('week');\n const endOfCalendar = monthSelected.clone().endOf('month').endOf('week');\n const weeks: Moment[][] = [];\n const currentWeek = startOfCalendar.clone();\n while (currentWeek.isSameOrBefore(endOfCalendar, 'day')) {\n const week: Moment[] = [];\n for (let days = 0; days < 7; days++) {\n week.push(currentWeek.clone());\n currentWeek.add(1, 'day');\n }\n weeks.push(week);\n }\n return weeks;\n}, (monthSelected: Moment) => monthSelected.format('YYYY-MM'));\n"],"names":["TOKEN_MASK","TOKEN_ISO_FORMAT","TOKEN_PTBR_FORMAT","options","OPTIONS_ON_DENIED","disabled","unvisible","readOnly","hideContent","NAVIGATION_KEYS","Keys","arrowLeft","arrowRight","arrowUp","arrowDown","pageUp","pageDown","home","end","escape","enter","PERIOD_OPTIONS_LIST","id","label","generateCalendarWeeks","memoize","monthSelected","startOfCalendar","clone","startOf","endOfCalendar","endOf","weeks","currentWeek","isSameOrBefore","week","days","push","add","format"],"mappings":";;;;AAMO,MAAMA,aAAa;AACnB,MAAMC,mBAAmB;AACzB,MAAMC,oBAAoB;AAC1B,MAAMC,UAAU,CACrBC,kBAAkBC,UAClBD,kBAAkBE,WAClBF,kBAAkBG,UAClBH,kBAAkBI,WAAW;AAExB,MAAMC,kBAA4B,CACvCC,KAAKC,WAAWD,KAAKE,YAAYF,KAAKG,SAASH,KAAKI,WACpDJ,KAAKK,QAAQL,KAAKM,UAAUN,KAAKO,MAAMP,KAAKQ,KAAKR,KAAKS,QACtDT,KAAKU,KAAK;AAEL,MAAMC,sBAAuC,CAClD;AAAA,EAAEC,IAAI;AAAA,EAASC,OAAO;AAAO,GAC7B;AAAA,EAAED,IAAI;AAAA,EAAQC,OAAO;AAAe,GACpC;AAAA,EAAED,IAAI;AAAA,EAAYC,OAAO;AAAgB,GACzC;AAAA,EAAED,IAAI;AAAA,EAAUC,OAAO;AAAkB,GACzC;AAAA,EAAED,IAAI;AAAA,EAASC,OAAO;AAAY,GAClC;AAAA,EAAED,IAAI;AAAA,EAAaC,OAAO;AAAa,CAAC;AAanC,MAAMC,wBAAwBC,QAAQ,CAACC,kBAAsC;AAClF,QAAMC,kBAAkBD,cAAcE,MAAAA,EAAQC,QAAQ,OAAO,EAAEA,QAAQ,MAAM;AAC7E,QAAMC,gBAAgBJ,cAAcE,MAAAA,EAAQG,MAAM,OAAO,EAAEA,MAAM,MAAM;AACvE,QAAMC,QAAoB,CAAA;AAC1B,QAAMC,cAAcN,gBAAgBC,MAAAA;AACpC,SAAOK,YAAYC,eAAeJ,eAAe,KAAK,GAAG;AACvD,UAAMK,OAAiB,CAAA;AACvB,aAASC,OAAO,GAAGA,OAAO,GAAGA,QAAQ;AACnCD,WAAKE,KAAKJ,YAAYL,OAAO;AAC7BK,kBAAYK,IAAI,GAAG,KAAK;AAAA,IAC1B;AACAN,UAAMK,KAAKF,IAAI;AAAA,EACjB;AACA,SAAOH;AACT,GAAG,CAACN,kBAA0BA,cAAca,OAAO,SAAS,CAAC;"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/lib/inputs2/date/helpers.ts"],"sourcesContent":["import _ from 'lodash';\nimport moment, { type Moment } from 'moment';\nimport memoize from 'lodash/memoize';\nimport { OPTIONS_ON_DENIED } from '../../permissionValidations';\nimport type { PeriodOptions } from './dateperiodfield/types';\nimport { Keys, type DateVariant, type TimeSelection } from './types';\n\n// Sem o import explícito o bundler não inclui o locale e o calendário cai em inglês.\nimport 'moment/dist/locale/pt-br';\n\nmoment.locale('pt-br');\n\nexport const TOKEN_ISO_FORMAT = 'YYYY-MM-DD';\nexport const TOKEN_PTBR_FORMAT = 'DD/MM/YYYY';\nexport const TOKEN_ISO_DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm';\nexport const TOKEN_PTBR_DATETIME_FORMAT = 'DD/MM/YYYY HH:mm';\nexport const ACCEPTED_BOUNDARY_FORMATS = [TOKEN_ISO_FORMAT, TOKEN_ISO_DATETIME_FORMAT];\nexport const ACCEPTED_VALUE_FORMATS = [...ACCEPTED_BOUNDARY_FORMATS, moment.ISO_8601];\n\nexport const getDateFormats = (variant: DateVariant) => (variant === 'datetime'\n ? { isoFormat: TOKEN_ISO_DATETIME_FORMAT, ptbrFormat: TOKEN_PTBR_DATETIME_FORMAT, digits: 12 }\n : { isoFormat: TOKEN_ISO_FORMAT, ptbrFormat: TOKEN_PTBR_FORMAT, digits: 8 });\nexport const parseDateValue = (value: unknown, variant: DateVariant): Moment => (\n variant === 'datetime'\n ? moment(_.toString(value), ACCEPTED_VALUE_FORMATS, true)\n : moment(_.toString(value), TOKEN_ISO_FORMAT)\n);\n\nexport interface MaskSegment { start: number; end: number; key: string }\nexport const getMaskSegments = memoize((format: string): MaskSegment[] => {\n const segments: MaskSegment[] = [];\n let start = 0;\n while (start < format.length) {\n let end = start;\n while (end < format.length && format[end] === format[start]) end++;\n if (/[a-z]/i.test(format[start])) segments.push({ start, end, key: format[start] });\n start = end;\n }\n return segments;\n});\n\ninterface MaskBlockRange { from: number; to: number; length: number; pad: boolean }\nconst MASK_BLOCK_RANGES: Record<string, MaskBlockRange> = {\n D: { from: 1, to: 31, length: 2, pad: true },\n M: { from: 1, to: 12, length: 2, pad: true },\n Y: { from: 1900, to: 2099, length: 4, pad: false },\n H: { from: 0, to: 23, length: 2, pad: true },\n m: { from: 0, to: 59, length: 2, pad: true },\n};\n\nconst fitsBlockRange = (digits: string, block: MaskBlockRange): boolean => {\n if (!digits) return true;\n if (digits.length > block.length) return false;\n const lowest = Number(digits.padEnd(block.length, '0'));\n const highest = Number(digits.padEnd(block.length, '9'));\n return highest >= block.from && lowest <= block.to;\n};\n\nexport const canSegmentAcceptDigits = (digits: string, key: string): boolean => {\n const block = MASK_BLOCK_RANGES[key];\n if (!block) return true;\n if (fitsBlockRange(digits, block)) return true;\n const padDigit = String(block.from).padStart(block.length, '0')[0];\n return block.pad && digits.length < block.length\n && fitsBlockRange(`${padDigit}${digits}`, block);\n};\n\nexport const getTimeSelection = (unmaskedValue: string, variant: DateVariant): TimeSelection => {\n const digits = _.toString(unmaskedValue).replace(/\\D/g, '');\n const hasDate = _.size(digits) >= 8;\n if (variant !== 'datetime') return { hour: null, minute: null, hasDate, isComplete: hasDate };\n const hour = _.size(digits) >= 10 ? Number(digits.slice(8, 10)) : null;\n const minute = _.size(digits) >= 12 ? Number(digits.slice(10, 12)) : null;\n return { hour, minute, hasDate, isComplete: hasDate && !_.isNull(hour) && !_.isNull(minute) };\n};\n\nconst padTimeUnit = (unit: number) => _.padStart(String(unit), 2, '0');\n\nexport const formatPartialDateTime = (\n date: Moment, hour: number | null, minute: number | null,\n): string => {\n const datePart = date.format(TOKEN_PTBR_FORMAT);\n if (_.isNull(hour)) return datePart;\n if (_.isNull(minute)) return `${datePart} ${padTimeUnit(hour)}`;\n return `${datePart} ${padTimeUnit(hour)}:${padTimeUnit(minute)}`;\n};\n\nexport const parseBoundary = (value?: string): Moment | undefined => {\n if (!value) return undefined;\n const boundary = moment(value, ACCEPTED_BOUNDARY_FORMATS, true);\n return boundary.isValid() ? boundary : undefined;\n};\n\nexport const clampDateToBounds = (date: Moment, min?: Moment, max?: Moment): Moment => {\n if (min && date.isBefore(min)) return min.clone();\n if (max && date.isAfter(max)) return max.clone();\n return date;\n};\n\n// O que a pessoa não escolheu vira zero — e só o que ela não escolheu é puxado para a borda de\n// `min`/`max`. O dia e as unidades que ela mesma definiu ficam como estão, mesmo fora do intervalo.\nexport interface AssumedTimeParams {\n date: Moment;\n hour: number | null;\n minute: number | null;\n min?: Moment;\n max?: Moment;\n}\n\nexport const resolveAssumedTime = (params: AssumedTimeParams): Moment => {\n const { date, hour, minute, min, max } = params;\n const assumedDate = date.clone().hour(hour ?? 0).minute(minute ?? 0).second(0);\n const fitToBoundary = (boundary: Moment) => {\n if (_.isNull(hour)) assumedDate.hour(boundary.hour());\n if (_.isNull(minute) && assumedDate.hour() === boundary.hour()) {\n assumedDate.minute(boundary.minute());\n }\n };\n if (min && assumedDate.isSame(min, 'day') && assumedDate.isBefore(min)) fitToBoundary(min);\n if (max && assumedDate.isSame(max, 'day') && assumedDate.isAfter(max)) fitToBoundary(max);\n return assumedDate;\n};\n\n// Sair do campo com a data fechada e a hora em aberto.\nexport const completePartialDateTime = (\n params: { unmaskedValue: string, variant: DateVariant, min?: Moment, max?: Moment },\n): Moment | null => {\n const { unmaskedValue, variant, min, max } = params;\n if (variant !== 'datetime') return null;\n const { hasDate, isComplete, hour, minute } = getTimeSelection(unmaskedValue, variant);\n if (!hasDate || isComplete) return null;\n const date = moment(_.toString(unmaskedValue).replace(/\\D/g, '').slice(0, 8), 'DDMMYYYY', true);\n if (!date.isValid()) return null;\n return resolveAssumedTime({ date, hour, minute, min, max });\n};\n\nexport const isDayOutOfBounds = (day: Moment, min?: Moment, max?: Moment): boolean => {\n if (min && day.isBefore(min, 'day')) return true;\n return Boolean(max && day.isAfter(max, 'day'));\n};\n\nexport const getPredefinedPeriodRange = (period: PeriodOptions['id']) => {\n const range = (start: Moment, end: Moment) => ({\n initialDate: start.startOf('day'), finalDate: end.endOf('day'),\n });\n switch (period) {\n case 'today': return range(moment(), moment());\n case 'week': return range(moment().startOf('week'), moment().endOf('week'));\n case 'lastweek': return range(\n moment().add(-1, 'week').startOf('week'), moment().add(-1, 'week').endOf('week'),\n );\n case 'last15': return range(moment().add(-14, 'd'), moment());\n case 'month': return range(moment().startOf('month'), moment().endOf('month'));\n case 'lastmonth':\n default: return range(\n moment().add(-1, 'month').startOf('month'), moment().add(-1, 'month').endOf('month'),\n );\n }\n};\n\nexport const options = [\n OPTIONS_ON_DENIED.disabled,\n OPTIONS_ON_DENIED.unvisible,\n OPTIONS_ON_DENIED.readOnly,\n OPTIONS_ON_DENIED.hideContent,\n];\nexport const NAVIGATION_KEYS: string[] = [\n Keys.arrowLeft, Keys.arrowRight, Keys.arrowUp, Keys.arrowDown,\n Keys.pageUp, Keys.pageDown, Keys.home, Keys.end, Keys.escape,\n Keys.enter,\n];\nexport const PERIOD_OPTIONS_LIST: PeriodOptions[] = [\n { id: 'today', label: 'Hoje' },\n { id: 'week', label: 'Semana Atual' },\n { id: 'lastweek', label: 'Última Semana' },\n { id: 'last15', label: 'Últimos 15 dias' },\n { id: 'month', label: 'Mês atual' },\n { id: 'lastmonth', label: 'Último Mês' },\n];\n\nexport const generateCalendarWeeks = memoize((monthSelected: Moment): Moment[][] => {\n const startOfCalendar = monthSelected.clone().startOf('month').startOf('week');\n const endOfCalendar = monthSelected.clone().endOf('month').endOf('week');\n const weeks: Moment[][] = [];\n const currentWeek = startOfCalendar.clone();\n while (currentWeek.isSameOrBefore(endOfCalendar, 'day')) {\n const week: Moment[] = [];\n for (let days = 0; days < 7; days++) {\n week.push(currentWeek.clone());\n currentWeek.add(1, 'day');\n }\n weeks.push(week);\n }\n return weeks;\n}, (monthSelected: Moment) => monthSelected.format('YYYY-MM'));\n"],"names":["moment","locale","TOKEN_ISO_FORMAT","TOKEN_PTBR_FORMAT","TOKEN_ISO_DATETIME_FORMAT","TOKEN_PTBR_DATETIME_FORMAT","ACCEPTED_BOUNDARY_FORMATS","ACCEPTED_VALUE_FORMATS","ISO_8601","getDateFormats","variant","isoFormat","ptbrFormat","digits","parseDateValue","value","_","toString","getMaskSegments","memoize","format","segments","start","length","end","test","push","key","MASK_BLOCK_RANGES","D","from","to","pad","M","Y","H","m","fitsBlockRange","block","lowest","Number","padEnd","highest","canSegmentAcceptDigits","padDigit","String","padStart","getTimeSelection","unmaskedValue","replace","hasDate","size","hour","minute","isComplete","slice","isNull","padTimeUnit","unit","formatPartialDateTime","date","datePart","parseBoundary","undefined","boundary","isValid","clampDateToBounds","min","max","isBefore","clone","isAfter","resolveAssumedTime","params","assumedDate","second","fitToBoundary","isSame","completePartialDateTime","isDayOutOfBounds","day","Boolean","getPredefinedPeriodRange","period","range","initialDate","startOf","finalDate","endOf","add","options","OPTIONS_ON_DENIED","disabled","unvisible","readOnly","hideContent","NAVIGATION_KEYS","Keys","arrowLeft","arrowRight","arrowUp","arrowDown","pageUp","pageDown","home","escape","enter","PERIOD_OPTIONS_LIST","id","label","generateCalendarWeeks","monthSelected","startOfCalendar","endOfCalendar","weeks","currentWeek","isSameOrBefore","week","days"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { CSSProperties, RefObject } from 'react';
2
- export declare const useCalendarPosition: (calendarBoxOpen: boolean, containerRef: RefObject<HTMLDivElement | null>) => {
2
+ export declare const useCalendarPosition: (calendarBoxOpen: boolean, containerRef: RefObject<HTMLDivElement | null>, calendarBoxRef: RefObject<HTMLDivElement | null>) => {
3
3
  calendarBoxStyles: CSSProperties;
4
4
  };
@@ -0,0 +1,93 @@
1
+ import { c as compilerRuntimeExports } from "../../../_virtual/compiler-runtime.js";
2
+ import { useState, useRef, useLayoutEffect } from "react";
3
+ const getOuterHeight = (element) => {
4
+ if (!element) return 0;
5
+ const {
6
+ borderTopWidth,
7
+ borderBottomWidth,
8
+ marginTop,
9
+ marginBottom
10
+ } = getComputedStyle(element);
11
+ const toNumber = (value) => parseFloat(value) || 0;
12
+ return element.scrollHeight + toNumber(borderTopWidth) + toNumber(borderBottomWidth) + toNumber(marginTop) + toNumber(marginBottom);
13
+ };
14
+ const useCalendarPosition = (calendarBoxOpen, containerRef, calendarBoxRef) => {
15
+ const $ = compilerRuntimeExports.c(8);
16
+ let t0;
17
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
18
+ t0 = {
19
+ top: 0,
20
+ left: 0,
21
+ position: "absolute"
22
+ };
23
+ $[0] = t0;
24
+ } else {
25
+ t0 = $[0];
26
+ }
27
+ const [calendarBoxStyles, setCalendarBoxStyles] = useState(t0);
28
+ const shouldAlignRight = useRef(false);
29
+ const shouldFlipAbove = useRef(false);
30
+ let t1;
31
+ let t2;
32
+ if ($[1] !== calendarBoxOpen || $[2] !== calendarBoxRef || $[3] !== containerRef) {
33
+ t1 = () => {
34
+ const updatePosition = (shouldReviewAlignment) => {
35
+ const anchor = containerRef.current?.getBoundingClientRect();
36
+ if (!anchor) {
37
+ return;
38
+ }
39
+ const measuredWidth = calendarBoxRef.current?.getBoundingClientRect().width ?? 0;
40
+ const boxWidth = Math.max(anchor.width, measuredWidth);
41
+ const boxHeight = getOuterHeight(calendarBoxRef.current);
42
+ if (shouldReviewAlignment) {
43
+ shouldAlignRight.current = anchor.left + boxWidth > window.innerWidth;
44
+ shouldFlipAbove.current = anchor.bottom + boxHeight > window.innerHeight && anchor.top - boxHeight >= 0;
45
+ }
46
+ const alignedLeft = shouldAlignRight.current ? Math.max(0, anchor.right - boxWidth) : anchor.left;
47
+ const alignedTop = shouldFlipAbove.current ? anchor.top - boxHeight : anchor.top + anchor.height;
48
+ setCalendarBoxStyles({
49
+ top: alignedTop + window.scrollY,
50
+ left: alignedLeft + window.scrollX,
51
+ width: anchor.width,
52
+ position: "absolute"
53
+ });
54
+ };
55
+ const handleScroll = () => updatePosition(false);
56
+ const handleResize = () => updatePosition(true);
57
+ if (calendarBoxOpen) {
58
+ updatePosition(true);
59
+ window.addEventListener("resize", handleResize);
60
+ window.addEventListener("scroll", handleScroll, true);
61
+ }
62
+ return () => {
63
+ window.removeEventListener("resize", handleResize);
64
+ window.removeEventListener("scroll", handleScroll, true);
65
+ };
66
+ };
67
+ t2 = [calendarBoxOpen, containerRef, calendarBoxRef];
68
+ $[1] = calendarBoxOpen;
69
+ $[2] = calendarBoxRef;
70
+ $[3] = containerRef;
71
+ $[4] = t1;
72
+ $[5] = t2;
73
+ } else {
74
+ t1 = $[4];
75
+ t2 = $[5];
76
+ }
77
+ useLayoutEffect(t1, t2);
78
+ let t3;
79
+ if ($[6] !== calendarBoxStyles) {
80
+ t3 = {
81
+ calendarBoxStyles
82
+ };
83
+ $[6] = calendarBoxStyles;
84
+ $[7] = t3;
85
+ } else {
86
+ t3 = $[7];
87
+ }
88
+ return t3;
89
+ };
90
+ export {
91
+ useCalendarPosition
92
+ };
93
+ //# sourceMappingURL=useCalendarPosition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCalendarPosition.js","sources":["../../../../src/lib/inputs2/date/hooks/useCalendarPosition.ts"],"sourcesContent":["import { CSSProperties, RefObject, useLayoutEffect, useRef, useState } from 'react';\n\nconst getOuterHeight = (element: HTMLDivElement | null) => {\n if (!element) return 0;\n const { borderTopWidth, borderBottomWidth, marginTop, marginBottom } = getComputedStyle(element);\n const toNumber = (value: string) => parseFloat(value) || 0;\n return element.scrollHeight + toNumber(borderTopWidth) + toNumber(borderBottomWidth)\n + toNumber(marginTop) + toNumber(marginBottom);\n};\n\nexport const useCalendarPosition = (\n calendarBoxOpen: boolean,\n containerRef: RefObject<HTMLDivElement | null>,\n calendarBoxRef: RefObject<HTMLDivElement | null>,\n) => {\n const [calendarBoxStyles, setCalendarBoxStyles] = useState<CSSProperties>({\n top: 0,\n left: 0,\n position: 'absolute',\n });\n const shouldAlignRight = useRef(false);\n const shouldFlipAbove = useRef(false);\n\n useLayoutEffect(() => {\n const updatePosition = (shouldReviewAlignment: boolean) => {\n const anchor = containerRef.current?.getBoundingClientRect();\n if (!anchor) return;\n const measuredWidth = calendarBoxRef.current?.getBoundingClientRect().width ?? 0;\n const boxWidth = Math.max(anchor.width, measuredWidth);\n const boxHeight = getOuterHeight(calendarBoxRef.current);\n if (shouldReviewAlignment) {\n shouldAlignRight.current = anchor.left + boxWidth > window.innerWidth;\n shouldFlipAbove.current = anchor.bottom + boxHeight > window.innerHeight\n && anchor.top - boxHeight >= 0;\n }\n const alignedLeft = shouldAlignRight.current\n ? Math.max(0, anchor.right - boxWidth)\n : anchor.left;\n const alignedTop = shouldFlipAbove.current\n ? anchor.top - boxHeight\n : anchor.top + anchor.height;\n setCalendarBoxStyles({\n top: alignedTop + window.scrollY,\n left: alignedLeft + window.scrollX,\n width: anchor.width,\n position: 'absolute',\n });\n };\n\n const handleScroll = () => updatePosition(false);\n const handleResize = () => updatePosition(true);\n\n if (calendarBoxOpen) {\n updatePosition(true);\n window.addEventListener('resize', handleResize);\n window.addEventListener('scroll', handleScroll, true);\n }\n\n return () => {\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [calendarBoxOpen, containerRef, calendarBoxRef]);\n\n return { calendarBoxStyles };\n};\n"],"names":["getOuterHeight","element","borderTopWidth","borderBottomWidth","marginTop","marginBottom","getComputedStyle","toNumber","value","parseFloat","scrollHeight","useCalendarPosition","calendarBoxOpen","containerRef","calendarBoxRef","$","_c","t0","Symbol","for","top","left","position","calendarBoxStyles","setCalendarBoxStyles","useState","shouldAlignRight","useRef","shouldFlipAbove","t1","t2","updatePosition","shouldReviewAlignment","anchor","current","getBoundingClientRect","measuredWidth","width","boxWidth","Math","max","boxHeight","window","innerWidth","bottom","innerHeight","alignedLeft","right","alignedTop","height","scrollY","scrollX","handleScroll","handleResize","addEventListener","removeEventListener","useLayoutEffect","t3"],"mappings":";;AAEA,MAAMA,iBAAiBA,CAACC,YAAmC;AACzD,MAAI,CAACA,QAAS,QAAO;AACrB,QAAM;AAAA,IAAEC;AAAAA,IAAgBC;AAAAA,IAAmBC;AAAAA,IAAWC;AAAAA,EAAAA,IAAiBC,iBAAiBL,OAAO;AAC/F,QAAMM,WAAWA,CAACC,UAAkBC,WAAWD,KAAK,KAAK;AACzD,SAAOP,QAAQS,eAAeH,SAASL,cAAc,IAAIK,SAASJ,iBAAiB,IAC/EI,SAASH,SAAS,IAAIG,SAASF,YAAY;AACjD;AAEO,MAAMM,sBAAsBA,CAAAC,iBAAAC,cAAAC,mBAAA;AAAA,QAAAC,IAAAC,uBAAAA,EAAA,CAAA;AAAA,MAAAC;AAAA,MAAAF,EAAA,CAAA,MAAAG,OAAAC,IAAA,2BAAA,GAAA;AAKyCF,SAAA;AAAA,MAAAG,KACnE;AAAA,MAACC,MACA;AAAA,MAACC,UACG;AAAA,IAAA;AACXP,WAAAE;AAAAA,EAAA,OAAA;AAAAA,SAAAF,EAAA,CAAA;AAAA,EAAA;AAJD,QAAA,CAAAQ,mBAAAC,oBAAA,IAAkDC,SAAwBR,EAIzE;AACD,QAAAS,mBAAyBC,OAAO,KAAK;AACrC,QAAAC,kBAAwBD,OAAO,KAAK;AAAE,MAAAE;AAAA,MAAAC;AAAA,MAAAf,EAAA,CAAA,MAAAH,mBAAAG,SAAAD,kBAAAC,EAAA,CAAA,MAAAF,cAAA;AAEtBgB,SAAAA,MAAA;AACd,YAAAE,iBAAuBC,CAAAA,0BAAA;AACrB,cAAAC,SAAepB,aAAYqB,SAA+BC,sBAAAA;AAC1D,YAAI,CAACF,QAAM;AAAA;AAAA,QAAA;AACX,cAAAG,gBAAsBtB,eAAcoB,SAA+BC,sBAAAA,EAAQE,SAArD;AACtB,cAAAC,WAAiBC,KAAIC,IAAKP,OAAMI,OAAQD,aAAa;AACrD,cAAAK,YAAkBzC,eAAec,eAAcoB,OAAQ;AACvD,YAAIF,uBAAqB;AACvBN,2BAAgBQ,UAAWD,OAAMZ,OAAQiB,WAAWI,OAAMC;AAC1Df,0BAAeM,UAAWD,OAAMW,SAAUH,YAAYC,OAAMG,eACvDZ,OAAMb,MAAOqB,aAAa;AAAA,QADR;AAGzB,cAAAK,cAAoBpB,iBAAgBQ,UAChCK,KAAIC,IAAK,GAAGP,OAAMc,QAAST,QACjB,IAAVL,OAAMZ;AACV,cAAA2B,aAAmBpB,gBAAeM,UAC9BD,OAAMb,MAAOqB,YACbR,OAAMb,MAAOa,OAAMgB;AACvBzB,6BAAqB;AAAA,UAAAJ,KACd4B,aAAaN,OAAMQ;AAAAA,UAAQ7B,MAC1ByB,cAAcJ,OAAMS;AAAAA,UAAQd,OAC3BJ,OAAMI;AAAAA,UAAMf,UACT;AAAA,QAAA,CACX;AAAA,MAAC;AAGJ,YAAA8B,eAAqBA,MAAMrB,eAAe,KAAK;AAC/C,YAAAsB,eAAqBA,MAAMtB,eAAe,IAAI;AAE9C,UAAInB,iBAAe;AACjBmB,uBAAe,IAAI;AACnBW,eAAMY,iBAAkB,UAAUD,YAAY;AAC9CX,eAAMY,iBAAkB,UAAUF,cAAc,IAAI;AAAA,MAAC;AACtD,aAEM,MAAA;AACLV,eAAMa,oBAAqB,UAAUF,YAAY;AACjDX,eAAMa,oBAAqB,UAAUH,cAAc,IAAI;AAAA,MAAC;AAAA,IACzD;AACAtB,UAAClB,iBAAiBC,cAAcC,cAAc;AAACC,WAAAH;AAAAG,WAAAD;AAAAC,WAAAF;AAAAE,WAAAc;AAAAd,WAAAe;AAAAA,EAAA,OAAA;AAAAD,SAAAd,EAAA,CAAA;AAAAe,SAAAf,EAAA,CAAA;AAAA,EAAA;AAvClDyC,kBAAgB3B,IAuCbC,EAA+C;AAAC,MAAA2B;AAAA,MAAA1C,SAAAQ,mBAAA;AAE5CkC,SAAA;AAAA,MAAAlC;AAAAA,IAAAA;AAAqBR,WAAAQ;AAAAR,WAAA0C;AAAAA,EAAA,OAAA;AAAAA,SAAA1C,EAAA,CAAA;AAAA,EAAA;AAAA,SAArB0C;AAAqB;"}
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+ import { Moment } from 'moment';
3
+ import { DateSharedContextProps } from '../types';
4
+ interface UseDateCalendarStateParams {
5
+ inputRef?: React.RefObject<HTMLInputElement | null>;
6
+ min?: Moment;
7
+ max?: Moment;
8
+ onPressEnter?: (activeDescendant: string) => void;
9
+ }
10
+ interface UseDateCalendarStateReturn extends DateSharedContextProps {
11
+ handleKeyDownNavigation: (event: React.KeyboardEvent<HTMLInputElement>) => void;
12
+ }
13
+ export declare const useDateCalendarState: (params?: UseDateCalendarStateParams) => UseDateCalendarStateReturn;
14
+ export {};
@@ -0,0 +1,250 @@
1
+ import { c as compilerRuntimeExports } from "../../../_virtual/compiler-runtime.js";
2
+ import React from "react";
3
+ import hooks from "../../../node_modules/moment/dist/moment.js";
4
+ import { Keys } from "../types.js";
5
+ import { TOKEN_ISO_FORMAT, NAVIGATION_KEYS } from "../helpers.js";
6
+ const useDateCalendarState = (t0) => {
7
+ const $ = compilerRuntimeExports.c(30);
8
+ let t1;
9
+ if ($[0] !== t0) {
10
+ t1 = t0 === void 0 ? {} : t0;
11
+ $[0] = t0;
12
+ $[1] = t1;
13
+ } else {
14
+ t1 = $[1];
15
+ }
16
+ const params = t1;
17
+ const {
18
+ inputRef,
19
+ min,
20
+ max,
21
+ onPressEnter
22
+ } = params;
23
+ const [calendarBoxOpen, setCalendarBoxOpen] = React.useState(false);
24
+ let t2;
25
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
26
+ t2 = hooks().format(TOKEN_ISO_FORMAT);
27
+ $[2] = t2;
28
+ } else {
29
+ t2 = $[2];
30
+ }
31
+ const [activeDescendant, setActiveDescendant] = React.useState(t2);
32
+ let t3;
33
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
34
+ t3 = hooks();
35
+ $[3] = t3;
36
+ } else {
37
+ t3 = $[3];
38
+ }
39
+ const [calendarDisplayDate, setCalendarDisplayDate] = React.useState(t3);
40
+ const calendarRef = React.useRef(null);
41
+ const dateContainerRef = React.useRef(null);
42
+ let t4;
43
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
44
+ t4 = (value) => setCalendarBoxOpen(value);
45
+ $[4] = t4;
46
+ } else {
47
+ t4 = $[4];
48
+ }
49
+ const handleSetCalendarBoxOpen = t4;
50
+ let t5;
51
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
52
+ t5 = (value_0) => setActiveDescendant(value_0);
53
+ $[5] = t5;
54
+ } else {
55
+ t5 = $[5];
56
+ }
57
+ const handleChangeActiveDescendant = t5;
58
+ let t6;
59
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
60
+ t6 = (value_1) => setCalendarDisplayDate(value_1);
61
+ $[6] = t6;
62
+ } else {
63
+ t6 = $[6];
64
+ }
65
+ const handleChangeCalendarDisplayDate = t6;
66
+ let t7;
67
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
68
+ t7 = () => setCalendarDisplayDate(_temp);
69
+ $[7] = t7;
70
+ } else {
71
+ t7 = $[7];
72
+ }
73
+ const handleNextMonth = t7;
74
+ let t8;
75
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
76
+ t8 = () => setCalendarDisplayDate(_temp2);
77
+ $[8] = t8;
78
+ } else {
79
+ t8 = $[8];
80
+ }
81
+ const handlePreviousMonth = t8;
82
+ let t9;
83
+ if ($[9] !== inputRef) {
84
+ t9 = () => {
85
+ setCalendarBoxOpen((prevState) => {
86
+ if (inputRef?.current !== document.activeElement) {
87
+ inputRef?.current?.focus?.();
88
+ }
89
+ return !prevState;
90
+ });
91
+ };
92
+ $[9] = inputRef;
93
+ $[10] = t9;
94
+ } else {
95
+ t9 = $[10];
96
+ }
97
+ const handleToggleCalendarBox = t9;
98
+ let t10;
99
+ if ($[11] !== max || $[12] !== min) {
100
+ t10 = (day) => {
101
+ if (min && day.isBefore(min, "day")) {
102
+ return min.clone().startOf("day");
103
+ }
104
+ if (max && day.isAfter(max, "day")) {
105
+ return max.clone().startOf("day");
106
+ }
107
+ return day;
108
+ };
109
+ $[11] = max;
110
+ $[12] = min;
111
+ $[13] = t10;
112
+ } else {
113
+ t10 = $[13];
114
+ }
115
+ const clampToBounds = t10;
116
+ let t11;
117
+ if ($[14] !== clampToBounds) {
118
+ t11 = (offset) => {
119
+ setCalendarDisplayDate((prevDisplayDate_1) => {
120
+ const daySelected = clampToBounds(prevDisplayDate_1.clone().add(offset, "day"));
121
+ setActiveDescendant(daySelected.format(TOKEN_ISO_FORMAT));
122
+ return daySelected;
123
+ });
124
+ };
125
+ $[14] = clampToBounds;
126
+ $[15] = t11;
127
+ } else {
128
+ t11 = $[15];
129
+ }
130
+ const handleNavigateWithDays = t11;
131
+ let t12;
132
+ if ($[16] !== clampToBounds) {
133
+ t12 = (when) => {
134
+ setCalendarDisplayDate((prevDisplayDate_2) => {
135
+ let daySelected_0 = prevDisplayDate_2;
136
+ if (when === "end") {
137
+ daySelected_0 = prevDisplayDate_2.clone().endOf("week");
138
+ }
139
+ if (when === "start") {
140
+ daySelected_0 = prevDisplayDate_2.clone().startOf("week");
141
+ }
142
+ daySelected_0 = clampToBounds(daySelected_0);
143
+ setActiveDescendant(daySelected_0.format(TOKEN_ISO_FORMAT));
144
+ return daySelected_0;
145
+ });
146
+ };
147
+ $[16] = clampToBounds;
148
+ $[17] = t12;
149
+ } else {
150
+ t12 = $[17];
151
+ }
152
+ const handleNavigateWithWeeks = t12;
153
+ let t13;
154
+ if ($[18] !== activeDescendant || $[19] !== calendarBoxOpen || $[20] !== handleNavigateWithDays || $[21] !== handleNavigateWithWeeks || $[22] !== onPressEnter) {
155
+ t13 = (event) => {
156
+ const isNavigationKey = Boolean(event.key) && !event.shiftKey && !event.altKey && NAVIGATION_KEYS.includes(event.key);
157
+ if (!calendarBoxOpen || !isNavigationKey) {
158
+ return;
159
+ }
160
+ event.preventDefault();
161
+ bb84: switch (event.key) {
162
+ case Keys.arrowLeft: {
163
+ handleNavigateWithDays(-1);
164
+ break bb84;
165
+ }
166
+ case Keys.arrowRight: {
167
+ handleNavigateWithDays(1);
168
+ break bb84;
169
+ }
170
+ case Keys.arrowUp: {
171
+ handleNavigateWithDays(-7);
172
+ break bb84;
173
+ }
174
+ case Keys.arrowDown: {
175
+ handleNavigateWithDays(7);
176
+ break bb84;
177
+ }
178
+ case Keys.pageUp: {
179
+ handleNextMonth();
180
+ break bb84;
181
+ }
182
+ case Keys.pageDown: {
183
+ handlePreviousMonth();
184
+ break bb84;
185
+ }
186
+ case Keys.home: {
187
+ handleNavigateWithWeeks("start");
188
+ break bb84;
189
+ }
190
+ case Keys.end: {
191
+ handleNavigateWithWeeks("end");
192
+ break bb84;
193
+ }
194
+ case Keys.escape: {
195
+ setCalendarBoxOpen(false);
196
+ break bb84;
197
+ }
198
+ case Keys.enter: {
199
+ onPressEnter?.(activeDescendant);
200
+ break bb84;
201
+ }
202
+ }
203
+ };
204
+ $[18] = activeDescendant;
205
+ $[19] = calendarBoxOpen;
206
+ $[20] = handleNavigateWithDays;
207
+ $[21] = handleNavigateWithWeeks;
208
+ $[22] = onPressEnter;
209
+ $[23] = t13;
210
+ } else {
211
+ t13 = $[23];
212
+ }
213
+ const handleKeyDownNavigation = t13;
214
+ let t14;
215
+ if ($[24] !== activeDescendant || $[25] !== calendarBoxOpen || $[26] !== calendarDisplayDate || $[27] !== handleKeyDownNavigation || $[28] !== handleToggleCalendarBox) {
216
+ t14 = {
217
+ calendarBoxOpen,
218
+ activeDescendant,
219
+ calendarDisplayDate,
220
+ calendarRef,
221
+ dateContainerRef,
222
+ handleNextMonth,
223
+ handlePreviousMonth,
224
+ handleToggleCalendarBox,
225
+ handleSetCalendarBoxOpen,
226
+ handleChangeActiveDescendant,
227
+ handleChangeCalendarDisplayDate,
228
+ handleKeyDownNavigation
229
+ };
230
+ $[24] = activeDescendant;
231
+ $[25] = calendarBoxOpen;
232
+ $[26] = calendarDisplayDate;
233
+ $[27] = handleKeyDownNavigation;
234
+ $[28] = handleToggleCalendarBox;
235
+ $[29] = t14;
236
+ } else {
237
+ t14 = $[29];
238
+ }
239
+ return t14;
240
+ };
241
+ function _temp(prevDisplayDate) {
242
+ return prevDisplayDate.clone().add(1, "month");
243
+ }
244
+ function _temp2(prevDisplayDate_0) {
245
+ return prevDisplayDate_0.clone().subtract(1, "month");
246
+ }
247
+ export {
248
+ useDateCalendarState
249
+ };
250
+ //# sourceMappingURL=useDateCalendarState.js.map