tp-react-elements 1.3.3 → 1.3.6

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.
@@ -1,3 +1,3 @@
1
- var DateInput = {};
1
+ var InputRangeField = {};
2
2
 
3
- export { DateInput as __exports };
3
+ export { InputRangeField as __exports };
@@ -1,3 +1,3 @@
1
- var Month = {};
1
+ var DateInput = {};
2
2
 
3
- export { Month as __exports };
3
+ export { DateInput as __exports };
@@ -1,3 +1,3 @@
1
- var InputRangeField = {};
1
+ var Month = {};
2
2
 
3
- export { InputRangeField as __exports };
3
+ export { Month as __exports };
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DefinedRange = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DefinedRange as __exports };
@@ -1,3 +1,3 @@
1
- var DateRange = {};
1
+ var DateRangePicker = {};
2
2
 
3
- export { DateRange as __exports };
3
+ export { DateRangePicker as __exports };
@@ -1,3 +1,3 @@
1
- var DefinedRange = {};
1
+ var DateRange = {};
2
2
 
3
- export { DefinedRange as __exports };
3
+ export { DateRange as __exports };
@@ -1,3 +1,3 @@
1
- var DateRangePicker = {};
1
+ var Calendar = {};
2
2
 
3
- export { DateRangePicker as __exports };
3
+ export { Calendar as __exports };
@@ -61,11 +61,11 @@ interface AvailableColumn {
61
61
  label: string;
62
62
  /**
63
63
  * Filter chip variant used in the "Column Filters" section of Manage Filters.
64
- * Mirrors the `meta.filterType` declared on the column definition.
64
+ * Sourced from the `filterType` prop on the column's `TPColumnDef`.
65
65
  * Defaults to `'text'` when omitted.
66
66
  */
67
- filterType?: 'text' | 'date' | 'searchableDropdown';
68
- /** Options for the `'searchableDropdown'` chip variant. */
67
+ filterType?: 'text' | 'date' | 'select' | 'searchable-select' | 'number';
68
+ /** Options for `'select'` / `'searchable-select'` chip variants. */
69
69
  filterOptions?: {
70
70
  label: string;
71
71
  value: string;
@@ -80,6 +80,8 @@ export interface DynamicFilterBarProps {
80
80
  columnFilters: MRT_ColumnFiltersState;
81
81
  onColumnFilterChange: (f: MRT_ColumnFiltersState) => void;
82
82
  availableColumns: AvailableColumn[];
83
+ /** Maximum number of chips that may be visible at once. Default: 4. */
84
+ maxVisibleFilters?: number;
83
85
  }
84
- declare const DynamicFilterBar: ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, }: DynamicFilterBarProps) => import("react/jsx-runtime").JSX.Element;
86
+ declare const DynamicFilterBar: ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, maxVisibleFilters, }: DynamicFilterBarProps) => import("react/jsx-runtime").JSX.Element;
85
87
  export default DynamicFilterBar;
@@ -9,7 +9,7 @@ import { DatePicker } from '@mui/x-date-pickers/DatePicker';
9
9
  import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
10
10
  import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
11
11
  import SingleSelectNonAutoComplete from '../FormComponents/Select/SingleSelectNonAutoComplete.esm.js';
12
- import { Box, Typography, Button, Popover, TextField, Stack, InputAdornment, List, ListItemButton, ListItemText, Tooltip, Divider } from '@mui/material';
12
+ import { Box, Typography, Tooltip, Button, Popover, TextField, Stack, InputAdornment, List, ListItemButton, ListItemText, Divider } from '@mui/material';
13
13
  import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
14
14
  import TuneIcon from '@mui/icons-material/Tune';
15
15
  import CloseIcon from '@mui/icons-material/Close';
@@ -22,6 +22,7 @@ import SearchIcon from '@mui/icons-material/Search';
22
22
  // that DatepickerWrapperV2 passes to onChangeFn
23
23
  dayjs.extend(customParseFormat);
24
24
  // ─── Type pill metadata ───────────────────────────────────────────────────────
25
+ // Server-side filter pills (used in SERVER FILTERS section of Manage Filters)
25
26
  const TYPE_PILL = {
26
27
  dateRange: { label: 'Range', color: '#1565c0', bg: '#e3f2fd' },
27
28
  date: { label: 'Date', color: '#00695c', bg: '#e0f2f1' },
@@ -29,6 +30,14 @@ const TYPE_PILL = {
29
30
  dropdown: { label: 'Select', color: '#6a1b9a', bg: '#f3e5f5' },
30
31
  searchableDropdown: { label: 'Search', color: '#bf360c', bg: '#fbe9e7' },
31
32
  };
33
+ // Column filter type pills (used in COLUMN FILTERS section of Manage Filters)
34
+ const COLUMN_TYPE_PILL = {
35
+ text: { label: 'Text', color: '#2e7d32', bg: '#e8f5e9' },
36
+ date: { label: 'Date', color: '#00695c', bg: '#e0f2f1' },
37
+ select: { label: 'Select', color: '#bf360c', bg: '#fbe9e7' },
38
+ 'searchable-select': { label: 'Search', color: '#bf360c', bg: '#fbe9e7' },
39
+ number: { label: 'Number', color: '#e65100', bg: '#fff3e0' },
40
+ };
32
41
  // ─── Chip shared style ────────────────────────────────────────────────────────
33
42
  const chipSx = (active) => ({
34
43
  borderRadius: 5,
@@ -41,8 +50,24 @@ const chipSx = (active) => ({
41
50
  whiteSpace: 'nowrap',
42
51
  px: 1.5,
43
52
  minHeight: 30,
53
+ // Cap chip width so long option labels don't break the filter bar layout
54
+ maxWidth: 260,
55
+ overflow: 'hidden',
44
56
  '&:hover': { borderColor: 'primary.main', bgcolor: 'rgba(25,118,210,0.08)' },
45
57
  });
58
+ // ─── ChipLabel — renders button text with ellipsis when it overflows ──────────
59
+ //
60
+ // MUI Button is a flex container: the text child must have `min-width: 0`
61
+ // (overrides the default `min-width: auto`) so it can shrink past its natural
62
+ // size and trigger `text-overflow: ellipsis`.
63
+ const ChipLabel = ({ text }) => (jsx(Box, { component: "span", sx: {
64
+ overflow: 'hidden',
65
+ textOverflow: 'ellipsis',
66
+ whiteSpace: 'nowrap',
67
+ display: 'block',
68
+ minWidth: 0,
69
+ flex: '1 1 0',
70
+ }, children: text }));
46
71
  // ─── Date helper ──────────────────────────────────────────────────────────────
47
72
  const fmtDate = (iso) => {
48
73
  if (!iso)
@@ -95,13 +120,14 @@ const DateRangeChip = ({ label, fromDate, toDate, onApply, onRemove }) => {
95
120
  setAnchor(null);
96
121
  }
97
122
  };
98
- return (jsxs(Fragment, { children: [jsx(Button, { variant: "outlined", size: "small", onClick: openPicker, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: chipLabel }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, overflow: 'hidden' } }, children: [jsx(distExports.DateRange, { editableDateInputs: false, onChange: handleRangeChange, moveRangeOnFirstSelection: false, ranges: selRange, months: 2, direction: "horizontal", showDateDisplay: false, dateDisplayFormat: "dd/MM/yyyy", rangeColors: ['#1976d2'] }), active && (jsx(Box, { sx: { display: 'flex', justifyContent: 'flex-end', px: 2, pb: 1.5 }, children: jsx(Button, { size: "small", color: "inherit", onClick: () => { onApply('', ''); setAnchor(null); }, children: "Clear" }) }))] })] }));
123
+ return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipLabel : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: openPicker, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipLabel }) }) }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, overflow: 'hidden' } }, children: [jsx(distExports.DateRange, { editableDateInputs: false, onChange: handleRangeChange, moveRangeOnFirstSelection: false, ranges: selRange, months: 2, direction: "horizontal", showDateDisplay: false, dateDisplayFormat: "dd/MM/yyyy", rangeColors: ['#1976d2'] }), active && (jsx(Box, { sx: { display: 'flex', justifyContent: 'flex-end', px: 2, pb: 1.5 }, children: jsx(Button, { size: "small", color: "inherit", onClick: () => { onApply('', ''); setAnchor(null); }, children: "Clear" }) }))] })] }));
99
124
  };
