@tailng-ui/primitives 0.55.0 → 0.57.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.
- package/package.json +2 -2
- package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.d.ts +25 -0
- package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.js +109 -0
- package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.js.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.adapters.d.ts +5 -0
- package/src/lib/form/date-range-picker/date-range-picker.adapters.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.adapters.js +9 -0
- package/src/lib/form/date-range-picker/date-range-picker.adapters.js.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.state.d.ts +10 -0
- package/src/lib/form/date-range-picker/date-range-picker.state.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.state.js +35 -0
- package/src/lib/form/date-range-picker/date-range-picker.state.js.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.types.d.ts +280 -0
- package/src/lib/form/date-range-picker/date-range-picker.types.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.types.js +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.types.js.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.utils.d.ts +54 -0
- package/src/lib/form/date-range-picker/date-range-picker.utils.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/date-range-picker.utils.js +37 -0
- package/src/lib/form/date-range-picker/date-range-picker.utils.js.map +1 -0
- package/src/lib/form/date-range-picker/index.d.ts +7 -0
- package/src/lib/form/date-range-picker/index.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/index.js +7 -0
- package/src/lib/form/date-range-picker/index.js.map +1 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.d.ts +5 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.js +1970 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.js.map +1 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.d.ts +87 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.js +447 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.js.map +1 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.parts.d.ts +3155 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.parts.d.ts.map +1 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.parts.js +940 -0
- package/src/lib/form/date-range-picker/tng-date-range-picker.parts.js.map +1 -0
- package/src/lib/form/datepicker/datepicker.adapters.d.ts.map +1 -1
- package/src/lib/form/datepicker/datepicker.adapters.js +4 -189
- package/src/lib/form/datepicker/datepicker.adapters.js.map +1 -1
- package/src/lib/form/datepicker/datepicker.state.d.ts.map +1 -1
- package/src/lib/form/datepicker/datepicker.state.js +7 -86
- package/src/lib/form/datepicker/datepicker.state.js.map +1 -1
- package/src/lib/form/datepicker/datepicker.utils.d.ts +6 -28
- package/src/lib/form/datepicker/datepicker.utils.d.ts.map +1 -1
- package/src/lib/form/datepicker/datepicker.utils.js +14 -228
- package/src/lib/form/datepicker/datepicker.utils.js.map +1 -1
- package/src/lib/form/index.d.ts +2 -0
- package/src/lib/form/index.d.ts.map +1 -1
- package/src/lib/form/index.js +2 -0
- package/src/lib/form/index.js.map +1 -1
- package/src/lib/form/number-range/index.d.ts +3 -0
- package/src/lib/form/number-range/index.d.ts.map +1 -0
- package/src/lib/form/number-range/index.js +3 -0
- package/src/lib/form/number-range/index.js.map +1 -0
- package/src/lib/form/number-range/tng-number-range.d.ts +26 -0
- package/src/lib/form/number-range/tng-number-range.d.ts.map +1 -0
- package/src/lib/form/number-range/tng-number-range.js +49 -0
- package/src/lib/form/number-range/tng-number-range.js.map +1 -0
- package/src/lib/form/number-range/tng-number-range.types.d.ts +12 -0
- package/src/lib/form/number-range/tng-number-range.types.d.ts.map +1 -0
- package/src/lib/form/number-range/tng-number-range.types.js +1 -0
- package/src/lib/form/number-range/tng-number-range.types.js.map +1 -0
|
@@ -1,239 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const weekInfo = new Intl.Locale(locale).weekInfo;
|
|
7
|
-
if (weekInfo === undefined) {
|
|
8
|
-
return 0;
|
|
9
|
-
}
|
|
10
|
-
return (weekInfo.firstDay % 7);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return 0;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export function toDateKey(adapter, date) {
|
|
17
|
-
const year = adapter.getYear(date).toString().padStart(4, '0');
|
|
18
|
-
const month = (adapter.getMonth(date) + 1).toString().padStart(2, '0');
|
|
19
|
-
const day = adapter.getDate(date).toString().padStart(2, '0');
|
|
20
|
-
return `${year}-${month}-${day}`;
|
|
21
|
-
}
|
|
22
|
-
export function datesEqual(adapter, left, right) {
|
|
23
|
-
if (left === null || right === null) {
|
|
24
|
-
return left === right;
|
|
25
|
-
}
|
|
26
|
-
return adapter.compare(left, right) === 0;
|
|
27
|
-
}
|
|
28
|
-
export function compareMonthIdentity(adapter, left, right) {
|
|
29
|
-
const yearDiff = adapter.getYear(left) - adapter.getYear(right);
|
|
30
|
-
if (yearDiff !== 0) {
|
|
31
|
-
return yearDiff;
|
|
32
|
-
}
|
|
33
|
-
return adapter.getMonth(left) - adapter.getMonth(right);
|
|
34
|
-
}
|
|
35
|
-
export function compareYearIdentity(adapter, left, right) {
|
|
36
|
-
return adapter.getYear(left) - adapter.getYear(right);
|
|
37
|
-
}
|
|
38
|
-
export function normalizeRangeOrder(adapter, range) {
|
|
39
|
-
if (range.start === null || range.end === null) {
|
|
40
|
-
return range;
|
|
41
|
-
}
|
|
42
|
-
if (adapter.compare(range.start, range.end) <= 0) {
|
|
43
|
-
return range;
|
|
44
|
-
}
|
|
45
|
-
return Object.freeze({
|
|
46
|
-
end: range.start,
|
|
47
|
-
start: range.end,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
export function sortAndUniqueDates(adapter, dates) {
|
|
51
|
-
const sorted = [...dates].sort((left, right) => adapter.compare(left, right));
|
|
52
|
-
const unique = [];
|
|
53
|
-
for (const date of sorted) {
|
|
54
|
-
const last = unique.length > 0 ? unique[unique.length - 1] : null;
|
|
55
|
-
if (last !== null && adapter.compare(last, date) === 0) {
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
unique.push(date);
|
|
59
|
-
}
|
|
60
|
-
return Object.freeze(unique);
|
|
61
|
-
}
|
|
62
|
-
export function isDateValueInMonth(adapter, value, visibleMonth) {
|
|
63
|
-
return (adapter.getYear(value) === adapter.getYear(visibleMonth) &&
|
|
64
|
-
adapter.getMonth(value) === adapter.getMonth(visibleMonth));
|
|
1
|
+
/* eslint-disable max-params -- Datepicker utility facades preserve the existing public positional API. */
|
|
2
|
+
import { buildMonthGrid as buildTngMonthGrid, buildMonthOptions as buildTngMonthOptions, buildYearOptions as buildTngYearOptions, hasSelectableDateInYear as hasTngSelectableDateInYear, isDateInRange as isTngDateInRange, isValueSelected as isTngValueSelected, resolveWeekBoundaryDate as resolveTngWeekBoundaryDate, } from '@tailng-ui/cdk';
|
|
3
|
+
export { clampDateToMonth, compareMonthIdentity, compareYearIdentity, datesEqual, findFirstEnabledDateInMonth, hasSelectableDateInMonth, includesView, isDateValueInMonth, moveDateSkippingDisabled, normalizeRangeOrder, resolveInitialFocusedSection, resolveLocaleWeekStartsOn, resolveViewForEscape, sortAndUniqueDates, toDateKey, } from '@tailng-ui/cdk';
|
|
4
|
+
export function buildMonthGrid(options) {
|
|
5
|
+
return buildTngMonthGrid(options);
|
|
65
6
|
}
|
|
66
|
-
export function
|
|
67
|
-
|
|
68
|
-
return adapter.createDate(adapter.getYear(monthDate), adapter.getMonth(monthDate), Math.min(adapter.getDate(date), lastDate));
|
|
7
|
+
export function buildMonthOptions(options) {
|
|
8
|
+
return buildTngMonthOptions(options);
|
|
69
9
|
}
|
|
70
|
-
export function
|
|
71
|
-
|
|
72
|
-
const maxIterations = 400;
|
|
73
|
-
let next = options.adapter.addDays(options.start, options.delta);
|
|
74
|
-
let remaining = maxIterations;
|
|
75
|
-
while (remaining > 0 && options.isDisabled(next)) {
|
|
76
|
-
const currentMonth = options.adapter.getMonth(options.start);
|
|
77
|
-
const nextMonth = options.adapter.getMonth(next);
|
|
78
|
-
if (!allowCrossView && currentMonth !== nextMonth) {
|
|
79
|
-
return options.start;
|
|
80
|
-
}
|
|
81
|
-
next = options.adapter.addDays(next, options.delta);
|
|
82
|
-
remaining -= 1;
|
|
83
|
-
}
|
|
84
|
-
return remaining === 0 ? options.start : next;
|
|
10
|
+
export function buildYearOptions(options) {
|
|
11
|
+
return buildTngYearOptions(options);
|
|
85
12
|
}
|
|
86
13
|
export function resolveWeekBoundaryDate(adapter, date, weekStartsOn, boundary) {
|
|
87
|
-
|
|
88
|
-
return boundary === 'start' ? start : adapter.addDays(start, 6);
|
|
14
|
+
return resolveTngWeekBoundaryDate({ adapter, boundary, date, weekStartsOn });
|
|
89
15
|
}
|
|
90
16
|
export function isValueSelected(adapter, selectionMode, value, date) {
|
|
91
|
-
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
if (selectionMode === 'single') {
|
|
95
|
-
return adapter.compare(value, date) === 0;
|
|
96
|
-
}
|
|
97
|
-
if (selectionMode === 'multiple') {
|
|
98
|
-
return value.some((selected) => adapter.compare(selected, date) === 0);
|
|
99
|
-
}
|
|
100
|
-
const range = value;
|
|
101
|
-
if (range.start === null || range.end === null) {
|
|
102
|
-
return range.start !== null && adapter.compare(range.start, date) === 0;
|
|
103
|
-
}
|
|
104
|
-
return adapter.compare(range.start, date) <= 0 && adapter.compare(range.end, date) >= 0;
|
|
17
|
+
return isTngValueSelected({ adapter, date, selectionMode, value });
|
|
105
18
|
}
|
|
106
19
|
export function isDateInRange(adapter, value, date) {
|
|
107
|
-
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
if ('start' in value && 'end' in value && value.start !== null && value.end !== null) {
|
|
111
|
-
return adapter.compare(value.start, date) <= 0 && adapter.compare(value.end, date) >= 0;
|
|
112
|
-
}
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
export function hasSelectableDateInMonth(adapter, monthDate, isDisabled) {
|
|
116
|
-
const start = adapter.startOfMonth(monthDate);
|
|
117
|
-
const totalDays = adapter.getDate(adapter.endOfMonth(monthDate));
|
|
118
|
-
for (let day = 0; day < totalDays; day += 1) {
|
|
119
|
-
const candidate = adapter.addDays(start, day);
|
|
120
|
-
if (!isDisabled(candidate)) {
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
export function hasSelectableDateInYear(adapter, year, currentMonth, isDisabled) {
|
|
127
|
-
for (let month = 0; month < 12; month += 1) {
|
|
128
|
-
const monthDate = adapter.createDate(year, month, 1);
|
|
129
|
-
if (hasSelectableDateInMonth(adapter, monthDate, isDisabled)) {
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
export function findFirstEnabledDateInMonth(adapter, monthDate, isDisabled) {
|
|
136
|
-
const start = adapter.startOfMonth(monthDate);
|
|
137
|
-
const totalDays = adapter.getDate(adapter.endOfMonth(monthDate));
|
|
138
|
-
for (let day = 0; day < totalDays; day += 1) {
|
|
139
|
-
const candidate = adapter.addDays(start, day);
|
|
140
|
-
if (!isDisabled(candidate)) {
|
|
141
|
-
return candidate;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
export function buildMonthGrid(options) {
|
|
147
|
-
const firstOfMonth = options.adapter.startOfMonth(options.visibleMonth);
|
|
148
|
-
const firstVisibleDate = options.adapter.startOfWeek(firstOfMonth, options.weekStartsOn);
|
|
149
|
-
const daysInMonth = options.adapter.getDate(options.adapter.endOfMonth(options.visibleMonth));
|
|
150
|
-
const leadingOffset = (options.adapter.getDay(firstOfMonth) - options.weekStartsOn + 7) % 7;
|
|
151
|
-
const weekCount = options.fixedWeeks ? 6 : Math.ceil((leadingOffset + daysInMonth) / 7);
|
|
152
|
-
const totalCells = weekCount * 7;
|
|
153
|
-
const cells = [];
|
|
154
|
-
for (let index = 0; index < totalCells; index += 1) {
|
|
155
|
-
const date = options.adapter.addDays(firstVisibleDate, index);
|
|
156
|
-
const inMonth = isDateValueInMonth(options.adapter, date, options.visibleMonth);
|
|
157
|
-
const hidden = !inMonth && !options.showOutsideDays;
|
|
158
|
-
const active = datesEqual(options.adapter, date, options.activeDate);
|
|
159
|
-
const focusVisible = options.focusedDate !== null && datesEqual(options.adapter, date, options.focusedDate);
|
|
160
|
-
const disabled = !inMonth || options.isDisabled(date);
|
|
161
|
-
cells.push(Object.freeze({
|
|
162
|
-
active,
|
|
163
|
-
colIndex: index % 7,
|
|
164
|
-
date,
|
|
165
|
-
disabled,
|
|
166
|
-
focusVisible,
|
|
167
|
-
hidden,
|
|
168
|
-
id: options.createCellId(date),
|
|
169
|
-
inMonth,
|
|
170
|
-
inRange: options.inRange(date),
|
|
171
|
-
label: hidden ? '' : options.adapter.format(date, 'day-number', options.locale),
|
|
172
|
-
rangeEnd: options.isRangeEnd(date),
|
|
173
|
-
rangeStart: options.isRangeStart(date),
|
|
174
|
-
rowIndex: Math.floor(index / 7),
|
|
175
|
-
selected: options.isSelected(date),
|
|
176
|
-
tabindex: active && options.focusStrategy === 'roving' ? 0 : -1,
|
|
177
|
-
today: datesEqual(options.adapter, date, options.today),
|
|
178
|
-
}));
|
|
179
|
-
}
|
|
180
|
-
return Object.freeze(cells);
|
|
181
|
-
}
|
|
182
|
-
export function buildMonthOptions(options) {
|
|
183
|
-
const year = options.adapter.getYear(options.visibleMonth);
|
|
184
|
-
const monthOptions = [];
|
|
185
|
-
for (let monthIndex = 0; monthIndex < 12; monthIndex += 1) {
|
|
186
|
-
const date = options.adapter.createDate(year, monthIndex, 1);
|
|
187
|
-
const active = options.focusedSection === 'month' &&
|
|
188
|
-
options.adapter.getYear(options.activeDate) === year &&
|
|
189
|
-
options.adapter.getMonth(options.activeDate) === monthIndex;
|
|
190
|
-
const focusVisible = options.focusedSection === 'month' &&
|
|
191
|
-
options.focusedDate !== null &&
|
|
192
|
-
compareMonthIdentity(options.adapter, date, options.focusedDate) === 0;
|
|
193
|
-
monthOptions.push(Object.freeze({
|
|
194
|
-
active,
|
|
195
|
-
date,
|
|
196
|
-
disabled: options.disabledMonth(monthIndex),
|
|
197
|
-
focusVisible,
|
|
198
|
-
id: options.createId(monthIndex),
|
|
199
|
-
index: monthIndex,
|
|
200
|
-
label: options.adapter.format(date, 'month-short', options.locale),
|
|
201
|
-
selected: options.selectedMonth(monthIndex),
|
|
202
|
-
tabindex: active ? 0 : -1,
|
|
203
|
-
}));
|
|
204
|
-
}
|
|
205
|
-
return Object.freeze(monthOptions);
|
|
206
|
-
}
|
|
207
|
-
export function buildYearOptions(options) {
|
|
208
|
-
const yearOptions = [];
|
|
209
|
-
for (let offset = 0; offset < options.totalYears; offset += 1) {
|
|
210
|
-
const year = options.startYear + offset;
|
|
211
|
-
const date = options.adapter.createDate(year, options.adapter.getMonth(options.visibleMonth), 1);
|
|
212
|
-
const active = options.focusedSection === 'year' && options.adapter.getYear(options.activeDate) === year;
|
|
213
|
-
const focusVisible = options.focusedSection === 'year' &&
|
|
214
|
-
options.focusedDate !== null &&
|
|
215
|
-
compareYearIdentity(options.adapter, date, options.focusedDate) === 0;
|
|
216
|
-
yearOptions.push(Object.freeze({
|
|
217
|
-
active,
|
|
218
|
-
date,
|
|
219
|
-
disabled: options.disabledYear(year),
|
|
220
|
-
focusVisible,
|
|
221
|
-
id: options.createId(year),
|
|
222
|
-
label: options.adapter.format(date, 'year-label', options.locale),
|
|
223
|
-
selected: options.selectedYear(year),
|
|
224
|
-
tabindex: active ? 0 : -1,
|
|
225
|
-
year,
|
|
226
|
-
}));
|
|
227
|
-
}
|
|
228
|
-
return Object.freeze(yearOptions);
|
|
229
|
-
}
|
|
230
|
-
export function resolveInitialFocusedSection(view) {
|
|
231
|
-
return view;
|
|
232
|
-
}
|
|
233
|
-
export function resolveViewForEscape(currentView) {
|
|
234
|
-
return currentView === 'day' ? null : 'day';
|
|
20
|
+
return isTngDateInRange({ adapter, date, value });
|
|
235
21
|
}
|
|
236
|
-
export function
|
|
237
|
-
return
|
|
22
|
+
export function hasSelectableDateInYear(adapter, year, _currentMonth, isDisabled) {
|
|
23
|
+
return hasTngSelectableDateInYear({ adapter, isDisabled, year });
|
|
238
24
|
}
|
|
239
25
|
//# sourceMappingURL=datepicker.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datepicker.utils.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/datepicker/datepicker.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n TngCalendarView,\n TngDateAdapter,\n TngDateCell,\n TngDateRange,\n TngDateValue,\n TngMonthOption,\n TngWeekdayIndex,\n TngYearOption,\n} from './datepicker.types';\n\ntype TngMonthGridOptions<TDate> = Readonly<{\n activeDate: TDate;\n adapter: Readonly<TngDateAdapter<TDate>>;\n createCellId: (date: TDate) => string;\n fixedWeeks: boolean;\n focusStrategy: 'active-descendant' | 'roving';\n focusedDate: TDate | null;\n inRange: (date: TDate) => boolean;\n isDisabled: (date: TDate) => boolean;\n isRangeEnd: (date: TDate) => boolean;\n isRangeStart: (date: TDate) => boolean;\n isSelected: (date: TDate) => boolean;\n locale?: string;\n showOutsideDays: boolean;\n today: TDate;\n visibleMonth: TDate;\n weekStartsOn: TngWeekdayIndex;\n}>;\n\ntype TngMonthOptionsConfig<TDate> = Readonly<{\n activeDate: TDate;\n adapter: Readonly<TngDateAdapter<TDate>>;\n createId: (month: number) => string;\n disabledMonth: (month: number) => boolean;\n focusedDate: TDate | null;\n focusedSection: 'day' | 'month' | 'year';\n locale?: string;\n selectedMonth: (month: number) => boolean;\n visibleMonth: TDate;\n}>;\n\ntype TngYearOptionsConfig<TDate> = Readonly<{\n activeDate: TDate;\n adapter: Readonly<TngDateAdapter<TDate>>;\n createId: (year: number) => string;\n disabledYear: (year: number) => boolean;\n focusedDate: TDate | null;\n focusedSection: 'day' | 'month' | 'year';\n locale?: string;\n selectedYear: (year: number) => boolean;\n startYear: number;\n totalYears: number;\n visibleMonth: TDate;\n}>;\n\ntype TngMoveDateOptions<TDate> = Readonly<{\n adapter: Readonly<TngDateAdapter<TDate>>;\n allowCrossView?: boolean;\n delta: number;\n isDisabled: (date: TDate) => boolean;\n start: TDate;\n}>;\n\ntype TngWeekBoundary = 'end' | 'start';\n\nexport function resolveLocaleWeekStartsOn(locale?: string): TngWeekdayIndex {\n if (typeof Intl === 'undefined' || typeof Intl.Locale === 'undefined' || locale === undefined) {\n return 0;\n }\n\n try {\n const weekInfo = (new Intl.Locale(locale) as Intl.Locale & {\n weekInfo?: Readonly<{ firstDay: number }>;\n }).weekInfo;\n if (weekInfo === undefined) {\n return 0;\n }\n\n return (weekInfo.firstDay % 7) as TngWeekdayIndex;\n } catch {\n return 0;\n }\n}\n\nexport function toDateKey<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n date: TDate,\n): string {\n const year = adapter.getYear(date).toString().padStart(4, '0');\n const month = (adapter.getMonth(date) + 1).toString().padStart(2, '0');\n const day = adapter.getDate(date).toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nexport function datesEqual<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n left: TDate | null,\n right: TDate | null,\n): boolean {\n if (left === null || right === null) {\n return left === right;\n }\n\n return adapter.compare(left, right) === 0;\n}\n\nexport function compareMonthIdentity<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n left: TDate,\n right: TDate,\n): number {\n const yearDiff = adapter.getYear(left) - adapter.getYear(right);\n if (yearDiff !== 0) {\n return yearDiff;\n }\n\n return adapter.getMonth(left) - adapter.getMonth(right);\n}\n\nexport function compareYearIdentity<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n left: TDate,\n right: TDate,\n): number {\n return adapter.getYear(left) - adapter.getYear(right);\n}\n\nexport function normalizeRangeOrder<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n range: Readonly<TngDateRange<TDate>>,\n): TngDateRange<TDate> {\n if (range.start === null || range.end === null) {\n return range;\n }\n\n if (adapter.compare(range.start, range.end) <= 0) {\n return range;\n }\n\n return Object.freeze({\n end: range.start,\n start: range.end,\n });\n}\n\nexport function sortAndUniqueDates<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n dates: readonly TDate[],\n): readonly TDate[] {\n const sorted = [...dates].sort((left, right) => adapter.compare(left, right));\n const unique: TDate[] = [];\n for (const date of sorted) {\n const last = unique.length > 0 ? unique[unique.length - 1] : null;\n if (last !== null && adapter.compare(last, date) === 0) {\n continue;\n }\n unique.push(date);\n }\n return Object.freeze(unique);\n}\n\nexport function isDateValueInMonth<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n value: TDate,\n visibleMonth: TDate,\n): boolean {\n return (\n adapter.getYear(value) === adapter.getYear(visibleMonth) &&\n adapter.getMonth(value) === adapter.getMonth(visibleMonth)\n );\n}\n\nexport function clampDateToMonth<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n date: TDate,\n monthDate: TDate,\n): TDate {\n const lastDate = adapter.getDate(adapter.endOfMonth(monthDate));\n return adapter.createDate(\n adapter.getYear(monthDate),\n adapter.getMonth(monthDate),\n Math.min(adapter.getDate(date), lastDate),\n );\n}\n\nexport function moveDateSkippingDisabled<TDate>(\n options: Readonly<TngMoveDateOptions<TDate>>,\n): TDate {\n const allowCrossView = options.allowCrossView ?? true;\n const maxIterations = 400;\n let next = options.adapter.addDays(options.start, options.delta);\n let remaining = maxIterations;\n while (remaining > 0 && options.isDisabled(next)) {\n const currentMonth = options.adapter.getMonth(options.start);\n const nextMonth = options.adapter.getMonth(next);\n if (!allowCrossView && currentMonth !== nextMonth) {\n return options.start;\n }\n next = options.adapter.addDays(next, options.delta);\n remaining -= 1;\n }\n\n return remaining === 0 ? options.start : next;\n}\n\nexport function resolveWeekBoundaryDate<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n date: TDate,\n weekStartsOn: TngWeekdayIndex,\n boundary: TngWeekBoundary,\n): TDate {\n const start = adapter.startOfWeek(date, weekStartsOn);\n return boundary === 'start' ? start : adapter.addDays(start, 6);\n}\n\nexport function isValueSelected<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n selectionMode: 'multiple' | 'range' | 'single',\n value: Readonly<TngDateValue<TDate>>,\n date: TDate,\n): boolean {\n if (value === null) {\n return false;\n }\n\n if (selectionMode === 'single') {\n return adapter.compare(value as TDate, date) === 0;\n }\n\n if (selectionMode === 'multiple') {\n return (value as readonly TDate[]).some((selected) => adapter.compare(selected, date) === 0);\n }\n\n const range = value as TngDateRange<TDate>;\n if (range.start === null || range.end === null) {\n return range.start !== null && adapter.compare(range.start, date) === 0;\n }\n\n return adapter.compare(range.start, date) <= 0 && adapter.compare(range.end, date) >= 0;\n}\n\nexport function isDateInRange<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n value: Readonly<TngDateValue<TDate>>,\n date: TDate,\n): boolean {\n if (value === null || Array.isArray(value)) {\n return false;\n }\n\n if ('start' in value && 'end' in value && value.start !== null && value.end !== null) {\n return adapter.compare(value.start, date) <= 0 && adapter.compare(value.end, date) >= 0;\n }\n\n return false;\n}\n\nexport function hasSelectableDateInMonth<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n monthDate: TDate,\n isDisabled: (date: TDate) => boolean,\n): boolean {\n const start = adapter.startOfMonth(monthDate);\n const totalDays = adapter.getDate(adapter.endOfMonth(monthDate));\n for (let day = 0; day < totalDays; day += 1) {\n const candidate = adapter.addDays(start, day);\n if (!isDisabled(candidate)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function hasSelectableDateInYear<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n year: number,\n currentMonth: TDate,\n isDisabled: (date: TDate) => boolean,\n): boolean {\n for (let month = 0; month < 12; month += 1) {\n const monthDate = adapter.createDate(year, month, 1);\n if (hasSelectableDateInMonth(adapter, monthDate, isDisabled)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function findFirstEnabledDateInMonth<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n monthDate: TDate,\n isDisabled: (date: TDate) => boolean,\n): TDate | null {\n const start = adapter.startOfMonth(monthDate);\n const totalDays = adapter.getDate(adapter.endOfMonth(monthDate));\n for (let day = 0; day < totalDays; day += 1) {\n const candidate = adapter.addDays(start, day);\n if (!isDisabled(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nexport function buildMonthGrid<TDate>(\n options: Readonly<TngMonthGridOptions<TDate>>,\n): readonly TngDateCell<TDate>[] {\n const firstOfMonth = options.adapter.startOfMonth(options.visibleMonth);\n const firstVisibleDate = options.adapter.startOfWeek(firstOfMonth, options.weekStartsOn);\n const daysInMonth = options.adapter.getDate(options.adapter.endOfMonth(options.visibleMonth));\n const leadingOffset = (options.adapter.getDay(firstOfMonth) - options.weekStartsOn + 7) % 7;\n const weekCount = options.fixedWeeks ? 6 : Math.ceil((leadingOffset + daysInMonth) / 7);\n const totalCells = weekCount * 7;\n const cells: TngDateCell<TDate>[] = [];\n\n for (let index = 0; index < totalCells; index += 1) {\n const date = options.adapter.addDays(firstVisibleDate, index);\n const inMonth = isDateValueInMonth(options.adapter, date, options.visibleMonth);\n const hidden = !inMonth && !options.showOutsideDays;\n const active = datesEqual(options.adapter, date, options.activeDate);\n const focusVisible = options.focusedDate !== null && datesEqual(options.adapter, date, options.focusedDate);\n const disabled = !inMonth || options.isDisabled(date);\n cells.push(\n Object.freeze({\n active,\n colIndex: index % 7,\n date,\n disabled,\n focusVisible,\n hidden,\n id: options.createCellId(date),\n inMonth,\n inRange: options.inRange(date),\n label: hidden ? '' : options.adapter.format(date, 'day-number', options.locale),\n rangeEnd: options.isRangeEnd(date),\n rangeStart: options.isRangeStart(date),\n rowIndex: Math.floor(index / 7),\n selected: options.isSelected(date),\n tabindex: active && options.focusStrategy === 'roving' ? 0 : -1,\n today: datesEqual(options.adapter, date, options.today),\n }),\n );\n }\n\n return Object.freeze(cells);\n}\n\nexport function buildMonthOptions<TDate>(\n options: Readonly<TngMonthOptionsConfig<TDate>>,\n): readonly TngMonthOption<TDate>[] {\n const year = options.adapter.getYear(options.visibleMonth);\n const monthOptions: TngMonthOption<TDate>[] = [];\n for (let monthIndex = 0; monthIndex < 12; monthIndex += 1) {\n const date = options.adapter.createDate(year, monthIndex, 1);\n const active =\n options.focusedSection === 'month' &&\n options.adapter.getYear(options.activeDate) === year &&\n options.adapter.getMonth(options.activeDate) === monthIndex;\n const focusVisible =\n options.focusedSection === 'month' &&\n options.focusedDate !== null &&\n compareMonthIdentity(options.adapter, date, options.focusedDate) === 0;\n monthOptions.push(\n Object.freeze({\n active,\n date,\n disabled: options.disabledMonth(monthIndex),\n focusVisible,\n id: options.createId(monthIndex),\n index: monthIndex,\n label: options.adapter.format(date, 'month-short', options.locale),\n selected: options.selectedMonth(monthIndex),\n tabindex: active ? 0 : -1,\n }),\n );\n }\n\n return Object.freeze(monthOptions);\n}\n\nexport function buildYearOptions<TDate>(\n options: Readonly<TngYearOptionsConfig<TDate>>,\n): readonly TngYearOption<TDate>[] {\n const yearOptions: TngYearOption<TDate>[] = [];\n for (let offset = 0; offset < options.totalYears; offset += 1) {\n const year = options.startYear + offset;\n const date = options.adapter.createDate(year, options.adapter.getMonth(options.visibleMonth), 1);\n const active = options.focusedSection === 'year' && options.adapter.getYear(options.activeDate) === year;\n const focusVisible =\n options.focusedSection === 'year' &&\n options.focusedDate !== null &&\n compareYearIdentity(options.adapter, date, options.focusedDate) === 0;\n yearOptions.push(\n Object.freeze({\n active,\n date,\n disabled: options.disabledYear(year),\n focusVisible,\n id: options.createId(year),\n label: options.adapter.format(date, 'year-label', options.locale),\n selected: options.selectedYear(year),\n tabindex: active ? 0 : -1,\n year,\n }),\n );\n }\n\n return Object.freeze(yearOptions);\n}\n\nexport function resolveInitialFocusedSection(view: TngCalendarView): TngCalendarView {\n return view;\n}\n\nexport function resolveViewForEscape(currentView: TngCalendarView): TngCalendarView | null {\n return currentView === 'day' ? null : 'day';\n}\n\nexport function includesView(views: readonly TngCalendarView[], view: TngCalendarView): boolean {\n return views.includes(view);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"datepicker.utils.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/datepicker/datepicker.utils.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,EACL,cAAc,IAAI,iBAAiB,EACnC,iBAAiB,IAAI,oBAAoB,EACzC,gBAAgB,IAAI,mBAAmB,EACvC,uBAAuB,IAAI,0BAA0B,EACrD,aAAa,IAAI,gBAAgB,EACjC,eAAe,IAAI,kBAAkB,EACrC,uBAAuB,IAAI,0BAA0B,GACtD,MAAM,gBAAgB,CAAC;AAwDxB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,2BAA2B,EAC3B,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,GACV,MAAM,gBAAgB,CAAC;AAIxB,MAAM,UAAU,cAAc,CAC5B,OAA6C;IAE7C,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAA+C;IAE/C,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAA8C;IAE9C,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAwC,EACxC,IAAW,EACX,YAA6B,EAC7B,QAAyB;IAEzB,OAAO,0BAA0B,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAwC,EACxC,aAAyC,EACzC,KAAoC,EACpC,IAAW;IAEX,OAAO,kBAAkB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAwC,EACxC,KAAoC,EACpC,IAAW;IAEX,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAwC,EACxC,IAAY,EACZ,aAAoB,EACpB,UAAoC;IAEpC,OAAO,0BAA0B,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AACnE,CAAC","sourcesContent":["/* eslint-disable max-params -- Datepicker utility facades preserve the existing public positional API. */\nimport {\n buildMonthGrid as buildTngMonthGrid,\n buildMonthOptions as buildTngMonthOptions,\n buildYearOptions as buildTngYearOptions,\n hasSelectableDateInYear as hasTngSelectableDateInYear,\n isDateInRange as isTngDateInRange,\n isValueSelected as isTngValueSelected,\n resolveWeekBoundaryDate as resolveTngWeekBoundaryDate,\n} from '@tailng-ui/cdk';\nimport type {\n TngDateAdapter,\n TngDateCell,\n TngDateValue,\n TngDatepickerSelectionMode,\n TngMonthOption,\n TngWeekdayIndex,\n TngYearOption,\n} from './datepicker.types';\n\ntype TngMonthGridOptions<TDate> = Readonly<{\n activeDate: TDate;\n adapter: Readonly<TngDateAdapter<TDate>>;\n createCellId: (date: TDate) => string;\n fixedWeeks: boolean;\n focusStrategy: 'active-descendant' | 'roving';\n focusedDate: TDate | null;\n inRange: (date: TDate) => boolean;\n isDisabled: (date: TDate) => boolean;\n isRangeEnd: (date: TDate) => boolean;\n isRangeStart: (date: TDate) => boolean;\n isSelected: (date: TDate) => boolean;\n locale?: string;\n showOutsideDays: boolean;\n today: TDate;\n visibleMonth: TDate;\n weekStartsOn: TngWeekdayIndex;\n}>;\n\ntype TngMonthOptionsConfig<TDate> = Readonly<{\n activeDate: TDate;\n adapter: Readonly<TngDateAdapter<TDate>>;\n createId: (month: number) => string;\n disabledMonth: (month: number) => boolean;\n focusedDate: TDate | null;\n focusedSection: 'day' | 'month' | 'year';\n locale?: string;\n selectedMonth: (month: number) => boolean;\n visibleMonth: TDate;\n}>;\n\ntype TngYearOptionsConfig<TDate> = Readonly<{\n activeDate: TDate;\n adapter: Readonly<TngDateAdapter<TDate>>;\n createId: (year: number) => string;\n disabledYear: (year: number) => boolean;\n focusedDate: TDate | null;\n focusedSection: 'day' | 'month' | 'year';\n locale?: string;\n selectedYear: (year: number) => boolean;\n startYear: number;\n totalYears: number;\n visibleMonth: TDate;\n}>;\n\nexport {\n clampDateToMonth,\n compareMonthIdentity,\n compareYearIdentity,\n datesEqual,\n findFirstEnabledDateInMonth,\n hasSelectableDateInMonth,\n includesView,\n isDateValueInMonth,\n moveDateSkippingDisabled,\n normalizeRangeOrder,\n resolveInitialFocusedSection,\n resolveLocaleWeekStartsOn,\n resolveViewForEscape,\n sortAndUniqueDates,\n toDateKey,\n} from '@tailng-ui/cdk';\n\ntype TngWeekBoundary = 'end' | 'start';\n\nexport function buildMonthGrid<TDate>(\n options: Readonly<TngMonthGridOptions<TDate>>,\n): readonly TngDateCell<TDate>[] {\n return buildTngMonthGrid(options);\n}\n\nexport function buildMonthOptions<TDate>(\n options: Readonly<TngMonthOptionsConfig<TDate>>,\n): readonly TngMonthOption<TDate>[] {\n return buildTngMonthOptions(options);\n}\n\nexport function buildYearOptions<TDate>(\n options: Readonly<TngYearOptionsConfig<TDate>>,\n): readonly TngYearOption<TDate>[] {\n return buildTngYearOptions(options);\n}\n\nexport function resolveWeekBoundaryDate<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n date: TDate,\n weekStartsOn: TngWeekdayIndex,\n boundary: TngWeekBoundary,\n): TDate {\n return resolveTngWeekBoundaryDate({ adapter, boundary, date, weekStartsOn });\n}\n\nexport function isValueSelected<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n selectionMode: TngDatepickerSelectionMode,\n value: Readonly<TngDateValue<TDate>>,\n date: TDate,\n): boolean {\n return isTngValueSelected({ adapter, date, selectionMode, value });\n}\n\nexport function isDateInRange<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n value: Readonly<TngDateValue<TDate>>,\n date: TDate,\n): boolean {\n return isTngDateInRange({ adapter, date, value });\n}\n\nexport function hasSelectableDateInYear<TDate>(\n adapter: Readonly<TngDateAdapter<TDate>>,\n year: number,\n _currentMonth: TDate,\n isDisabled: (date: TDate) => boolean,\n): boolean {\n return hasTngSelectableDateInYear({ adapter, isDisabled, year });\n}\n"]}
|
package/src/lib/form/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './button-toggle/tng-button-toggle';
|
|
|
7
7
|
export * from './checkbox/tng-checkbox';
|
|
8
8
|
export * from './chips/tng-chips';
|
|
9
9
|
export * from './datepicker';
|
|
10
|
+
export * from './date-range-picker';
|
|
10
11
|
export * from './input/tng-input';
|
|
11
12
|
export * from './input/tng-input-group';
|
|
12
13
|
export * from './input/tng-adornment';
|
|
@@ -20,6 +21,7 @@ export * from './select/tng-select.parts';
|
|
|
20
21
|
export * from './select/tng-select.overlay';
|
|
21
22
|
export * from './select/tng-select.listbox';
|
|
22
23
|
export * from './select/tng-select.listbox.types';
|
|
24
|
+
export * from './number-range';
|
|
23
25
|
export * from './slider/tng-slider';
|
|
24
26
|
export * from './switch/tng-switch';
|
|
25
27
|
export * from './textarea/tng-textarea';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAKA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAKA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC"}
|
package/src/lib/form/index.js
CHANGED
|
@@ -11,6 +11,7 @@ export * from './button-toggle/tng-button-toggle';
|
|
|
11
11
|
export * from './checkbox/tng-checkbox';
|
|
12
12
|
export * from './chips/tng-chips';
|
|
13
13
|
export * from './datepicker';
|
|
14
|
+
export * from './date-range-picker';
|
|
14
15
|
export * from './input/tng-input';
|
|
15
16
|
export * from './input/tng-input-group';
|
|
16
17
|
export * from './input/tng-adornment';
|
|
@@ -24,6 +25,7 @@ export * from './select/tng-select.parts';
|
|
|
24
25
|
export * from './select/tng-select.overlay';
|
|
25
26
|
export * from './select/tng-select.listbox';
|
|
26
27
|
export * from './select/tng-select.listbox.types';
|
|
28
|
+
export * from './number-range';
|
|
27
29
|
export * from './slider/tng-slider';
|
|
28
30
|
export * from './switch/tng-switch';
|
|
29
31
|
export * from './textarea/tng-textarea';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,+FAA+F;AAC/F,4CAA4C;AAE5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC","sourcesContent":["// Form primitives\n//\n// Note: keep exports aligned with `src/index.ts` (root barrel) so the public API stays stable.\n// The root barrel will re-export this file.\n\nexport * from './listbox/listbox.directive';\nexport * from './listbox/option.directive';\nexport * from './listbox/tokens';\nexport * from './_shared/id';\nexport * from './autocomplete';\nexport * from './button-toggle/tng-button-toggle';\nexport * from './checkbox/tng-checkbox';\nexport * from './chips/tng-chips';\nexport * from './datepicker';\nexport * from './input/tng-input';\nexport * from './input/tng-input-group';\nexport * from './input/tng-adornment';\nexport * from './input-otp/tng-input-otp';\nexport * from './label/tng-label';\nexport * from './multi-select';\nexport * from './radio/tng-radio';\nexport * from './multi-autocomplete';\n\nexport * from './select/tng-select';\nexport * from './select/tng-select.parts';\nexport * from './select/tng-select.overlay';\nexport * from './select/tng-select.listbox';\nexport * from './select/tng-select.listbox.types';\n\nexport * from './slider/tng-slider';\nexport * from './switch/tng-switch';\nexport * from './textarea/tng-textarea';\nexport * from './toggle/tng-toggle';\nexport * from './toggle-group/tng-toggle-group';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,+FAA+F;AAC/F,4CAA4C;AAE5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC","sourcesContent":["// Form primitives\n//\n// Note: keep exports aligned with `src/index.ts` (root barrel) so the public API stays stable.\n// The root barrel will re-export this file.\n\nexport * from './listbox/listbox.directive';\nexport * from './listbox/option.directive';\nexport * from './listbox/tokens';\nexport * from './_shared/id';\nexport * from './autocomplete';\nexport * from './button-toggle/tng-button-toggle';\nexport * from './checkbox/tng-checkbox';\nexport * from './chips/tng-chips';\nexport * from './datepicker';\nexport * from './date-range-picker';\nexport * from './input/tng-input';\nexport * from './input/tng-input-group';\nexport * from './input/tng-adornment';\nexport * from './input-otp/tng-input-otp';\nexport * from './label/tng-label';\nexport * from './multi-select';\nexport * from './radio/tng-radio';\nexport * from './multi-autocomplete';\n\nexport * from './select/tng-select';\nexport * from './select/tng-select.parts';\nexport * from './select/tng-select.overlay';\nexport * from './select/tng-select.listbox';\nexport * from './select/tng-select.listbox.types';\n\nexport * from './number-range';\nexport * from './slider/tng-slider';\nexport * from './switch/tng-switch';\nexport * from './textarea/tng-textarea';\nexport * from './toggle/tng-toggle';\nexport * from './toggle-group/tng-toggle-group';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/number-range/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/number-range/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC","sourcesContent":["export * from './tng-number-range';\nexport * from './tng-number-range.types';\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { TngNumberRangeValue } from './tng-number-range.types';
|
|
2
|
+
/**
|
|
3
|
+
* Parses a raw string from a number input into a finite number or null.
|
|
4
|
+
* Empty / whitespace-only strings and non-finite results become null.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseNumberInput(raw: string): number | null;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a nullable number to the string value expected by a native
|
|
9
|
+
* `<input type="number">`. null becomes the empty string.
|
|
10
|
+
*/
|
|
11
|
+
export declare function toInputValue(value: number | null): string;
|
|
12
|
+
/**
|
|
13
|
+
* Normalizes an arbitrary external value (e.g. from CVA `writeValue`) into a
|
|
14
|
+
* well-typed `TngNumberRangeValue`. null / undefined is converted to
|
|
15
|
+
* `{ min: null, max: null }`. Object properties that are not finite numbers
|
|
16
|
+
* are normalised to null.
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeRangeValue(value: unknown): TngNumberRangeValue;
|
|
19
|
+
/**
|
|
20
|
+
* Returns true when the range value satisfies all three validity conditions:
|
|
21
|
+
* 1. min is within the configured lower bound (if set).
|
|
22
|
+
* 2. max is within the configured upper bound (if set).
|
|
23
|
+
* 3. min ≤ max (when both are non-null).
|
|
24
|
+
*/
|
|
25
|
+
export declare function isRangeValid(value: TngNumberRangeValue, minBound: number | null, maxBound: number | null): boolean;
|
|
26
|
+
//# sourceMappingURL=tng-number-range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-number-range.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/number-range/tng-number-range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAevE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAWT"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a raw string from a number input into a finite number or null.
|
|
3
|
+
* Empty / whitespace-only strings and non-finite results become null.
|
|
4
|
+
*/
|
|
5
|
+
export function parseNumberInput(raw) {
|
|
6
|
+
if (raw.trim() === '') {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const parsed = Number(raw);
|
|
10
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Converts a nullable number to the string value expected by a native
|
|
14
|
+
* `<input type="number">`. null becomes the empty string.
|
|
15
|
+
*/
|
|
16
|
+
export function toInputValue(value) {
|
|
17
|
+
return value === null ? '' : String(value);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Normalizes an arbitrary external value (e.g. from CVA `writeValue`) into a
|
|
21
|
+
* well-typed `TngNumberRangeValue`. null / undefined is converted to
|
|
22
|
+
* `{ min: null, max: null }`. Object properties that are not finite numbers
|
|
23
|
+
* are normalised to null.
|
|
24
|
+
*/
|
|
25
|
+
export function normalizeRangeValue(value) {
|
|
26
|
+
if (value === null || value === undefined) {
|
|
27
|
+
return { min: null, max: null };
|
|
28
|
+
}
|
|
29
|
+
if (typeof value !== 'object') {
|
|
30
|
+
return { min: null, max: null };
|
|
31
|
+
}
|
|
32
|
+
const obj = value;
|
|
33
|
+
const min = typeof obj['min'] === 'number' && Number.isFinite(obj['min']) ? obj['min'] : null;
|
|
34
|
+
const max = typeof obj['max'] === 'number' && Number.isFinite(obj['max']) ? obj['max'] : null;
|
|
35
|
+
return { min, max };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns true when the range value satisfies all three validity conditions:
|
|
39
|
+
* 1. min is within the configured lower bound (if set).
|
|
40
|
+
* 2. max is within the configured upper bound (if set).
|
|
41
|
+
* 3. min ≤ max (when both are non-null).
|
|
42
|
+
*/
|
|
43
|
+
export function isRangeValid(value, minBound, maxBound) {
|
|
44
|
+
const minBoundValid = value.min === null || minBound === null || value.min >= minBound;
|
|
45
|
+
const maxBoundValid = value.max === null || maxBound === null || value.max <= maxBound;
|
|
46
|
+
const orderValid = value.min === null || value.max === null || value.min <= value.max;
|
|
47
|
+
return minBoundValid && maxBoundValid && orderValid;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=tng-number-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-number-range.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/number-range/tng-number-range.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9F,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,KAA0B,EAC1B,QAAuB,EACvB,QAAuB;IAEvB,MAAM,aAAa,GACjB,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC;IAEnE,MAAM,aAAa,GACjB,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC;IAEnE,MAAM,UAAU,GACd,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;IAErE,OAAO,aAAa,IAAI,aAAa,IAAI,UAAU,CAAC;AACtD,CAAC","sourcesContent":["import type { TngNumberRangeValue } from './tng-number-range.types';\n\n/**\n * Parses a raw string from a number input into a finite number or null.\n * Empty / whitespace-only strings and non-finite results become null.\n */\nexport function parseNumberInput(raw: string): number | null {\n if (raw.trim() === '') {\n return null;\n }\n\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\n/**\n * Converts a nullable number to the string value expected by a native\n * `<input type=\"number\">`. null becomes the empty string.\n */\nexport function toInputValue(value: number | null): string {\n return value === null ? '' : String(value);\n}\n\n/**\n * Normalizes an arbitrary external value (e.g. from CVA `writeValue`) into a\n * well-typed `TngNumberRangeValue`. null / undefined is converted to\n * `{ min: null, max: null }`. Object properties that are not finite numbers\n * are normalised to null.\n */\nexport function normalizeRangeValue(value: unknown): TngNumberRangeValue {\n if (value === null || value === undefined) {\n return { min: null, max: null };\n }\n\n if (typeof value !== 'object') {\n return { min: null, max: null };\n }\n\n const obj = value as Record<string, unknown>;\n\n const min = typeof obj['min'] === 'number' && Number.isFinite(obj['min']) ? obj['min'] : null;\n const max = typeof obj['max'] === 'number' && Number.isFinite(obj['max']) ? obj['max'] : null;\n\n return { min, max };\n}\n\n/**\n * Returns true when the range value satisfies all three validity conditions:\n * 1. min is within the configured lower bound (if set).\n * 2. max is within the configured upper bound (if set).\n * 3. min ≤ max (when both are non-null).\n */\nexport function isRangeValid(\n value: TngNumberRangeValue,\n minBound: number | null,\n maxBound: number | null,\n): boolean {\n const minBoundValid =\n value.min === null || minBound === null || value.min >= minBound;\n\n const maxBoundValid =\n value.max === null || maxBound === null || value.max <= maxBound;\n\n const orderValid =\n value.min === null || value.max === null || value.min <= value.max;\n\n return minBoundValid && maxBoundValid && orderValid;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type TngNumberRangeValue = {
|
|
2
|
+
min: number | null;
|
|
3
|
+
max: number | null;
|
|
4
|
+
};
|
|
5
|
+
export type TngNumberRangeSource = 'min' | 'max';
|
|
6
|
+
export type TngNumberRangeChangeEvent = {
|
|
7
|
+
value: TngNumberRangeValue;
|
|
8
|
+
source: TngNumberRangeSource;
|
|
9
|
+
valid: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type TngNumberRangeSlots = 'root' | 'group' | 'minInput' | 'separator' | 'maxInput';
|
|
12
|
+
//# sourceMappingURL=tng-number-range.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-number-range.types.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/number-range/tng-number-range.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,OAAO,GACP,UAAU,GACV,WAAW,GACX,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=tng-number-range.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-number-range.types.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/number-range/tng-number-range.types.ts"],"names":[],"mappings":"","sourcesContent":["export type TngNumberRangeValue = {\n min: number | null;\n max: number | null;\n};\n\nexport type TngNumberRangeSource = 'min' | 'max';\n\nexport type TngNumberRangeChangeEvent = {\n value: TngNumberRangeValue;\n source: TngNumberRangeSource;\n valid: boolean;\n};\n\nexport type TngNumberRangeSlots =\n | 'root'\n | 'group'\n | 'minInput'\n | 'separator'\n | 'maxInput';\n"]}
|