@tedi-design-system/react 19.0.0-rc.7 → 19.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/README.md +27 -1
  2. package/bundle-stats.html +1 -1
  3. package/index.css +1 -1
  4. package/package.json +5 -3
  5. package/src/tedi/components/content/calendar/calendar.cjs.js +1 -1
  6. package/src/tedi/components/content/calendar/calendar.d.ts +12 -0
  7. package/src/tedi/components/content/calendar/calendar.es.js +39 -35
  8. package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.cjs.js +1 -1
  9. package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.d.ts +13 -1
  10. package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.es.js +40 -35
  11. package/src/tedi/components/form/date-field/date-field.cjs.js +1 -1
  12. package/src/tedi/components/form/date-field/date-field.d.ts +10 -0
  13. package/src/tedi/components/form/date-field/date-field.es.js +176 -170
  14. package/src/tedi/components/form/date-field/date-picker-modal/date-picker-modal.cjs.js +1 -1
  15. package/src/tedi/components/form/date-field/date-picker-modal/date-picker-modal.d.ts +4 -0
  16. package/src/tedi/components/form/date-field/date-picker-modal/date-picker-modal.es.js +47 -43
  17. package/src/tedi/components/form/date-time-field/date-time-field.cjs.js +1 -1
  18. package/src/tedi/components/form/date-time-field/date-time-field.d.ts +10 -0
  19. package/src/tedi/components/form/date-time-field/date-time-field.es.js +92 -88
  20. package/src/tedi/components/form/file-upload/file-upload.cjs.js +1 -1
  21. package/src/tedi/components/form/file-upload/file-upload.es.js +11 -11
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@tedi-design-system/react",
3
- "version": "19.0.0-rc.7",
3
+ "version": "19.0.0-rc.9",
4
+ "description": "TEDI Design System React component library — accessible, reusable UI components. Docs & live examples: https://storybook.tedi.ee/react/rc/",
4
5
  "type": "module",
5
6
  "sideEffects": false,
6
7
  "exports": {
@@ -28,7 +29,8 @@
28
29
  "test-storybook": "test-storybook",
29
30
  "test-storybook:ci": "concurrently -k -s first -n \"SB,A11Y\" -c \"magenta,blue\" \"http-server dist/storybook-static --port 6006 --silent\" \"wait-on tcp:127.0.0.1:6006 && test-storybook --index-json --url http://127.0.0.1:6006 --junit\"",
30
31
  "release": "npx semantic-release",
31
- "chromatic": "npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN"
32
+ "chromatic": "npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN",
33
+ "design:build": "node design-docs/build.js"
32
34
  },
33
35
  "repository": {
34
36
  "type": "git",
@@ -45,7 +47,7 @@
45
47
  "@mui/material": "^5.15.13",
46
48
  "@mui/x-date-pickers": "^5.0.20",
47
49
  "@tanstack/react-table": "^8.13.2",
48
- "@tedi-design-system/core": "6.5.0",
50
+ "@tedi-design-system/core": "^6.6.0",
49
51
  "classnames": "^2.5.1",
50
52
  "draft-js": "^0.11.7",
51
53
  "draftjs-md-converter": "^1.5.2",
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),S=require("../../../../../external/classnames/index.cjs.js"),a=require("./calendar.module.scss.cjs.js"),I=require("./components/calendar-header/calendar-header.cjs.js"),L=require("./components/calendar-month-grid/calendar-month-grid.cjs.js"),T=require("./components/calendar-year-grid/calendar-year-grid.cjs.js"),V=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),z=require("../../../../../external/react-day-picker/dist/esm/locale/et.cjs.js"),R=require("../../../../../external/react-day-picker/dist/esm/DayPicker.cjs.js"),k=require("../../../../../external/react-day-picker/dist/esm/components/DayButton.cjs.js"),U=require("../../tags/status-indicator/status-indicator.cjs.js"),x=_=>{const{getCurrentBreakpointProps:C}=V.useBreakpointProps(_.defaultServerBreakpoint),{view:c="days",selectionLevel:y="days",currentMonth:u,setCurrentMonth:s,setView:i=()=>"days",mode:q="single",value:d,locale:M=z.et,localeCode:m="et-EE",showOutsideDays:A=!0,disabledMatchers:G,required:Y,availableDays:n,unavailableDays:l,footer:B,monthYearSelectType:P,dayStatus:h,handleSelect:O,applyValue:b,showNavigation:f=!0,className:v,bordered:W=!0,fullWidth:g=!1,...E}=C(_),p=W?void 0:a.default["tedi-calendar--borderless"],D=g?a.default["tedi-calendar--full-width"]:void 0,w=S.default(p,D,v),j=e=>n?Array.isArray(n)?n.some(r=>r.toDateString()===e.toDateString()):n(e):!0,N=e=>l?Array.isArray(l)?l.some(r=>r.toDateString()===e.toDateString()):l(e):!1,o=[...G??[],...n?[e=>!j(e)]:[],...l?[e=>N(e)]:[]],F=(()=>{switch(q){case"multiple":return{mode:"multiple",selected:Array.isArray(d)?d:void 0};case"range":return{mode:"range",selected:d&&!Array.isArray(d)&&!(d instanceof Date)?d:void 0};default:return{mode:"single",selected:d instanceof Date?d:void 0}}})();return t.jsxs("div",{className:a.default["tedi-calendar__wrapper"],children:[c==="years"&&t.jsx(T.YearGrid,{currentMonth:u,onNavigate:s,showNavigation:f,onSelectYear:e=>{s(e),y==="years"?b(new Date(e.getFullYear(),0,1)):i("months")},className:w}),c==="months"&&t.jsx(L.MonthGrid,{currentMonth:u,onNavigate:s,showNavigation:f,localeCode:m,onSelectMonth:e=>{s(e),y==="months"?b(e):i("days")},className:w}),c==="days"&&t.jsx(R.DayPicker,{...E,...F,locale:M,month:u,onMonthChange:s,showOutsideDays:A,disabled:o.length?o:void 0,required:Y,components:{MonthCaption:e=>t.jsx(I.CalendarHeader,{...e,monthYearSelectType:P,onOpenMonthGrid:()=>i("months"),onOpenYearGrid:()=>i("years"),showNavigation:f,localeCode:m,disabledMatchers:o.length?o:void 0}),Nav:()=>t.jsx(t.Fragment,{}),...h?{DayButton:e=>{const r=h(e.day.date);if(!r)return t.jsx(k.DayButton,{...e});const H=[e["aria-label"],r.label].filter(Boolean).join(", ");return t.jsxs(k.DayButton,{...e,"aria-label":H,children:[e.children,t.jsx(U.StatusIndicator,{type:r.type,size:"sm",className:a.default["tedi-calendar__day-status"]})]})}}:{},...g?{Weekday:({children:e,...r})=>t.jsx("th",{...r,children:t.jsx("span",{className:a.default["tedi-calendar__weekday-inner"],children:e})})}:{}},footer:B,classNames:{root:S.default(a.default["tedi-calendar"],p,D,v),month_caption:a.default["tedi-calendar__caption"],head:a.default["tedi-calendar__head"],row:a.default["tedi-calendar__row"],day:a.default["tedi-calendar__day"],selected:a.default["tedi-calendar__day--selected"],weekday:a.default["tedi-calendar__weekday"],outside:a.default["tedi-calendar__outside-days"],range_start:a.default["tedi-calendar__range-start"],range_middle:a.default["tedi-calendar__range-middle"],range_end:a.default["tedi-calendar__range-end"],today:a.default["tedi-calendar__today"],disabled:a.default["tedi-calendar__disabled"],month:a.default["tedi-calendar__month"],months:a.default["tedi-calendar__months-container"],footer:a.default["tedi-calendar__footer"],week_number:a.default["tedi-calendar__week-number"]},modifiers:{available:e=>n?j(e):!1,unavailable:e=>l?N(e):!1},modifiersClassNames:{available:a.default["tedi-calendar__available-day"],unavailable:a.default["tedi-calendar__unavailable-day"]},onSelect:O})]})};x.displayName="Calendar";exports.Calendar=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),N=require("../../../../../external/classnames/index.cjs.js"),a=require("./calendar.module.scss.cjs.js"),T=require("./components/calendar-header/calendar-header.cjs.js"),V=require("./components/calendar-month-grid/calendar-month-grid.cjs.js"),z=require("./components/calendar-year-grid/calendar-year-grid.cjs.js"),R=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),U=require("../../../../../external/react-day-picker/dist/esm/locale/et.cjs.js"),J=require("../../../../../external/react-day-picker/dist/esm/DayPicker.cjs.js"),S=require("../../../../../external/react-day-picker/dist/esm/components/DayButton.cjs.js"),K=require("../../tags/status-indicator/status-indicator.cjs.js"),k=_=>{const{getCurrentBreakpointProps:C}=R.useBreakpointProps(_.defaultServerBreakpoint),{view:c="days",selectionLevel:m="days",currentMonth:u,setCurrentMonth:s,setView:i=()=>"days",mode:q="single",value:d,locale:M=U.et,localeCode:y="et-EE",showOutsideDays:A=!0,disabledMatchers:Y,required:G,availableDays:n,unavailableDays:l,footer:B,monthYearSelectType:P,minYear:O,maxYear:W,dayStatus:h,handleSelect:E,applyValue:b,showNavigation:f=!0,className:v,bordered:F=!0,fullWidth:g=!1,...H}=C(_),p=F?void 0:a.default["tedi-calendar--borderless"],D=g?a.default["tedi-calendar--full-width"]:void 0,w=N.default(p,D,v),j=e=>n?Array.isArray(n)?n.some(r=>r.toDateString()===e.toDateString()):n(e):!0,x=e=>l?Array.isArray(l)?l.some(r=>r.toDateString()===e.toDateString()):l(e):!1,o=[...Y??[],...n?[e=>!j(e)]:[],...l?[e=>x(e)]:[]],I=(()=>{switch(q){case"multiple":return{mode:"multiple",selected:Array.isArray(d)?d:void 0};case"range":return{mode:"range",selected:d&&!Array.isArray(d)&&!(d instanceof Date)?d:void 0};default:return{mode:"single",selected:d instanceof Date?d:void 0}}})();return t.jsxs("div",{className:a.default["tedi-calendar__wrapper"],children:[c==="years"&&t.jsx(z.YearGrid,{currentMonth:u,onNavigate:s,showNavigation:f,onSelectYear:e=>{s(e),m==="years"?b(new Date(e.getFullYear(),0,1)):i("months")},className:w}),c==="months"&&t.jsx(V.MonthGrid,{currentMonth:u,onNavigate:s,showNavigation:f,localeCode:y,onSelectMonth:e=>{s(e),m==="months"?b(e):i("days")},className:w}),c==="days"&&t.jsx(J.DayPicker,{...H,...I,locale:M,month:u,onMonthChange:s,showOutsideDays:A,disabled:o.length?o:void 0,required:G,components:{MonthCaption:e=>t.jsx(T.CalendarHeader,{...e,monthYearSelectType:P,onOpenMonthGrid:()=>i("months"),onOpenYearGrid:()=>i("years"),showNavigation:f,localeCode:y,disabledMatchers:o.length?o:void 0,minYear:O,maxYear:W}),Nav:()=>t.jsx(t.Fragment,{}),...h?{DayButton:e=>{const r=h(e.day.date);if(!r)return t.jsx(S.DayButton,{...e});const L=[e["aria-label"],r.label].filter(Boolean).join(", ");return t.jsxs(S.DayButton,{...e,"aria-label":L,children:[e.children,t.jsx(K.StatusIndicator,{type:r.type,size:"sm",className:a.default["tedi-calendar__day-status"]})]})}}:{},...g?{Weekday:({children:e,...r})=>t.jsx("th",{...r,children:t.jsx("span",{className:a.default["tedi-calendar__weekday-inner"],children:e})})}:{}},footer:B,classNames:{root:N.default(a.default["tedi-calendar"],p,D,v),month_caption:a.default["tedi-calendar__caption"],head:a.default["tedi-calendar__head"],row:a.default["tedi-calendar__row"],day:a.default["tedi-calendar__day"],selected:a.default["tedi-calendar__day--selected"],weekday:a.default["tedi-calendar__weekday"],outside:a.default["tedi-calendar__outside-days"],range_start:a.default["tedi-calendar__range-start"],range_middle:a.default["tedi-calendar__range-middle"],range_end:a.default["tedi-calendar__range-end"],today:a.default["tedi-calendar__today"],disabled:a.default["tedi-calendar__disabled"],month:a.default["tedi-calendar__month"],months:a.default["tedi-calendar__months-container"],footer:a.default["tedi-calendar__footer"],week_number:a.default["tedi-calendar__week-number"]},modifiers:{available:e=>n?j(e):!1,unavailable:e=>l?x(e):!1},modifiersClassNames:{available:a.default["tedi-calendar__available-day"],unavailable:a.default["tedi-calendar__unavailable-day"]},onSelect:E})]})};k.displayName="Calendar";exports.Calendar=k;
@@ -118,6 +118,18 @@ interface CalendarBreakpointProps extends Omit<DayPickerProps, 'mode' | 'selecte
118
118
  * no status.
