@tedi-design-system/react 17.1.0 → 18.0.0-rc.1

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 (62) hide show
  1. package/_virtual/index.cjs10.js +1 -1
  2. package/_virtual/index.cjs11.js +1 -1
  3. package/_virtual/index.cjs12.js +1 -1
  4. package/_virtual/index.cjs13.js +1 -1
  5. package/_virtual/index.cjs5.js +1 -1
  6. package/_virtual/index.cjs6.js +1 -1
  7. package/_virtual/index.cjs7.js +1 -1
  8. package/_virtual/index.cjs8.js +1 -1
  9. package/_virtual/index.cjs9.js +1 -1
  10. package/_virtual/index.es10.js +1 -1
  11. package/_virtual/index.es11.js +1 -1
  12. package/_virtual/index.es12.js +1 -1
  13. package/_virtual/index.es13.js +4 -2
  14. package/_virtual/index.es14.js +2 -2
  15. package/_virtual/index.es5.js +2 -4
  16. package/_virtual/index.es6.js +1 -1
  17. package/_virtual/index.es7.js +1 -1
  18. package/_virtual/index.es8.js +1 -1
  19. package/_virtual/index.es9.js +1 -1
  20. package/bundle-stats.html +1 -1
  21. package/external/@mui/system/colorManipulator.cjs.js +1 -1
  22. package/external/@mui/system/colorManipulator.es.js +2 -2
  23. package/external/@mui/system/createStyled.cjs.js +1 -1
  24. package/external/@mui/system/createStyled.es.js +6 -6
  25. package/external/@mui/system/useThemeWithoutDefault.cjs.js +1 -1
  26. package/external/@mui/system/useThemeWithoutDefault.es.js +1 -1
  27. package/external/hoist-non-react-statics/external/react-is/cjs/react-is.development.cjs.js +1 -1
  28. package/external/hoist-non-react-statics/external/react-is/cjs/react-is.development.es.js +1 -1
  29. package/external/hoist-non-react-statics/external/react-is/cjs/react-is.production.min.cjs.js +1 -1
  30. package/external/hoist-non-react-statics/external/react-is/cjs/react-is.production.min.es.js +1 -1
  31. package/external/hoist-non-react-statics/external/react-is/index.cjs.js +1 -1
  32. package/external/hoist-non-react-statics/external/react-is/index.es.js +1 -1
  33. package/external/prop-types/external/react-is/cjs/react-is.development.cjs.js +1 -1
  34. package/external/prop-types/external/react-is/cjs/react-is.development.es.js +1 -1
  35. package/external/prop-types/external/react-is/cjs/react-is.production.min.cjs.js +1 -1
  36. package/external/prop-types/external/react-is/cjs/react-is.production.min.es.js +1 -1
  37. package/external/prop-types/external/react-is/index.cjs.js +1 -1
  38. package/external/prop-types/external/react-is/index.es.js +1 -1
  39. package/external/react-is/index.cjs.js +1 -1
  40. package/external/react-is/index.es.js +1 -1
  41. package/external/toposort/index.cjs.js +1 -1
  42. package/external/toposort/index.es.js +1 -1
  43. package/index.css +1 -1
  44. package/package.json +1 -1
  45. package/src/community/components/layout/breadcrumbs/breadcrumbs.d.ts +6 -0
  46. package/src/community/components/layout/breadcrumbs/crumb/crumb.d.ts +6 -0
  47. package/src/tedi/components/form/number-field/number-field.cjs.js +1 -1
  48. package/src/tedi/components/form/number-field/number-field.d.ts +16 -3
  49. package/src/tedi/components/form/number-field/number-field.es.js +121 -97
  50. package/src/tedi/components/navigation/breadcrumbs/breadcrumbs.cjs.js +1 -0
  51. package/src/tedi/components/navigation/breadcrumbs/breadcrumbs.d.ts +66 -0
  52. package/src/tedi/components/navigation/breadcrumbs/breadcrumbs.es.js +65 -0
  53. package/src/tedi/components/navigation/breadcrumbs/breadcrumbs.module.scss.cjs.js +1 -0
  54. package/src/tedi/components/navigation/breadcrumbs/breadcrumbs.module.scss.es.js +11 -0
  55. package/src/tedi/components/navigation/breadcrumbs/index.d.ts +1 -0
  56. package/src/tedi/index.d.ts +1 -0
  57. package/src/tedi/providers/label-provider/label-provider.d.ts +5 -0
  58. package/src/tedi/providers/label-provider/labels-map.cjs.js +1 -1
  59. package/src/tedi/providers/label-provider/labels-map.d.ts +7 -0
  60. package/src/tedi/providers/label-provider/labels-map.es.js +7 -0
  61. package/tedi.cjs.js +1 -1
  62. package/tedi.es.js +103 -101
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tedi-design-system/react",
3
- "version": "17.1.0",
3
+ "version": "18.0.0-rc.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -17,6 +17,9 @@ type ConditionalTypes<C extends React.ElementType> = {
17
17
  linkAs?: never;
18
18
  crumbs: CrumbProps<IntentionalAny>[];
19
19
  };
20
+ /**
21
+ * @deprecated Use Breadcrumbs from `@tedi-design-system/react/tedi` instead.
22
+ */
20
23
  export type BreadcrumbsProps<C extends React.ElementType = 'a'> = ConditionalTypes<C> & {
21
24
  /**
22
25
  * Additional custom class.
@@ -29,5 +32,8 @@ export type BreadcrumbsProps<C extends React.ElementType = 'a'> = ConditionalTyp
29
32
  */
30
33
  showMinimalCrumbs?: boolean | Layouts;
31
34
  };
