tp-react-elements 1.3.4 → 1.3.7

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 accessibility = {};
1
+ var propTypes = {exports: {}};
2
2
 
3
- export { accessibility as __exports };
3
+ export { propTypes as __module };
@@ -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 DateInput = {};
1
+ var Month = {};
2
2
 
3
- export { DateInput as __exports };
3
+ export { Month as __exports };
@@ -1,3 +1,3 @@
1
- var DateRange = {};
1
+ var Calendar = {};
2
2
 
3
- export { DateRange as __exports };
3
+ export { Calendar as __exports };
@@ -1,3 +1,3 @@
1
- var DateRangePicker = {};
1
+ var DateRange = {};
2
2
 
3
- export { DateRangePicker as __exports };
3
+ export { DateRange as __exports };
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DateRangePicker = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DateRangePicker as __exports };
@@ -1,3 +1,3 @@
1
- var propTypes = {exports: {}};
1
+ var accessibility = {};
2
2
 
3
- export { propTypes as __module };
3
+ export { accessibility as __exports };
@@ -1,5 +1,7 @@
1
1
  import { jsx, Fragment } from 'react/jsx-runtime';
2
2
  import React__default, { lazy, Suspense } from 'react';
3
+ import FormCheckBox from '../FormComponents/FormCheckBox/FormCheckBox.esm.js';
4
+ import FormCheckBoxGroup from '../FormComponents/FormCheckBoxGroup/FormCheckBoxGroup.esm.js';
3
5
  import SingleSelect from '../FormComponents/Select/SingleSelect.esm.js';
4
6
  import MultiSelectAutocomplete from '../FormComponents/Select/MultiSelectAutocomplete.esm.js';
5
7
  import SingleSelectNonAutoComplete from '../FormComponents/Select/SingleSelectNonAutoComplete.esm.js';
@@ -11,9 +13,7 @@ import RichTextEditorWrapper from '../FormComponents/RichTextEditor/RichTextEdit
11
13
  import SingleSelectSearchApi from '../FormComponents/Select/SingleSelectSearchApi.esm.js';
12
14
  import DatetimepickerWrapper from '../FormComponents/DatePicker/DatetimepickerWrapper.esm.js';
13
15
  import FormTextAreaField from '../FormComponents/FormTextAreaField/FormTextAreaField.esm.js';
14
- import FormCheckBox from '../FormComponents/FormCheckBox/FormCheckBox.esm.js';
15
16
  import FormRadioGroup from '../FormComponents/FormRadioGroup/FormRadioGroup.esm.js';
16
- import FormCheckBoxGroup from '../FormComponents/FormCheckBoxGroup/FormCheckBoxGroup.esm.js';
17
17
  import FormNumberFieldDecimal from '../FormComponents/FormNumberField/FormNumberFieldDecimal.esm.js';
18
18
  import FormNumberField from '../FormComponents/FormNumberField/FormNumberField.esm.js';
19
19
  import PasswordField from '../FormComponents/PasswordField/PasswordField.esm.js';
@@ -1,14 +1,17 @@
1
+ export { default as FormCheckBox } from './FormCheckBox/FormCheckBox.esm.js';
1
2
  export { default as SingleSelect } from './Select/SingleSelect.esm.js';
2
3
  export { default as SingleSelectNonAutoComplete } from './Select/SingleSelectNonAutoComplete.esm.js';
3
4
  export { default as SingleSelectSearchApi } from './Select/SingleSelectSearchApi.esm.js';
4
5
  export { default as MultiSelectV1 } from './Select/MultiSelectv1.esm.js';
5
6
  export { default as MultiSelectTable } from './Select/MultiSelectTable.esm.js';
6
7
  export { default as SearchableSelect } from './Select/SearchableSelect.esm.js';
8
+ export { default as FormCheckBoxGroup } from './FormCheckBoxGroup/FormCheckBoxGroup.esm.js';
7
9
  export { default as DatepickerWrapperV2 } from './DatePicker/DatepickerWrapperV2.esm.js';
10
+ export { default as Monthpickerrender } from './DatePicker/Monthpickerrender.esm.js';
11
+ export { default as YearPickerField } from './YearPickerField/YearPickerField.esm.js';
8
12
  export { default as FormBottomField } from './FormBottomField/FormBottomField.esm.js';
9
- export { default as FormCheckBox } from './FormCheckBox/FormCheckBox.esm.js';
10
- export { default as FormCheckBoxGroup } from './FormCheckBoxGroup/FormCheckBoxGroup.esm.js';
11
13
  export { default as FormErrorField } from './FormErrorField/FormErrorField.esm.js';