100
125
  const TextFilterChip = ({ label, value, onApply, onRemove, placeholder }) => {
101
126
  const [anchor, setAnchor] = useState(null);
102
127
  const [draft, setDraft] = useState('');
103
128
  const active = Boolean(value);
104
- return (jsxs(Fragment, { children: [jsx(Button, { variant: "outlined", size: "small", onClick: (e) => { setDraft(value); setAnchor(e.currentTarget); }, endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: active ? `${label}: ${value}` : label }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, minWidth: 240 } }, children: jsxs(Box, { sx: { p: 2 }, children: [jsx(Typography, { variant: "caption", fontWeight: 600, color: "text.secondary", display: "block", mb: 1.5, children: label }), jsx(TextField, { value: draft, onChange: (e) => setDraft(e.target.value), placeholder: placeholder, size: "small", fullWidth: true, autoFocus: true, onKeyDown: (e) => {
129
+ const chipText = active ? `${label}: ${value}` : label;
130
+ return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: (e) => { setDraft(value); setAnchor(e.currentTarget); }, endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, minWidth: 240 } }, children: jsxs(Box, { sx: { p: 2 }, children: [jsx(Typography, { variant: "caption", fontWeight: 600, color: "text.secondary", display: "block", mb: 1.5, children: label }), jsx(TextField, { value: draft, onChange: (e) => setDraft(e.target.value), placeholder: placeholder, size: "small", fullWidth: true, autoFocus: true, onKeyDown: (e) => {
105
131
  if (e.key === 'Enter') {
106
132
  onApply(draft);
107
133
  setAnchor(null);
@@ -129,11 +155,12 @@ const DatePickerChip = ({ label, value, onApply, onRemove }) => {
129
155
  }
130
156
  setOpen(false);
131
157
  };
158
+ const chipText = active ? `${label}: ${fmtDate(value)}` : label;
132
159
  return (
133
160
  // LocalizationProvider must wrap DatePicker — scoped here so it only
134
161
  // loads when the chip is actually used (DatePickerChip is tree-shaken
135
162
  // if the 'date' filter type is never included in serverFilterDefs).
136
- jsxs(LocalizationProvider, { dateAdapter: AdapterDayjs, children: [jsx(Button, { variant: "outlined", size: "small", onClick: handleChipClick, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: active ? `${label}: ${fmtDate(value)}` : label }), jsx(DatePicker, { value: dayjsValue, open: open, onClose: () => setOpen(false), onChange: handleChange, slotProps: {
163
+ jsxs(LocalizationProvider, { dateAdapter: AdapterDayjs, children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: handleChipClick, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsx(DatePicker, { value: dayjsValue, open: open, onClose: () => setOpen(false), onChange: handleChange, slotProps: {
137
164
  textField: { sx: { display: 'none' }, size: 'small' },
138
165
  popper: {
139
166
  anchorEl,
@@ -171,7 +198,8 @@ const DropdownFilterChip = ({ label, value, options, onApply, onRemove }) => {
171
198
  ...options.map((o) => ({ label: o.label, value: o.value })),
172
199
  ],
173
200
  };
174
- return (jsxs(Fragment, { children: [jsx(Button, { variant: "outlined", size: "small", onClick: (e) => setAnchor(e.currentTarget), startIcon: jsx(ArrowDropDownIcon, { sx: { fontSize: '15px !important', mr: -0.5 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: active ? `${label}: ${selectedLabel}` : label }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, p: 1.5, minWidth: 240 } }, children: jsx(SingleSelectNonAutoComplete, { props: {
201
+ const chipText = active ? `${label}: ${selectedLabel}` : label;
202
+ return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: (e) => setAnchor(e.currentTarget), startIcon: jsx(ArrowDropDownIcon, { sx: { fontSize: '15px !important', mr: -0.5 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, p: 1.5, minWidth: 240 } }, children: jsx(SingleSelectNonAutoComplete, { props: {
175
203
  item,
176
204
  register,
177
205
  control,
@@ -199,7 +227,8 @@ const SearchableSelectChip = ({ label, value, options, onApply, onRemove, placeh
199
227
  const filtered = search
200
228
  ? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))
201
229
  : options;
202
- return (jsxs(Fragment, { children: [jsx(Button, { variant: "outlined", size: "small", onClick: open, startIcon: jsx(SearchIcon, { sx: { fontSize: '14px !important', mr: -0.25 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: active ? `${label}: ${selectedLabel}` : label }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: {
230
+ const chipText = active ? `${label}: ${selectedLabel}` : label;
231
+ return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: open, startIcon: jsx(SearchIcon, { sx: { fontSize: '14px !important', mr: -0.25 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: {
203
232
  sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, width: 280, display: 'flex', flexDirection: 'column' },
204
233
  }, children: [jsx(Box, { sx: { px: 1.5, pt: 1.5, pb: 0.75 }, children: jsx(TextField, { size: "small", fullWidth: true, autoFocus: true, placeholder: placeholder, value: search, onChange: (e) => setSearch(e.target.value), onKeyDown: (e) => { if (e.key === 'Escape')
205
234
  setAnchor(null); }, InputProps: {
@@ -217,55 +246,53 @@ const SearchableSelectChip = ({ label, value, options, onApply, onRemove, placeh
217
246
  } }), isSelected && (jsx(CheckIcon, { sx: { fontSize: 15, color: 'primary.main', flexShrink: 0 } }))] }, opt.value));
218
247
  }))] })] })] }));
219
248
  };
220
- const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, onToggle, }) => {
249
+ const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, onToggle, maxVisible = 4, }) => {
221
250
  const [anchor, setAnchor] = useState(null);
251
+ const atLimit = visibleIds.length >= maxVisible;
252
+ // Shared pill box renderer
253
+ const PillBox = ({ bg, color, label }) => (jsx(Box, { component: "span", sx: {
254
+ mr: 1.25, flexShrink: 0,
255
+ fontSize: 10, fontWeight: 700,
256
+ px: 0.75, py: '2px',
257
+ borderRadius: '4px',
258
+ bgcolor: bg,
259
+ color,
260
+ textTransform: 'uppercase',
261
+ letterSpacing: 0.4,
262
+ lineHeight: 1.6,
263
+ }, children: label }));
222
264
  return (jsxs(Fragment, { children: [jsx(Tooltip, { title: "Add or remove filter chips", children: jsx(Button, { size: "small", variant: "outlined", startIcon: jsx(TuneIcon, { sx: { fontSize: 14 } }), onClick: (e) => setAnchor(e.currentTarget), sx: {
223
265
  borderRadius: 5, textTransform: 'none', fontSize: 12,
224
266
  borderColor: 'divider', color: 'text.secondary',
225
267
  px: 1.5, minHeight: 30,
226
268
  '&:hover': { borderColor: 'primary.main', color: 'primary.main' },
227
- }, children: "Manage Filters" }) }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, width: 280 } }, children: jsxs(Box, { sx: { py: 1 }, children: [serverFilterDefs.length > 0 && (jsxs(Fragment, { children: [jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Server Filters" }), jsx(List, { dense: true, disablePadding: true, children: serverFilterDefs.map((def) => {
228
- const selected = visibleIds.includes(def.id);
229
- const pill = TYPE_PILL[def.type];
230
- return (jsxs(ListItemButton, { onClick: () => onToggle(def.id), sx: { px: 2, py: 0.5 }, children: [jsx(Box, { component: "span", sx: {
231
- mr: 1.25, flexShrink: 0,
232
- fontSize: 10, fontWeight: 700,
233
- px: 0.75, py: '2px',
234
- borderRadius: '4px',
235
- bgcolor: pill.bg,
236
- color: pill.color,
237
- textTransform: 'uppercase',
238
- letterSpacing: 0.4,
239
- lineHeight: 1.6,
240
- }, children: pill.label }), jsx(ListItemText, { primary: def.label, primaryTypographyProps: {
241
- fontSize: 13,
242
- color: selected ? 'primary.main' : 'text.primary',
243
- } }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }, def.id));
244
- }) })] })), availableColumns.length > 0 && (jsxs(Fragment, { children: [jsx(Divider, { sx: { my: 1 } }), jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Column Filters" }), jsx(List, { dense: true, disablePadding: true, sx: { maxHeight: 260, overflowY: 'auto' }, children: availableColumns.map((col) => {
245
- const selected = visibleIds.includes(col.id);
246
- // Pick the type pill based on the column's declared filter type
247
- const pill = col.filterType === 'date'
248
- ? TYPE_PILL.date
249
- : col.filterType === 'searchableDropdown'
250
- ? TYPE_PILL.searchableDropdown
251
- : TYPE_PILL.text;
252
- return (jsxs(ListItemButton, { onClick: () => onToggle(col.id), sx: { px: 2, py: 0.4 }, children: [jsx(Box, { component: "span", sx: {
253
- mr: 1.25, flexShrink: 0,
254
- fontSize: 10, fontWeight: 700,
255
- px: 0.75, py: '2px',
256
- borderRadius: '4px',
257
- bgcolor: pill.bg,
258
- color: pill.color,
259
- textTransform: 'uppercase',
260
- letterSpacing: 0.4,
261
- lineHeight: 1.6,
262
- }, children: pill.label }), jsx(ListItemText, { primary: col.label, primaryTypographyProps: {
263
- fontSize: 13,
264
- color: selected ? 'primary.main' : 'text.primary',
265
- } }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }, col.id));
266
- }) })] }))] }) })] }));
269
+ }, children: "Manage Filters" }) }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, width: 280, overflow: 'hidden' } }, children: [atLimit && (jsx(Box, { sx: {
270
+ px: 2, py: 0.75,
271
+ bgcolor: 'rgba(25,118,210,0.07)',
272
+ borderBottom: '1px solid rgba(25,118,210,0.2)',
273
+ display: 'flex',
274
+ alignItems: 'center',
275
+ gap: 0.75,
276
+ }, children: jsxs(Typography, { sx: { fontSize: 11, color: 'primary.main', fontWeight: 600, lineHeight: 1.4 }, children: [visibleIds.length, "/", maxVisible, " filters active \u2014 remove one to add another"] }) })), jsxs(Box, { sx: { maxHeight: 360, overflowY: 'auto', py: 1 }, children: [serverFilterDefs.length > 0 && (jsxs(Fragment, { children: [jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Server Filters" }), jsx(List, { dense: true, disablePadding: true, children: serverFilterDefs.map((def) => {
277
+ const selected = visibleIds.includes(def.id);
278
+ const blocked = atLimit && !selected; // at cap and not yet shown → disabled
279
+ const pill = TYPE_PILL[def.type];
280
+ return (jsx(Tooltip, { title: blocked ? `Maximum ${maxVisible} filters allowed` : '', placement: "right", arrow: true, children: jsx("span", { style: { display: 'block' }, children: jsxs(ListItemButton, { onClick: () => !blocked && onToggle(def.id), disabled: blocked, sx: { px: 2, py: 0.5, opacity: blocked ? 0.45 : 1 }, children: [jsx(PillBox, { bg: pill.bg, color: pill.color, label: pill.label }), jsx(ListItemText, { primary: def.label, primaryTypographyProps: {
281
+ fontSize: 13,
282
+ color: selected ? 'primary.main' : 'text.primary',
283
+ } }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }) }) }, def.id));
284
+ }) })] })), availableColumns.length > 0 && (jsxs(Fragment, { children: [jsx(Divider, { sx: { my: 1 } }), jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Column Filters" }), jsx(List, { dense: true, disablePadding: true, children: availableColumns.map((col) => {
285
+ const selected = visibleIds.includes(col.id);
286
+ const blocked = atLimit && !selected;
287
+ const pill = COLUMN_TYPE_PILL[col.filterType ?? 'text'] ??
288
+ COLUMN_TYPE_PILL.text;
289
+ return (jsx(Tooltip, { title: blocked ? `Maximum ${maxVisible} filters allowed` : '', placement: "right", arrow: true, children: jsx("span", { style: { display: 'block' }, children: jsxs(ListItemButton, { onClick: () => !blocked && onToggle(col.id), disabled: blocked, sx: { px: 2, py: 0.4, opacity: blocked ? 0.45 : 1 }, children: [jsx(PillBox, { bg: pill.bg, color: pill.color, label: pill.label }), jsx(ListItemText, { primary: col.label, primaryTypographyProps: {
290
+ fontSize: 13,
291
+ color: selected ? 'primary.main' : 'text.primary',
292
+ } }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }) }) }, col.id));
293
+ }) })] }))] })] })] }));
267
294
  };
268
- const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, }) => {
295
+ const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, maxVisibleFilters = 4, }) => {
269
296
  const getColValue = (id) => columnFilters.find((f) => f.id === id)?.value ?? '';
270
297
  const applyColFilter = (id, value) => {
271
298
  const rest = columnFilters.filter((f) => f.id !== id);
@@ -313,12 +340,12 @@ const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter,
313
340
  if (col.filterType === 'date') {
314
341
  return (jsx(DatePickerChip, { label: col.label, value: getColValue(id), onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id) }, id));
315
342
  }
316
- if (col.filterType === 'searchableDropdown') {
343
+ if (col.filterType === 'select' || col.filterType === 'searchable-select') {
317
344
  return (jsx(SearchableSelectChip, { label: col.label, value: getColValue(id), options: col.filterOptions ?? [], onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id) }, id));
318
345
  }
319
346
  // Default: free-text input
320
347
  return (jsx(TextFilterChip, { label: col.label, value: getColValue(id), onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id), placeholder: `Filter by ${col.label}` }, id));
321
- }), jsx(ManageFiltersButton, { serverFilterDefs: serverFilterDefs, visibleIds: visibleFilterIds, availableColumns: availableColumns, onToggle: onToggleFilter })] }));
348
+ }), jsx(ManageFiltersButton, { serverFilterDefs: serverFilterDefs, visibleIds: visibleFilterIds, availableColumns: availableColumns, onToggle: onToggleFilter, maxVisible: maxVisibleFilters })] }));
322
349
  };