35
+ /**
36
+ * @deprecated Use Breadcrumbs from `@tedi-design-system/react/tedi` instead.
37
+ */
32
38
  export declare const Breadcrumbs: <C extends React.ElementType = "a">(props: BreadcrumbsProps<C>) => JSX.Element | null;
33
39
  export default Breadcrumbs;
@@ -1,5 +1,8 @@
1
1
  import { default as React } from 'react';
2
2
  import { AnchorProps } from '../../../anchor/anchor';
3
+ /**
4
+ * @deprecated Use Breadcrumbs from `@tedi-design-system/react/tedi` instead.
5
+ */
3
6
  export type CrumbProps<C extends React.ElementType = 'a'> = {
4
7
  /**
5
8
  * If crumb is last/current page;
@@ -7,6 +10,9 @@ export type CrumbProps<C extends React.ElementType = 'a'> = {
7
10
  */
8
11
  isLast?: boolean;
9
12
  } & AnchorProps<C>;
13
+ /**
14
+ * @deprecated Use Breadcrumbs from `@tedi-design-system/react/tedi` instead.
15
+ */
10
16
  declare const Crumb: <C extends React.ElementType = "a">(props: CrumbProps<C> & {
11
17
  singleCrumb?: boolean;
12
18
  }) => JSX.Element;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("react/jsx-runtime"),v=require("../../../../../external/classnames/index.cjs.js"),o=require("react"),J=require("../../base/typography/text/text.cjs.js"),K=require("../../buttons/button/button.cjs.js"),Q=require("../feedback-text/feedback-text.cjs.js"),X=require("../form-label/form-label.cjs.js"),n=require("./number-field.module.scss.cjs.js"),Y=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),Z=require("../../../providers/label-provider/use-labels.cjs.js"),y=I=>{const{getCurrentBreakpointProps:P}=Y.useBreakpointProps(I.defaultServerBreakpoint),{id:x,label:S,hideLabel:U,required:q,className:j,size:_,inputMode:E="numeric",decimalPlaces:k,min:i,max:u,step:c=1,defaultValue:$,value:B,onChange:a,suffix:h,fullWidth:z=!1,disabled:m=!1,invalid:F=!1,helper:d,input:f}=P(I),{getLabel:M}=Z.useLabels(),b=o.useRef(null),[L,T]=o.useState(""),[V,g]=o.useState($??0),s=o.useMemo(()=>a&&typeof B<"u"?B:V,[a,B,V]),w=d?`${x}-helper`:void 0,C=o.useCallback(e=>{const t=i!==void 0&&e<i,r=u!==void 0&&e>u;return F||t||r||(d==null?void 0:d.type)==="error"},[F,d,u,i]),N=e=>Math.min(u??1/0,Math.max(i??-1/0,e)),R=e=>{const t=M("numberField.quantityUpdated",e);T(t),setTimeout(()=>{T("")},5e3)},W=e=>k!==void 0?parseFloat(e.toFixed(k)):e,A=e=>{let t=s;e==="increment"&&(t=t+c),e==="decrement"&&(t=t-c),t=N(t),t=W(t),R(t),a==null||a(t),g(t)},D=({currentTarget:{value:e}})=>{a==null||a(N(+e)),g(N(+e))},O=e=>{const t=e==="increment"?u!==void 0&&s>=u:i!==void 0&&s<=i,r=v.default(n.default["tedi-number-field__button"],n.default[`tedi-number-field__button--${e}`],{[n.default["tedi-number-field__button--disabled"]]:t||m}),p=M(`numberField.${e}`,c);return l.jsx(K.Button,{"aria-label":p,onClick:()=>A(e),disabled:t||m,visualType:"secondary",className:r,icon:{name:e==="increment"?"add":"remove"},size:_==="small"?"small":void 0,children:e==="increment"?"+":"-"})},G=()=>{const e=v.default(n.default["tedi-number-field__input-wrapper"],{[n.default["tedi-number-field__input-wrapper--with-suffix"]]:h,[n.default["tedi-number-field__input-wrapper--full-width"]]:z}),t=v.default(n.default["tedi-number-field__input"],f==null?void 0:f.className),r=()=>{var p;return(p=b==null?void 0:b.current)==null?void 0:p.focus()};return l.jsxs("div",{className:e,onClick:r,children:[l.jsx("input",{ref:b,id:x,"aria-describedby":w,"aria-invalid":C(s)?"true":"false",type:"number",inputMode:E,value:s,min:i,max:u,required:q,step:c,disabled:m,onChange:D,className:t,...f}),h&&l.jsx(J.Text,{element:"span",modifiers:"small",color:"tertiary",className:n.default["tedi-number-field__suffix"],children:h})]})},H=v.default(n.default["tedi-number-field"],{[n.default["tedi-number-field--invalid"]]:C(s)},{[n.default["tedi-number-field--disabled"]]:m},{[n.default["tedi-number-field--small"]]:_==="small"},j);return l.jsxs("div",{"data-name":"number-field",className:j,children:[l.jsx(X.FormLabel,{id:x,label:S,required:q,hideLabel:U,size:_}),l.jsxs("div",{className:H,children:[O("decrement"),G(),O("increment")]}),d&&l.jsx(Q.FeedbackText,{className:n.default["tedi-number-field__feedback"],...d,id:w}),L&&l.jsx("div",{"aria-live":"polite",className:"sr-only",children:L})]})};y.displayName="NumberField";exports.NumberField=y;exports.default=y;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("react/jsx-runtime"),B=require("../../../../../external/classnames/index.cjs.js"),u=require("react"),le=require("../../base/typography/text/text.cjs.js"),re=require("../../buttons/button/button.cjs.js"),se=require("../feedback-text/feedback-text.cjs.js"),ue=require("../form-label/form-label.cjs.js"),n=require("./number-field.module.scss.cjs.js"),de=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),oe=require("../../../providers/label-provider/use-labels.cjs.js"),S=L=>{const{getCurrentBreakpointProps:C}=de.useBreakpointProps(L.defaultServerBreakpoint),{getLabel:T,locale:D}=oe.useLabels(),W=D==="en"?".":",",{id:N,label:A,hideLabel:G,required:V,className:g,size:y,inputMode:H,decimalPlaces:p,decimalSeparator:F=W,min:d,max:o,step:I=1,defaultValue:w,value:c,onChange:a,suffix:h,fullWidth:J=!1,disabled:b=!1,invalid:k=!1,helper:i,input:v}=C(L),K=H??(p&&p>0||F===","?"decimal":"numeric"),m=u.useCallback(e=>e===void 0?"":F===","?String(e).replace(".",","):String(e),[F]),x=u.useRef(null),q=u.useRef(!1),[E,O]=u.useState(""),[Q,M]=u.useState(w),[X,_]=u.useState(()=>m(c??w)),l=a&&typeof c<"u"?c:Q;u.useEffect(()=>{!q.current&&typeof c<"u"&&_(m(c))},[c,m]);const P=i?`${N}-helper`:void 0,U=u.useCallback(e=>{if(e===void 0)return k||(i==null?void 0:i.type)==="error";const t=d!==void 0&&e<d,s=o!==void 0&&e>o;return k||t||s||(i==null?void 0:i.type)==="error"},[k,i,o,d]),R=e=>Math.min(o??1/0,Math.max(d??-1/0,e)),Y=e=>{const t=T("numberField.quantityUpdated",e);O(t),setTimeout(()=>{O("")},5e3)},$=e=>p!==void 0?parseFloat(e.toFixed(p)):e,Z=e=>{let t=l??0;e==="increment"&&(t=t+I),e==="decrement"&&(t=t-I),t=R(t),t=$(t),Y(t),a==null||a(t),M(t),_(m(t))},ee=({currentTarget:{value:e}})=>{if(_(e),e===""){l!==void 0&&(a==null||a(void 0),M(void 0));return}const t=e.replace(",",".");if(!/^-?(\d+(\.\d*)?|\.\d+)$/.test(t))return;const s=parseFloat(t);if(Number.isNaN(s))return;const f=R(s),j=$(f);j!==l&&(a==null||a(j),M(j))},te=()=>{q.current=!0},ne=()=>{q.current=!1,_(m(l))},z=e=>{const t=l!==void 0&&(e==="increment"?o!==void 0&&l>=o:d!==void 0&&l<=d),s=B.default(n.default["tedi-number-field__button"],n.default[`tedi-number-field__button--${e}`],{[n.default["tedi-number-field__button--disabled"]]:t||b}),f=T(`numberField.${e}`,I);return r.jsx(re.Button,{"aria-label":f,onClick:()=>Z(e),disabled:t||b,visualType:"secondary",className:s,icon:{name:e==="increment"?"add":"remove"},size:y==="small"?"small":void 0,children:e==="increment"?"+":"-"})},ae=()=>{const e=B.default(n.default["tedi-number-field__input-wrapper"],{[n.default["tedi-number-field__input-wrapper--with-suffix"]]:h,[n.default["tedi-number-field__input-wrapper--full-width"]]:J}),t=B.default(n.default["tedi-number-field__input"],v==null?void 0:v.className),s=()=>{var f;return(f=x==null?void 0:x.current)==null?void 0:f.focus()};return r.jsxs("div",{className:e,onClick:s,children:[r.jsx("input",{ref:x,id:N,role:"spinbutton","aria-valuemin":d,"aria-valuemax":o,"aria-valuenow":l,"aria-describedby":P,"aria-invalid":U(l)?"true":"false",type:"text",inputMode:K,value:X,required:V,disabled:b,onChange:ee,onFocus:te,onBlur:ne,className:t,...v}),h&&r.jsx(le.Text,{element:"span",modifiers:"small",color:"tertiary",className:n.default["tedi-number-field__suffix"],children:h})]})},ie=B.default(n.default["tedi-number-field"],{[n.default["tedi-number-field--invalid"]]:U(l)},{[n.default["tedi-number-field--disabled"]]:b},{[n.default["tedi-number-field--small"]]:y==="small"},g);return r.jsxs("div",{"data-name":"number-field",className:g,children:[r.jsx(ue.FormLabel,{id:N,label:A,required:V,hideLabel:G,size:y}),r.jsxs("div",{className:ie,children:[z("decrement"),ae(),z("increment")]}),i&&r.jsx(se.FeedbackText,{className:n.default["tedi-number-field__feedback"],...i,id:P}),E&&r.jsx("div",{"aria-live":"polite",className:"sr-only",children:E})]})};S.displayName="NumberField";exports.NumberField=S;exports.default=S;
