@tedi-design-system/react 17.0.0-rc.5 → 17.0.0-rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/_virtual/index.es13.js +2 -2
  2. package/_virtual/index.es14.js +2 -2
  3. package/bundle-stats.html +1 -1
  4. package/external/react-is/index.cjs.js +1 -1
  5. package/external/react-is/index.es.js +1 -1
  6. package/external/toposort/index.cjs.js +1 -1
  7. package/external/toposort/index.es.js +1 -1
  8. package/index.css +1 -1
  9. package/package.json +1 -1
  10. package/src/community/components/tabs/tabs/tabs.d.ts +6 -0
  11. package/src/community/components/tabs/tabs-item/tabs-item.d.ts +6 -0
  12. package/src/community/components/tabs/tabs-nav/tabs-nav-item.d.ts +6 -0
  13. package/src/community/components/tabs/tabs-nav/tabs-nav.d.ts +6 -0
  14. package/src/tedi/components/misc/scroll-fade/scroll-fade.cjs.js +1 -1
  15. package/src/tedi/components/misc/scroll-fade/scroll-fade.es.js +32 -42
  16. package/src/tedi/components/navigation/tabs/index.d.ts +5 -0
  17. package/src/tedi/components/navigation/tabs/tabs-content/tabs-content.cjs.js +1 -0
  18. package/src/tedi/components/navigation/tabs/tabs-content/tabs-content.d.ts +22 -0
  19. package/src/tedi/components/navigation/tabs/tabs-content/tabs-content.es.js +22 -0
  20. package/src/tedi/components/navigation/tabs/tabs-context.cjs.js +1 -0
  21. package/src/tedi/components/navigation/tabs/tabs-context.d.ts +7 -0
  22. package/src/tedi/components/navigation/tabs/tabs-context.es.js +11 -0
  23. package/src/tedi/components/navigation/tabs/tabs-helpers.cjs.js +1 -0
  24. package/src/tedi/components/navigation/tabs/tabs-helpers.d.ts +5 -0
  25. package/src/tedi/components/navigation/tabs/tabs-helpers.es.js +29 -0
  26. package/src/tedi/components/navigation/tabs/tabs-list/tabs-list.cjs.js +1 -0
  27. package/src/tedi/components/navigation/tabs/tabs-list/tabs-list.d.ts +37 -0
  28. package/src/tedi/components/navigation/tabs/tabs-list/tabs-list.es.js +102 -0
  29. package/src/tedi/components/navigation/tabs/tabs-trigger/tabs-trigger.cjs.js +1 -0
  30. package/src/tedi/components/navigation/tabs/tabs-trigger/tabs-trigger.d.ts +31 -0
  31. package/src/tedi/components/navigation/tabs/tabs-trigger/tabs-trigger.es.js +43 -0
  32. package/src/tedi/components/navigation/tabs/tabs.cjs.js +1 -0
  33. package/src/tedi/components/navigation/tabs/tabs.d.ts +40 -0
  34. package/src/tedi/components/navigation/tabs/tabs.es.js +24 -0
  35. package/src/tedi/components/navigation/tabs/tabs.module.scss.cjs.js +1 -0
  36. package/src/tedi/components/navigation/tabs/tabs.module.scss.es.js +17 -0
  37. package/src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.cjs.js +1 -1
  38. package/src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.es.js +9 -7
  39. package/src/tedi/components/tags/status-badge/status-badge.cjs.js +1 -1
  40. package/src/tedi/components/tags/status-badge/status-badge.es.js +25 -25
  41. package/src/tedi/components/tags/status-badge/status-badge.module.scss.cjs.js +1 -1
  42. package/src/tedi/components/tags/status-badge/status-badge.module.scss.es.js +0 -6
  43. package/src/tedi/components/tags/status-indicator/index.d.ts +1 -0
  44. package/src/tedi/components/tags/status-indicator/status-indicator.cjs.js +1 -0
  45. package/src/tedi/components/tags/status-indicator/status-indicator.d.ts +36 -0
  46. package/src/tedi/components/tags/status-indicator/status-indicator.es.js +26 -0
  47. package/src/tedi/components/tags/status-indicator/status-indicator.module.scss.cjs.js +1 -0
  48. package/src/tedi/components/tags/status-indicator/status-indicator.module.scss.es.js +14 -0
  49. package/src/tedi/helpers/hooks/use-scroll-fade.cjs.js +1 -0
  50. package/src/tedi/helpers/hooks/use-scroll-fade.d.ts +35 -0
  51. package/src/tedi/helpers/hooks/use-scroll-fade.es.js +34 -0
  52. package/src/tedi/helpers/index.d.ts +1 -0
  53. package/src/tedi/index.d.ts +2 -0
  54. package/src/tedi/providers/label-provider/labels-map.cjs.js +1 -1
  55. package/src/tedi/providers/label-provider/labels-map.d.ts +7 -0
  56. package/src/tedi/providers/label-provider/labels-map.es.js +8 -1
  57. package/tedi.cjs.js +1 -1
  58. package/tedi.es.js +186 -171
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tedi-design-system/react",
3
- "version": "17.0.0-rc.5",
3
+ "version": "17.0.0-rc.6",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -1,5 +1,8 @@
1
1
  import { default as React } from 'react';
2
2
  import { PrintProps } from '../../../../tedi/components/misc/print/print';