323
350
 
324
351
  export { DynamicFilterBar as default };
@@ -1,14 +1,21 @@
1
- import { type MRT_ColumnDef } from 'material-react-table';
1
+ import type { TPColumnDef } from './types';
2
2
  import { type ServerFilterDef } from './DynamicFilterBar';
3
3
  export type { ServerFilterDef };
4
+ export type { TPColumnDef } from './types';
4
5
  /** Shape that fetchPage must return. */
5
6
  export interface PagedResult<TData> {
6
7
  data: TData[];
7
8
  totalRecords: number;
8
9
  }
9
10
  export interface GenericPaginatedGridProps<TData extends object> {
10
- /** MRT column definitions typed to your data shape. */
11
- columns: MRT_ColumnDef<TData>[];
11
+ /**
12
+ * Column definitions. Use `TPColumnDef<TData>` (a superset of `MRT_ColumnDef`)
13
+ * to get top-level `filterType` and `options` support with no `meta` boilerplate.
14
+ *
15
+ * The grid automatically injects the right `filterFn` for each `filterType`,
16
+ * and wires up the correct chip in Manage Filters → Column Filters.
17
+ */
18
+ columns: TPColumnDef<TData>[];
12
19
  /**
13
20
  * Async function called on every page/filter change.
14
21
  * Receives the current flat filter map and the 0-based page index.
@@ -35,6 +42,12 @@ export interface GenericPaginatedGridProps<TData extends object> {
35
42
  * Accepts any valid CSS colour string.
36
43
  */
37
44
  headerBgColor?: string;
45
+ /**
46
+ * Maximum number of filter chips that can be visible at once.
47
+ * Prevents the filter bar from wrapping to a second row on typical screens.
48
+ * Default: 4.
49
+ */
50
+ maxVisibleFilters?: number;
38
51
  }