@@ -36,18 +36,31 @@ export interface NumberFieldProps extends BreakpointSupport<NumberFieldBreakpoin
36
36
  */
37
37
  value?: number;
38
38
  /**
39
- * Callback fired when the input value changes.
39
+ * Callback fired when the input value changes. Emits `undefined` when the
40
+ * field is cleared so consumers can distinguish *"user explicitly entered
41
+ * zero"* from *"field is empty"* — important for required-field validation
42
+ * and for fields where `0` is a meaningful selection.
40
43
  */
41
- onChange?: (value: number) => void;
44
+ onChange?: (value: number | undefined) => void;
42
45
  /**
43
46
  * Specifies the input mode for the field (e.g., numeric or decimal).
44
- * @default numeric
47
+ * Defaults to `'decimal'` when `decimalPlaces > 0` or `decimalSeparator === ','`,
48
+ * otherwise numeric.
45
49
  */
46
50
  inputMode?: 'numeric' | 'decimal';
47
51
  /**
48
52
  * Number of decimal places for rounding calculations.
49
53
  */
50
54
  decimalPlaces?: number;
55
+ /**
56
+ * Character used as the decimal separator when displaying the value.
57
+ * Both `.` and `,` are always accepted as input regardless of this setting.
58
+ *
59
+ * Defaults are derived from `<LabelProvider locale>`: `en` → `.`, `et` / `ru`
60
+ * → `,`. Pass the prop explicitly to override the locale-derived default for
61
+ * a single field.
62
+ */
63
+ decimalSeparator?: '.' | ',';
51
64
  /**
52
65
  * Minimum allowed value. Disables decrementing below this value and restricts manual input.
53
66
  */