119
119
  */
120
120
  dayStatus?: DayStatusFn;
121
+ /**
122
+ * Earliest year offered in the calendar header's year dropdown.
123
+ * Forwarded to the internal `CalendarHeader`.
124
+ * @default currentYear - 100
125
+ */
126
+ minYear?: number;
127
+ /**
128
+ * Latest year offered in the calendar header's year dropdown.
129
+ * Forwarded to the internal `CalendarHeader`.
130
+ * @default currentYear + 20
131
+ */
132
+ maxYear?: number;
121
133
  /**
122
134
  * Callback fired when a date or date range is selected. Receives the selected value, day, modifiers, and event.
123
135
  */
@@ -1,16 +1,16 @@
1
- import { jsxs as S, jsx as t, Fragment as q } from "react/jsx-runtime";
1
+ import { jsxs as S, jsx as t, Fragment as H } from "react/jsx-runtime";
2
2
  import k from "../../../../../external/classnames/index.es.js";
3
3
  import a from "./calendar.module.scss.es.js";
4
- import { CalendarHeader as z } from "./components/calendar-header/calendar-header.es.js";
5
- import { MonthGrid as H } from "./components/calendar-month-grid/calendar-month-grid.es.js";
6
- import { YearGrid as I } from "./components/calendar-year-grid/calendar-year-grid.es.js";
7
- import { useBreakpointProps as T } from "../../../helpers/hooks/use-breakpoint-props.es.js";
8
- import { et as U } from "../../../../../external/react-day-picker/dist/esm/locale/et.es.js";
9
- import { DayPicker as J } from "../../../../../external/react-day-picker/dist/esm/DayPicker.es.js";
4
+ import { CalendarHeader as I } from "./components/calendar-header/calendar-header.es.js";
5
+ import { MonthGrid as T } from "./components/calendar-month-grid/calendar-month-grid.es.js";
6
+ import { YearGrid as U } from "./components/calendar-year-grid/calendar-year-grid.es.js";
7
+ import { useBreakpointProps as J } from "../../../helpers/hooks/use-breakpoint-props.es.js";
8
+ import { et as K } from "../../../../../external/react-day-picker/dist/esm/locale/et.es.js";
9
+ import { DayPicker as Q } from "../../../../../external/react-day-picker/dist/esm/DayPicker.es.js";
10
10
  import { DayButton as A } from "../../../../../external/react-day-picker/dist/esm/components/DayButton.es.js";