3
+ /**
4
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
5
+ */
3
6
  export interface TabsProps {
4
7
  /**
5
8
  * Tabs content. Children should be TabsItems
@@ -32,5 +35,8 @@ export interface TabsProps {
32
35
  */
33
36
  hideNavOnPrint?: PrintProps['visibility'];
34
37
  }
38
+ /**
39
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
40
+ */
35
41
  export declare const Tabs: (props: TabsProps) => JSX.Element;
36
42
  export default Tabs;
@@ -2,6 +2,9 @@ import { default as React } from 'react';
2
2
  import { BreakpointSupport } from '../../../helpers';
3
3
  import { CardContentProps } from '../../card';
4
4
  type TabsItemBreakpointProps = Pick<CardContentProps, 'padding' | 'background'>;
5
+ /**
6
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
7
+ */
5
8
  export interface TabsItemProps extends BreakpointSupport<TabsItemBreakpointProps> {
6
9
  /**
7
10
  * ID property.
@@ -20,5 +23,8 @@ export interface TabsItemProps extends BreakpointSupport<TabsItemBreakpointProps
20
23
  */
21
24
  className?: string;
22
25
  }
26
+ /**
27
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
28
+ */
23
29
  export declare const TabsItem: (props: TabsItemProps) => import("react/jsx-runtime").JSX.Element | null;
24
30
  export default TabsItem;
@@ -1,6 +1,12 @@
1
1
  import { default as React } from 'react';
2
2
  import { AnchorProps } from '../../anchor/anchor';
3
3
  import { TabsItemProps } from '../tabs-item/tabs-item';
4
+ /**
5
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
6
+ */
4
7
  export type TabsNavItemProps<C extends React.ElementType = 'a'> = AnchorProps<C> & Pick<TabsItemProps, 'id'>;
8
+ /**
9
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
10
+ */
5
11
  export declare const TabsNavItem: <C extends React.ElementType = "a">(props: TabsNavItemProps<C>) => JSX.Element;
6
12
  export default TabsNavItem;
@@ -1,4 +1,7 @@
1
1
  import { TabsNavItemProps } from './tabs-nav-item';
2
+ /**
3
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
4
+ */
2
5
  export interface TabsNavProps {
3
6
  /**
4
7
  * Additional classes.
@@ -13,5 +16,8 @@ export interface TabsNavProps {
13
16
  */
14
17
  'aria-labelledby': string;
15
18
  }
19
+ /**
20
+ * @deprecated Use Tabs from `@tedi-design-system/react/tedi` instead.
21
+ */
16
22
  export declare const TabsNav: (props: TabsNavProps) => JSX.Element;
17
23
  export default TabsNav;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const p=require("react/jsx-runtime"),F=require("../../../../../external/classnames/index.cjs.js"),l=require("react"),a=require("./scroll-fade.module.scss.cjs.js"),f=l.forwardRef((S,t)=>{const{children:g,className:_,scrollBar:x="custom",onScrollToBottom:o,onScrollToTop:s,fadeSize:n=20,fadePosition:c="both"}=S,[m,M]=l.useState({top:!1,bottom:!1}),d=l.useCallback((e,r,i)=>{const u=e===0,B=Math.abs(r-e-i)<=1;let b=!0,h=!0;u&&(b=!1,s==null||s()),B&&(h=!1,o==null||o()),M({top:b,bottom:h})},[s,o]),j=l.useCallback(e=>{const{scrollTop:r,scrollHeight:i,clientHeight:u}=e.target;d(r,i,u)},[d]),k=l.useCallback(e=>{typeof t=="function"?t(e):t&&(t.current=e),e&&d(e.scrollTop,e.scrollHeight,e.clientHeight)},[d,t]),q=F.default(a.default["tedi-scroll-fade"],{[a.default[`tedi-scroll-fade--top-${n}`]]:m.top&&(c==="both"||c==="top")},{[a.default[`tedi-scroll-fade--bottom-${n}`]]:m.bottom&&(c==="both"||c==="bottom")},_),v=F.default(a.default["tedi-scroll-fade__inner"],{[a.default["tedi-scroll-fade__inner--custom-scroll"]]:x==="custom"});return p.jsx("div",{"data-name":"scroll-fade",className:q,children:p.jsx("div",{ref:k,onScroll:j,className:v,tabIndex:0,children:g})})});f.displayName="ScrollFade";exports.ScrollFade=f;exports.default=f;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const d=require("react/jsx-runtime"),s=require("../../../../../external/classnames/index.cjs.js"),n=require("react"),l=require("./scroll-fade.module.scss.cjs.js"),E=require("../../../helpers/hooks/use-scroll-fade.cjs.js"),c=n.forwardRef((i,e)=>{const{children:u,className:f,scrollBar:S="custom",onScrollToBottom:m,onScrollToTop:F,fadeSize:r=20,fadePosition:o="both"}=i,{scrollRef:a,canScrollStart:b,canScrollEnd:h,handleScroll:_}=E.useScrollFade({direction:"vertical",onScrollToStart:F,onScrollToEnd:m}),p=n.useCallback(t=>{a(t),typeof e=="function"?e(t):e&&(e.current=t)},[a,e]),T=b&&(o==="both"||o==="top"),q=h&&(o==="both"||o==="bottom"),v=s.default(l.default["tedi-scroll-fade"],{[l.default[`tedi-scroll-fade--top-${r}`]]:T},{[l.default[`tedi-scroll-fade--bottom-${r}`]]:q},f),x=s.default(l.default["tedi-scroll-fade__inner"],{[l.default["tedi-scroll-fade__inner--custom-scroll"]]:S==="custom"});return d.jsx("div",{"data-name":"scroll-fade",className:v,children:d.jsx("div",{ref:p,onScroll:_,className:x,tabIndex:0,children:u})})});c.displayName="ScrollFade";exports.ScrollFade=c;exports.default=c;