39
- declare function GenericPaginatedGrid<TData extends object>({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize, exportFilename, tableHeight, pageSizeOptions, headerBgColor, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
52
+ declare function GenericPaginatedGrid<TData extends object>({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize, exportFilename, tableHeight, pageSizeOptions, headerBgColor, maxVisibleFilters, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
40
53
  export default GenericPaginatedGrid;
@@ -43,7 +43,7 @@ const PaginationFooter = ({ pageIndex, pageSize, totalRecords, isFetching, isLoa
43
43
  }, children: pageIndex + 1 }), jsx(Tooltip, { title: "Next page", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: onNext, disabled: !canNext, children: jsx(ChevronRightIcon, { sx: { fontSize: 20 } }) }) }) }), jsx(Tooltip, { title: "Last page", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: onLast, disabled: !canNext, children: jsx(LastPageIcon, { sx: { fontSize: 20 } }) }) }) })] })] }));
44
44
  };
45
45
  // ─── GenericPaginatedGrid ─────────────────────────────────────────────────────
46
- function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize = 10000, exportFilename = 'export', tableHeight = '60vh', pageSizeOptions = [1000, 5000, 10000], headerBgColor, }) {
46
+ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize = 10000, exportFilename = 'export', tableHeight = '60vh', pageSizeOptions = [1000, 5000, 10000], headerBgColor, maxVisibleFilters = 4, }) {
47
47
  const defaultVisible = defaultVisibleFilterIds
48
48
  ?? (serverFilterDefs.length > 0 ? [serverFilterDefs[0].id] : []);
49
49
  // ── State ──────────────────────────────────────────────────────────────────
@@ -66,6 +66,34 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
66
66
  });
67
67
  const rows = data?.data ?? [];
68
68
  const totalRecords = data?.totalRecords ?? 0;
69
+ // ── Strip custom props + auto-inject filterFn before passing to MRT ──────────
70
+ //
71
+ // `TPColumnDef` extends `MRT_ColumnDef` with `filterType` and `options`.
72
+ // MRT doesn't know these props, so we strip them here. We also inject the
73
+ // appropriate `filterFn` automatically so callers never have to write one.
74
+ const processedColumns = useMemo(() => {
75
+ return columns.map((col) => {
76
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
77
+ const { filterType, options, ...mrtCol } = col;
78
+ // Auto-inject filterFn only when the user hasn't already supplied one.
79
+ if (!mrtCol.filterFn && filterType) {
80
+ if (filterType === 'date') {
81
+ // ISO date strings: "2026-05-05T00:00:00" → startsWith "2026-05-05"
82
+ mrtCol.filterFn = (row, columnId, filterValue) => filterValue
83
+ ? (row.getValue(columnId) ?? '').startsWith(filterValue)
84
+ : true;
85
+ }
86
+ else if (filterType === 'select' || filterType === 'searchable-select') {
87
+ // Exact-value match (avoids substring false positives)
88
+ mrtCol.filterFn = (row, columnId, filterValue) => filterValue
89
+ ? row.getValue(columnId) === filterValue
90
+ : true;
91
+ }
92
+ // 'text' and 'number' use MRT's built-in client-side filtering
93
+ }
94
+ return mrtCol;
95
+ });
96
+ }, [columns]);
69
97
  // ── Derive column list for filter chip picker ──────────────────────────────
70
98
  //
71
99
  // A column is excluded from the "Column Filters" section of Manage Filters
@@ -73,7 +101,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
73
101
  // 1. It has no accessorKey (computed / display columns).
74
102
  // 2. Its accessorKey is already handled by a server-side 'date' filter def.
75
103
  // 3. Its MRT `enableColumnFilter` prop is explicitly set to `false` —
76
- // this is the standard MRT opt-out flag for column-level filters.
104
+ // use this for numeric/computed columns that don't need a filter chip.
77
105
  const availableColumns = useMemo(() => {
78
106
  const serverManagedColKeys = new Set(serverFilterDefs
79
107
  .filter((d) => d.type === 'date')
@@ -82,16 +110,14 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
82
110
  .filter((c) => 'accessorKey' in c &&
83
111
  c.accessorKey &&
84
112
  !serverManagedColKeys.has(c.accessorKey) &&
85
- // Honour the standard MRT opt-out flag: columns with
86
- // enableColumnFilter: false should not appear in Manage Filters.
87
113
  c.enableColumnFilter !== false)
88
114
  .map((c) => ({
89
115
  id: c.accessorKey,
90
116
  label: c.header,
91
- // Forward column-level filter type hints so DynamicFilterBar can render
92
- // the right chip (text / date / searchableDropdown) for each column.
93
- filterType: c.meta?.filterType,
94
- filterOptions: c.meta?.filterOptions,
117
+ // Pass filterType directly from TPColumnDef (no meta unwrapping needed)
118
+ filterType: c.filterType,
119
+ // Map TPColumnDef.options → AvailableColumn.filterOptions
120
+ filterOptions: c.options,
95
121
  }));
96
122
  }, [columns, serverFilterDefs]);
97
123
  // ── Handlers ───────────────────────────────────────────────────────────────
@@ -99,7 +125,13 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
99
125
  setFilterValues(newValues);
100
126
  setPagination((p) => ({ ...p, pageIndex: 0 }));
101
127
  };
102
- const handleToggleFilter = (id) => setVisibleFilterIds((prev) => prev.includes(id) ? prev.filter((v) => v !== id) : [...prev, id]);
128
+ const handleToggleFilter = (id) => setVisibleFilterIds((prev) => {
129
+ if (prev.includes(id))
130
+ return prev.filter((v) => v !== id); // always allow remove
131
+ if (prev.length >= maxVisibleFilters)
132
+ return prev; // cap reached — ignore add
133
+ return [...prev, id];
134
+ });
103
135
  const handleClearAll = () => {
104
136
  setFilterValues(defaultFilters);
105
137
  setColumnFilters([]);
@@ -127,7 +159,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
127
159
  columnFilters.some((f) => f.value);
128
160
  // ── Table instance ─────────────────────────────────────────────────────────
129
161
  const table = useMaterialReactTable({
130
- columns,
162
+ columns: processedColumns,
131
163
  data: rows,
132
164
  manualPagination: true,
133
165
  rowCount: totalRecords,
@@ -187,8 +219,8 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
187
219
  whiteSpace: 'normal',
188
220
  borderRight: '1px solid rgba(224,224,224,1)',
189
221
  borderBottom: '2px solid rgba(0,0,0,0.15)',
190
- '& button[aria-label="Move"]': { display: 'none' },
191
- '& .MuiTableSortLabel-icon': { display: 'none' },
222
+ '& button[aria-label="Move"]': { display: 'none !important' },
223
+ '& .MuiTableSortLabel-icon': { display: 'none !important' },
192
224
  '& .Mui-TableHeadCell-ResizeHandle-Wrapper': {
193
225
  height: '100%',
194
226
  top: 0,
@@ -223,7 +255,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
223
255
  muiToolbarAlertBannerProps: isError
224
256
  ? { color: 'error', children: 'Failed to load data. Please try again.' }
225
257
  : undefined,
226
- renderTopToolbarCustomActions: () => (jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0, pr: 1, gap: 0.5 }, children: [jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexShrink: 0, gap: 0.25 }, children: [jsx(Tooltip, { title: "Refresh current batch", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: () => refetch(), disabled: isFetching, children: jsx(RefreshIcon, { fontSize: "small" }) }) }) }), jsx(Tooltip, { title: "Export batch as CSV", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: handleExport, disabled: rows.length === 0 || isFetching, children: jsx(FileDownloadIcon, { fontSize: "small" }) }) }) })] }), jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: jsx(DynamicFilterBar, { serverFilterDefs: serverFilterDefs, visibleFilterIds: visibleFilterIds, onToggleFilter: handleToggleFilter, filterValues: filterValues, onFilterValuesChange: handleFilterValuesChange, columnFilters: columnFilters, onColumnFilterChange: setColumnFilters, availableColumns: availableColumns }) }), hasAnyValue && (jsx(Button, { size: "small", onClick: handleClearAll, sx: {
258
+ renderTopToolbarCustomActions: () => (jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0, pr: 1, gap: 0.5 }, children: [jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexShrink: 0, gap: 0.25 }, children: [jsx(Tooltip, { title: "Refresh current batch", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: () => refetch(), disabled: isFetching, children: jsx(RefreshIcon, { fontSize: "small" }) }) }) }), jsx(Tooltip, { title: "Export batch as CSV", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: handleExport, disabled: rows.length === 0 || isFetching, children: jsx(FileDownloadIcon, { fontSize: "small" }) }) }) })] }), jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: jsx(DynamicFilterBar, { serverFilterDefs: serverFilterDefs, visibleFilterIds: visibleFilterIds, onToggleFilter: handleToggleFilter, filterValues: filterValues, onFilterValuesChange: handleFilterValuesChange, columnFilters: columnFilters, onColumnFilterChange: setColumnFilters, availableColumns: availableColumns, maxVisibleFilters: maxVisibleFilters }) }), hasAnyValue && (jsx(Button, { size: "small", onClick: handleClearAll, sx: {
227
259
  flexShrink: 0,
228
260
  textTransform: 'none',
229
261
  fontSize: 12,
@@ -234,7 +266,11 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
234
266
  }, children: "Clear All" }))] })),