14
+ export { default as HelperText } from './HelperText/HelperText.esm.js';
12
15
  export { default as FormNumberField } from './FormNumberField/FormNumberField.esm.js';
13
16
  export { default as FormNumberFieldDecimal } from './FormNumberField/FormNumberFieldDecimal.esm.js';
14
17
  export { default as FormRadioGroup } from './FormRadioGroup/FormRadioGroup.esm.js';
@@ -16,10 +19,7 @@ export { default as FormRenderFileUpload } from './FileUpload/FormRenderFileUplo
16
19
  export { default as FormRenderMultiFileUpload } from './FileUpload/FormRenderMultiFileUpload.esm.js';
17
20
  export { default as FormTextAreaField } from './FormTextAreaField/FormTextAreaField.esm.js';
18
21
  export { default as FormTextField } from './FormTextField/FormTextField.esm.js';
19
- export { default as HelperText } from './HelperText/HelperText.esm.js';
20
- export { default as Monthpickerrender } from './DatePicker/Monthpickerrender.esm.js';
21
22
  export { default as PasswordField } from './PasswordField/PasswordField.esm.js';
22
23
  export { default as RichTextEditor } from './RichTextEditor/RichTextEditor.esm.js';
23
24
  export { default as RichTextEditorWrapper } from './RichTextEditor/RichTextEditorWrapper.esm.js';
24
25
  export { default as TimePicker } from './TimePicker/TimePicker.esm.js';
25
- export { default as YearPickerField } from './YearPickerField/YearPickerField.esm.js';
@@ -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';
@@ -50,8 +50,24 @@ const chipSx = (active) => ({
50
50
  whiteSpace: 'nowrap',
51
51
  px: 1.5,
52
52
  minHeight: 30,
53
+ // Cap chip width so long option labels don't break the filter bar layout
54
+ maxWidth: 260,
55
+ overflow: 'hidden',
53
56
  '&:hover': { borderColor: 'primary.main', bgcolor: 'rgba(25,118,210,0.08)' },
54
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 }));
55
71
  // ─── Date helper ──────────────────────────────────────────────────────────────
56
72
  const fmtDate = (iso) => {
57
73
  if (!iso)
@@ -104,13 +120,14 @@ const DateRangeChip = ({ label, fromDate, toDate, onApply, onRemove }) => {
104
120
  setAnchor(null);
105
121
  }
106
122
  };
107
- 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" }) }))] })] }));
108
124
  };
109
125
  const TextFilterChip = ({ label, value, onApply, onRemove, placeholder }) => {
110
126
  const [anchor, setAnchor] = useState(null);
111
127
  const [draft, setDraft] = useState('');
112
128
  const active = Boolean(value);
113
- 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) => {
114
131
  if (e.key === 'Enter') {
115
132
  onApply(draft);
116
133
  setAnchor(null);
@@ -138,11 +155,12 @@ const DatePickerChip = ({ label, value, onApply, onRemove }) => {
138
155
  }
139
156
  setOpen(false);
140
157
  };
158
+ const chipText = active ? `${label}: ${fmtDate(value)}` : label;
141
159
  return (
142
160
  // LocalizationProvider must wrap DatePicker — scoped here so it only
143
161
  // loads when the chip is actually used (DatePickerChip is tree-shaken
144
162
  // if the 'date' filter type is never included in serverFilterDefs).
145
- 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: {
146
164
  textField: { sx: { display: 'none' }, size: 'small' },
147
165
  popper: {
148
166
  anchorEl,
@@ -180,7 +198,8 @@ const DropdownFilterChip = ({ label, value, options, onApply, onRemove }) => {
180
198
  ...options.map((o) => ({ label: o.label, value: o.value })),
181
199
  ],
182
200
  };
183
- 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: {
184
203
  item,
185
204
  register,
186
205
  control,
@@ -208,7 +227,8 @@ const SearchableSelectChip = ({ label, value, options, onApply, onRemove, placeh
208
227
  const filtered = search
209
228
  ? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))
210
229
  : options;
211
- 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: {
212
232
  sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, width: 280, display: 'flex', flexDirection: 'column' },
213
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')
214
234
  setAnchor(null); }, InputProps: {
@@ -226,52 +246,53 @@ const SearchableSelectChip = ({ label, value, options, onApply, onRemove, placeh
226
246
  } }), isSelected && (jsx(CheckIcon, { sx: { fontSize: 15, color: 'primary.main', flexShrink: 0 } }))] }, opt.value));