11
- import { StatusIndicator as K } from "../../tags/status-indicator/status-indicator.es.js";
12
- const Q = (u) => {
13
- const { getCurrentBreakpointProps: M } = T(u.defaultServerBreakpoint), {
11
+ import { StatusIndicator as R } from "../../tags/status-indicator/status-indicator.es.js";
12
+ const X = (u) => {
13
+ const { getCurrentBreakpointProps: M } = J(u.defaultServerBreakpoint), {
14
14
  view: c = "days",
15
15
  selectionLevel: y = "days",
16
16
  currentMonth: m,
@@ -18,28 +18,30 @@ const Q = (u) => {
18
18
  setView: s = () => "days",
19
19
  mode: Y = "single",
20
20
  value: n,
21
- locale: G = U,
21
+ locale: x = K,
22
22
  localeCode: h = "et-EE",
23
- showOutsideDays: j = !0,
24
- disabledMatchers: x,
23
+ showOutsideDays: G = !0,
24
+ disabledMatchers: j,
25
25
  required: O,
26
26
  availableDays: i,
27
27
  unavailableDays: d,
28
28
  footer: W,
29
29
  monthYearSelectType: B,
30
+ minYear: E,
31
+ maxYear: F,
30
32
  dayStatus: f,
31
- handleSelect: E,
33
+ handleSelect: L,
32
34
  applyValue: p,
33
35
  showNavigation: _ = !0,
34
36
  className: v,
35
- bordered: F = !0,
37
+ bordered: P = !0,
36
38
  fullWidth: b = !1,
37
- ...L
38
- } = M(u), g = F ? void 0 : a["tedi-calendar--borderless"], w = b ? a["tedi-calendar--full-width"] : void 0, N = k(g, w, v), D = (e) => i ? Array.isArray(i) ? i.some((r) => r.toDateString() === e.toDateString()) : i(e) : !0, C = (e) => d ? Array.isArray(d) ? d.some((r) => r.toDateString() === e.toDateString()) : d(e) : !1, o = [
39
- ...x ?? [],
39
+ ...V
40
+ } = M(u), g = P ? void 0 : a["tedi-calendar--borderless"], w = b ? a["tedi-calendar--full-width"] : void 0, N = k(g, w, v), D = (e) => i ? Array.isArray(i) ? i.some((r) => r.toDateString() === e.toDateString()) : i(e) : !0, C = (e) => d ? Array.isArray(d) ? d.some((r) => r.toDateString() === e.toDateString()) : d(e) : !1, o = [
41
+ ...j ?? [],
40
42
  ...i ? [(e) => !D(e)] : [],
41
43
  ...d ? [(e) => C(e)] : []
42
- ], P = (() => {
44
+ ], q = (() => {
43
45
  switch (Y) {
44
46
  case "multiple":
45
47
  return { mode: "multiple", selected: Array.isArray(n) ? n : void 0 };
@@ -54,7 +56,7 @@ const Q = (u) => {
54
56
  })();
55
57
  return /* @__PURE__ */ S("div", { className: a["tedi-calendar__wrapper"], children: [
56
58
  c === "years" && /* @__PURE__ */ t(
57
- I,
59
+ U,
58
60
  {
59
61
  currentMonth: m,
60
62
  onNavigate: l,
@@ -66,7 +68,7 @@ const Q = (u) => {
66
68
  }
67
69
  ),
68
70
  c === "months" && /* @__PURE__ */ t(
69
- H,
71
+ T,
70
72
  {
71
73
  currentMonth: m,
72
74
  onNavigate: l,
@@ -79,19 +81,19 @@ const Q = (u) => {
79
81
  }
80
82
  ),
81
83
  c === "days" && /* @__PURE__ */ t(
82
- J,
84
+ Q,
83
85
  {
84
- ...L,
85
- ...P,
86
- locale: G,
86
+ ...V,
87
+ ...q,
88
+ locale: x,
87
89
  month: m,
88
90
  onMonthChange: l,
89
- showOutsideDays: j,
91
+ showOutsideDays: G,
90
92
  disabled: o.length ? o : void 0,
91
93
  required: O,
92
94
  components: {
93
95
  MonthCaption: (e) => /* @__PURE__ */ t(
94
- z,
96
+ I,
95
97
  {
96
98
  ...e,
97
99
  monthYearSelectType: B,
@@ -99,19 +101,21 @@ const Q = (u) => {
99
101
  onOpenYearGrid: () => s("years"),
100
102
  showNavigation: _,
101
103
  localeCode: h,
102
- disabledMatchers: o.length ? o : void 0
104
+ disabledMatchers: o.length ? o : void 0,
105
+ minYear: E,
106
+ maxYear: F
103
107
  }
104
108
  ),
105
- Nav: () => /* @__PURE__ */ t(q, {}),
109
+ Nav: () => /* @__PURE__ */ t(H, {}),
106
110
  ...f ? {
107
111
  DayButton: (e) => {
108
112
  const r = f(e.day.date);
109
113
  if (!r)
110
114
  return /* @__PURE__ */ t(A, { ...e });
111
- const V = [e["aria-label"], r.label].filter(Boolean).join(", ");
112
- return /* @__PURE__ */ S(A, { ...e, "aria-label": V, children: [
115
+ const z = [e["aria-label"], r.label].filter(Boolean).join(", ");
116
+ return /* @__PURE__ */ S(A, { ...e, "aria-label": z, children: [
113
117
  e.children,
114
- /* @__PURE__ */ t(K, { type: r.type, size: "sm", className: a["tedi-calendar__day-status"] })
118
+ /* @__PURE__ */ t(R, { type: r.type, size: "sm", className: a["tedi-calendar__day-status"] })
115
119
  ] });
116
120
  }
117
121
  } : {},
@@ -147,12 +151,12 @@ const Q = (u) => {
147
151
  available: a["tedi-calendar__available-day"],
148
152
  unavailable: a["tedi-calendar__unavailable-day"]
149
153
  },
150
- onSelect: E
154
+ onSelect: L
151
155
  }
152
156
  )
153
157
  ] });
154
158
  };
155
- Q.displayName = "Calendar";
159
+ X.displayName = "Calendar";
156
160
  export {
157
- Q as Calendar
161
+ X as Calendar
158
162
  };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),y=require("../../../../../../../external/classnames/index.cjs.js"),j=require("react"),p=require("../../../../base/icon/icon.cjs.js"),v=require("../../../../base/typography/text/text.cjs.js"),c=require("../../../../buttons/button/button.cjs.js"),r=require("./calendar-header.module.scss.cjs.js"),F=require("../../../../../providers/label-provider/use-labels.cjs.js"),A=require("../../../../../../../external/react-day-picker/dist/esm/types/deprecated.cjs.js"),H=require("../../../../../../../external/react-day-picker/dist/esm/utils/dateMatchModifiers.cjs.js"),l=require("../../../../overlays/dropdown/dropdown.cjs.js");function O({calendarMonth:N,monthYearSelectType:D="dropdown",onOpenMonthGrid:q,onOpenYearGrid:C,showNavigation:u=!0,localeCode:_,disabledMatchers:o}){const x=D==="grid",I=D==="static"||!u,{getLabel:f}=F.useLabels(),{goToMonth:m,nextMonth:S,previousMonth:k}=A.useNavigation(),i=N.date,a=i.getFullYear(),h=i.getMonth(),L=Array.from({length:12},(n,t)=>new Date(a,t,1).toLocaleString(_,{month:"long"})),T=new Date().getFullYear(),s=Array.from({length:21},(n,t)=>T-10+t),w=j.useCallback((n,t)=>{if(!(o!=null&&o.length))return!1;const d=new Date(n);for(;d<=t;){if(!H.dateMatchModifiers(d,o))return!1;d.setDate(d.getDate()+1)}return!0},[o]),B=j.useMemo(()=>{if(!(o!=null&&o.length))return new Set;const n=new Set;for(let t=0;t<12;t++){const d=new Date(a,t,1),g=new Date(a,t+1,0);w(d,g)&&n.add(t)}return n},[o,a,w]),Y=j.useMemo(()=>{if(!(o!=null&&o.length))return new Set;const n=new Set;for(const t of s){const d=new Date(t,0,1),g=new Date(t,11,31);w(d,g)&&n.add(t)}return n},[o,s,w]);return e.jsxs("div",{className:y.default(r.default["tedi-calendar__header"],{[r.default["tedi-calendar__no-navigation"]]:!u}),children:[u&&e.jsx(c.Button,{type:"button",onClick:()=>k&&m(k),"aria-label":f("pickers.previousMonth"),icon:"arrow_back",visualType:"neutral",children:f("pickers.previousMonth")}),I?e.jsxs("div",{className:r.default["tedi-calendar__month-year-label"],children:[e.jsx(v.Text,{children:i.toLocaleString(_,{month:"long"})}),e.jsx(v.Text,{children:a})]}):x?e.jsxs("div",{className:r.default["tedi-calendar__title"],children:[e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],onClick:q,"data-testid":"tedi-calendar-month-trigger",children:[i.toLocaleString(_,{month:"long"}),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"]})]}),e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],onClick:C,"data-testid":"tedi-calendar-year-trigger",children:[i.getFullYear(),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"]})]})]}):e.jsxs("div",{className:r.default["tedi-calendar__title"],children:[e.jsxs(l.Dropdown,{className:y.default(r.default["tedi-calendar__month-year-dropdown"],{[r.default["tedi-calendar__picker-grid-dropdown"]]:x}),width:"auto",defaultActiveIndex:h,children:[e.jsx(l.Dropdown.Trigger,{children:e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],children:[i.toLocaleString(_,{month:"long"}),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"],"data-testid":"tedi-icon-arrow_drop_down"})]})}),e.jsx(l.Dropdown.Content,{children:L.map((n,t)=>e.jsx(l.Dropdown.Item,{index:t,active:h===t,disabled:B.has(t),onClick:()=>m(new Date(a,t)),children:n},n))})]}),e.jsxs(l.Dropdown,{className:y.default(r.default["tedi-calendar__month-year-dropdown"],{[r.default["tedi-calendar__picker-grid-dropdown"]]:x}),width:"auto",defaultActiveIndex:s.indexOf(a)===-1?void 0:s.indexOf(a),children:[e.jsx(l.Dropdown.Trigger,{children:e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],children:[i.getFullYear(),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"],"data-testid":"tedi-icon-arrow_drop_down"})]})}),e.jsx(l.Dropdown.Content,{children:s.map((n,t)=>e.jsx(l.Dropdown.Item,{index:t,active:a===n,disabled:Y.has(n),onClick:()=>m(new Date(n,h)),children:n},n))})]})]}),u&&e.jsx(c.Button,{type:"button",onClick:()=>S&&m(S),visualType:"neutral","aria-label":f("pickers.nextMonth"),icon:"arrow_forward",children:f("pickers.nextMonth")})]})}exports.CalendarHeader=O;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),y=require("../../../../../../../external/classnames/index.cjs.js"),j=require("react"),p=require("../../../../base/icon/icon.cjs.js"),q=require("../../../../base/typography/text/text.cjs.js"),c=require("../../../../buttons/button/button.cjs.js"),r=require("./calendar-header.module.scss.cjs.js"),O=require("../../../../../providers/label-provider/use-labels.cjs.js"),R=require("../../../../../../../external/react-day-picker/dist/esm/types/deprecated.cjs.js"),G=require("../../../../../../../external/react-day-picker/dist/esm/utils/dateMatchModifiers.cjs.js"),l=require("../../../../overlays/dropdown/dropdown.cjs.js");function P({calendarMonth:C,monthYearSelectType:D="dropdown",onOpenMonthGrid:Y,onOpenYearGrid:I,showNavigation:u=!0,localeCode:_,disabledMatchers:o,minYear:L,maxYear:T}){const x=D==="grid",B=D==="static"||!u,{getLabel:m}=O.useLabels(),{goToMonth:f,nextMonth:v,previousMonth:S}=R.useNavigation(),i=C.date,a=i.getFullYear(),h=i.getMonth(),F=Array.from({length:12},(n,t)=>new Date(a,t,1).toLocaleString(_,{month:"long"})),k=new Date().getFullYear(),N=L??k-100,A=T??k+20,s=Array.from({length:Math.max(0,A-N+1)},(n,t)=>N+t),w=j.useCallback((n,t)=>{if(!(o!=null&&o.length))return!1;const d=new Date(n);for(;d<=t;){if(!G.dateMatchModifiers(d,o))return!1;d.setDate(d.getDate()+1)}return!0},[o]),H=j.useMemo(()=>{if(!(o!=null&&o.length))return new Set;const n=new Set;for(let t=0;t<12;t++){const d=new Date(a,t,1),g=new Date(a,t+1,0);w(d,g)&&n.add(t)}return n},[o,a,w]),M=j.useMemo(()=>{if(!(o!=null&&o.length))return new Set;const n=new Set;for(const t of s){const d=new Date(t,0,1),g=new Date(t,11,31);w(d,g)&&n.add(t)}return n},[o,s,w]);return e.jsxs("div",{className:y.default(r.default["tedi-calendar__header"],{[r.default["tedi-calendar__no-navigation"]]:!u}),children:[u&&e.jsx(c.Button,{type:"button",onClick:()=>S&&f(S),"aria-label":m("pickers.previousMonth"),icon:"arrow_back",visualType:"neutral",children:m("pickers.previousMonth")}),B?e.jsxs("div",{className:r.default["tedi-calendar__month-year-label"],children:[e.jsx(q.Text,{children:i.toLocaleString(_,{month:"long"})}),e.jsx(q.Text,{children:a})]}):x?e.jsxs("div",{className:r.default["tedi-calendar__title"],children:[e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],onClick:Y,"data-testid":"tedi-calendar-month-trigger",children:[i.toLocaleString(_,{month:"long"}),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"]})]}),e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],onClick:I,"data-testid":"tedi-calendar-year-trigger",children:[i.getFullYear(),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"]})]})]}):e.jsxs("div",{className:r.default["tedi-calendar__title"],children:[e.jsxs(l.Dropdown,{className:y.default(r.default["tedi-calendar__month-year-dropdown"],{[r.default["tedi-calendar__picker-grid-dropdown"]]:x}),width:"auto",defaultActiveIndex:h,children:[e.jsx(l.Dropdown.Trigger,{children:e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],children:[i.toLocaleString(_,{month:"long"}),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"],"data-testid":"tedi-icon-arrow_drop_down"})]})}),e.jsx(l.Dropdown.Content,{children:F.map((n,t)=>e.jsx(l.Dropdown.Item,{index:t,active:h===t,disabled:H.has(t),onClick:()=>f(new Date(a,t)),children:n},n))})]}),e.jsxs(l.Dropdown,{className:y.default(r.default["tedi-calendar__month-year-dropdown"],{[r.default["tedi-calendar__picker-grid-dropdown"]]:x}),width:"auto",defaultActiveIndex:s.indexOf(a)===-1?void 0:s.indexOf(a),children:[e.jsx(l.Dropdown.Trigger,{children:e.jsxs(c.Button,{noStyle:!0,className:r.default["tedi-calendar__month-year-selector"],children:[i.getFullYear(),e.jsx(p.Icon,{name:"arrow_drop_down",color:"tertiary",className:r.default["tedi-calendar__month-year-caret"],"data-testid":"tedi-icon-arrow_drop_down"})]})}),e.jsx(l.Dropdown.Content,{children:s.map((n,t)=>e.jsx(l.Dropdown.Item,{index:t,active:a===n,disabled:M.has(n),onClick:()=>f(new Date(n,h)),children:n},n))})]})]}),u&&e.jsx(c.Button,{type:"button",onClick:()=>v&&f(v),visualType:"neutral","aria-label":m("pickers.nextMonth"),icon:"arrow_forward",children:m("pickers.nextMonth")})]})}exports.CalendarHeader=P;
@@ -27,5 +27,17 @@ export interface CalendarHeaderProps extends Pick<MonthCaptionProps, 'calendarMo
27
27
  * that has no selectable dates.
28
28
  */
29
29
  disabledMatchers?: Matcher[];
30
+ /**
31
+ * Earliest year offered in the year dropdown. Defaults to 100 years before
32
+ * the current year when omitted.
33
+ * @default currentYear - 100
34
+ */
35
+ minYear?: number;
36
+ /**
37
+ * Latest year offered in the year dropdown. Defaults to 20 years after the
38
+ * current year when omitted.
39
+ * @default currentYear + 20
40
+ */
41
+ maxYear?: number;
30
42
  }
31
- export declare function CalendarHeader({ calendarMonth, monthYearSelectType, onOpenMonthGrid, onOpenYearGrid, showNavigation, localeCode, disabledMatchers, }: CalendarHeaderProps): import("react/jsx-runtime").JSX.Element;
43
+ export declare function CalendarHeader({ calendarMonth, monthYearSelectType, onOpenMonthGrid, onOpenYearGrid, showNavigation, localeCode, disabledMatchers, minYear, maxYear, }: CalendarHeaderProps): import("react/jsx-runtime").JSX.Element;
@@ -1,58 +1,63 @@
1
1
  import { jsxs as a, jsx as n } from "react/jsx-runtime";
2
- import v from "../../../../../../../external/classnames/index.es.js";
3
- import { useCallback as B, useMemo as x } from "react";
2
+ import k from "../../../../../../../external/classnames/index.es.js";
3
+ import { useCallback as q, useMemo as C } from "react";
4
4
  import { Icon as g } from "../../../../base/icon/icon.es.js";
5
- import { Text as C } from "../../../../base/typography/text/text.es.js";
5
+ import { Text as L } from "../../../../base/typography/text/text.es.js";
6
6
  import { Button as s } from "../../../../buttons/button/button.es.js";
7
7
  import r from "./calendar-header.module.scss.es.js";
8
- import { useLabels as G } from "../../../../../providers/label-provider/use-labels.es.js";
9
- import { useNavigation as H } from "../../../../../../../external/react-day-picker/dist/esm/types/deprecated.es.js";
10
- import { dateMatchModifiers as R } from "../../../../../../../external/react-day-picker/dist/esm/utils/dateMatchModifiers.es.js";
8
+ import { useLabels as z } from "../../../../../providers/label-provider/use-labels.es.js";
9
+ import { useNavigation as E } from "../../../../../../../external/react-day-picker/dist/esm/types/deprecated.es.js";
10
+ import { dateMatchModifiers as J } from "../../../../../../../external/react-day-picker/dist/esm/utils/dateMatchModifiers.es.js";
11
11
  import { Dropdown as c } from "../../../../overlays/dropdown/dropdown.es.js";
12
- function Z({
13
- calendarMonth: L,
14
- monthYearSelectType: D = "dropdown",
15
- onOpenMonthGrid: Y,
16
- onOpenYearGrid: F,
12
+ function ee({
13
+ calendarMonth: F,
14
+ monthYearSelectType: x = "dropdown",
15
+ onOpenMonthGrid: T,
16
+ onOpenYearGrid: A,
17
17
  showNavigation: _ = !0,
18
18
  localeCode: u,
19
- disabledMatchers: o
19
+ disabledMatchers: o,
20
+ minYear: I,
21
+ maxYear: j
20
22
  }) {
21
- const f = D === "grid", T = D === "static" || !_, { getLabel: p } = G(), { goToMonth: h, nextMonth: N, previousMonth: S } = H(), d = L.date, i = d.getFullYear(), y = d.getMonth(), A = Array.from(
23
+ const f = x === "grid", O = x === "static" || !_, { getLabel: p } = z(), { goToMonth: h, nextMonth: D, previousMonth: N } = E(), d = F.date, i = d.getFullYear(), y = d.getMonth(), B = Array.from(
22
24
  { length: 12 },
23
25
  (t, e) => new Date(i, e, 1).toLocaleString(u, { month: "long" })
24
- ), I = (/* @__PURE__ */ new Date()).getFullYear(), m = Array.from({ length: 21 }, (t, e) => I - 10 + e), w = B(
26
+ ), S = (/* @__PURE__ */ new Date()).getFullYear(), Y = I ?? S - 100, G = j ?? S + 20, m = Array.from(
27
+ { length: Math.max(0, G - Y + 1) },
28
+ (t, e) => Y + e
29
+ ), w = q(
25
30
  (t, e) => {
26
31
  if (!(o != null && o.length)) return !1;
27
32
  const l = new Date(t);
28
33
  for (; l <= e; ) {
29
- if (!R(l, o)) return !1;
34
+ if (!J(l, o)) return !1;
30
35
  l.setDate(l.getDate() + 1);
31
36
  }
32
37
  return !0;
33
38
  },
34
39
  [o]
35
- ), j = x(() => {
40
+ ), H = C(() => {
36
41
  if (!(o != null && o.length)) return /* @__PURE__ */ new Set();
37
42
  const t = /* @__PURE__ */ new Set();
38
43
  for (let e = 0; e < 12; e++) {
39
- const l = new Date(i, e, 1), k = new Date(i, e + 1, 0);
40
- w(l, k) && t.add(e);
44
+ const l = new Date(i, e, 1), v = new Date(i, e + 1, 0);
45
+ w(l, v) && t.add(e);
41
46
  }
42
47
  return t;
43
- }, [o, i, w]), O = x(() => {
48
+ }, [o, i, w]), R = C(() => {
44
49
  if (!(o != null && o.length)) return /* @__PURE__ */ new Set();
45
50
  const t = /* @__PURE__ */ new Set();
46
51
  for (const e of m) {
47
- const l = new Date(e, 0, 1), k = new Date(e, 11, 31);
48
- w(l, k) && t.add(e);
52
+ const l = new Date(e, 0, 1), v = new Date(e, 11, 31);
53
+ w(l, v) && t.add(e);
49
54
  }
50
55
  return t;
51
56
  }, [o, m, w]);
52
57
  return /* @__PURE__ */ a(
53
58
  "div",
54
59
  {
55
- className: v(r["tedi-calendar__header"], {
60
+ className: k(r["tedi-calendar__header"], {
56
61
  [r["tedi-calendar__no-navigation"]]: !_
57
62
  }),
58
63
  children: [
@@ -60,23 +65,23 @@ function Z({
60
65
  s,
61
66
  {
62
67
  type: "button",
63
- onClick: () => S && h(S),
68
+ onClick: () => N && h(N),
64
69
  "aria-label": p("pickers.previousMonth"),
65
70
  icon: "arrow_back",
66
71
  visualType: "neutral",
67
72
  children: p("pickers.previousMonth")
68
73
  }
69
74
  ),
70
- T ? /* @__PURE__ */ a("div", { className: r["tedi-calendar__month-year-label"], children: [
71
- /* @__PURE__ */ n(C, { children: d.toLocaleString(u, { month: "long" }) }),
72
- /* @__PURE__ */ n(C, { children: i })
75
+ O ? /* @__PURE__ */ a("div", { className: r["tedi-calendar__month-year-label"], children: [
76
+ /* @__PURE__ */ n(L, { children: d.toLocaleString(u, { month: "long" }) }),
77
+ /* @__PURE__ */ n(L, { children: i })
73
78
  ] }) : f ? /* @__PURE__ */ a("div", { className: r["tedi-calendar__title"], children: [
74
79
  /* @__PURE__ */ a(
75
80
  s,
76
81
  {
77
82
  noStyle: !0,
78
83
  className: r["tedi-calendar__month-year-selector"],
79
- onClick: Y,
84
+ onClick: T,
80
85
  "data-testid": "tedi-calendar-month-trigger",
81
86
  children: [
82
87
  d.toLocaleString(u, { month: "long" }),
@@ -89,7 +94,7 @@ function Z({
89
94
  {
90
95
  noStyle: !0,
91
96
  className: r["tedi-calendar__month-year-selector"],
92
- onClick: F,
97
+ onClick: A,
93
98
  "data-testid": "tedi-calendar-year-trigger",
94
99
  children: [
95
100
  d.getFullYear(),
@@ -101,7 +106,7 @@ function Z({
101
106
  /* @__PURE__ */ a(
102
107
  c,
103
108
  {
104
- className: v(r["tedi-calendar__month-year-dropdown"], {
109
+ className: k(r["tedi-calendar__month-year-dropdown"], {
105
110
  [r["tedi-calendar__picker-grid-dropdown"]]: f
106
111
  }),
107
112
  width: "auto",
@@ -119,12 +124,12 @@ function Z({
119
124
  }
120
125
  )
121
126
  ] }) }),
122
- /* @__PURE__ */ n(c.Content, { children: A.map((t, e) => /* @__PURE__ */ n(
127
+ /* @__PURE__ */ n(c.Content, { children: B.map((t, e) => /* @__PURE__ */ n(
123
128
  c.Item,
124
129
  {
125
130
  index: e,
126
131
  active: y === e,
127
- disabled: j.has(e),
132
+ disabled: H.has(e),
128
133
  onClick: () => h(new Date(i, e)),
129
134
  children: t
130
135
  },
@@ -136,7 +141,7 @@ function Z({
136
141
  /* @__PURE__ */ a(
137
142
  c,
138
143
  {
139
- className: v(r["tedi-calendar__month-year-dropdown"], {
144
+ className: k(r["tedi-calendar__month-year-dropdown"], {
140
145
  [r["tedi-calendar__picker-grid-dropdown"]]: f
141
146
  }),
142
147
  width: "auto",
@@ -159,7 +164,7 @@ function Z({
159
164
  {
160
165
  index: e,
161
166
  active: i === t,
162
- disabled: O.has(t),
167
+ disabled: R.has(t),
163
168
  onClick: () => h(new Date(t, y)),
164
169
  children: t
165
170
  },
@@ -173,7 +178,7 @@ function Z({
173
178
  s,
174
179
  {
175
180
  type: "button",
176
- onClick: () => N && h(N),
181
+ onClick: () => D && h(D),
177
182
  visualType: "neutral",
178
183
  "aria-label": p("pickers.nextMonth"),
179
184
  icon: "arrow_forward",
@@ -185,5 +190,5 @@ function Z({
185
190
  );
186
191
  }
187
192
  export {
188
- Z as CalendarHeader
193
+ ee as CalendarHeader
189
194
  };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),A=require("../../../../../external/@floating-ui/react/dist/floating-ui.react.cjs.js"),I=require("../../../../../external/classnames/index.cjs.js"),a=require("react"),xt=require("../../content/calendar/calendar.cjs.js"),Mt=require("../multi-value-field/multi-value-field.cjs.js"),Ct=require("../textfield/textfield.cjs.js"),D=require("./date-field.module.scss.cjs.js"),v=require("./date-field-helpers.cjs.js"),At=require("./date-picker-modal/date-picker-modal.cjs.js"),Ft=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),kt=require("../../../providers/label-provider/use-labels.cjs.js"),vt=require("../../../../../external/react-day-picker/dist/esm/locale/et.cjs.js"),me=require("../../../helpers/hooks/use-breakpoint.cjs.js"),Pt=require("../../../../../external/@floating-ui/dom/dist/floating-ui.dom.cjs.js"),G=require("../../../../../external/@floating-ui/react-dom/dist/floating-ui.react-dom.cjs.js"),wt=require("../../../../../external/react-day-picker/dist/esm/utils/dateMatchModifiers.cjs.js"),je=a.forwardRef((P,w)=>{const{getCurrentBreakpointProps:Se}=Ft.useBreakpointProps(P.defaultServerBreakpoint),{getLabel:z}=kt.useLabels(),{useNativePicker:Le=!1,enableCalendar:h=!0,calendarTrigger:T="button",numberOfMonths:X}=Se(P),{id:pe,mode:l="single",label:he,selected:j,onSelect:i,disabled:N,disabledMatchers:E,placeholder:$e,className:He,formatDate:c,required:S,showOutsideDays:ge=!0,parseDate:Ue,monthYearSelectType:be,dayStatus:ye,tagsDirection:We,showNavigation:De=!0,selectionLevel:O="days",initialView:L,locale:_e=vt.et,localeCode:$="et-EE",initialMonth:H,closeOnSelect:Ye,footer:xe,defaultValue:U,minDate:J,maxDate:K,disablePast:Me,disableFuture:Ce,shouldDisableMonth:Q,shouldDisableYear:Z,readOnly:R,availableDays:Ae,inputProps:n,modal:ee=!1,modalProps:Ge,modalTitle:ze,disabledDateErrorMessage:Xe=z("dateField.disabledDateError"),invalidDateErrorMessage:Je=z("dateField.invalidDateError"),useNativePicker:Nt,enableCalendar:Et,calendarTrigger:Ot,numberOfMonths:Rt,defaultServerBreakpoint:Vt,sm:qt,md:Bt,lg:It,xl:Tt,xxl:jt,...Fe}=P,f=Le&&l==="single",ke=me.default(P.defaultServerBreakpoint),F=me.isBreakpointBelow(ke,"md"),[Ke,g]=a.useState(j??U),[b,V]=a.useState(!1),[te,ve]=a.useState(!1),[Qe,Pe]=a.useState(L??O),[re,_]=a.useState(""),[we,m]=a.useState(!1),[Ne,ae]=a.useState(!1),y=h&&!f&&!R&&(ee===!0||typeof ee=="string"&&me.isBreakpointBelow(ke,ee)),Ee=F&&!y&&typeof X=="number"&&X>1?1:X,{current:u}=a.useRef("selected"in P),s=u?j:Ke,ie=a.useRef(null),Oe=a.useRef(null),Ze=a.useCallback(e=>{ie.current=e,typeof w=="function"?w(e):w&&(w.current=e)},[w]),et=e=>{if(!e)return"";const t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${o}`},tt=f&&s instanceof Date?et(s):"",ne=a.useCallback((e,t)=>e instanceof Date?e:Array.isArray(e)&&e.length>0?[...e].sort((r,o)=>r.getTime()-o.getTime())[0]:e&&typeof e=="object"&&"from"in e&&e.from instanceof Date?e.from:e&&typeof e=="object"&&"to"in e&&e.to instanceof Date?e.to:t??new Date,[]),[rt,se]=a.useState(()=>ne(s,H));a.useEffect(()=>{b||se(ne(s,H))},[s,H,b,ne]),a.useEffect(()=>{b&&Pe(L??O)},[b,O,L]),a.useEffect(()=>{u&&g(j)},[j,u]);const x=a.useMemo(()=>new Intl.DateTimeFormat($,{day:"2-digit",month:"2-digit",year:"numeric"}),[$]),M=a.useCallback(e=>{if(!e)return"";if(e instanceof Date)return x.format(e);if(Array.isArray(e))return e.map(t=>x.format(t)).join(", ");if(e.from){const t=x.format(e.from);return e.to?`${t} – ${x.format(e.to)}`:t}return""},[x]),oe=Ye??l==="single",Re=l==="multiple"&&Array.isArray(s)?s.map((e,t)=>({id:t,label:c?c(e):M(e),date:e})):[],W=a.useMemo(()=>{const e=[];return N&&(Array.isArray(N)?e.push(...N):e.push(N)),E&&(Array.isArray(E)?e.push(...E):e.push(E)),J&&e.push({before:J}),K&&e.push({after:K}),Me&&e.push({before:new Date}),Ce&&e.push({after:new Date}),Q&&e.push(t=>Q(t)),Z&&e.push(t=>Z(t)),e},[N,E,J,K,Me,Ce,Q,Z]),k=a.useCallback(e=>wt.dateMatchModifiers(e,W),[W]),at=(e,t,r,o)=>{const d=l==="range"?v.resolveRangeSelection(e,s,t):e;if(m(!1),u||g(d),i==null||i(d,t,r,o),d){const C=c?c(d):M(d);_(C)}else _("");oe&&V(!1)},it=e=>{if(k(e))return;const t=l==="range"?{from:e,to:void 0}:l==="multiple"?[...Array.isArray(s)?s:[],e]:e;m(!1),u||g(t),i==null||i(t,e,{},{});const r=c?c(t):M(t);_(r),oe&&V(!1)},nt=a.useMemo(()=>{const e=v.getLocaleDateParts(x),t=new RegExp(`^${v.buildDateRegexSource(e)}$`),{fieldOrder:r}=e;return o=>{const d=o.match(t);if(!d)return;const C={};r.forEach((Dt,_t)=>{C[Dt]=Number(d[_t+1])});const{day:ue,month:ce,year:fe}=C;if(ue===void 0||ce===void 0||fe===void 0)return;const B=new Date(fe,ce-1,ue);if(!(isNaN(B.getTime())||B.getFullYear()!==fe||B.getMonth()!==ce-1||B.getDate()!==ue))return B}},[x]),Ve=e=>(Ue??(l==="single"?nt:()=>{}))(e),qe=e=>l==="single"&&e instanceof Date||l==="multiple"&&Array.isArray(e)||l==="range"&&!!e&&!Array.isArray(e)&&"from"in e,st=e=>{if(_(e),ae(!1),e.trim()===""){m(!1),s!==void 0&&(u||g(void 0),i==null||i(void 0,void 0,{},{}));return}const t=Ve(e);if(!qe(t)){m(!1);return}const o=t&&!Array.isArray(t)&&"from"in t?t:null;if(t instanceof Date&&k(t)||Array.isArray(t)&&t.some(C=>C instanceof Date&&k(C))||!!o&&(o.from&&k(o.from)||o.to&&k(o.to))){m(!0);return}m(!1),u||g(t),i==null||i(t,t,{},{}),t instanceof Date&&se(t),oe&&V(!1)},ot=()=>{if(re.trim()===""){ae(!1);return}ae(!qe(Ve(re)))};a.useEffect(()=>{if(u){const e=c?c(s):M(s);_(e)}},[s,u,c,M]),a.useEffect(()=>{if(!u&&U){const e=c?c(U):M(U);_(e)}},[]);const lt=A.useFloating({open:b,onOpenChange:V,placement:T==="input"?"bottom-start":"bottom-end",middleware:[G.offset(v.CALENDAR_POPOVER_OFFSET),G.flip(),G.shift({padding:v.CALENDAR_POPOVER_PADDING}),G.size({padding:v.CALENDAR_POPOVER_PADDING,apply({availableWidth:e,elements:t}){const r=t.floating;if(r.style.width="",r.style.maxWidth="",r.style.overflowX="",F)return;r.style.width="max-content",r.getBoundingClientRect().width>e&&(r.style.width="min-content",r.style.maxWidth=`${e}px`)}})],whileElementsMounted:Pt.autoUpdate}),{refs:q,context:Y,x:dt,y:ut,strategy:ct}=lt,ft=A.useClick(Y),Be=A.useInteractions([...h&&!f&&T==="input"&&!y?[ft]:[],A.useDismiss(Y,{outsidePress:e=>{const t=e.target;return!(t!=null&&t.closest('[role="menu"], [role="listbox"]'))}}),A.useRole(Y,{role:"dialog"})]);a.useEffect(()=>{var t,r;const e=l==="multiple"?((t=Oe.current)==null?void 0:t.wrapper)??null:((r=ie.current)==null?void 0:r.input)??null;q.setPositionReference(e??q.reference.current)},[l,b,q]);const mt=()=>{var t;const e=(t=ie.current)==null?void 0:t.input;if(e){if(typeof e.showPicker=="function")try{e.showPicker();return}catch{}e.focus()}},le=()=>{!h||R||(f?mt():y?ve(!0):V(e=>!e))},pt=e=>{if(m(!1),u||g(e),i==null||i(e,e,{},{}),e){const t=c?c(e):M(e);_(t)}else _("")},ht=e=>{if(!e){m(!1),u||g(void 0),i==null||i(void 0,void 0,{},{});return}const[t,r,o]=e.split("-").map(Number);if(!t||!r||!o)return;const d=new Date(t,r-1,o);if(!Number.isNaN(d.getTime())){if(k(d)){m(!0);return}m(!1),u||g(d),i==null||i(d,d,{},{})}},gt=Be.getReferenceProps(y&&T==="input"?{onClick:()=>le()}:void 0),{role:St,"aria-expanded":Lt,"aria-haspopup":$t,"aria-controls":bt,...yt}=gt,Ie=y?void 0:bt,de=z("dateField.openCalendar"),Te={"aria-label":de,"aria-expanded":y?te:b,"aria-haspopup":"dialog","aria-controls":Ie};return p.jsxs(p.Fragment,{children:[p.jsx("div",{className:I.default(D.default["tedi-date-field__container"],He),...yt,ref:q.setReference,children:l==="multiple"?p.jsx(Mt.MultiValueField,{...n,ref:Oe,id:pe,label:he,tagsDirection:We,values:Re.map(e=>e.label),icon:"calendar_today",onIconClick:le,iconButtonProps:h?Te:{"aria-label":de},isClearable:!0,required:S,onChange:e=>{if(!Array.isArray(s))return;const t=Re.filter(r=>e.includes(r.label)).map(r=>r.date);u||g(t),i==null||i(t,{},{},{})},className:I.default(D.default["tedi-date-field__textfield"],{[D.default["tedi-date-field__icon--disabled"]]:!h||R})}):p.jsx(Ct.TextField,{...n,ref:Ze,id:pe,label:he,readOnly:R,value:f?tt:re,placeholder:$e,icon:"calendar_today",isClearable:!0,onIconClick:le,iconButtonProps:h&&!f?Te:{"aria-label":de},onChange:e=>f?ht(e):st(e),onBlur:e=>{var t;f||ot(),(t=n==null?void 0:n.onBlur)==null||t.call(n,e)},required:S,invalid:we||Ne||(n==null?void 0:n.invalid),helper:(()=>{const e=n==null?void 0:n.helper,t=we?Xe:Ne?Je:null,r=t?{text:t,type:"error"}:null;return r?e?Array.isArray(e)?[...e,r]:[e,r]:r:e})(),className:I.default(D.default["tedi-date-field__textfield"],{[D.default["tedi-date-field__textfield--disabled"]]:n==null?void 0:n.disabled,[D.default["tedi-date-field__icon--disabled"]]:!h||R}),input:{...n==null?void 0:n.input,...f&&{type:"date"},...h&&!f&&T==="input"?{role:"combobox","aria-haspopup":"dialog","aria-expanded":y?te:b,"aria-controls":Ie}:{}}})}),y&&p.jsx(At.DatePickerModal,{open:te,onOpenChange:ve,value:s,onConfirm:pt,mode:l,numberOfMonths:Ee,locale:_e,localeCode:$,showOutsideDays:ge,disabledMatchers:W,required:S,availableDays:Ae,footer:xe,monthYearSelectType:be,dayStatus:ye,showNavigation:De,selectionLevel:O,initialView:L,initialMonth:H,modalProps:Ge,...Fe,title:ze}),h&&!f&&!y&&p.jsx(A.FloatingPortal,{children:b&&p.jsx(A.FloatingFocusManager,{context:Y,modal:!1,initialFocus:-1,children:p.jsx("div",{ref:q.setFloating,className:I.default({[D.default["tedi-date-field__calendar-popover--fullwidth"]]:F}),...Be.getFloatingProps({style:{position:ct,top:ut??0,left:F?0:dt??0,right:F?0:void 0}}),children:p.jsx(xt.Calendar,{...Fe,numberOfMonths:Ee,view:Qe,selectionLevel:O,currentMonth:rt,setCurrentMonth:se,setView:Pe,mode:l,value:s,locale:_e,localeCode:$,showOutsideDays:ge,disabledMatchers:W,required:S,availableDays:Ae,footer:xe,monthYearSelectType:be,dayStatus:ye,showNavigation:De,handleSelect:at,applyValue:it,className:I.default(D.default["tedi-date-field__calendar"],{[D.default["tedi-date-field__calendar--fullwidth"]]:F})})})})})]})});je.displayName="DateField";exports.DateField=je;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),A=require("../../../../../external/@floating-ui/react/dist/floating-ui.react.cjs.js"),I=require("../../../../../external/classnames/index.cjs.js"),a=require("react"),Ct=require("../../content/calendar/calendar.cjs.js"),At=require("../multi-value-field/multi-value-field.cjs.js"),Ft=require("../textfield/textfield.cjs.js"),D=require("./date-field.module.scss.cjs.js"),v=require("./date-field-helpers.cjs.js"),kt=require("./date-picker-modal/date-picker-modal.cjs.js"),vt=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),Pt=require("../../../providers/label-provider/use-labels.cjs.js"),wt=require("../../../../../external/react-day-picker/dist/esm/locale/et.cjs.js"),me=require("../../../helpers/hooks/use-breakpoint.cjs.js"),Nt=require("../../../../../external/@floating-ui/dom/dist/floating-ui.dom.cjs.js"),G=require("../../../../../external/@floating-ui/react-dom/dist/floating-ui.react-dom.cjs.js"),Et=require("../../../../../external/react-day-picker/dist/esm/utils/dateMatchModifiers.cjs.js"),Le=a.forwardRef((P,w)=>{const{getCurrentBreakpointProps:$e}=vt.useBreakpointProps(P.defaultServerBreakpoint),{getLabel:z}=Pt.useLabels(),{useNativePicker:He=!1,enableCalendar:h=!0,calendarTrigger:T="button",numberOfMonths:X}=$e(P),{id:pe,mode:l="single",label:he,selected:j,onSelect:i,disabled:N,disabledMatchers:E,placeholder:Ye,className:Ue,formatDate:c,required:S,showOutsideDays:ge=!0,parseDate:We,monthYearSelectType:be,minYear:ye,maxYear:De,dayStatus:_e,tagsDirection:Ge,showNavigation:xe=!0,selectionLevel:O="days",initialView:L,locale:Me=wt.et,localeCode:$="et-EE",initialMonth:H,closeOnSelect:ze,footer:Ce,defaultValue:Y,minDate:J,maxDate:K,disablePast:Ae,disableFuture:Fe,shouldDisableMonth:Q,shouldDisableYear:Z,readOnly:R,availableDays:ke,inputProps:n,modal:ee=!1,modalProps:Xe,modalTitle:Je,disabledDateErrorMessage:Ke=z("dateField.disabledDateError"),invalidDateErrorMessage:Qe=z("dateField.invalidDateError"),useNativePicker:Ot,enableCalendar:Rt,calendarTrigger:Vt,numberOfMonths:qt,defaultServerBreakpoint:Bt,sm:It,md:Tt,lg:jt,xl:St,xxl:Lt,...ve}=P,f=He&&l==="single",Pe=me.default(P.defaultServerBreakpoint),F=me.isBreakpointBelow(Pe,"md"),[Ze,g]=a.useState(j??Y),[b,V]=a.useState(!1),[te,we]=a.useState(!1),[et,Ne]=a.useState(L??O),[re,_]=a.useState(""),[Ee,m]=a.useState(!1),[Oe,ae]=a.useState(!1),y=h&&!f&&!R&&(ee===!0||typeof ee=="string"&&me.isBreakpointBelow(Pe,ee)),Re=F&&!y&&typeof X=="number"&&X>1?1:X,{current:u}=a.useRef("selected"in P),s=u?j:Ze,ie=a.useRef(null),Ve=a.useRef(null),tt=a.useCallback(e=>{ie.current=e,typeof w=="function"?w(e):w&&(w.current=e)},[w]),rt=e=>{if(!e)return"";const t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${o}`},at=f&&s instanceof Date?rt(s):"",ne=a.useCallback((e,t)=>e instanceof Date?e:Array.isArray(e)&&e.length>0?[...e].sort((r,o)=>r.getTime()-o.getTime())[0]:e&&typeof e=="object"&&"from"in e&&e.from instanceof Date?e.from:e&&typeof e=="object"&&"to"in e&&e.to instanceof Date?e.to:t??new Date,[]),[it,se]=a.useState(()=>ne(s,H));a.useEffect(()=>{b||se(ne(s,H))},[s,H,b,ne]),a.useEffect(()=>{b&&Ne(L??O)},[b,O,L]),a.useEffect(()=>{u&&g(j)},[j,u]);const x=a.useMemo(()=>new Intl.DateTimeFormat($,{day:"2-digit",month:"2-digit",year:"numeric"}),[$]),M=a.useCallback(e=>{if(!e)return"";if(e instanceof Date)return x.format(e);if(Array.isArray(e))return e.map(t=>x.format(t)).join(", ");if(e.from){const t=x.format(e.from);return e.to?`${t} – ${x.format(e.to)}`:t}return""},[x]),oe=ze??l==="single",qe=l==="multiple"&&Array.isArray(s)?s.map((e,t)=>({id:t,label:c?c(e):M(e),date:e})):[],U=a.useMemo(()=>{const e=[];return N&&(Array.isArray(N)?e.push(...N):e.push(N)),E&&(Array.isArray(E)?e.push(...E):e.push(E)),J&&e.push({before:J}),K&&e.push({after:K}),Ae&&e.push({before:new Date}),Fe&&e.push({after:new Date}),Q&&e.push(t=>Q(t)),Z&&e.push(t=>Z(t)),e},[N,E,J,K,Ae,Fe,Q,Z]),k=a.useCallback(e=>Et.dateMatchModifiers(e,U),[U]),nt=(e,t,r,o)=>{const d=l==="range"?v.resolveRangeSelection(e,s,t):e;if(m(!1),u||g(d),i==null||i(d,t,r,o),d){const C=c?c(d):M(d);_(C)}else _("");oe&&V(!1)},st=e=>{if(k(e))return;const t=l==="range"?{from:e,to:void 0}:l==="multiple"?[...Array.isArray(s)?s:[],e]:e;m(!1),u||g(t),i==null||i(t,e,{},{});const r=c?c(t):M(t);_(r),oe&&V(!1)},ot=a.useMemo(()=>{const e=v.getLocaleDateParts(x),t=new RegExp(`^${v.buildDateRegexSource(e)}$`),{fieldOrder:r}=e;return o=>{const d=o.match(t);if(!d)return;const C={};r.forEach((xt,Mt)=>{C[xt]=Number(d[Mt+1])});const{day:ue,month:ce,year:fe}=C;if(ue===void 0||ce===void 0||fe===void 0)return;const B=new Date(fe,ce-1,ue);if(!(isNaN(B.getTime())||B.getFullYear()!==fe||B.getMonth()!==ce-1||B.getDate()!==ue))return B}},[x]),Be=e=>(We??(l==="single"?ot:()=>{}))(e),Ie=e=>l==="single"&&e instanceof Date||l==="multiple"&&Array.isArray(e)||l==="range"&&!!e&&!Array.isArray(e)&&"from"in e,lt=e=>{if(_(e),ae(!1),e.trim()===""){m(!1),s!==void 0&&(u||g(void 0),i==null||i(void 0,void 0,{},{}));return}const t=Be(e);if(!Ie(t)){m(!1);return}const o=t&&!Array.isArray(t)&&"from"in t?t:null;if(t instanceof Date&&k(t)||Array.isArray(t)&&t.some(C=>C instanceof Date&&k(C))||!!o&&(o.from&&k(o.from)||o.to&&k(o.to))){m(!0);return}m(!1),u||g(t),i==null||i(t,t,{},{}),t instanceof Date&&se(t),oe&&V(!1)},dt=()=>{if(re.trim()===""){ae(!1);return}ae(!Ie(Be(re)))};a.useEffect(()=>{if(u){const e=c?c(s):M(s);_(e)}},[s,u,c,M]),a.useEffect(()=>{if(!u&&Y){const e=c?c(Y):M(Y);_(e)}},[]);const ut=A.useFloating({open:b,onOpenChange:V,placement:T==="input"?"bottom-start":"bottom-end",middleware:[G.offset(v.CALENDAR_POPOVER_OFFSET),G.flip(),G.shift({padding:v.CALENDAR_POPOVER_PADDING}),G.size({padding:v.CALENDAR_POPOVER_PADDING,apply({availableWidth:e,elements:t}){const r=t.floating;if(r.style.width="",r.style.maxWidth="",r.style.overflowX="",F)return;r.style.width="max-content",r.getBoundingClientRect().width>e&&(r.style.width="min-content",r.style.maxWidth=`${e}px`)}})],whileElementsMounted:Nt.autoUpdate}),{refs:q,context:W,x:ct,y:ft,strategy:mt}=ut,pt=A.useClick(W),Te=A.useInteractions([...h&&!f&&T==="input"&&!y?[pt]:[],A.useDismiss(W,{outsidePress:e=>{const t=e.target;return!(t!=null&&t.closest('[role="menu"], [role="listbox"]'))}}),A.useRole(W,{role:"dialog"})]);a.useEffect(()=>{var t,r;const e=l==="multiple"?((t=Ve.current)==null?void 0:t.wrapper)??null:((r=ie.current)==null?void 0:r.input)??null;q.setPositionReference(e??q.reference.current)},[l,b,q]);const ht=()=>{var t;const e=(t=ie.current)==null?void 0:t.input;if(e){if(typeof e.showPicker=="function")try{e.showPicker();return}catch{}e.focus()}},le=()=>{!h||R||(f?ht():y?we(!0):V(e=>!e))},gt=e=>{if(m(!1),u||g(e),i==null||i(e,e,{},{}),e){const t=c?c(e):M(e);_(t)}else _("")},bt=e=>{if(!e){m(!1),u||g(void 0),i==null||i(void 0,void 0,{},{});return}const[t,r,o]=e.split("-").map(Number);if(!t||!r||!o)return;const d=new Date(t,r-1,o);if(!Number.isNaN(d.getTime())){if(k(d)){m(!0);return}m(!1),u||g(d),i==null||i(d,d,{},{})}},yt=Te.getReferenceProps(y&&T==="input"?{onClick:()=>le()}:void 0),{role:$t,"aria-expanded":Ht,"aria-haspopup":Yt,"aria-controls":Dt,..._t}=yt,je=y?void 0:Dt,de=z("dateField.openCalendar"),Se={"aria-label":de,"aria-expanded":y?te:b,"aria-haspopup":"dialog","aria-controls":je};return p.jsxs(p.Fragment,{children:[p.jsx("div",{className:I.default(D.default["tedi-date-field__container"],Ue),..._t,ref:q.setReference,children:l==="multiple"?p.jsx(At.MultiValueField,{...n,ref:Ve,id:pe,label:he,tagsDirection:Ge,values:qe.map(e=>e.label),icon:"calendar_today",onIconClick:le,iconButtonProps:h?Se:{"aria-label":de},isClearable:!0,required:S,onChange:e=>{if(!Array.isArray(s))return;const t=qe.filter(r=>e.includes(r.label)).map(r=>r.date);u||g(t),i==null||i(t,{},{},{})},className:I.default(D.default["tedi-date-field__textfield"],{[D.default["tedi-date-field__icon--disabled"]]:!h||R})}):p.jsx(Ft.TextField,{...n,ref:tt,id:pe,label:he,readOnly:R,value:f?at:re,placeholder:Ye,icon:"calendar_today",isClearable:!0,onIconClick:le,iconButtonProps:h&&!f?Se:{"aria-label":de},onChange:e=>f?bt(e):lt(e),onBlur:e=>{var t;f||dt(),(t=n==null?void 0:n.onBlur)==null||t.call(n,e)},required:S,invalid:Ee||Oe||(n==null?void 0:n.invalid),helper:(()=>{const e=n==null?void 0:n.helper,t=Ee?Ke:Oe?Qe:null,r=t?{text:t,type:"error"}:null;return r?e?Array.isArray(e)?[...e,r]:[e,r]:r:e})(),className:I.default(D.default["tedi-date-field__textfield"],{[D.default["tedi-date-field__textfield--disabled"]]:n==null?void 0:n.disabled,[D.default["tedi-date-field__icon--disabled"]]:!h||R}),input:{...n==null?void 0:n.input,...f&&{type:"date"},...h&&!f&&T==="input"?{role:"combobox","aria-haspopup":"dialog","aria-expanded":y?te:b,"aria-controls":je}:{}}})}),y&&p.jsx(kt.DatePickerModal,{open:te,onOpenChange:we,value:s,onConfirm:gt,mode:l,numberOfMonths:Re,locale:Me,localeCode:$,showOutsideDays:ge,disabledMatchers:U,required:S,availableDays:ke,footer:Ce,monthYearSelectType:be,minYear:ye,maxYear:De,dayStatus:_e,showNavigation:xe,selectionLevel:O,initialView:L,initialMonth:H,modalProps:Xe,...ve,title:Je}),h&&!f&&!y&&p.jsx(A.FloatingPortal,{children:b&&p.jsx(A.FloatingFocusManager,{context:W,modal:!1,initialFocus:-1,children:p.jsx("div",{ref:q.setFloating,className:I.default({[D.default["tedi-date-field__calendar-popover--fullwidth"]]:F}),...Te.getFloatingProps({style:{position:mt,top:ft??0,left:F?0:ct??0,right:F?0:void 0}}),children:p.jsx(Ct.Calendar,{...ve,numberOfMonths:Re,view:et,selectionLevel:O,currentMonth:it,setCurrentMonth:se,setView:Ne,mode:l,value:s,locale:Me,localeCode:$,showOutsideDays:ge,disabledMatchers:U,required:S,availableDays:ke,footer:Ce,monthYearSelectType:be,minYear:ye,maxYear:De,dayStatus:_e,showNavigation:xe,handleSelect:nt,applyValue:st,className:I.default(D.default["tedi-date-field__calendar"],{[D.default["tedi-date-field__calendar--fullwidth"]]:F})})})})})]})});Le.displayName="DateField";exports.DateField=Le;
@@ -139,6 +139,16 @@ export interface DateFieldProps extends BreakpointSupport<DateFieldBreakpointPro
139
139
  * day's `aria-label`), or `null` / `undefined` for no status.
140
140
  */
141
141
  dayStatus?: DayStatusFn;
142
+ /**
143
+ * Earliest year offered in the calendar header's year dropdown.
144
+ * @default currentYear - 100
145
+ */
146
+ minYear?: number;
147
+ /**
148
+ * Latest year offered in the calendar header's year dropdown.
149
+ * @default currentYear + 20
150
+ */
151
+ maxYear?: number;
142
152
  /**
143
153
  * Show or hide the calendar header's previous/next navigation. When hidden, the month/year header
144
154
  * also becomes a static, non-interactive label (no dropdown / grid jumping) — so the calendar is