235
267
  renderBottomToolbar: ({ table: t }) => (jsx(PaginationFooter, { pageIndex: t.getState().pagination.pageIndex, pageSize: t.getState().pagination.pageSize, totalRecords: totalRecords, isFetching: isFetching, isLoading: isLoading, canPrev: t.getCanPreviousPage() && !isFetching, canNext: t.getCanNextPage() && !isFetching, onFirst: () => t.firstPage(), onPrev: () => t.previousPage(), onNext: () => t.nextPage(), onLast: () => t.lastPage(), onPageSizeChange: (s) => t.setPageSize(s), pageSizeOptions: pageSizeOptions })),
236
268
  });
237
- return (jsxs(Box, { sx: { position: 'relative' }, children: [jsx(GlobalStyles, { styles: { 'button[aria-label="Pin to right"]': { display: 'none' } } }), isLoading && jsx(OverlayLoader, { message: "Loading data\u2026" }), !isLoading && isFetching && jsx(OverlayLoader, { message: "Updating data\u2026" }), jsx(MaterialReactTable, { table: table })] }));
269
+ return (jsxs(Box, { className: "tp-gpg-root", sx: { position: 'relative' }, children: [jsx(GlobalStyles, { styles: {
270
+ 'button[aria-label="Pin to right"]': { display: 'none' },
271
+ '.tp-gpg-root .MuiTableSortLabel-icon': { display: 'none !important' },
272
+ '.tp-gpg-root button[aria-label="Move"]': { display: 'none !important' },
273
+ } }), isLoading && jsx(OverlayLoader, { message: "Loading data\u2026" }), !isLoading && isFetching && jsx(OverlayLoader, { message: "Updating data\u2026" }), jsx(MaterialReactTable, { table: table })] }));
238
274
  }
239
275
 
240
276
  export { GenericPaginatedGrid as default };
@@ -1,22 +1,3 @@
1
- import type { MRT_ColumnDef } from 'material-react-table';
1
+ import type { TPColumnDef } from './types';
2
2
  import type { InvoiceDetail } from './types';
3
- import type { RowData } from '@tanstack/table-core';
4
- declare module '@tanstack/table-core' {
5
- interface ColumnMeta<TData extends RowData, TValue> {
6
- /**
7
- * Which chip variant to render in the "Column Filters" section of
8
- * Manage Filters. Defaults to `'text'` when omitted.
9
- *
10
- * 'text' → TextFilterChip (free-text input)
11
- * 'date' → DatePickerChip (MUI X calendar)
12
- * 'searchableDropdown' → SearchableSelectChip (search + options list)
13
- */
14
- filterType?: 'text' | 'date' | 'searchableDropdown';
15
- /** Option pairs for the `'searchableDropdown'` filter chip. */
16
- filterOptions?: {
17
- label: string;
18
- value: string;
19
- }[];
20
- }
21
- }
22
- export declare const invoiceColumns: MRT_ColumnDef<InvoiceDetail>[];
3
+ export declare const invoiceColumns: TPColumnDef<InvoiceDetail>[];
@@ -1,3 +1,64 @@
1
+ import type { MRT_ColumnDef } from 'material-react-table';
2
+ /**
3
+ * Filter chip variant shown in Manage Filters → Column Filters.
4
+ *
5
+ * | Value | Chip rendered |
6
+ * |---------------------|---------------------------|
7
+ * | `'text'` | Free-text input (default) |
8
+ * | `'date'` | Calendar date picker |
9
+ * | `'select'` | Searchable option list |
10
+ * | `'searchable-select'` | Searchable option list |
11
+ * | `'number'` | Numeric input |
12
+ *
13
+ * Set `enableColumnFilter: false` to hide the column from Manage Filters
14
+ * entirely (e.g. for computed or numeric columns that don't need filtering).
15
+ */
16
+ export type ColumnFilterType = 'text' | 'date' | 'select' | 'searchable-select' | 'number';
17
+ /**
18
+ * Drop-in replacement for `MRT_ColumnDef` that adds top-level
19
+ * `filterType` and `options` so you never have to write `meta` blocks
20
+ * or custom `filterFn` — the grid handles both automatically.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import type { TPColumnDef } from './types';
25
+ *
26
+ * const columns: TPColumnDef<MyRow>[] = [
27
+ * // Date picker chip
28
+ * { accessorKey: 'invoiceDate', header: 'Invoice Date', filterType: 'date' },
29
+ *
30
+ * // Searchable option list chip
31
+ * {
32
+ * accessorKey: 'status',
33
+ * header: 'Status',
34
+ * filterType: 'searchable-select',
35
+ * options: [
36
+ * { label: 'Active', value: 'A' },
37
+ * { label: 'Inactive', value: 'I' },
38
+ * ],
39
+ * },
40
+ *
41
+ * // Hidden from Manage Filters (numeric column)
42
+ * { accessorKey: 'qty', header: 'Qty', enableColumnFilter: false },
43
+ * ];
44
+ * ```
45
+ */
46
+ export type TPColumnDef<TData extends object = object> = MRT_ColumnDef<TData> & {
47
+ /**
48
+ * Which filter chip to show in Manage Filters → Column Filters.
49
+ * Omit (or set to `'text'`) for a plain text-input chip.
50
+ */
51
+ filterType?: ColumnFilterType;
52
+ /**
53
+ * Option pairs for `'select'` and `'searchable-select'` filter types.
54
+ * Each entry needs `label` (display text) and `value` (filter value sent).
55
+ */
56
+ options?: {
57
+ label: string;
58
+ value: string | number;
59
+ disable?: boolean;
60
+ }[];
61
+ };
1
62
  export interface InvoiceDetail {
2
63
  Data_from: string;
3
64
  FINYEAR: string;
@@ -1,4 +1,4 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm4.js';
1
+ import { __exports as Calendar } from '../../../../../_virtual/index.esm7.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateInput } from '../../../../../_virtual/index.esm12.js';
1
+ import { __exports as DateInput } from '../../../../../_virtual/index.esm13.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireClassnames } from '../../../../classnames/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRange } from '../../../../../_virtual/index.esm5.js';
1
+ import { __exports as DateRange } from '../../../../../_virtual/index.esm6.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireCalendar } from '../Calendar/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm7.js';
1
+ import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm5.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDateRange } from '../DateRange/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DefinedRange } from '../../../../../_virtual/index.esm6.js';
1
+ import { __exports as DefinedRange } from '../../../../../_virtual/index.esm4.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireStyles } from '../../styles.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as InputRangeField } from '../../../../../_virtual/index.esm14.js';
1
+ import { __exports as InputRangeField } from '../../../../../_virtual/index.esm12.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { __exports as Month } from '../../../../../_virtual/index.esm13.js';
1
+ import { __exports as Month } from '../../../../../_virtual/index.esm14.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
@@ -26,122 +26,122 @@ import { useEffect } from 'react';
26
26
  const STYLE_ID = 'tp-rdr-styles';
27
27
  /* ─── Combined CSS from react-date-range ──────────────────────────────────── */