227
247
  }))] })] })] }));
228
248
  };
229
- const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, onToggle, }) => {
249
+ const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, onToggle, maxVisible = 4, }) => {
230
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 }));
231
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: {
232
265
  borderRadius: 5, textTransform: 'none', fontSize: 12,
233
266
  borderColor: 'divider', color: 'text.secondary',
234
267
  px: 1.5, minHeight: 30,
235
268
  '&:hover': { borderColor: 'primary.main', color: 'primary.main' },
236
- }, 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) => {
237
- const selected = visibleIds.includes(def.id);
238
- const pill = TYPE_PILL[def.type];
239
- return (jsxs(ListItemButton, { onClick: () => onToggle(def.id), sx: { px: 2, py: 0.5 }, children: [jsx(Box, { component: "span", sx: {
240
- mr: 1.25, flexShrink: 0,
241
- fontSize: 10, fontWeight: 700,
242
- px: 0.75, py: '2px',
243
- borderRadius: '4px',
244
- bgcolor: pill.bg,
245
- color: pill.color,
246
- textTransform: 'uppercase',
247
- letterSpacing: 0.4,
248
- lineHeight: 1.6,
249
- }, children: pill.label }), jsx(ListItemText, { primary: def.label, primaryTypographyProps: {
250
- fontSize: 13,
251
- color: selected ? 'primary.main' : 'text.primary',
252
- } }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }, def.id));
253
- }) })] })), 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) => {
254
- const selected = visibleIds.includes(col.id);
255
- // Pick the type pill based on the column's declared filter type
256
- const pill = COLUMN_TYPE_PILL[col.filterType ?? 'text'] ??
257
- COLUMN_TYPE_PILL.text;
258
- return (jsxs(ListItemButton, { onClick: () => onToggle(col.id), sx: { px: 2, py: 0.4 }, children: [jsx(Box, { component: "span", sx: {
259
- mr: 1.25, flexShrink: 0,
260
- fontSize: 10, fontWeight: 700,
261
- px: 0.75, py: '2px',
262
- borderRadius: '4px',
263
- bgcolor: pill.bg,
264
- color: pill.color,
265
- textTransform: 'uppercase',
266
- letterSpacing: 0.4,
267
- lineHeight: 1.6,
268
- }, children: pill.label }), jsx(ListItemText, { primary: col.label, primaryTypographyProps: {
269
- fontSize: 13,
270
- color: selected ? 'primary.main' : 'text.primary',
271
- } }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }, col.id));
272
- }) })] }))] }) })] }));
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 } }, 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: { 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
+ }) })] }))] })] })] }));
273
294
  };
274
- const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, }) => {
295
+ const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, maxVisibleFilters = 4, }) => {
275
296
  const getColValue = (id) => columnFilters.find((f) => f.id === id)?.value ?? '';
276
297
  const applyColFilter = (id, value) => {
277
298
  const rest = columnFilters.filter((f) => f.id !== id);
@@ -324,7 +345,7 @@ const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter,
324
345
  }
325
346
  // Default: free-text input
326
347
  return (jsx(TextFilterChip, { label: col.label, value: getColValue(id), onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id), placeholder: `Filter by ${col.label}` }, id));
327
- }), jsx(ManageFiltersButton, { serverFilterDefs: serverFilterDefs, visibleIds: visibleFilterIds, availableColumns: availableColumns, onToggle: onToggleFilter })] }));
348
+ }), jsx(ManageFiltersButton, { serverFilterDefs: serverFilterDefs, visibleIds: visibleFilterIds, availableColumns: availableColumns, onToggle: onToggleFilter, maxVisible: maxVisibleFilters })] }));
328
349
  };
329
350
 
330
351
  export { DynamicFilterBar as default };