@@ -1,122 +1,146 @@
1
- import { jsxs as N, jsx as d } from "react/jsx-runtime";
2
- import b from "../../../../../external/classnames/index.es.js";
3
- import { useRef as K, useState as O, useMemo as Q, useCallback as R } from "react";
4
- import { Text as X } from "../../base/typography/text/text.es.js";
5
- import { Button as Y } from "../../buttons/button/button.es.js";
6
- import { FeedbackText as Z } from "../feedback-text/feedback-text.es.js";
7
- import { FormLabel as ee } from "../form-label/form-label.es.js";
1
+ import { jsxs as L, jsx as c } from "react/jsx-runtime";
2
+ import _ from "../../../../../external/classnames/index.es.js";
3
+ import { useCallback as D, useRef as W, useState as S, useEffect as se } from "react";
4
+ import { Text as de } from "../../base/typography/text/text.es.js";
5
+ import { Button as oe } from "../../buttons/button/button.es.js";
6
+ import { FeedbackText as ue } from "../feedback-text/feedback-text.es.js";
7
+ import { FormLabel as ce } from "../form-label/form-label.es.js";
8
8
  import n from "./number-field.module.scss.es.js";
9
- import { useBreakpointProps as te } from "../../../helpers/hooks/use-breakpoint-props.es.js";
10
- import { useLabels as ne } from "../../../providers/label-provider/use-labels.es.js";
11
- const ie = (y) => {
12
- const { getCurrentBreakpointProps: P } = te(y.defaultServerBreakpoint), {
13
- id: v,
14
- label: $,
15
- hideLabel: j,
16
- required: x,
17
- className: k,
18
- size: _,
19
- inputMode: q = "numeric",
20
- decimalPlaces: F,
21
- min: r,
22
- max: a,
23
- step: u = 1,
24
- defaultValue: z,
25
- value: h,
9
+ import { useBreakpointProps as me } from "../../../helpers/hooks/use-breakpoint-props.es.js";
10
+ import { useLabels as fe } from "../../../providers/label-provider/use-labels.es.js";
11
+ const pe = (T) => {
12
+ const { getCurrentBreakpointProps: A } = me(T.defaultServerBreakpoint), { getLabel: w, locale: R } = fe(), G = R === "en" ? "." : ",", {
13
+ id: y,
14
+ label: H,
15
+ hideLabel: J,
16
+ required: E,
17
+ className: U,
18
+ size: B,
19
+ inputMode: K,
20
+ decimalPlaces: f,
21
+ decimalSeparator: I = G,
22
+ min: l,
23
+ max: s,
24
+ step: x = 1,
25
+ defaultValue: O,
26
+ value: o,
26
27
  onChange: i,
27
- suffix: B,
28
- fullWidth: S = !1,
29
- disabled: o = !1,
30
- invalid: M = !1,
31
- helper: l,
32
- input: m
33
- } = P(y), { getLabel: V } = ne(), c = K(null), [w, L] = O(""), [T, C] = O(z ?? 0), s = Q(
34
- () => i && typeof h < "u" ? h : T,
35
- [i, h, T]
36
- ), U = l ? `${v}-helper` : void 0, g = R(
28
+ suffix: h,
29
+ fullWidth: Q = !1,
30
+ disabled: p = !1,
31
+ invalid: F = !1,
32
+ helper: r,
33
+ input: b
34
+ } = A(T), X = K ?? (f && f > 0 || I === "," ? "decimal" : "numeric"), m = D(
35
+ (e) => e === void 0 ? "" : I === "," ? String(e).replace(".", ",") : String(e),
36
+ [I]
37
+ ), v = W(null), M = W(!1), [$, g] = S(""), [Y, k] = S(O), [Z, N] = S(() => m(o ?? O)), a = i && typeof o < "u" ? o : Y;
38
+ se(() => {
39
+ !M.current && typeof o < "u" && N(m(o));
40
+ }, [o, m]);
41
+ const z = r ? `${y}-helper` : void 0, P = D(
37
42
  (e) => {
38
- const t = r !== void 0 && e < r, f = a !== void 0 && e > a;
39
- return M || t || f || (l == null ? void 0 : l.type) === "error";
43
+ if (e === void 0)
44
+ return F || (r == null ? void 0 : r.type) === "error";
45
+ const t = l !== void 0 && e < l, d = s !== void 0 && e > s;
46
+ return F || t || d || (r == null ? void 0 : r.type) === "error";
40
47
  },
41
- [M, l, a, r]
42
- ), I = (e) => Math.min(a ?? 1 / 0, Math.max(r ?? -1 / 0, e)), W = (e) => {
43
- const t = V("numberField.quantityUpdated", e);
44
- L(t), setTimeout(() => {
45
- L("");
48
+ [F, r, s, l]
49
+ ), j = (e) => Math.min(s ?? 1 / 0, Math.max(l ?? -1 / 0, e)), ee = (e) => {
50
+ const t = w("numberField.quantityUpdated", e);
51
+ g(t), setTimeout(() => {
52
+ g("");
46
53
  }, 5e3);
47
- }, A = (e) => F !== void 0 ? parseFloat(e.toFixed(F)) : e, D = (e) => {
48
- let t = s;
49
- e === "increment" && (t = t + u), e === "decrement" && (t = t - u), t = I(t), t = A(t), W(t), i == null || i(t), C(t);
50
- }, G = ({ currentTarget: { value: e } }) => {
51
- i == null || i(I(+e)), C(I(+e));
52
- }, E = (e) => {
53
- const t = e === "increment" ? a !== void 0 && s >= a : r !== void 0 && s <= r, f = b(n["tedi-number-field__button"], n[`tedi-number-field__button--${e}`], {
54
- [n["tedi-number-field__button--disabled"]]: t || o
55
- }), p = V(`numberField.${e}`, u);
56
- return /* @__PURE__ */ d(
57
- Y,
54
+ }, q = (e) => f !== void 0 ? parseFloat(e.toFixed(f)) : e, te = (e) => {
55
+ let t = a ?? 0;
56
+ e === "increment" && (t = t + x), e === "decrement" && (t = t - x), t = j(t), t = q(t), ee(t), i == null || i(t), k(t), N(m(t));
57
+ }, ne = ({ currentTarget: { value: e } }) => {
58
+ if (N(e), e === "") {
59
+ a !== void 0 && (i == null || i(void 0), k(void 0));
60
+ return;
61
+ }
62
+ const t = e.replace(",", ".");
63
+ if (!/^-?(\d+(\.\d*)?|\.\d+)$/.test(t))
64
+ return;
65
+ const d = parseFloat(t);
66
+ if (Number.isNaN(d)) return;
67
+ const u = j(d), V = q(u);
68
+ V !== a && (i == null || i(V), k(V));
69
+ }, ie = () => {
70
+ M.current = !0;
71
+ }, re = () => {
72
+ M.current = !1, N(m(a));
73
+ }, C = (e) => {
74
+ const t = a !== void 0 && (e === "increment" ? s !== void 0 && a >= s : l !== void 0 && a <= l), d = _(n["tedi-number-field__button"], n[`tedi-number-field__button--${e}`], {
75
+ [n["tedi-number-field__button--disabled"]]: t || p
76
+ }), u = w(`numberField.${e}`, x);
77
+ return /* @__PURE__ */ c(
78
+ oe,
58
79
  {
59
- "aria-label": p,
60
- onClick: () => D(e),
61
- disabled: t || o,
80
+ "aria-label": u,
81
+ onClick: () => te(e),
82
+ disabled: t || p,
62
83
  visualType: "secondary",
63
- className: f,
84
+ className: d,
64
85
  icon: { name: e === "increment" ? "add" : "remove" },
65
- size: _ === "small" ? "small" : void 0,
86
+ size: B === "small" ? "small" : void 0,
66
87
  children: e === "increment" ? "+" : "-"
67
88
  }
68
89
  );
69
- }, H = () => {
70
- const e = b(n["tedi-number-field__input-wrapper"], {
71
- [n["tedi-number-field__input-wrapper--with-suffix"]]: B,
72
- [n["tedi-number-field__input-wrapper--full-width"]]: S
73
- }), t = b(n["tedi-number-field__input"], m == null ? void 0 : m.className);
74
- return /* @__PURE__ */ N("div", { className: e, onClick: () => {
75
- var p;
76
- return (p = c == null ? void 0 : c.current) == null ? void 0 : p.focus();
90
+ }, ae = () => {
91
+ const e = _(n["tedi-number-field__input-wrapper"], {
92
+ [n["tedi-number-field__input-wrapper--with-suffix"]]: h,
93
+ [n["tedi-number-field__input-wrapper--full-width"]]: Q
94
+ }), t = _(n["tedi-number-field__input"], b == null ? void 0 : b.className);
95
+ return /* @__PURE__ */ L("div", { className: e, onClick: () => {
96
+ var u;
97
+ return (u = v == null ? void 0 : v.current) == null ? void 0 : u.focus();
77
98
  }, children: [
78
- /* @__PURE__ */ d(
99
+ /* @__PURE__ */ c(
79
100
  "input",
80
101
  {
81
- ref: c,
82
- id: v,
83
- "aria-describedby": U,
84
- "aria-invalid": g(s) ? "true" : "false",
85
- type: "number",
86
- inputMode: q,
87
- value: s,
88
- min: r,
89
- max: a,
90
- required: x,
91
- step: u,
92
- disabled: o,
93
- onChange: G,
102
+ ref: v,
103
+ id: y,
104
+ role: "spinbutton",
105
+ "aria-valuemin": l,
106
+ "aria-valuemax": s,
107
+ "aria-valuenow": a,
108
+ "aria-describedby": z,
109
+ "aria-invalid": P(a) ? "true" : "false",
110
+ type: "text",
111
+ inputMode: X,
112
+ value: Z,
113
+ required: E,
114
+ disabled: p,
115
+ onChange: ne,
116
+ onFocus: ie,
117
+ onBlur: re,
94
118
  className: t,
95
- ...m
119
+ ...b
96
120
  }
97
121
  ),
98
- B && /* @__PURE__ */ d(X, { element: "span", modifiers: "small", color: "tertiary", className: n["tedi-number-field__suffix"], children: B })
122
+ h && /* @__PURE__ */ c(de, { element: "span", modifiers: "small", color: "tertiary", className: n["tedi-number-field__suffix"], children: h })
99
123
  ] });
100
- }, J = b(
124
+ }, le = _(
101
125
  n["tedi-number-field"],
102
- { [n["tedi-number-field--invalid"]]: g(s) },
103
- { [n["tedi-number-field--disabled"]]: o },
104
- { [n["tedi-number-field--small"]]: _ === "small" },
105
- k
126
+ { [n["tedi-number-field--invalid"]]: P(a) },
127
+ { [n["tedi-number-field--disabled"]]: p },
128
+ { [n["tedi-number-field--small"]]: B === "small" },
129
+ U
106
130
  );
107
- return /* @__PURE__ */ N("div", { "data-name": "number-field", className: k, children: [
108
- /* @__PURE__ */ d(ee, { id: v, label: $, required: x, hideLabel: j, size: _ }),
109
- /* @__PURE__ */ N("div", { className: J, children: [
110
- E("decrement"),
111
- H(),
112
- E("increment")
131
+ return /* @__PURE__ */ L("div", { "data-name": "number-field", className: U, children: [
132
+ /* @__PURE__ */ c(ce, { id: y, label: H, required: E, hideLabel: J, size: B }),
133
+ /* @__PURE__ */ L("div", { className: le, children: [
134
+ C("decrement"),
135
+ ae(),
136
+ C("increment")
113
137
  ] }),
114
- l && /* @__PURE__ */ d(Z, { className: n["tedi-number-field__feedback"], ...l, id: U }),
115
- w && /* @__PURE__ */ d("div", { "aria-live": "polite", className: "sr-only", children: w })
138
+ r && /* @__PURE__ */ c(ue, { className: n["tedi-number-field__feedback"], ...r, id: z }),
139
+ $ && /* @__PURE__ */ c("div", { "aria-live": "polite", className: "sr-only", children: $ })
116
140
  ] });
117
141
  };
118
- ie.displayName = "NumberField";
142
+ pe.displayName = "NumberField";
119
143
  export {
120
- ie as NumberField,
121
- ie as default
144
+ pe as NumberField,
145
+ pe as default
122
146
  };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),b=require("../../../../../external/classnames/index.cjs.js"),o=require("react"),I=require("../../base/icon/icon.cjs.js"),M=require("../../buttons/button/button.cjs.js"),t=require("./breadcrumbs.module.scss.cjs.js"),P=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),S=require("../../../providers/label-provider/use-labels.cjs.js"),d=require("../../overlays/dropdown/dropdown.cjs.js"),k=n=>{const l=[];return o.Children.forEach(n,a=>{if(o.isValidElement(a)){if(a.type===o.Fragment){l.push(...k(a.props.children));return}l.push(a)}}),l},D=e.jsx(I.Icon,{name:"chevron_right",size:16,color:"brand"}),h=n=>{const{children:l,ariaLabel:a,showMoreLabel:v,separator:w=D,className:p}=n,{getCurrentBreakpointProps:B}=P.useBreakpointProps(n.defaultServerBreakpoint),{variant:C="long",maxItems:f,itemsBeforeCollapse:q=1,itemsAfterCollapse:y=1}=B(n),{getLabel:x}=S.useLabels(),_=a??x("breadcrumbs"),L=v??x("breadcrumbs.show-more"),s=k(l);if(s.length===0)return null;if(C==="short"){if(s.length<2)return null;const r=s[s.length-2],i=r.props,c=typeof r.type!="string"&&i.iconLeft===void 0?o.cloneElement(r,{iconLeft:"arrow_back"}):r;return e.jsx("nav",{"aria-label":_,className:b.default(t.default["tedi-breadcrumbs"],p),children:e.jsx("ol",{className:t.default["tedi-breadcrumbs__list"],children:e.jsx("li",{className:t.default["tedi-breadcrumbs__item"],children:c})})})}const u=Math.max(0,q),m=Math.max(1,y),g=f!==void 0&&s.length>f&&s.length>u+m?[...s.slice(0,u).map(r=>({kind:"item",element:r})),{kind:"ellipsis",hidden:s.slice(u,s.length-m)},...s.slice(s.length-m).map(r=>({kind:"item",element:r}))]:s.map(r=>({kind:"item",element:r})),j=g.length-1;return e.jsx("nav",{"aria-label":_,className:b.default(t.default["tedi-breadcrumbs"],p),children:e.jsx("ol",{className:t.default["tedi-breadcrumbs__list"],children:g.map((r,i)=>e.jsxs(o.Fragment,{children:[r.kind==="item"?e.jsx("li",{className:b.default(t.default["tedi-breadcrumbs__item"],{[t.default["tedi-breadcrumbs__current"]]:i===j}),children:r.element}):e.jsx("li",{className:t.default["tedi-breadcrumbs__item"],children:e.jsxs(d.Dropdown,{children:[e.jsx(d.Dropdown.Trigger,{children:e.jsxs(M.Button,{noStyle:!0,className:t.default["tedi-breadcrumbs__ellipsis"],children:[e.jsx("span",{"aria-hidden":"true",children:"…"}),e.jsx("span",{className:"sr-only",children:L})]})}),e.jsx(d.Dropdown.Content,{children:r.hidden.map((c,N)=>e.jsx(d.Dropdown.Item,{index:N,asChild:!0,children:c},c.key??N))})]})}),i<j&&e.jsx("li",{className:t.default["tedi-breadcrumbs__separator"],"aria-hidden":"true",children:w})]},i))})})};h.displayName="Breadcrumbs";exports.Breadcrumbs=h;exports.default=h;
@@ -0,0 +1,66 @@
1
+ import { default as React, ReactNode } from 'react';
2
+ import { BreakpointSupport } from '../../../helpers';
3
+ type BreadcrumbsBreakpointProps = {
4
+ /**
5
+ * - `'long'` — full trail of crumbs separated by chevrons.
6
+ * - `'short'` — only the second-to-last child rendered as a back-link with
7
+ * a left-pointing arrow. Useful on narrow viewports. Renders nothing when
8
+ * fewer than two crumbs are supplied.
9
+ * @default long
10
+ */
11
+ variant?: 'long' | 'short';
12
+ /**
13
+ * Maximum number of crumbs to render before collapsing the middle into an
14
+ * ellipsis button. Clicking the button opens a dropdown listing the hidden
15
+ * crumbs. Only applies in the `'long'` variant. When omitted, all crumbs are
16
+ * rendered.
17
+ */
18
+ maxItems?: number;
19
+ /**
20
+ * Number of crumbs to keep visible at the start of the trail when collapsed.
21
+ * @default 1
22
+ */
23
+ itemsBeforeCollapse?: number;
24
+ /**
25
+ * Number of crumbs to keep visible at the end of the trail when collapsed.
26
+ * The current page (last crumb) should normally stay visible — keep this ≥ 1.
27
+ * @default 1
28
+ */
29
+ itemsAfterCollapse?: number;
30
+ };
31
+ export interface BreadcrumbsProps extends BreakpointSupport<BreadcrumbsBreakpointProps> {
32
+ /**
33
+ * Crumbs in order from the root page to the current page. Each child becomes
34
+ * one crumb; chevron separators are inserted between them. Use a `Link` (or
35
+ * any anchor) for navigable crumbs and a plain element (e.g. `<span>`) for
36
+ * the current page — add `aria-current="page"` to it yourself.
37
+ */
38
+ children: React.ReactNode;
39
+ /**
40
+ * Accessible label for the wrapping `<nav>` landmark. Falls back to the
41
+ * `breadcrumbs` entry from `LabelProvider`.
42
+ */
43
+ ariaLabel?: string;
44
+ /**
45
+ * Accessible label for the ellipsis button that opens the collapsed-crumbs
46
+ * dropdown. Only used when `maxItems` causes a collapse. Falls back to the
47
+ * `breadcrumbs.show-more` entry from `LabelProvider`.
48
+ */
49
+ showMoreLabel?: string;
50
+ /**
51
+ * Node rendered between crumbs. Pass a string (e.g. `'/'`, `'›'`) for text
52
+ * separators or any React node for custom markup. Hidden from assistive
53
+ * technology — screen readers announce only the crumbs themselves.
54
+ * @default <Icon name="chevron_right" size={16} color="brand" />
55
+ */
56
+ separator?: ReactNode;
57
+ /**
58
+ * Additional class name applied to the `<nav>` element.
59
+ */
60
+ className?: string;
61
+ }
62
+ export declare const Breadcrumbs: {
63
+ (props: BreadcrumbsProps): JSX.Element | null;
64
+ displayName: string;
65
+ };
66
+ export default Breadcrumbs;
@@ -0,0 +1,65 @@
1
+ import { jsx as r, jsxs as p } from "react/jsx-runtime";
2
+ import h from "../../../../../external/classnames/index.es.js";
3
+ import { cloneElement as E, Fragment as k, Children as P, isValidElement as S } from "react";
4
+ import { Icon as j } from "../../base/icon/icon.es.js";
5
+ import { Button as A } from "../../buttons/button/button.es.js";
6
+ import s from "./breadcrumbs.module.scss.es.js";
7
+ import { useBreakpointProps as T } from "../../../helpers/hooks/use-breakpoint-props.es.js";
8
+ import { useLabels as z } from "../../../providers/label-provider/use-labels.es.js";
9
+ import { Dropdown as c } from "../../overlays/dropdown/dropdown.es.js";
10
+ const v = (l) => {
11
+ const n = [];
12
+ return P.forEach(l, (a) => {
13
+ if (S(a)) {
14
+ if (a.type === k) {
15
+ n.push(...v(a.props.children));
16
+ return;
17
+ }
18
+ n.push(a);
19
+ }
20
+ }), n;
21
+ }, D = /* @__PURE__ */ r(j, { name: "chevron_right", size: 16, color: "brand" }), F = (l) => {
22
+ const { children: n, ariaLabel: a, showMoreLabel: y, separator: B = D, className: u } = l, { getCurrentBreakpointProps: L } = T(l.defaultServerBreakpoint), {
23
+ variant: w = "long",
24
+ maxItems: b,
25
+ itemsBeforeCollapse: x = 1,
26
+ itemsAfterCollapse: I = 1
27
+ } = L(l), { getLabel: f } = z(), _ = a ?? f("breadcrumbs"), M = y ?? f("breadcrumbs.show-more"), t = v(n);
28
+ if (t.length === 0) return null;
29
+ if (w === "short") {
30
+ if (t.length < 2) return null;
31
+ const e = t[t.length - 2], i = e.props, o = typeof e.type != "string" && i.iconLeft === void 0 ? E(e, { iconLeft: "arrow_back" }) : e;
32
+ return /* @__PURE__ */ r("nav", { "aria-label": _, className: h(s["tedi-breadcrumbs"], u), children: /* @__PURE__ */ r("ol", { className: s["tedi-breadcrumbs__list"], children: /* @__PURE__ */ r("li", { className: s["tedi-breadcrumbs__item"], children: o }) }) });
33
+ }
34
+ const m = Math.max(0, x), d = Math.max(1, I), g = b !== void 0 && t.length > b && t.length > m + d ? [
35
+ ...t.slice(0, m).map((e) => ({ kind: "item", element: e })),
36
+ {
37
+ kind: "ellipsis",
38
+ hidden: t.slice(m, t.length - d)
39
+ },
40
+ ...t.slice(t.length - d).map((e) => ({ kind: "item", element: e }))
41
+ ] : t.map((e) => ({ kind: "item", element: e })), N = g.length - 1;
42
+ return /* @__PURE__ */ r("nav", { "aria-label": _, className: h(s["tedi-breadcrumbs"], u), children: /* @__PURE__ */ r("ol", { className: s["tedi-breadcrumbs__list"], children: g.map((e, i) => /* @__PURE__ */ p(k, { children: [
43
+ e.kind === "item" ? /* @__PURE__ */ r(
44
+ "li",
45
+ {
46
+ className: h(s["tedi-breadcrumbs__item"], {
47
+ [s["tedi-breadcrumbs__current"]]: i === N
48
+ }),
49
+ children: e.element
50
+ }
51
+ ) : /* @__PURE__ */ r("li", { className: s["tedi-breadcrumbs__item"], children: /* @__PURE__ */ p(c, { children: [
52
+ /* @__PURE__ */ r(c.Trigger, { children: /* @__PURE__ */ p(A, { noStyle: !0, className: s["tedi-breadcrumbs__ellipsis"], children: [
53
+ /* @__PURE__ */ r("span", { "aria-hidden": "true", children: "…" }),
54
+ /* @__PURE__ */ r("span", { className: "sr-only", children: M })
55
+ ] }) }),
56
+ /* @__PURE__ */ r(c.Content, { children: e.hidden.map((o, C) => /* @__PURE__ */ r(c.Item, { index: C, asChild: !0, children: o }, o.key ?? C)) })
57
+ ] }) }),
58
+ i < N && /* @__PURE__ */ r("li", { className: s["tedi-breadcrumbs__separator"], "aria-hidden": "true", children: B })
59
+ ] }, i)) }) });
60
+ };
61
+ F.displayName = "Breadcrumbs";
62
+ export {
63
+ F as Breadcrumbs,
64
+ F as default
65
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e={"tedi-breadcrumbs":"tedi-breadcrumbs-0247287c","tedi-breadcrumbs__list":"tedi-breadcrumbs__list-10d5a5f4","tedi-breadcrumbs__item":"tedi-breadcrumbs__item-d8534029","tedi-breadcrumbs__separator":"tedi-breadcrumbs__separator-7f7b6f95","tedi-breadcrumbs__current":"tedi-breadcrumbs__current-db9fd67c","tedi-breadcrumbs__ellipsis":"tedi-breadcrumbs__ellipsis-0b4cdcac"};exports.default=e;
@@ -0,0 +1,11 @@
1
+ const e = {
2
+ "tedi-breadcrumbs": "tedi-breadcrumbs-0247287c",
3
+ "tedi-breadcrumbs__list": "tedi-breadcrumbs__list-10d5a5f4",
4
+ "tedi-breadcrumbs__item": "tedi-breadcrumbs__item-d8534029",
5
+ "tedi-breadcrumbs__separator": "tedi-breadcrumbs__separator-7f7b6f95",
6
+ "tedi-breadcrumbs__current": "tedi-breadcrumbs__current-db9fd67c",
7
+ "tedi-breadcrumbs__ellipsis": "tedi-breadcrumbs__ellipsis-0b4cdcac"
8
+ };
9
+ export {
10
+ e as default
11
+ };
@@ -0,0 +1 @@
1
+ export * from './breadcrumbs';
@@ -25,6 +25,7 @@ export * from './components/notifications/alert/alert';
25
25
  export * from './components/misc/empty-state';
26
26
  export * from './components/notifications/toast/toast';
27
27
  export * from './components/cards/card';
28
+ export * from './components/navigation/breadcrumbs';
28
29
  export * from './components/navigation/hash-trigger/hash-trigger';
29
30
  export * from './components/navigation/link/link';
30
31
  export * from './components/navigation/pagination';
@@ -3,6 +3,11 @@ import { TediLabelEntryRecord, TediLabels, TediLabelValuesRecord, TediLanguage }
3
3
  export interface ILabelContext {
4
4
  getLabel<TKey extends keyof TediLabels, TArgs extends TediLabels[TKey] extends Record<TediLanguage, infer FuncType> ? FuncType extends (...args: infer P) => string ? P : [] : TediLabels[TKey] extends (...args: infer P) => string ? P : []>(key: TKey, ...args: TArgs): string;
5
5
  setLocale: (locale: TediLanguage) => void;
6
+ /**
7
+ * Currently active locale. Exposed so components can derive locale-sensitive
8
+ * formatting defaults (e.g. `NumberField`'s `decimalSeparator`) without
9
+ * forcing every consumer to repeat the prop on every instance.
10
+ */
6
11
  locale: TediLanguage;
7
12
  }
8
13
  export declare const LabelContext: React.Context<ILabelContext>;