28
28
  /* Source: react-date-range/dist/styles.css + theme/default.css v2.0.1 */
29
- const RDR_CSS = `
30
- /* ── react-date-range/dist/styles.css ── */
31
- .rdrCalendarWrapper{box-sizing:border-box;background:#ffffff;display:inline-flex;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;user-select:none}
32
- .rdrDateDisplay{display:flex;justify-content:space-between}
33
- .rdrDateDisplayItem{flex:1 1;width:0;text-align:center;color:inherit}
34
- .rdrDateDisplayItem+.rdrDateDisplayItem{margin-left:.833em}
35
- .rdrDateDisplayItem input{text-align:inherit}
36
- .rdrDateDisplayItem input:disabled{cursor:default}
37
- .rdrDateDisplayItemActive{}
38
- .rdrMonthAndYearWrapper{box-sizing:inherit;display:flex;justify-content:space-between}
39
- .rdrMonthAndYearPickers{flex:1 1 auto;display:flex;justify-content:center;align-items:center}
40
- .rdrMonthPicker{}
41
- .rdrYearPicker{}
42
- .rdrNextPrevButton{box-sizing:inherit;cursor:pointer;outline:none}
43
- .rdrPprevButton{}
44
- .rdrNextButton{}
45
- .rdrMonths{display:flex}
46
- .rdrMonthsVertical{flex-direction:column}
47
- .rdrMonthsHorizontal>div>div>div{display:flex;flex-direction:row}
48
- .rdrMonth{width:27.667em}
49
- .rdrWeekDays{display:flex}
50
- .rdrWeekDay{flex-basis:calc(100% / 7);box-sizing:inherit;text-align:center}
51
- .rdrDays{display:flex;flex-wrap:wrap}
52
- .rdrDateDisplayWrapper{}
53
- .rdrMonthName{}
54
- .rdrInfiniteMonths{overflow:auto}
55
- .rdrDateRangeWrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}
56
- .rdrDateInput{position:relative}
57
- .rdrDateInput input{outline:none}
58
- .rdrDateInput .rdrWarning{position:absolute;font-size:1.6em;line-height:1.6em;top:0;right:.25em;color:#FF0000}
59
- .rdrDay{box-sizing:inherit;width:calc(100% / 7);position:relative;font:inherit;cursor:pointer}
60
- .rdrDayNumber{display:block;position:relative}
61
- .rdrDayNumber span{color:#1d2429}
62
- .rdrDayDisabled{cursor:not-allowed}
63
- @supports (-ms-ime-align:auto){.rdrDay{flex-basis:14.285% !important}}
64
- .rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{pointer-events:none}
65
- .rdrInRange{}
66
- .rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{pointer-events:none}
67
- .rdrDayHovered{}
68
- .rdrDayActive{}
69
- .rdrDateRangePickerWrapper{display:inline-flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}
70
- .rdrDefinedRangesWrapper{}
71
- .rdrStaticRanges{display:flex;flex-direction:column}
72
- .rdrStaticRange{font-size:inherit}
73
- .rdrStaticRangeLabel{}
74
- .rdrInputRanges{}
75
- .rdrInputRange{display:flex}
76
- .rdrInputRangeInput{}
77
-
78
- /* ── react-date-range/dist/theme/default.css ── */
79
- .rdrCalendarWrapper{color:#000000;font-size:12px}
80
- .rdrDateDisplayWrapper{background-color:rgb(239,242,247)}
81
- .rdrDateDisplay{margin:.833em}
82
- .rdrDateDisplayItem{border-radius:4px;background-color:rgb(255,255,255);box-shadow:0 1px 2px 0 rgba(35,57,66,.21);border:1px solid transparent}
83
- .rdrDateDisplayItem input{cursor:pointer;height:2.5em;line-height:2.5em;border:0;background:transparent;width:100%;color:#849095}
84
- .rdrDateDisplayItemActive{border-color:currentColor}
85
- .rdrDateDisplayItemActive input{color:#7d888d}
86
- .rdrMonthAndYearWrapper{align-items:center;height:60px;padding-top:10px}
87
- .rdrMonthAndYearPickers{font-weight:600}
88
- .rdrMonthAndYearPickers select{-moz-appearance:none;appearance:none;-webkit-appearance:none;border:0;background:transparent;padding:10px 30px 10px 10px;border-radius:4px;outline:0;color:#3e484f;background:url("data:image/svg+xml;utf8,<svg width='9px' height='6px' viewBox='0 0 9 6' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g id='Artboard' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' transform='translate(-636.000000, -171.000000)' fill-opacity='0.368716033'><g id='input' transform='translate(172.000000, 37.000000)' fill='%230E242F' fill-rule='nonzero'><g id='Group-9' transform='translate(323.000000, 127.000000)'><path d='M142.280245,7.23952813 C141.987305,6.92353472 141.512432,6.92361662 141.219585,7.23971106 C140.926739,7.5558055 140.926815,8.06821394 141.219755,8.38420735 L145.498801,13 L149.780245,8.38162071 C150.073185,8.0656273 150.073261,7.55321886 149.780415,7.23712442 C149.487568,6.92102998 149.012695,6.92094808 148.719755,7.23694149 L145.498801,10.7113732 L142.280245,7.23952813 Z' id='arrow'></path></g></g></g></svg>") no-repeat;background-position:right 8px center;cursor:pointer;text-align:center}
89
- .rdrMonthAndYearPickers select:hover{background-color:rgba(0,0,0,.07)}
90
- .rdrMonthPicker,.rdrYearPicker{margin:0 5px}
91
- .rdrNextPrevButton{display:block;width:24px;height:24px;margin:0 .833em;padding:0;border:0;border-radius:5px;background:#EFF2F7}
92
- .rdrNextPrevButton:hover{background:#E1E7F0}
93
- .rdrNextPrevButton i{display:block;width:0;height:0;padding:0;text-align:center;border-style:solid;margin:auto;transform:translate(-3px,0)}
94
- .rdrPprevButton i{border-width:4px 6px 4px 4px;border-color:transparent rgb(52,73,94) transparent transparent;transform:translate(-3px,0)}
95
- .rdrNextButton i{margin:0 0 0 7px;border-width:4px 4px 4px 6px;border-color:transparent transparent transparent rgb(52,73,94);transform:translate(3px,0)}
96
- .rdrWeekDays{padding:0 .833em}
97
- .rdrMonth{padding:0 .833em 1.666em .833em}
98
- .rdrMonth .rdrWeekDays{padding:0}
99
- .rdrMonths.rdrMonthsVertical .rdrMonth:first-child .rdrMonthName{display:none}
100
- .rdrWeekDay{font-weight:400;line-height:2.667em;color:rgb(132,144,149)}
101
- .rdrDay{background:transparent;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:0;padding:0;line-height:3em;height:3em;text-align:center;color:#1d2429}
102
- .rdrDay:focus{outline:0}
103
- .rdrDayNumber{outline:0;font-weight:300;position:absolute;left:0;right:0;top:5px;bottom:5px;display:flex;align-items:center;justify-content:center}
104
- .rdrDayToday .rdrDayNumber span{font-weight:500}
105
- .rdrDayToday .rdrDayNumber span:after{content:'';position:absolute;bottom:4px;left:50%;transform:translate(-50%,0);width:18px;height:2px;border-radius:2px;background:#3d91ff}
106
- .rdrDayToday:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span:after{background:#fff}
107
- .rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:rgba(255,255,255,.85)}
108
- .rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{background:currentColor;position:absolute;top:5px;left:0;right:0;bottom:5px}
109
- .rdrSelected{left:2px;right:2px}
110
- .rdrInRange{}
111
- .rdrStartEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
112
- .rdrEndEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
113
- .rdrSelected{border-radius:1.042em}
114
- .rdrDayStartOfMonth .rdrInRange,.rdrDayStartOfMonth .rdrEndEdge,.rdrDayStartOfWeek .rdrInRange,.rdrDayStartOfWeek .rdrEndEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
115
- .rdrDayEndOfMonth .rdrInRange,.rdrDayEndOfMonth .rdrStartEdge,.rdrDayEndOfWeek .rdrInRange,.rdrDayEndOfWeek .rdrStartEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
116
- .rdrDayStartOfMonth .rdrDayInPreview,.rdrDayStartOfMonth .rdrDayEndPreview,.rdrDayStartOfWeek .rdrDayInPreview,.rdrDayStartOfWeek .rdrDayEndPreview{border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;border-left-width:1px;left:0}
117
- .rdrDayEndOfMonth .rdrDayInPreview,.rdrDayEndOfMonth .rdrDayStartPreview,.rdrDayEndOfWeek .rdrDayInPreview,.rdrDayEndOfWeek .rdrDayStartPreview{border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;border-right-width:1px;right:0}
118
- .rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{background:rgba(255,255,255,.09);position:absolute;top:3px;left:0;right:0;bottom:3px;pointer-events:none;border:0 solid currentColor;z-index:1}
119
- .rdrDayStartPreview{border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;left:0}
120
- .rdrDayInPreview{border-top-width:1px;border-bottom-width:1px}
121
- .rdrDayEndPreview{border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;right:0}
122
- .rdrDefinedRangesWrapper{font-size:12px;width:226px;border-right:solid 1px #eff2f7;background:#fff}
123
- .rdrDefinedRangesWrapper .rdrStaticRangeSelected{color:currentColor;font-weight:600}
124
- .rdrStaticRange{border:0;cursor:pointer;display:block;outline:0;border-bottom:1px solid #eff2f7;padding:0;background:#fff}
125
- .rdrStaticRange:hover .rdrStaticRangeLabel,.rdrStaticRange:focus .rdrStaticRangeLabel{background:#eff2f7}
126
- .rdrStaticRangeLabel{display:block;outline:0;line-height:18px;padding:10px 20px;text-align:left}
127
- .rdrInputRanges{padding:10px 0}
128
- .rdrInputRange{align-items:center;padding:5px 20px}
129
- .rdrInputRangeInput{width:30px;height:30px;line-height:30px;border-radius:4px;text-align:center;border:solid 1px rgb(222,231,235);margin-right:10px;color:rgb(108,118,122)}
130
- .rdrInputRangeInput:focus,.rdrInputRangeInput:hover{border-color:rgb(180,191,196);outline:0;color:#333}
131
- .rdrCalendarWrapper:not(.rdrDateRangeWrapper) .rdrDayHovered .rdrDayNumber:after{content:'';border:1px solid currentColor;border-radius:1.333em;position:absolute;top:-2px;bottom:-2px;left:0;right:0;background:transparent}
132
- .rdrDayPassive{pointer-events:none}
133
- .rdrDayPassive .rdrDayNumber span{color:#d5dce0}
134
- .rdrDayPassive .rdrInRange,.rdrDayPassive .rdrStartEdge,.rdrDayPassive .rdrEndEdge,.rdrDayPassive .rdrSelected,.rdrDayPassive .rdrDayStartPreview,.rdrDayPassive .rdrDayInPreview,.rdrDayPassive .rdrDayEndPreview{display:none}
135
- .rdrDayDisabled{background-color:rgb(248,248,248)}
136
- .rdrDayDisabled .rdrDayNumber span{color:#aeb9bf}
137
- .rdrDayDisabled .rdrInRange,.rdrDayDisabled .rdrStartEdge,.rdrDayDisabled .rdrEndEdge,.rdrDayDisabled .rdrSelected,.rdrDayDisabled .rdrDayStartPreview,.rdrDayDisabled .rdrDayInPreview,.rdrDayDisabled .rdrDayEndPreview{filter:grayscale(100%) opacity(60%)}
138
- .rdrMonthName{text-align:left;font-weight:600;color:#849095;padding:.833em}
139
-
140
- /* ── DateRangePicker.scss override (compiled) ── */
141
- .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,
142
- .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,
143
- .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,
144
- .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:#fff !important}
29
+ const RDR_CSS = `
30
+ /* ── react-date-range/dist/styles.css ── */
31
+ .rdrCalendarWrapper{box-sizing:border-box;background:#ffffff;display:inline-flex;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;user-select:none}
32
+ .rdrDateDisplay{display:flex;justify-content:space-between}
33
+ .rdrDateDisplayItem{flex:1 1;width:0;text-align:center;color:inherit}
34
+ .rdrDateDisplayItem+.rdrDateDisplayItem{margin-left:.833em}
35
+ .rdrDateDisplayItem input{text-align:inherit}
36
+ .rdrDateDisplayItem input:disabled{cursor:default}
37
+ .rdrDateDisplayItemActive{}
38
+ .rdrMonthAndYearWrapper{box-sizing:inherit;display:flex;justify-content:space-between}
39
+ .rdrMonthAndYearPickers{flex:1 1 auto;display:flex;justify-content:center;align-items:center}
40
+ .rdrMonthPicker{}
41
+ .rdrYearPicker{}
42
+ .rdrNextPrevButton{box-sizing:inherit;cursor:pointer;outline:none}
43
+ .rdrPprevButton{}
44
+ .rdrNextButton{}
45
+ .rdrMonths{display:flex}
46
+ .rdrMonthsVertical{flex-direction:column}
47
+ .rdrMonthsHorizontal>div>div>div{display:flex;flex-direction:row}
48
+ .rdrMonth{width:27.667em}
49
+ .rdrWeekDays{display:flex}
50
+ .rdrWeekDay{flex-basis:calc(100% / 7);box-sizing:inherit;text-align:center}
51
+ .rdrDays{display:flex;flex-wrap:wrap}
52
+ .rdrDateDisplayWrapper{}
53
+ .rdrMonthName{}
54
+ .rdrInfiniteMonths{overflow:auto}
55
+ .rdrDateRangeWrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}
56
+ .rdrDateInput{position:relative}
57
+ .rdrDateInput input{outline:none}
58
+ .rdrDateInput .rdrWarning{position:absolute;font-size:1.6em;line-height:1.6em;top:0;right:.25em;color:#FF0000}
59
+ .rdrDay{box-sizing:inherit;width:calc(100% / 7);position:relative;font:inherit;cursor:pointer}
60
+ .rdrDayNumber{display:block;position:relative}
61
+ .rdrDayNumber span{color:#1d2429}
62
+ .rdrDayDisabled{cursor:not-allowed}
63
+ @supports (-ms-ime-align:auto){.rdrDay{flex-basis:14.285% !important}}
64
+ .rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{pointer-events:none}
65
+ .rdrInRange{}
66
+ .rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{pointer-events:none}
67
+ .rdrDayHovered{}
68
+ .rdrDayActive{}
69
+ .rdrDateRangePickerWrapper{display:inline-flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}
70
+ .rdrDefinedRangesWrapper{}
71
+ .rdrStaticRanges{display:flex;flex-direction:column}
72
+ .rdrStaticRange{font-size:inherit}
73
+ .rdrStaticRangeLabel{}
74
+ .rdrInputRanges{}
75
+ .rdrInputRange{display:flex}
76
+ .rdrInputRangeInput{}
77
+
78
+ /* ── react-date-range/dist/theme/default.css ── */
79
+ .rdrCalendarWrapper{color:#000000;font-size:12px}
80
+ .rdrDateDisplayWrapper{background-color:rgb(239,242,247)}
81
+ .rdrDateDisplay{margin:.833em}
82
+ .rdrDateDisplayItem{border-radius:4px;background-color:rgb(255,255,255);box-shadow:0 1px 2px 0 rgba(35,57,66,.21);border:1px solid transparent}
83
+ .rdrDateDisplayItem input{cursor:pointer;height:2.5em;line-height:2.5em;border:0;background:transparent;width:100%;color:#849095}
84
+ .rdrDateDisplayItemActive{border-color:currentColor}
85
+ .rdrDateDisplayItemActive input{color:#7d888d}
86
+ .rdrMonthAndYearWrapper{align-items:center;height:60px;padding-top:10px}
87
+ .rdrMonthAndYearPickers{font-weight:600}
88
+ .rdrMonthAndYearPickers select{-moz-appearance:none;appearance:none;-webkit-appearance:none;border:0;background:transparent;padding:10px 30px 10px 10px;border-radius:4px;outline:0;color:#3e484f;background:url("data:image/svg+xml;utf8,<svg width='9px' height='6px' viewBox='0 0 9 6' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g id='Artboard' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' transform='translate(-636.000000, -171.000000)' fill-opacity='0.368716033'><g id='input' transform='translate(172.000000, 37.000000)' fill='%230E242F' fill-rule='nonzero'><g id='Group-9' transform='translate(323.000000, 127.000000)'><path d='M142.280245,7.23952813 C141.987305,6.92353472 141.512432,6.92361662 141.219585,7.23971106 C140.926739,7.5558055 140.926815,8.06821394 141.219755,8.38420735 L145.498801,13 L149.780245,8.38162071 C150.073185,8.0656273 150.073261,7.55321886 149.780415,7.23712442 C149.487568,6.92102998 149.012695,6.92094808 148.719755,7.23694149 L145.498801,10.7113732 L142.280245,7.23952813 Z' id='arrow'></path></g></g></g></svg>") no-repeat;background-position:right 8px center;cursor:pointer;text-align:center}
89
+ .rdrMonthAndYearPickers select:hover{background-color:rgba(0,0,0,.07)}
90
+ .rdrMonthPicker,.rdrYearPicker{margin:0 5px}
91
+ .rdrNextPrevButton{display:block;width:24px;height:24px;margin:0 .833em;padding:0;border:0;border-radius:5px;background:#EFF2F7}
92
+ .rdrNextPrevButton:hover{background:#E1E7F0}
93
+ .rdrNextPrevButton i{display:block;width:0;height:0;padding:0;text-align:center;border-style:solid;margin:auto;transform:translate(-3px,0)}
94
+ .rdrPprevButton i{border-width:4px 6px 4px 4px;border-color:transparent rgb(52,73,94) transparent transparent;transform:translate(-3px,0)}
95
+ .rdrNextButton i{margin:0 0 0 7px;border-width:4px 4px 4px 6px;border-color:transparent transparent transparent rgb(52,73,94);transform:translate(3px,0)}
96
+ .rdrWeekDays{padding:0 .833em}
97
+ .rdrMonth{padding:0 .833em 1.666em .833em}
98
+ .rdrMonth .rdrWeekDays{padding:0}
99
+ .rdrMonths.rdrMonthsVertical .rdrMonth:first-child .rdrMonthName{display:none}
100
+ .rdrWeekDay{font-weight:400;line-height:2.667em;color:rgb(132,144,149)}
101
+ .rdrDay{background:transparent;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:0;padding:0;line-height:3em;height:3em;text-align:center;color:#1d2429}
102
+ .rdrDay:focus{outline:0}
103
+ .rdrDayNumber{outline:0;font-weight:300;position:absolute;left:0;right:0;top:5px;bottom:5px;display:flex;align-items:center;justify-content:center}
104
+ .rdrDayToday .rdrDayNumber span{font-weight:500}
105
+ .rdrDayToday .rdrDayNumber span:after{content:'';position:absolute;bottom:4px;left:50%;transform:translate(-50%,0);width:18px;height:2px;border-radius:2px;background:#3d91ff}
106
+ .rdrDayToday:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span:after{background:#fff}
107
+ .rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:rgba(255,255,255,.85)}
108
+ .rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{background:currentColor;position:absolute;top:5px;left:0;right:0;bottom:5px}
109
+ .rdrSelected{left:2px;right:2px}
110
+ .rdrInRange{}
111
+ .rdrStartEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
112
+ .rdrEndEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
113
+ .rdrSelected{border-radius:1.042em}
114
+ .rdrDayStartOfMonth .rdrInRange,.rdrDayStartOfMonth .rdrEndEdge,.rdrDayStartOfWeek .rdrInRange,.rdrDayStartOfWeek .rdrEndEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
115
+ .rdrDayEndOfMonth .rdrInRange,.rdrDayEndOfMonth .rdrStartEdge,.rdrDayEndOfWeek .rdrInRange,.rdrDayEndOfWeek .rdrStartEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
116
+ .rdrDayStartOfMonth .rdrDayInPreview,.rdrDayStartOfMonth .rdrDayEndPreview,.rdrDayStartOfWeek .rdrDayInPreview,.rdrDayStartOfWeek .rdrDayEndPreview{border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;border-left-width:1px;left:0}
117
+ .rdrDayEndOfMonth .rdrDayInPreview,.rdrDayEndOfMonth .rdrDayStartPreview,.rdrDayEndOfWeek .rdrDayInPreview,.rdrDayEndOfWeek .rdrDayStartPreview{border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;border-right-width:1px;right:0}
118
+ .rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{background:rgba(255,255,255,.09);position:absolute;top:3px;left:0;right:0;bottom:3px;pointer-events:none;border:0 solid currentColor;z-index:1}
119
+ .rdrDayStartPreview{border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;left:0}
120
+ .rdrDayInPreview{border-top-width:1px;border-bottom-width:1px}
121
+ .rdrDayEndPreview{border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;right:0}
122
+ .rdrDefinedRangesWrapper{font-size:12px;width:226px;border-right:solid 1px #eff2f7;background:#fff}
123
+ .rdrDefinedRangesWrapper .rdrStaticRangeSelected{color:currentColor;font-weight:600}
124
+ .rdrStaticRange{border:0;cursor:pointer;display:block;outline:0;border-bottom:1px solid #eff2f7;padding:0;background:#fff}
125
+ .rdrStaticRange:hover .rdrStaticRangeLabel,.rdrStaticRange:focus .rdrStaticRangeLabel{background:#eff2f7}
126
+ .rdrStaticRangeLabel{display:block;outline:0;line-height:18px;padding:10px 20px;text-align:left}
127
+ .rdrInputRanges{padding:10px 0}
128
+ .rdrInputRange{align-items:center;padding:5px 20px}
129
+ .rdrInputRangeInput{width:30px;height:30px;line-height:30px;border-radius:4px;text-align:center;border:solid 1px rgb(222,231,235);margin-right:10px;color:rgb(108,118,122)}
130
+ .rdrInputRangeInput:focus,.rdrInputRangeInput:hover{border-color:rgb(180,191,196);outline:0;color:#333}
131
+ .rdrCalendarWrapper:not(.rdrDateRangeWrapper) .rdrDayHovered .rdrDayNumber:after{content:'';border:1px solid currentColor;border-radius:1.333em;position:absolute;top:-2px;bottom:-2px;left:0;right:0;background:transparent}
132
+ .rdrDayPassive{pointer-events:none}
133
+ .rdrDayPassive .rdrDayNumber span{color:#d5dce0}
134
+ .rdrDayPassive .rdrInRange,.rdrDayPassive .rdrStartEdge,.rdrDayPassive .rdrEndEdge,.rdrDayPassive .rdrSelected,.rdrDayPassive .rdrDayStartPreview,.rdrDayPassive .rdrDayInPreview,.rdrDayPassive .rdrDayEndPreview{display:none}
135
+ .rdrDayDisabled{background-color:rgb(248,248,248)}
136
+ .rdrDayDisabled .rdrDayNumber span{color:#aeb9bf}
137
+ .rdrDayDisabled .rdrInRange,.rdrDayDisabled .rdrStartEdge,.rdrDayDisabled .rdrEndEdge,.rdrDayDisabled .rdrSelected,.rdrDayDisabled .rdrDayStartPreview,.rdrDayDisabled .rdrDayInPreview,.rdrDayDisabled .rdrDayEndPreview{filter:grayscale(100%) opacity(60%)}
138
+ .rdrMonthName{text-align:left;font-weight:600;color:#849095;padding:.833em}
139
+
140
+ /* ── DateRangePicker.scss override (compiled) ── */
141
+ .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,
142
+ .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,
143
+ .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,
144
+ .rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:#fff !important}
145
145
  `;
146
146
  /* ─── Singleton injection ─────────────────────────────────────────────────── */
147
147
  let _injected = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tp-react-elements",
3
- "version": "1.3.3",
3
+ "version": "1.3.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "React form components library built with React Hook Form and Yup",
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
 
3
3
  /**
4
4
  * Install exact versions of peerDependencies for tp-react-elements