@@ -33,7 +33,13 @@ export interface GenericPaginatedGridProps<TData extends object> {
33
33
  batchSize?: number;
34
34
  /** CSV file name prefix. Default: "export". */
35
35
  exportFilename?: string;
36
- /** max-height of the scrollable table body. Default: "60vh". */
36
+ /**
37
+ * Height of the entire grid component.
38
+ * When omitted (default) the grid auto-sizes to fill the remaining viewport
39
+ * height from its top position — the page never needs to scroll.
40
+ * Pass an explicit CSS value only when you need to override
41
+ * (e.g. "600px", "calc(100vh - 300px)").
42
+ */
37
43
  tableHeight?: string;
38
44
  /** Choices shown in the "Rows per page" footer dropdown. Default: [1 000, 5 000, 10 000]. */
39
45
  pageSizeOptions?: number[];
@@ -42,6 +48,12 @@ export interface GenericPaginatedGridProps<TData extends object> {
42
48
  * Accepts any valid CSS colour string.
43
49
  */
44
50
  headerBgColor?: string;
51
+ /**
52
+ * Maximum number of filter chips that can be visible at once.
53
+ * Prevents the filter bar from wrapping to a second row on typical screens.
54
+ * Default: 4.
55
+ */
56
+ maxVisibleFilters?: number;
45
57
  }
46
- 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;
58
+ 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;
47
59
  export default GenericPaginatedGrid;
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useState, useMemo } from 'react';
2
+ import { useState, useRef, useLayoutEffect, useMemo } from 'react';
3
3
  import { useMaterialReactTable, MaterialReactTable } from 'material-react-table';
4
4
  import { useQuery, keepPreviousData } from '@tanstack/react-query';
5
5
  import { Box, Tooltip, IconButton, Button, GlobalStyles, Typography, Select, MenuItem, CircularProgress } from '@mui/material';
@@ -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, pageSizeOptions = [1000, 5000, 10000], headerBgColor, maxVisibleFilters = 4, }) {
47
47
  const defaultVisible = defaultVisibleFilterIds
48
48
  ?? (serverFilterDefs.length > 0 ? [serverFilterDefs[0].id] : []);
49
49
  // ── State ──────────────────────────────────────────────────────────────────
@@ -57,6 +57,35 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
57
57
  const [columnFilters, setColumnFilters] = useState([]);
58
58
  const [globalFilter, setGlobalFilter] = useState('');
59
59
  const [columnPinning, setColumnPinning] = useState({});
60
+ // ── Viewport-fill: measure this component's top offset and derive height ──────
61
+ //
62
+ // When tableHeight is not provided, we measure how far the wrapper sits from
63
+ // the top of the viewport and set height = 100vh − topOffset − 8px (tiny
64
+ // bottom margin). A ResizeObserver on <html> keeps the value in sync if the
65
+ // layout shifts (sidebar collapses, font loads, etc.).
66
+ //
67
+ // The MRT Paper + TableContainer flex chain distributes that height between
68
+ // the toolbar, sticky column headers, scrollable rows, and pagination footer —
69
+ // so the grid fills the window exactly and the page never needs to scroll.
70
+ const containerRef = useRef(null);
71
+ const [autoHeight, setAutoHeight] = useState('');
72
+ useLayoutEffect(() => {
73
+ if (tableHeight)
74
+ return; // explicit prop — skip auto calculation
75
+ const el = containerRef.current;
76
+ if (!el)
77
+ return;
78
+ const update = () => {
79
+ const top = el.getBoundingClientRect().top;
80
+ setAutoHeight(`calc(100vh - ${Math.ceil(top) + 8}px)`);
81
+ };
82
+ update();
83
+ const ro = new ResizeObserver(update);
84
+ ro.observe(document.documentElement);
85
+ return () => ro.disconnect();
86
+ }, [tableHeight]);
87
+ // Resolved height: explicit prop › auto-calculated › safe fallback
88
+ const resolvedHeight = tableHeight || autoHeight || '60vh';
60
89
  // ── Data fetching ──────────────────────────────────────────────────────────
61
90
  const { data, isLoading, isError, isFetching, refetch } = useQuery({
62
91
  queryKey: [...queryKey, filterValues, pagination.pageIndex],
@@ -125,7 +154,13 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
125
154
  setFilterValues(newValues);
126
155
  setPagination((p) => ({ ...p, pageIndex: 0 }));
127
156
  };
128
- const handleToggleFilter = (id) => setVisibleFilterIds((prev) => prev.includes(id) ? prev.filter((v) => v !== id) : [...prev, id]);
157
+ const handleToggleFilter = (id) => setVisibleFilterIds((prev) => {
158
+ if (prev.includes(id))
159
+ return prev.filter((v) => v !== id); // always allow remove
160
+ if (prev.length >= maxVisibleFilters)
161
+ return prev; // cap reached — ignore add
162
+ return [...prev, id];
163
+ });
129
164
  const handleClearAll = () => {
130
165
  setFilterValues(defaultFilters);
131
166
  setColumnFilters([]);
@@ -190,7 +225,24 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
190
225
  enableHiding: true,
191
226
  enableStickyHeader: true,
192
227
  enableRowVirtualization: true,
193
- muiTableContainerProps: { sx: { maxHeight: tableHeight } },
228
+ // The container fills whatever height is left after the top toolbar and
229
+ // pagination footer. min-height: 0 is required so the flex child can
230
+ // shrink below its natural content height and scroll its rows instead.
231
+ muiTableContainerProps: {
232
+ sx: {
233
+ flex: '1 1 0',
234
+ minHeight: 0,
235
+ },
236
+ },
237
+ // Paper fills the wrapper Box height and acts as the flex column host for
238
+ // toolbar → table-container → pagination.
239
+ muiTablePaperProps: {
240
+ sx: {
241
+ height: '100%',
242
+ display: 'flex',
243
+ flexDirection: 'column',
244
+ },
245
+ },
194
246
  muiTopToolbarProps: {
195
247
  sx: {
196
248
  alignItems: 'center',
@@ -213,8 +265,8 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
213
265
  whiteSpace: 'normal',
214
266
  borderRight: '1px solid rgba(224,224,224,1)',
215
267
  borderBottom: '2px solid rgba(0,0,0,0.15)',
216
- '& button[aria-label="Move"]': { display: 'none' },
217
- '& .MuiTableSortLabel-icon': { display: 'none' },
268
+ '& button[aria-label="Move"]': { display: 'none !important' },
269
+ '& .MuiTableSortLabel-icon': { display: 'none !important' },
218
270
  '& .Mui-TableHeadCell-ResizeHandle-Wrapper': {
219
271
  height: '100%',
220
272
  top: 0,
@@ -249,7 +301,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
249
301
  muiToolbarAlertBannerProps: isError
250
302
  ? { color: 'error', children: 'Failed to load data. Please try again.' }
251
303
  : undefined,
252
- 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: {
304
+ 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: {
253
305
  flexShrink: 0,
254
306
  textTransform: 'none',
255
307
  fontSize: 12,
@@ -260,7 +312,16 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
260
312
  }, children: "Clear All" }))] })),