@@ -1,48 +1,38 @@
1
- import { jsx as h } from "react/jsx-runtime";
2
- import u from "../../../../../external/classnames/index.es.js";
3
- import { forwardRef as k, useState as v, useCallback as f } from "react";
4
- import o from "./scroll-fade.module.scss.es.js";
5
- const E = k((F, e) => {
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import s from "../../../../../external/classnames/index.es.js";
3
+ import { forwardRef as B, useCallback as _ } from "react";
4
+ import l from "./scroll-fade.module.scss.es.js";
5
+ import { useScrollFade as v } from "../../../helpers/hooks/use-scroll-fade.es.js";
6
+ const w = B((d, o) => {
6
7
  const {
7
- children: g,
8
- className: N,
9
- scrollBar: S = "custom",
10
- onScrollToBottom: l,
11
- onScrollToTop: a,
12
- fadeSize: m = 20,
13
- fadePosition: s = "both"
14
- } = F, [n, B] = v({ top: !1, bottom: !1 }), c = f(
15
- (t, r, i) => {
16
- const d = t === 0, M = Math.abs(r - t - i) <= 1;
17
- let p = !0, b = !0;
18
- d && (p = !1, a == null || a()), M && (b = !1, l == null || l()), B({ top: p, bottom: b });
8
+ children: n,
9
+ className: i,
10
+ scrollBar: m = "custom",
11
+ onScrollToBottom: f,
12
+ onScrollToTop: S,
13
+ fadeSize: c = 20,
14
+ fadePosition: t = "both"
15
+ } = d, { scrollRef: e, canScrollStart: p, canScrollEnd: u, handleScroll: h } = v({
16
+ direction: "vertical",
17
+ onScrollToStart: S,
18
+ onScrollToEnd: f
19
+ }), b = _(
20
+ (r) => {
21
+ e(r), typeof o == "function" ? o(r) : o && (o.current = r);
19
22
  },
20
- [a, l]
21
- ), H = f(
22
- (t) => {
23
- const { scrollTop: r, scrollHeight: i, clientHeight: d } = t.target;
24
- c(r, i, d);
25
- },
26
- [c]
27
- ), _ = f(
28
- (t) => {
29
- typeof e == "function" ? e(t) : e && (e.current = t), t && c(t.scrollTop, t.scrollHeight, t.clientHeight);
30
- },
31
- [c, e]
32
- ), x = u(
33
- o["tedi-scroll-fade"],
34
- { [o[`tedi-scroll-fade--top-${m}`]]: n.top && (s === "both" || s === "top") },
35
- {
36
- [o[`tedi-scroll-fade--bottom-${m}`]]: n.bottom && (s === "both" || s === "bottom")
37
- },
38
- N
39
- ), y = u(o["tedi-scroll-fade__inner"], {
40
- [o["tedi-scroll-fade__inner--custom-scroll"]]: S === "custom"
23
+ [e, o]
24
+ ), F = p && (t === "both" || t === "top"), E = u && (t === "both" || t === "bottom"), N = s(
25
+ l["tedi-scroll-fade"],
26
+ { [l[`tedi-scroll-fade--top-${c}`]]: F },
27
+ { [l[`tedi-scroll-fade--bottom-${c}`]]: E },
28
+ i
29
+ ), T = s(l["tedi-scroll-fade__inner"], {
30
+ [l["tedi-scroll-fade__inner--custom-scroll"]]: m === "custom"
41
31
  });
42
- return /* @__PURE__ */ h("div", { "data-name": "scroll-fade", className: x, children: /* @__PURE__ */ h("div", { ref: _, onScroll: H, className: y, tabIndex: 0, children: g }) });
32
+ return /* @__PURE__ */ a("div", { "data-name": "scroll-fade", className: N, children: /* @__PURE__ */ a("div", { ref: b, onScroll: h, className: T, tabIndex: 0, children: n }) });
43
33
  });
44
- E.displayName = "ScrollFade";
34
+ w.displayName = "ScrollFade";
45
35
  export {
46
- E as ScrollFade,
47
- E as default
36
+ w as ScrollFade,
37
+ w as default
48
38
  };
@@ -0,0 +1,5 @@
1
+ export * from './tabs';
2
+ export * from './tabs-context';
3
+ export * from './tabs-list/tabs-list';
4
+ export * from './tabs-trigger/tabs-trigger';
5
+ export * from './tabs-content/tabs-content';
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),i=require("../../../../../../external/classnames/index.cjs.js"),l=require("../tabs.module.scss.cjs.js"),d=require("../tabs-context.cjs.js"),t=n=>{const{id:e,children:a,className:s}=n,{currentTab:o}=d.useTabsContext();return e&&o!==e?null:r.jsx("div",{"data-name":"tabs-content",id:e?`${e}-panel`:void 0,role:"tabpanel","aria-labelledby":e??void 0,className:i.default(l.default["tedi-tabs__content"],s),children:a})};t.displayName="TabsContent";exports.TabsContent=t;
@@ -0,0 +1,22 @@
1
+ import { default as React } from 'react';
2
+ export interface TabsContentProps {
3
+ /**
4
+ * Unique identifier matching the corresponding TabsTrigger id.
5
+ * When provided, content is only shown when this tab is active.
6
+ * When omitted, content is always rendered (useful for router outlets).
7
+ */
8
+ id?: string;
9
+ /**
10
+ * Tab panel content
11
+ */
12
+ children: React.ReactNode;
13
+ /**
14
+ * Additional class name(s)
15
+ */
16
+ className?: string;
17
+ }
18
+ export declare const TabsContent: {
19
+ (props: TabsContentProps): import("react/jsx-runtime").JSX.Element | null;
20
+ displayName: string;
21
+ };
22
+ export default TabsContent;
@@ -0,0 +1,22 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import r from "../../../../../../external/classnames/index.es.js";
3
+ import i from "../tabs.module.scss.es.js";
4
+ import { useTabsContext as l } from "../tabs-context.es.js";
5
+ const m = (a) => {
6
+ const { id: t, children: e, className: n } = a, { currentTab: o } = l();
7
+ return t && o !== t ? null : /* @__PURE__ */ s(
8
+ "div",
9
+ {
10
+ "data-name": "tabs-content",
11
+ id: t ? `${t}-panel` : void 0,
12
+ role: "tabpanel",
13
+ "aria-labelledby": t ?? void 0,
14
+ className: r(i["tedi-tabs__content"], n),
15
+ children: e
16
+ }
17
+ );
18
+ };
19
+ m.displayName = "TabsContent";
20
+ export {
21
+ m as TabsContent
22
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),n=e.createContext(null),o=()=>{const t=e.useContext(n);if(!t)throw new Error("Tabs components must be used within <Tabs />");return t};exports.TabsContext=n;exports.useTabsContext=o;
@@ -0,0 +1,7 @@
1
+ import { default as React } from 'react';
2
+ export type TabsContextValue = {
3
+ currentTab: string;
4
+ setCurrentTab: (id: string) => void;
5
+ };
6
+ export declare const TabsContext: React.Context<TabsContextValue | null>;
7
+ export declare const useTabsContext: () => TabsContextValue;
@@ -0,0 +1,11 @@
1
+ import e, { useContext as o } from "react";
2
+ const n = e.createContext(null), r = () => {
3
+ const t = o(n);
4
+ if (!t)
5
+ throw new Error("Tabs components must be used within <Tabs />");
6
+ return t;
7
+ };
8
+ export {
9
+ n as TabsContext,
10
+ r as useTabsContext
11
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=e=>{if(e.key!=="ArrowLeft"&&e.key!=="ArrowRight"&&e.key!=="Home"&&e.key!=="End")return null;const l=e.currentTarget.closest('[role="tablist"]');if(!l)return null;const t=Array.from(l.querySelectorAll('[role="tab"]:not([disabled])')).filter(a=>getComputedStyle(a).display!=="none"),n=t.indexOf(e.currentTarget);if(t.length===0||n===-1)return null;let r=-1;switch(e.key){case"ArrowLeft":r=n===0?t.length-1:n-1;break;case"ArrowRight":r=n===t.length-1?0:n+1;break;case"Home":r=0;break;case"End":r=t.length-1;break}return r!==-1?(e.preventDefault(),t[r].focus(),t[r].scrollIntoView({block:"nearest",inline:"nearest"}),t[r]):null};exports.navigateTablist=o;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Navigates to a sibling tab in the tablist using ArrowLeft/ArrowRight/Home/End keys.
3
+ * Returns the target tab element if navigation occurred, or null otherwise.
4
+ */
5
+ export declare const navigateTablist: (e: React.KeyboardEvent<HTMLButtonElement>) => HTMLButtonElement | null;
@@ -0,0 +1,29 @@
1
+ const o = (e) => {
2
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight" && e.key !== "Home" && e.key !== "End")
3
+ return null;
4
+ const l = e.currentTarget.closest('[role="tablist"]');
5
+ if (!l) return null;
6
+ const t = Array.from(l.querySelectorAll('[role="tab"]:not([disabled])')).filter(
7
+ (a) => getComputedStyle(a).display !== "none"
8
+ ), n = t.indexOf(e.currentTarget);
9
+ if (t.length === 0 || n === -1) return null;
10
+ let r = -1;
11
+ switch (e.key) {
12
+ case "ArrowLeft":
13
+ r = n === 0 ? t.length - 1 : n - 1;
14
+ break;
15
+ case "ArrowRight":
16
+ r = n === t.length - 1 ? 0 : n + 1;
17
+ break;
18
+ case "Home":
19
+ r = 0;
20
+ break;
21
+ case "End":
22
+ r = t.length - 1;
23
+ break;
24
+ }
25
+ return r !== -1 ? (e.preventDefault(), t[r].focus(), t[r].scrollIntoView({ block: "nearest", inline: "nearest" }), t[r]) : null;
26
+ };
27
+ export {
28
+ o as navigateTablist
29
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),g=require("../../../../../../external/classnames/index.cjs.js"),t=require("react"),D=require("../../../base/icon/icon.cjs.js"),k=require("../../../misc/print/print.cjs.js"),o=require("../../../overlays/dropdown/dropdown.cjs.js"),i=require("../tabs.module.scss.cjs.js"),z=require("../tabs-context.cjs.js"),P=require("../../../../providers/label-provider/use-labels.cjs.js"),A=require("../../../../helpers/hooks/use-scroll-fade.cjs.js"),v=R=>{const{children:a,className:S,"aria-label":j,"aria-labelledby":y,printVisibility:L="show",overflowMode:r="dropdown"}=R,{getLabel:q}=P.useLabels(),{currentTab:W,setCurrentTab:T}=z.useTabsContext(),h=t.useRef(null),c=t.useRef(null),[d,u]=t.useState(!1),f=t.useRef(!1),b=t.useRef(0);f.current=d;const{scrollRef:w,canScrollStart:C,canScrollEnd:M,handleScroll:N}=A.useScrollFade({direction:"horizontal"}),O=t.useCallback(e=>{c.current=e,r==="scroll"&&w(e)},[r,w]),p=t.useMemo(()=>t.Children.toArray(a).filter(t.isValidElement),[a]),m=t.useMemo(()=>{const e=[];return p.forEach(l=>{const n=l.props;e.push({id:n.id,label:n.children,disabled:n.disabled})}),e},[p]),_=r==="dropdown"&&d&&m.length>1,E=m.filter(e=>e.id!==W),I=e=>{e&&T(e)};return t.useLayoutEffect(()=>{if(r!=="dropdown")return;const e=c.current;!e||f.current||(b.current=e.scrollWidth,e.scrollWidth>e.clientWidth&&e.clientWidth>0&&u(!0))},[r,d,p]),t.useEffect(()=>{if(r!=="dropdown")return;const e=h.current,l=c.current;if(!e||!l)return;const n=()=>{f.current?b.current<=e.clientWidth&&u(!1):l.scrollWidth>l.clientWidth&&l.clientWidth>0&&(b.current=l.scrollWidth,u(!0))},x=new ResizeObserver(n);return x.observe(e),()=>x.disconnect()},[r]),s.jsx(k.Print,{visibility:L,children:s.jsxs("div",{ref:h,className:g.default(i.default["tedi-tabs__list-wrapper"],{[i.default["tedi-tabs__list-wrapper--scroll-fade-left"]]:r==="scroll"&&C,[i.default["tedi-tabs__list-wrapper--scroll-fade-right"]]:r==="scroll"&&M}),children:[s.jsx("div",{ref:O,"data-name":"tabs-list",role:"tablist","aria-label":j,"aria-labelledby":y,className:g.default(i.default["tedi-tabs__list"],{[i.default["tedi-tabs__list--overflow"]]:_},{[i.default["tedi-tabs__list--scroll"]]:r==="scroll"},S),onScroll:r==="scroll"?N:void 0,children:a}),_&&s.jsx("div",{className:i.default["tedi-tabs__more-wrapper"],children:s.jsxs(o.Dropdown,{placement:"bottom-end",children:[s.jsx(o.Dropdown.Trigger,{children:s.jsxs("button",{"data-name":"tabs-more-btn",type:"button",className:i.default["tedi-tabs__more-btn"],children:[q("tabs.more"),s.jsx(D.Icon,{name:"expand_more",size:18})]})}),s.jsx(o.Dropdown.Content,{children:E.map((e,l)=>s.jsx(o.Dropdown.Item,{index:l,disabled:e.disabled,onClick:()=>I(e.id),children:e.label},e.id))})]})})]})})};v.displayName="TabsList";exports.TabsList=v;
@@ -0,0 +1,37 @@
1
+ import { default as React } from 'react';
2
+ import { PrintProps } from '../../../misc/print/print';
3
+ export interface TabsListProps {
4
+ /**
5
+ * Tab trigger elements
6
+ */
7
+ children: React.ReactNode;
8
+ /**
9
+ * Additional class name(s)
10
+ */
11
+ className?: string;
12
+ /**
13
+ * Accessible label for the tablist
14
+ */
15
+ 'aria-label'?: string;
16
+ /**
17
+ * ID of element labelling the tablist
18
+ */
19
+ 'aria-labelledby'?: string;
20
+ /**
21
+ * Controls visibility when printing
22
+ * @default 'show'
23
+ */
24
+ printVisibility?: PrintProps['visibility'];
25
+ /**
26
+ * How to handle tab overflow when tabs don't fit in available space.
27
+ * - 'dropdown': Shows a dropdown button containing overflowing tabs (default)
28
+ * - 'scroll': Enables horizontal scrolling with a fade indicator
29
+ * @default 'dropdown'
30
+ */
31
+ overflowMode?: 'dropdown' | 'scroll';
32
+ }
33
+ export declare const TabsList: {
34
+ (props: TabsListProps): import("react/jsx-runtime").JSX.Element;
35
+ displayName: string;
36
+ };
37
+ export default TabsList;
@@ -0,0 +1,102 @@
1
+ import { jsx as s, jsxs as h } from "react/jsx-runtime";
2
+ import R from "../../../../../../external/classnames/index.es.js";
3
+ import i, { useRef as n, useState as A, useCallback as P, useLayoutEffect as V, useEffect as B } from "react";
4
+ import { Icon as D } from "../../../base/icon/icon.es.js";
5
+ import { Print as F } from "../../../misc/print/print.es.js";
6
+ import { Dropdown as a } from "../../../overlays/dropdown/dropdown.es.js";
7
+ import l from "../tabs.module.scss.es.js";
8
+ import { useTabsContext as q } from "../tabs-context.es.js";
9
+ import { useLabels as G } from "../../../../providers/label-provider/use-labels.es.js";
10
+ import { useScrollFade as H } from "../../../../helpers/hooks/use-scroll-fade.es.js";
11
+ const J = (S) => {
12
+ const {
13
+ children: c,
14
+ className: W,
15
+ "aria-label": L,
16
+ "aria-labelledby": N,
17
+ printVisibility: C = "show",
18
+ overflowMode: r = "dropdown"
19
+ } = S, { getLabel: T } = G(), { currentTab: x, setCurrentTab: E } = q(), w = n(null), d = n(null), [f, b] = A(!1), m = n(!1), u = n(0);
20
+ m.current = f;
21
+ const {
22
+ scrollRef: _,
23
+ canScrollStart: I,
24
+ canScrollEnd: M,
25
+ handleScroll: O
26
+ } = H({ direction: "horizontal" }), k = P(
27
+ (e) => {
28
+ d.current = e, r === "scroll" && _(e);
29
+ },
30
+ [r, _]
31
+ ), p = i.useMemo(() => i.Children.toArray(c).filter(i.isValidElement), [c]), v = i.useMemo(() => {
32
+ const e = [];
33
+ return p.forEach((t) => {
34
+ const o = t.props;
35
+ e.push({ id: o.id, label: o.children, disabled: o.disabled });
36
+ }), e;
37
+ }, [p]), g = r === "dropdown" && f && v.length > 1, z = v.filter((e) => e.id !== x), j = (e) => {
38
+ e && E(e);
39
+ };
40
+ return V(() => {
41
+ if (r !== "dropdown") return;
42
+ const e = d.current;
43
+ !e || m.current || (u.current = e.scrollWidth, e.scrollWidth > e.clientWidth && e.clientWidth > 0 && b(!0));
44
+ }, [r, f, p]), B(() => {
45
+ if (r !== "dropdown") return;
46
+ const e = w.current, t = d.current;
47
+ if (!e || !t) return;
48
+ const o = () => {
49
+ m.current ? u.current <= e.clientWidth && b(!1) : t.scrollWidth > t.clientWidth && t.clientWidth > 0 && (u.current = t.scrollWidth, b(!0));
50
+ }, y = new ResizeObserver(o);
51
+ return y.observe(e), () => y.disconnect();
52
+ }, [r]), /* @__PURE__ */ s(F, { visibility: C, children: /* @__PURE__ */ h(
53
+ "div",
54
+ {
55
+ ref: w,
56
+ className: R(l["tedi-tabs__list-wrapper"], {
57
+ [l["tedi-tabs__list-wrapper--scroll-fade-left"]]: r === "scroll" && I,
58
+ [l["tedi-tabs__list-wrapper--scroll-fade-right"]]: r === "scroll" && M
59
+ }),
60
+ children: [
61
+ /* @__PURE__ */ s(
62
+ "div",
63
+ {
64
+ ref: k,
65
+ "data-name": "tabs-list",
66
+ role: "tablist",
67
+ "aria-label": L,
68
+ "aria-labelledby": N,
69
+ className: R(
70
+ l["tedi-tabs__list"],
71
+ { [l["tedi-tabs__list--overflow"]]: g },
72
+ { [l["tedi-tabs__list--scroll"]]: r === "scroll" },
73
+ W
74
+ ),
75
+ onScroll: r === "scroll" ? O : void 0,
76
+ children: c
77
+ }
78
+ ),
79
+ g && /* @__PURE__ */ s("div", { className: l["tedi-tabs__more-wrapper"], children: /* @__PURE__ */ h(a, { placement: "bottom-end", children: [
80
+ /* @__PURE__ */ s(a.Trigger, { children: /* @__PURE__ */ h("button", { "data-name": "tabs-more-btn", type: "button", className: l["tedi-tabs__more-btn"], children: [
81
+ T("tabs.more"),
82
+ /* @__PURE__ */ s(D, { name: "expand_more", size: 18 })
83
+ ] }) }),
84
+ /* @__PURE__ */ s(a.Content, { children: z.map((e, t) => /* @__PURE__ */ s(
85
+ a.Item,
86
+ {
87
+ index: t,
88
+ disabled: e.disabled,
89
+ onClick: () => j(e.id),
90
+ children: e.label
91
+ },
92
+ e.id
93
+ )) })
94
+ ] }) })
95
+ ]
96
+ }
97
+ ) });
98
+ };
99
+ J.displayName = "TabsList";
100
+ export {
101
+ J as TabsList
102
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),m=require("../../../../../../external/classnames/index.cjs.js"),x=require("../../../base/icon/icon.cjs.js"),r=require("../tabs.module.scss.cjs.js"),_=require("../tabs-context.cjs.js"),q=require("../tabs-helpers.cjs.js"),c=l=>{const{id:e,children:d,icon:a,disabled:t=!1,className:b}=l,{currentTab:u,setCurrentTab:i}=_.useTabsContext(),s=u===e,g=()=>{t||i(e)},T=f=>{const n=q.navigateTablist(f);n&&i(n.id)};return o.jsxs("button",{"data-name":"tabs-trigger",id:e,role:"tab",type:"button","aria-selected":s,"aria-controls":`${e}-panel`,tabIndex:s?0:-1,disabled:t,className:m.default(r.default["tedi-tabs__trigger"],{[r.default["tedi-tabs__trigger--selected"]]:s},{[r.default["tedi-tabs__trigger--disabled"]]:t},b),onClick:g,onKeyDown:T,children:[a&&o.jsx(x.Icon,{name:a,size:18,color:"inherit"}),d]})};c.displayName="TabsTrigger";exports.TabsTrigger=c;
@@ -0,0 +1,31 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../../../base/icon/icon';
3
+ export interface TabsTriggerProps {
4
+ /**
5
+ * Unique identifier for this tab. Used as the element id and to link to the
6
+ * corresponding TabsContent panel (aria-controls="{id}-panel").
7
+ */
8
+ id: string;
9
+ /**
10
+ * Tab label text
11
+ */
12
+ children: React.ReactNode;
13
+ /**
14
+ * Icon displayed before the label
15
+ */
16
+ icon?: IconProps['name'];
17
+ /**
18
+ * Whether the tab is disabled
19
+ * @default false
20
+ */
21
+ disabled?: boolean;
22
+ /**
23
+ * Additional class name(s)
24
+ */
25
+ className?: string;
26
+ }
27
+ export declare const TabsTrigger: {
28
+ (props: TabsTriggerProps): import("react/jsx-runtime").JSX.Element;
29
+ displayName: string;
30
+ };
31
+ export default TabsTrigger;
@@ -0,0 +1,43 @@
1
+ import { jsxs as p, jsx as f } from "react/jsx-runtime";
2
+ import T from "../../../../../../external/classnames/index.es.js";
3
+ import { Icon as u } from "../../../base/icon/icon.es.js";
4
+ import s from "../tabs.module.scss.es.js";
5
+ import { useTabsContext as _ } from "../tabs-context.es.js";
6
+ import { navigateTablist as h } from "../tabs-helpers.es.js";
7
+ const x = (n) => {
8
+ const { id: e, children: c, icon: a, disabled: t = !1, className: l } = n, { currentTab: d, setCurrentTab: i } = _(), r = d === e, m = () => {
9
+ t || i(e);
10
+ }, b = (g) => {
11
+ const o = h(g);
12
+ o && i(o.id);
13
+ };
14
+ return /* @__PURE__ */ p(
15
+ "button",
16
+ {
17
+ "data-name": "tabs-trigger",
18
+ id: e,
19
+ role: "tab",
20
+ type: "button",
21
+ "aria-selected": r,
22
+ "aria-controls": `${e}-panel`,
23
+ tabIndex: r ? 0 : -1,
24
+ disabled: t,
25
+ className: T(
26
+ s["tedi-tabs__trigger"],
27
+ { [s["tedi-tabs__trigger--selected"]]: r },
28
+ { [s["tedi-tabs__trigger--disabled"]]: t },
29
+ l
30
+ ),
31
+ onClick: m,
32
+ onKeyDown: b,
33
+ children: [
34
+ a && /* @__PURE__ */ f(u, { name: a, size: 18, color: "inherit" }),
35
+ c
36
+ ]
37
+ }
38
+ );
39
+ };
40
+ x.displayName = "TabsTrigger";
41
+ export {
42
+ x as TabsTrigger
43
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),q=require("../../../../../external/classnames/index.cjs.js"),o=require("react"),g=require("./tabs.module.scss.cjs.js"),m=require("./tabs-content/tabs-content.cjs.js"),f=require("./tabs-context.cjs.js"),v=require("./tabs-list/tabs-list.cjs.js"),x=require("./tabs-trigger/tabs-trigger.cjs.js"),e=i=>{const{children:u,value:s,defaultValue:c,onChange:t,className:l}=i,[b,d]=o.useState(c||""),r=s??b,T=o.useCallback(a=>{a!==r&&(s===void 0&&d(a),t==null||t(a))},[s,r,t]);return n.jsx(f.TabsContext.Provider,{value:{currentTab:r,setCurrentTab:T},children:n.jsx("div",{"data-name":"tabs",className:q.default(g.default["tedi-tabs"],l),children:u})})};e.displayName="Tabs";e.List=v.TabsList;e.Trigger=x.TabsTrigger;e.Content=m.TabsContent;exports.Tabs=e;
@@ -0,0 +1,40 @@
1
+ import { default as React } from 'react';
2
+ export interface TabsProps {
3
+ /**
4
+ * Tabs content — should include Tabs.List and Tabs.Content elements
5
+ */
6
+ children: React.ReactNode;
7
+ /**
8
+ * Controlled active tab id. Use together with onChange.
9
+ */
10
+ value?: string;
11
+ /**
12
+ * Default active tab id for uncontrolled usage.
13
+ */
14
+ defaultValue?: string;
15
+ /**
16
+ * Callback fired when the active tab changes
17
+ */
18
+ onChange?: (tabId: string) => void;
19
+ /**
20
+ * Additional class name(s)
21
+ */
22
+ className?: string;
23
+ }
24
+ export declare const Tabs: {
25
+ (props: TabsProps): import("react/jsx-runtime").JSX.Element;
26
+ displayName: string;
27
+ List: {
28
+ (props: import('./tabs-list/tabs-list').TabsListProps): import("react/jsx-runtime").JSX.Element;
29
+ displayName: string;
30
+ };
31
+ Trigger: {
32
+ (props: import('./tabs-trigger/tabs-trigger').TabsTriggerProps): import("react/jsx-runtime").JSX.Element;
33
+ displayName: string;
34
+ };
35
+ Content: {
36
+ (props: import('./tabs-content/tabs-content').TabsContentProps): import("react/jsx-runtime").JSX.Element | null;
37
+ displayName: string;
38
+ };
39
+ };
40
+ export default Tabs;
@@ -0,0 +1,24 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import u from "../../../../../external/classnames/index.es.js";
3
+ import m from "react";
4
+ import d from "./tabs.module.scss.es.js";
5
+ import { TabsContent as p } from "./tabs-content/tabs-content.es.js";
6
+ import { TabsContext as v } from "./tabs-context.es.js";
7
+ import { TabsList as C } from "./tabs-list/tabs-list.es.js";
8
+ import { TabsTrigger as N } from "./tabs-trigger/tabs-trigger.es.js";
9
+ const r = (l) => {
10
+ const { children: n, value: e, defaultValue: i, onChange: t, className: c } = l, [b, T] = m.useState(i || ""), a = e ?? b, f = m.useCallback(
11
+ (o) => {
12
+ o !== a && (e === void 0 && T(o), t == null || t(o));
13
+ },
14
+ [e, a, t]
15
+ );
16
+ return /* @__PURE__ */ s(v.Provider, { value: { currentTab: a, setCurrentTab: f }, children: /* @__PURE__ */ s("div", { "data-name": "tabs", className: u(d["tedi-tabs"], c), children: n }) });
17
+ };
18
+ r.displayName = "Tabs";
19
+ r.List = C;
20
+ r.Trigger = N;
21
+ r.Content = p;
22
+ export {
23
+ r as Tabs
24
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={"tedi-tabs__list-wrapper":"tedi-tabs__list-wrapper-836dbadb","tedi-tabs__list-wrapper--scroll-fade-left":"tedi-tabs__list-wrapper--scroll-fade-left-0e5e3c75","tedi-tabs__list-wrapper--scroll-fade-right":"tedi-tabs__list-wrapper--scroll-fade-right-c29132bd","tedi-tabs__list":"tedi-tabs__list-59580c81","tedi-tabs__list--overflow":"tedi-tabs__list--overflow-31407fe9","tedi-tabs__trigger":"tedi-tabs__trigger-6d66998e","tedi-tabs__trigger--selected":"tedi-tabs__trigger--selected-e4ee99cf","tedi-tabs__list--scroll":"tedi-tabs__list--scroll-04ebd4e1","tedi-tabs__trigger--disabled":"tedi-tabs__trigger--disabled-d33c941d","tedi-tabs__content":"tedi-tabs__content-55f3ce06","tedi-tabs__more-wrapper":"tedi-tabs__more-wrapper-c6ff4efd","tedi-tabs__more-btn":"tedi-tabs__more-btn-bfea5f30"};exports.default=t;
@@ -0,0 +1,17 @@
1
+ const t = {
2
+ "tedi-tabs__list-wrapper": "tedi-tabs__list-wrapper-836dbadb",
3
+ "tedi-tabs__list-wrapper--scroll-fade-left": "tedi-tabs__list-wrapper--scroll-fade-left-0e5e3c75",
4
+ "tedi-tabs__list-wrapper--scroll-fade-right": "tedi-tabs__list-wrapper--scroll-fade-right-c29132bd",
5
+ "tedi-tabs__list": "tedi-tabs__list-59580c81",
6
+ "tedi-tabs__list--overflow": "tedi-tabs__list--overflow-31407fe9",
7
+ "tedi-tabs__trigger": "tedi-tabs__trigger-6d66998e",
8
+ "tedi-tabs__trigger--selected": "tedi-tabs__trigger--selected-e4ee99cf",
9
+ "tedi-tabs__list--scroll": "tedi-tabs__list--scroll-04ebd4e1",
10
+ "tedi-tabs__trigger--disabled": "tedi-tabs__trigger--disabled-d33c941d",
11
+ "tedi-tabs__content": "tedi-tabs__content-55f3ce06",
12
+ "tedi-tabs__more-wrapper": "tedi-tabs__more-wrapper-c6ff4efd",
13
+ "tedi-tabs__more-btn": "tedi-tabs__more-btn-bfea5f30"
14
+ };
15
+ export {
16
+ t as default
17
+ };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),n=require("../dropdown-context.cjs.js"),c=({children:e})=>{const{refs:r,getReferenceProps:o}=n.useDropdownContext();return t.cloneElement(e,o({ref:r.setReference}))};exports.DropdownTrigger=c;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../../../../../../external/@floating-ui/react/dist/floating-ui.react.cjs.js"),c=require("react"),f=require("../dropdown-context.cjs.js"),g=({children:e})=>{const{refs:r,getReferenceProps:o}=f.useDropdownContext(),t=e.ref??null,n=s.useMergeRefs([r.setReference,t]);return c.cloneElement(e,o({...e.props,ref:n}))};exports.DropdownTrigger=g;