261
313
  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 })),
262
314
  });
263
- 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 })] }));
315
+ return (jsxs(Box, { ref: containerRef, className: "tp-gpg-root", sx: {
316
+ position: 'relative',
317
+ height: resolvedHeight,
318
+ display: 'flex',
319
+ flexDirection: 'column',
320
+ }, children: [jsx(GlobalStyles, { styles: {
321
+ 'button[aria-label="Pin to right"]': { display: 'none' },
322
+ '.tp-gpg-root .MuiTableSortLabel-icon': { display: 'none !important' },
323
+ '.tp-gpg-root button[aria-label="Move"]': { display: 'none !important' },
324
+ } }), isLoading && jsx(OverlayLoader, { message: "Loading data\u2026" }), !isLoading && isFetching && jsx(OverlayLoader, { message: "Updating data\u2026" }), jsx(MaterialReactTable, { table: table })] }));
264
325
  }
265
326
 
266
327
  export { GenericPaginatedGrid as default };
@@ -1,4 +1,4 @@
1
- import { __module as propTypes } from '../../_virtual/index.esm9.js';
1
+ import { __module as propTypes } from '../../_virtual/index.esm10.js';
2
2
  import { __require as requireReactIs } from './node_modules/react-is/index.esm.js';
3
3
  import { __require as requireFactoryWithTypeCheckers } from './factoryWithTypeCheckers.esm.js';
4
4
  import { __require as requireFactoryWithThrowingShims } from './factoryWithThrowingShims.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as accessibility } from '../../../../_virtual/index.esm10.js';
1
+ import { __exports as accessibility } from '../../../../_virtual/index.esm9.js';
2
2
  import { __require as requirePropTypes } from '../../../prop-types/index.esm.js';
3
3
 
4
4
  var hasRequiredAccessibility;
@@ -1,4 +1,4 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm7.js';
1
+ import { __exports as Calendar } 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 requireDayCell } from '../DayCell/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateInput } from '../../../../../_virtual/index.esm13.js';
1
+ import { __exports as DateInput } 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
  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.esm6.js';
1
+ import { __exports as DateRangePicker } 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 requireDateRange } from '../DateRange/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as Month } from '../../../../../_virtual/index.esm12.js';
1
+ import { __exports as Month } 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 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.4",
3
+ "version": "1.3.7",
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