@tedi-design-system/react 19.1.0-rc.6 → 19.1.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle-stats.html +1 -1
- package/index.css +1 -1
- package/package.json +2 -2
- package/src/tedi/components/misc/affix/affix.cjs.js +1 -1
- package/src/tedi/components/misc/affix/affix.es.js +20 -8
- package/src/tedi/components/navigation/table-of-contents/components/table-of-contents-collapsible/table-of-contents-collapsible.cjs.js +1 -1
- package/src/tedi/components/navigation/table-of-contents/components/table-of-contents-collapsible/table-of-contents-collapsible.d.ts +9 -1
- package/src/tedi/components/navigation/table-of-contents/components/table-of-contents-collapsible/table-of-contents-collapsible.es.js +78 -39
- package/src/tedi/components/navigation/table-of-contents/components/table-of-contents-item/table-of-contents-item.d.ts +6 -0
- package/src/tedi/components/navigation/table-of-contents/components/table-of-contents-row/table-of-contents-row.cjs.js +1 -1
- package/src/tedi/components/navigation/table-of-contents/components/table-of-contents-row/table-of-contents-row.es.js +23 -28
- package/src/tedi/components/navigation/table-of-contents/table-of-contents.cjs.js +1 -1
- package/src/tedi/components/navigation/table-of-contents/table-of-contents.d.ts +32 -21
- package/src/tedi/components/navigation/table-of-contents/table-of-contents.es.js +58 -55
- package/src/tedi/components/navigation/table-of-contents/table-of-contents.module.scss.cjs.js +1 -1
- package/src/tedi/components/navigation/table-of-contents/table-of-contents.module.scss.es.js +4 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tedi-design-system/react",
|
|
3
|
-
"version": "19.1.0-rc.
|
|
3
|
+
"version": "19.1.0-rc.7",
|
|
4
4
|
"description": "TEDI Design System React component library — accessible, reusable UI components. Docs & live examples: https://storybook.tedi.ee/react/rc/",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@mui/material": "^5.15.13",
|
|
48
48
|
"@mui/x-date-pickers": "^5.0.20",
|
|
49
49
|
"@tanstack/react-table": "^8.13.2",
|
|
50
|
-
"@tedi-design-system/core": "^6.
|
|
50
|
+
"@tedi-design-system/core": "^6.9.0",
|
|
51
51
|
"classnames": "^2.5.1",
|
|
52
52
|
"draft-js": "^0.11.7",
|
|
53
53
|
"draftjs-md-converter": "^1.5.2",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),$=require("../../../../../external/classnames/index.cjs.js"),b=require("react"),h=require("../../../../../external/react-sticky-box/dist/index.cjs.js"),e=require("./affix.module.scss.cjs.js"),q=require("../../../../community/components/layout/layout-context.cjs.js"),g=require("../../../helpers/hooks/use-element-size.cjs.js"),j=x=>{const{children:n,relative:p=["header"],className:m,position:i="sticky",top:t=1.5,bottom:f,right:s,left:a}=x,{headerBottomElement:y}=b.useContext(q.LayoutContext),o=g.useElementSize(y),d=$.default(e.default["tedi-affix"],m,e.default[`tedi-affix--${i}`],{[e.default[`tedi-affix--top-${t}`.replace(".","-")]]:typeof t<"u"&&i==="fixed",[e.default[`tedi-affix--bottom-${f}`.replace(".","-")]]:typeof f<"u",[e.default[`tedi-affix--left-${a}`.replace(".","-")]]:typeof a<"u",[e.default[`tedi-affix--right-${s}`.replace(".","-")]]:typeof s<"u"});if(i==="fixed")return l.jsx("div",{className:d,children:n});const r=(typeof t=="number"?t:0)*16,u=p.includes("header")?r+((o==null?void 0:o.height)||0):r,c=(typeof f=="number"?f:0)*16;return l.jsx(h.default,{offsetTop:u,offsetBottom:c,className:d,style:{"--tedi-affix-offset-top":`${u}px`,"--tedi-affix-offset-bottom":`${c}px`},children:n})};exports.Affix=j;
|
|
@@ -1,21 +1,33 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsx as c } from "react/jsx-runtime";
|
|
2
2
|
import h from "../../../../../external/classnames/index.es.js";
|
|
3
3
|
import { useContext as $ } from "react";
|
|
4
4
|
import b from "../../../../../external/react-sticky-box/dist/index.es.js";
|
|
5
5
|
import e from "./affix.module.scss.es.js";
|
|
6
6
|
import { LayoutContext as g } from "../../../../community/components/layout/layout-context.es.js";
|
|
7
7
|
import { useElementSize as N } from "../../../helpers/hooks/use-element-size.es.js";
|
|
8
|
-
const L = (
|
|
9
|
-
const { children: r, relative:
|
|
8
|
+
const L = (l) => {
|
|
9
|
+
const { children: r, relative: x = ["header"], className: u, position: f = "sticky", top: t = 1.5, bottom: o, right: s, left: n } = l, { headerBottomElement: y } = $(g), i = N(y), p = h(e["tedi-affix"], u, e[`tedi-affix--${f}`], {
|
|
10
10
|
[e[`tedi-affix--top-${t}`.replace(".", "-")]]: typeof t < "u" && f === "fixed",
|
|
11
11
|
[e[`tedi-affix--bottom-${o}`.replace(".", "-")]]: typeof o < "u",
|
|
12
|
-
[e[`tedi-affix--left-${
|
|
13
|
-
[e[`tedi-affix--right-${
|
|
12
|
+
[e[`tedi-affix--left-${n}`.replace(".", "-")]]: typeof n < "u",
|
|
13
|
+
[e[`tedi-affix--right-${s}`.replace(".", "-")]]: typeof s < "u"
|
|
14
14
|
});
|
|
15
15
|
if (f === "fixed")
|
|
16
|
-
return /* @__PURE__ */
|
|
17
|
-
const a = (typeof t == "number" ? t : 0) * 16,
|
|
18
|
-
return /* @__PURE__ */
|
|
16
|
+
return /* @__PURE__ */ c("div", { className: p, children: r });
|
|
17
|
+
const a = (typeof t == "number" ? t : 0) * 16, m = x.includes("header") ? a + ((i == null ? void 0 : i.height) || 0) : a, d = (typeof o == "number" ? o : 0) * 16;
|
|
18
|
+
return /* @__PURE__ */ c(
|
|
19
|
+
b,
|
|
20
|
+
{
|
|
21
|
+
offsetTop: m,
|
|
22
|
+
offsetBottom: d,
|
|
23
|
+
className: p,
|
|
24
|
+
style: {
|
|
25
|
+
"--tedi-affix-offset-top": `${m}px`,
|
|
26
|
+
"--tedi-affix-offset-bottom": `${d}px`
|
|
27
|
+
},
|
|
28
|
+
children: r
|
|
29
|
+
}
|
|
30
|
+
);
|
|
19
31
|
};
|
|
20
32
|
export {
|
|
21
33
|
L as Affix
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),w=require("../../../../../../../external/classnames/index.cjs.js"),n=require("react"),T=require("../../../../base/typography/text/text.cjs.js"),q=require("../../../../buttons/collapse-button/collapse-button.cjs.js"),H=require("../../../../overlays/sheet/sheet.cjs.js"),b=require("../../table-of-contents.cjs.js"),t=require("../../table-of-contents.module.scss.cjs.js"),Y=require("../table-of-contents-list/table-of-contents-list.cjs.js"),F=require("../../../../../providers/label-provider/use-labels.cjs.js"),N=E=>{const{children:m,heading:h,ariaLabel:S,activeId:o,numbered:v=!1,bordered:y=!1,defaultOpen:p=!0,sticky:c=!0,hideOnScroll:x=!1,className:M}=E,{getLabel:C}=F.useLabels(),[l,i]=n.useState(!1),[k,_]=n.useState(!1),[r,A]=n.useState(null);n.useEffect(()=>{if(!x||!c){_(!1);return}let a=window.scrollY,s=0;const O=()=>{s||(s=window.requestAnimationFrame(()=>{s=0;const f=window.scrollY,j=f-a;Math.abs(j)>4&&(_(j>0&&f>0),a=f)}))};return window.addEventListener("scroll",O,{passive:!0}),()=>{window.removeEventListener("scroll",O),s&&window.cancelAnimationFrame(s)}},[x,c]),n.useEffect(()=>{if(!l||!r)return;const a=s=>{s.target.closest("a, button")&&i(!1)};return r.addEventListener("click",a),()=>r.removeEventListener("click",a)},[l,r]);const d=(h===void 0?C("table-of-contents.title"):h)??C("table-of-contents.title"),g=S||d,u=n.useMemo(()=>b.childrenToNodes(m),[m]),L=n.useMemo(()=>b.buildActiveTrail(u,o),[u,o]),B=n.useMemo(()=>({activeId:o,numbered:v,ariaLabel:g,activeTrail:L,defaultOpen:p}),[o,v,g,L,p]);return e.jsxs(b.TableOfContentsContext.Provider,{value:B,children:[e.jsxs("div",{className:w.default(t.default["tedi-table-of-contents__bar"],{[t.default["tedi-table-of-contents__bar--static"]]:!c,[t.default["tedi-table-of-contents__bar--hidden"]]:k&&!l},M),children:[e.jsx(T.Text,{modifiers:"bold",className:t.default["tedi-table-of-contents__bar-title"],children:d}),e.jsx(q.CollapseButton,{open:l,onOpenChange:i,underline:!1,"aria-haspopup":"dialog"})]}),e.jsx(H.Sheet,{open:l,onToggle:i,ariaLabel:d,className:t.default["tedi-table-of-contents__sheet"],header:e.jsxs("div",{className:t.default["tedi-table-of-contents__sheet-header"],children:[e.jsx(T.Text,{modifiers:"bold",className:t.default["tedi-table-of-contents__bar-title"],children:d}),e.jsx(q.CollapseButton,{open:l,onOpenChange:i,underline:!1})]}),children:e.jsx("div",{ref:A,className:w.default(t.default["tedi-table-of-contents"],{[t.default["tedi-table-of-contents--bordered"]]:y}),children:e.jsx(Y.TableOfContentsList,{nodes:u,heading:null})})})]})};N.displayName="TableOfContentsCollapsible";exports.TableOfContentsCollapsible=N;
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { TableOfContentsProps } from '../../table-of-contents';
|
|
2
|
-
export interface TableOfContentsCollapsibleProps extends Pick<TableOfContentsProps, 'children' | 'heading' | 'ariaLabel' | 'activeId' | 'numbered' | 'className'> {
|
|
2
|
+
export interface TableOfContentsCollapsibleProps extends Pick<TableOfContentsProps, 'children' | 'heading' | 'ariaLabel' | 'activeId' | 'numbered' | 'bordered' | 'defaultOpen' | 'className'> {
|
|
3
3
|
/**
|
|
4
4
|
* Pin the bar to the bottom of the viewport. Set `false` to render it inline.
|
|
5
5
|
* @default true
|
|
6
6
|
*/
|
|
7
7
|
sticky?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Mobile-only behaviour of this `TableOfContents.Collapsible` bar — there is no desktop equivalent.
|
|
10
|
+
* When the bar is pinned (`sticky`), auto-hide it while the page scrolls down and reveal it again on
|
|
11
|
+
* scroll up, so it stays out of the way while reading but is one gesture away. No effect when
|
|
12
|
+
* `sticky` is `false`.
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
hideOnScroll?: boolean;
|
|
8
16
|
}
|
|
9
17
|
/**
|
|
10
18
|
* Mobile variant of `TableOfContents`: a bottom bar that opens the list in a bottom-sheet overlay.
|
|
@@ -1,58 +1,97 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { useState as
|
|
4
|
-
import { Text as
|
|
5
|
-
import { CollapseButton as
|
|
6
|
-
import { Sheet as
|
|
7
|
-
import { childrenToNodes as
|
|
8
|
-
import
|
|
9
|
-
import { TableOfContentsList as
|
|
10
|
-
import { useLabels as
|
|
11
|
-
const
|
|
12
|
-
const {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { jsxs as m, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import E from "../../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { useState as b, useEffect as x, useMemo as u } from "react";
|
|
4
|
+
import { Text as y } from "../../../../base/typography/text/text.es.js";
|
|
5
|
+
import { CollapseButton as S } from "../../../../buttons/collapse-button/collapse-button.es.js";
|
|
6
|
+
import { Sheet as q } from "../../../../overlays/sheet/sheet.es.js";
|
|
7
|
+
import { childrenToNodes as B, buildActiveTrail as I, TableOfContentsContext as P } from "../../table-of-contents.es.js";
|
|
8
|
+
import e from "../../table-of-contents.module.scss.es.js";
|
|
9
|
+
import { TableOfContentsList as V } from "../table-of-contents-list/table-of-contents-list.es.js";
|
|
10
|
+
import { useLabels as z } from "../../../../../providers/label-provider/use-labels.es.js";
|
|
11
|
+
const D = (k) => {
|
|
12
|
+
const {
|
|
13
|
+
children: h,
|
|
14
|
+
heading: p,
|
|
15
|
+
ariaLabel: A,
|
|
16
|
+
activeId: s,
|
|
17
|
+
numbered: v = !1,
|
|
18
|
+
bordered: H = !1,
|
|
19
|
+
defaultOpen: _ = !0,
|
|
20
|
+
sticky: d = !0,
|
|
21
|
+
hideOnScroll: g = !1,
|
|
22
|
+
className: Y
|
|
23
|
+
} = k, { getLabel: w } = z(), [o, a] = b(!1), [j, L] = b(!1), [i, F] = b(null);
|
|
24
|
+
x(() => {
|
|
25
|
+
if (!g || !d) {
|
|
26
|
+
L(!1);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
let l = window.scrollY, t = 0;
|
|
30
|
+
const O = () => {
|
|
31
|
+
t || (t = window.requestAnimationFrame(() => {
|
|
32
|
+
t = 0;
|
|
33
|
+
const f = window.scrollY, T = f - l;
|
|
34
|
+
Math.abs(T) > 4 && (L(T > 0 && f > 0), l = f);
|
|
35
|
+
}));
|
|
17
36
|
};
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
37
|
+
return window.addEventListener("scroll", O, { passive: !0 }), () => {
|
|
38
|
+
window.removeEventListener("scroll", O), t && window.cancelAnimationFrame(t);
|
|
39
|
+
};
|
|
40
|
+
}, [g, d]), x(() => {
|
|
41
|
+
if (!o || !i) return;
|
|
42
|
+
const l = (t) => {
|
|
43
|
+
t.target.closest("a, button") && a(!1);
|
|
44
|
+
};
|
|
45
|
+
return i.addEventListener("click", l), () => i.removeEventListener("click", l);
|
|
46
|
+
}, [o, i]);
|
|
47
|
+
const r = (p === void 0 ? w("table-of-contents.title") : p) ?? w("table-of-contents.title"), N = A || r, c = u(() => B(h), [h]), C = u(() => I(c, s), [c, s]), M = u(
|
|
48
|
+
() => ({ activeId: s, numbered: v, ariaLabel: N, activeTrail: C, defaultOpen: _ }),
|
|
49
|
+
[s, v, N, C, _]
|
|
23
50
|
);
|
|
24
|
-
return /* @__PURE__ */
|
|
25
|
-
/* @__PURE__ */
|
|
51
|
+
return /* @__PURE__ */ m(P.Provider, { value: M, children: [
|
|
52
|
+
/* @__PURE__ */ m(
|
|
26
53
|
"div",
|
|
27
54
|
{
|
|
28
|
-
className:
|
|
29
|
-
|
|
30
|
-
{
|
|
31
|
-
|
|
55
|
+
className: E(
|
|
56
|
+
e["tedi-table-of-contents__bar"],
|
|
57
|
+
{
|
|
58
|
+
[e["tedi-table-of-contents__bar--static"]]: !d,
|
|
59
|
+
[e["tedi-table-of-contents__bar--hidden"]]: j && !o
|
|
60
|
+
},
|
|
61
|
+
Y
|
|
32
62
|
),
|
|
33
63
|
children: [
|
|
34
|
-
/* @__PURE__ */
|
|
35
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ n(y, { modifiers: "bold", className: e["tedi-table-of-contents__bar-title"], children: r }),
|
|
65
|
+
/* @__PURE__ */ n(S, { open: o, onOpenChange: a, underline: !1, "aria-haspopup": "dialog" })
|
|
36
66
|
]
|
|
37
67
|
}
|
|
38
68
|
),
|
|
39
|
-
/* @__PURE__ */
|
|
40
|
-
|
|
69
|
+
/* @__PURE__ */ n(
|
|
70
|
+
q,
|
|
41
71
|
{
|
|
42
72
|
open: o,
|
|
43
73
|
onToggle: a,
|
|
44
|
-
ariaLabel:
|
|
45
|
-
className:
|
|
46
|
-
header: /* @__PURE__ */
|
|
47
|
-
/* @__PURE__ */
|
|
48
|
-
/* @__PURE__ */
|
|
74
|
+
ariaLabel: r,
|
|
75
|
+
className: e["tedi-table-of-contents__sheet"],
|
|
76
|
+
header: /* @__PURE__ */ m("div", { className: e["tedi-table-of-contents__sheet-header"], children: [
|
|
77
|
+
/* @__PURE__ */ n(y, { modifiers: "bold", className: e["tedi-table-of-contents__bar-title"], children: r }),
|
|
78
|
+
/* @__PURE__ */ n(S, { open: o, onOpenChange: a, underline: !1 })
|
|
49
79
|
] }),
|
|
50
|
-
children: /* @__PURE__ */
|
|
80
|
+
children: /* @__PURE__ */ n(
|
|
81
|
+
"div",
|
|
82
|
+
{
|
|
83
|
+
ref: F,
|
|
84
|
+
className: E(e["tedi-table-of-contents"], {
|
|
85
|
+
[e["tedi-table-of-contents--bordered"]]: H
|
|
86
|
+
}),
|
|
87
|
+
children: /* @__PURE__ */ n(V, { nodes: c, heading: null })
|
|
88
|
+
}
|
|
89
|
+
)
|
|
51
90
|
}
|
|
52
91
|
)
|
|
53
92
|
] });
|
|
54
93
|
};
|
|
55
|
-
|
|
94
|
+
D.displayName = "TableOfContentsCollapsible";
|
|
56
95
|
export {
|
|
57
|
-
|
|
96
|
+
D as TableOfContentsCollapsible
|
|
58
97
|
};
|
|
@@ -15,6 +15,12 @@ export interface TableOfContentsItemProps {
|
|
|
15
15
|
* Render a separator below the item.
|
|
16
16
|
*/
|
|
17
17
|
separator?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Trailing content shown at the end of the item's row (right-aligned) — e.g. a
|
|
20
|
+
* count `Tag` or `StatusBadge`. Kept out of the link so it isn't part of the
|
|
21
|
+
* link's accessible name.
|
|
22
|
+
*/
|
|
23
|
+
slot?: React.ReactNode;
|
|
18
24
|
}
|
|
19
25
|
export declare const TableOfContentsItem: {
|
|
20
26
|
(_props: TableOfContentsItemProps): JSX.Element | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),_=require("../../../../../../../external/classnames/index.cjs.js"),w=require("react"),R=require("../../../../misc/separator/separator.cjs.js"),$=require("../../table-of-contents.cjs.js"),e=require("../../table-of-contents.module.scss.cjs.js"),r=({node:m,depth:c,index:d,numberPrefix:a})=>{const{activeId:p,numbered:o,activeTrail:x,defaultOpen:j}=w.useContext($.TableOfContentsContext),{id:n,content:v,children:s,separator:h,slot:i}=m,C=!!(s!=null&&s.length),u=!!n&&n===p,O=C&&(j||!!n&&x.has(n)),N=Math.min(c,2),l=a?`${a}.${d+1}`:`${d+1}`,q=a?l:`${l}.`,T=o?"ol":"ul";return t.jsxs("li",{"aria-current":u?"true":void 0,className:_.default(e.default["tedi-table-of-contents__item"],{[e.default["tedi-table-of-contents__item--selected"]]:u}),children:[t.jsxs("div",{className:_.default(e.default["tedi-table-of-contents__row"],e.default[`tedi-table-of-contents__row--level-${N}`]),children:[o&&t.jsx("span",{className:e.default["tedi-table-of-contents__number"],"aria-hidden":"true",children:q}),t.jsx("span",{className:e.default["tedi-table-of-contents__content"],children:v}),i!==void 0&&t.jsx("div",{className:e.default["tedi-table-of-contents__slot"],children:i})]}),O&&t.jsx(T,{className:e.default["tedi-table-of-contents__group"],children:s.map((f,b)=>t.jsx(r,{node:f,depth:c+1,index:b,numberPrefix:o?l:void 0},f.id??b))}),h&&t.jsx(R.Separator,{className:e.default["tedi-table-of-contents__separator"]})]})};r.displayName="TableOfContentsRow";exports.TableOfContentsRow=r;
|
|
@@ -1,45 +1,40 @@
|
|
|
1
1
|
import { jsxs as p, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
3
|
-
import { useContext as
|
|
4
|
-
import { Separator as
|
|
5
|
-
import { TableOfContentsContext as
|
|
2
|
+
import _ from "../../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { useContext as j } from "react";
|
|
4
|
+
import { Separator as y } from "../../../../misc/separator/separator.es.js";
|
|
5
|
+
import { TableOfContentsContext as R } from "../../table-of-contents.es.js";
|
|
6
6
|
import t from "../../table-of-contents.module.scss.es.js";
|
|
7
|
-
const
|
|
8
|
-
const { activeId:
|
|
7
|
+
const b = ({ node: u, depth: r, index: i, numberPrefix: s }) => {
|
|
8
|
+
const { activeId: h, numbered: a, activeTrail: v, defaultOpen: N } = j(R), { id: o, content: C, children: n, separator: O, slot: c } = u, $ = !!(n != null && n.length), d = !!o && o === h, w = $ && (N || !!o && v.has(o)), T = Math.min(r, 2), l = s ? `${s}.${i + 1}` : `${i + 1}`, x = s ? l : `${l}.`, g = a ? "ol" : "ul";
|
|
9
9
|
return /* @__PURE__ */ p(
|
|
10
10
|
"li",
|
|
11
11
|
{
|
|
12
|
-
"aria-current":
|
|
13
|
-
className:
|
|
14
|
-
[t["tedi-table-of-contents__item--selected"]]:
|
|
12
|
+
"aria-current": d ? "true" : void 0,
|
|
13
|
+
className: _(t["tedi-table-of-contents__item"], {
|
|
14
|
+
[t["tedi-table-of-contents__item--selected"]]: d
|
|
15
15
|
}),
|
|
16
16
|
children: [
|
|
17
|
-
/* @__PURE__ */ p(
|
|
18
|
-
"span",
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
),
|
|
27
|
-
$ && /* @__PURE__ */ e(T, { className: t["tedi-table-of-contents__group"], children: n.map((m, d) => /* @__PURE__ */ e(
|
|
28
|
-
_,
|
|
17
|
+
/* @__PURE__ */ p("div", { className: _(t["tedi-table-of-contents__row"], t[`tedi-table-of-contents__row--level-${T}`]), children: [
|
|
18
|
+
a && /* @__PURE__ */ e("span", { className: t["tedi-table-of-contents__number"], "aria-hidden": "true", children: x }),
|
|
19
|
+
/* @__PURE__ */ e("span", { className: t["tedi-table-of-contents__content"], children: C }),
|
|
20
|
+
c !== void 0 && /* @__PURE__ */ e("div", { className: t["tedi-table-of-contents__slot"], children: c })
|
|
21
|
+
] }),
|
|
22
|
+
w && /* @__PURE__ */ e(g, { className: t["tedi-table-of-contents__group"], children: n.map((m, f) => /* @__PURE__ */ e(
|
|
23
|
+
b,
|
|
29
24
|
{
|
|
30
25
|
node: m,
|
|
31
|
-
depth:
|
|
32
|
-
index:
|
|
33
|
-
numberPrefix: a ?
|
|
26
|
+
depth: r + 1,
|
|
27
|
+
index: f,
|
|
28
|
+
numberPrefix: a ? l : void 0
|
|
34
29
|
},
|
|
35
|
-
m.id ??
|
|
30
|
+
m.id ?? f
|
|
36
31
|
)) }),
|
|
37
|
-
|
|
32
|
+
O && /* @__PURE__ */ e(y, { className: t["tedi-table-of-contents__separator"] })
|
|
38
33
|
]
|
|
39
34
|
}
|
|
40
35
|
);
|
|
41
36
|
};
|
|
42
|
-
|
|
37
|
+
b.displayName = "TableOfContentsRow";
|
|
43
38
|
export {
|
|
44
|
-
|
|
39
|
+
b as TableOfContentsRow
|
|
45
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),g=require("../../../../../external/classnames/index.cjs.js"),i=require("react"),P=require("../../misc/affix/affix.cjs.js"),S=require("./components/table-of-contents-collapsible/table-of-contents-collapsible.cjs.js"),j=require("./components/table-of-contents-item/table-of-contents-item.cjs.js"),B=require("./components/table-of-contents-list/table-of-contents-list.cjs.js"),f=require("./table-of-contents.module.scss.cjs.js"),M=require("../../../providers/label-provider/use-labels.cjs.js"),w=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),E=require("../../content/card/card.cjs.js"),R=require("../../content/card/card-content/card-content.cjs.js"),y=i.createContext({activeTrail:new Set}),m=t=>i.isValidElement(t)&&t.type===j.TableOfContentsItem,h=t=>i.Children.toArray(t).filter(m).map(l=>{const{id:o,separator:a,slot:c,children:s}=l.props,e=i.Children.toArray(s),n=e.filter(m),d=e.filter(u=>!m(u));return{id:o,separator:a,slot:c,content:r.jsx(r.Fragment,{children:d}),children:n.length?h(s):void 0}}),k=(t,l)=>{const o=new Set;if(!l)return o;const a=(c,s)=>{for(const e of c){const n=e.id?[...s,e.id]:s;if(e.id===l||e.children&&a(e.children,n))return n.forEach(d=>o.add(d)),!0}return!1};return a(t,[]),o};function b(t){const{getLabel:l}=M.useLabels(),{getCurrentBreakpointProps:o}=w.useBreakpointProps(t.defaultServerBreakpoint),{children:a,heading:c,headingLevel:s="h3",ariaLabel:e,activeId:n,defaultOpen:d=!0,numbered:u=!1,sticky:p=!0,variant:x="default",bordered:N=!1,className:L}=o(t),A=c===void 0?l("table-of-contents.title"):c,C=i.useMemo(()=>h(a),[a]),T=i.useMemo(()=>k(C,n),[C,n]),I=i.useMemo(()=>({activeId:n,numbered:u,headingLevel:s,ariaLabel:e,activeTrail:T,defaultOpen:d}),[n,u,s,e,T,d]),v=r.jsx("div",{className:g.default(f.default["tedi-table-of-contents"],{[f.default["tedi-table-of-contents--transparent"]]:x==="transparent",[f.default["tedi-table-of-contents--bordered"]]:N}),children:r.jsx(B.TableOfContentsList,{nodes:C,heading:A})}),O=g.default({[f.default["tedi-table-of-contents--sticky"]]:p},L),q=x==="transparent"?r.jsx("div",{className:O,children:v}):r.jsx(E.Card,{className:O,children:r.jsx(R.CardContent,{padding:0,children:v})});return r.jsx(y.Provider,{value:I,children:p?r.jsx(P.Affix,{position:"sticky",top:1.5,bottom:1.5,children:q}):q})}b.displayName="TableOfContents";b.Item=j.TableOfContentsItem;b.Collapsible=S.TableOfContentsCollapsible;exports.TableOfContents=b;exports.TableOfContentsContext=y;exports.buildActiveTrail=k;exports.childrenToNodes=h;
|
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
+
import { BreakpointSupport } from '../../../helpers';
|
|
2
3
|
import { TableOfContentsItemProps } from './components/table-of-contents-item/table-of-contents-item';
|
|
3
|
-
/** Semantic level of the `TableOfContents` heading element. */
|
|
4
4
|
export type TableOfContentsHeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
5
|
-
|
|
5
|
+
type TableOfContentsBreakpointProps = {
|
|
6
|
+
/**
|
|
7
|
+
* Visual variant:
|
|
8
|
+
* - `default` — rendered inside a bordered `Card`.
|
|
9
|
+
* - `transparent` — no card chrome (border / background); the list sits
|
|
10
|
+
* directly on the page, with a continuous grey left rail (the active item's
|
|
11
|
+
* segment turns blue).
|
|
12
|
+
* @default default
|
|
13
|
+
*/
|
|
14
|
+
variant?: 'default' | 'transparent';
|
|
15
|
+
/**
|
|
16
|
+
* Stick the card to the viewport while scrolling.
|
|
17
|
+
* @default true
|
|
18
|
+
*/
|
|
19
|
+
sticky?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export interface TableOfContentsProps extends BreakpointSupport<TableOfContentsBreakpointProps> {
|
|
6
22
|
/**
|
|
7
23
|
* `TableOfContents.Item` elements. An item's non-`Item` children are its
|
|
8
24
|
* link / label; nested `TableOfContents.Item` children become its sub-items.
|
|
@@ -28,36 +44,29 @@ export interface TableOfContentsProps {
|
|
|
28
44
|
*/
|
|
29
45
|
ariaLabel?: string;
|
|
30
46
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* directly on the page, with a continuous grey left rail (the active item's
|
|
35
|
-
* segment turns blue).
|
|
36
|
-
* @default default
|
|
47
|
+
* Id of the currently active item. The active item gets the left accent bar
|
|
48
|
+
* and active link colour. When `defaultOpen` is `false`, the branch leading
|
|
49
|
+
* to it is the only one kept expanded.
|
|
37
50
|
*/
|
|
38
|
-
|
|
51
|
+
activeId?: string;
|
|
39
52
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
53
|
+
* Draws a divider between items so the list reads as a set of separated rows. The last item has no
|
|
54
|
+
* divider — the card border closes the list.
|
|
55
|
+
* @default false
|
|
42
56
|
*/
|
|
43
|
-
|
|
57
|
+
bordered?: boolean;
|
|
44
58
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
59
|
+
* Whether every item's sub-items are expanded by default. Set `false` to make the list behave like
|
|
60
|
+
* an accordion: only the branch leading to `activeId` keeps its nested children visible.
|
|
61
|
+
* @default true
|
|
48
62
|
*/
|
|
49
|
-
|
|
63
|
+
defaultOpen?: boolean;
|
|
50
64
|
/**
|
|
51
65
|
* Render the list as an ordered list with auto-generated hierarchical numbers
|
|
52
66
|
* (`1.`, `2.`, `2.1`, …) shown before each item.
|
|
53
67
|
* @default false
|
|
54
68
|
*/
|
|
55
69
|
numbered?: boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Stick the card to the viewport while scrolling.
|
|
58
|
-
* @default true
|
|
59
|
-
*/
|
|
60
|
-
sticky?: boolean;
|
|
61
70
|
/**
|
|
62
71
|
* Additional class name on the root element.
|
|
63
72
|
*/
|
|
@@ -69,6 +78,7 @@ export interface TableOfContentsNode {
|
|
|
69
78
|
content: ReactNode;
|
|
70
79
|
children?: TableOfContentsNode[];
|
|
71
80
|
separator?: boolean;
|
|
81
|
+
slot?: ReactNode;
|
|
72
82
|
}
|
|
73
83
|
interface TableOfContentsContextValue {
|
|
74
84
|
activeId?: string;
|
|
@@ -76,6 +86,7 @@ interface TableOfContentsContextValue {
|
|
|
76
86
|
headingLevel?: TableOfContentsHeadingLevel;
|
|
77
87
|
ariaLabel?: string;
|
|
78
88
|
activeTrail: Set<string>;
|
|
89
|
+
defaultOpen?: boolean;
|
|
79
90
|
}
|
|
80
91
|
export declare const TableOfContentsContext: import('react').Context<TableOfContentsContextValue>;
|
|
81
92
|
export declare const childrenToNodes: (children: ReactNode) => TableOfContentsNode[];
|
|
@@ -1,70 +1,73 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import
|
|
3
|
-
import { useMemo as
|
|
4
|
-
import { Affix as
|
|
5
|
-
import { TableOfContentsCollapsible as
|
|
6
|
-
import { TableOfContentsItem as
|
|
7
|
-
import { TableOfContentsList as
|
|
8
|
-
import
|
|
9
|
-
import { useLabels as
|
|
1
|
+
import { jsx as o, Fragment as B } from "react/jsx-runtime";
|
|
2
|
+
import N from "../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { useMemo as p, createContext as E, Children as k, isValidElement as P } from "react";
|
|
4
|
+
import { Affix as S } from "../../misc/affix/affix.es.js";
|
|
5
|
+
import { TableOfContentsCollapsible as V } from "./components/table-of-contents-collapsible/table-of-contents-collapsible.es.js";
|
|
6
|
+
import { TableOfContentsItem as O } from "./components/table-of-contents-item/table-of-contents-item.es.js";
|
|
7
|
+
import { TableOfContentsList as j } from "./components/table-of-contents-list/table-of-contents-list.es.js";
|
|
8
|
+
import m from "./table-of-contents.module.scss.es.js";
|
|
9
|
+
import { useLabels as F } from "../../../providers/label-provider/use-labels.es.js";
|
|
10
|
+
import { useBreakpointProps as H } from "../../../helpers/hooks/use-breakpoint-props.es.js";
|
|
10
11
|
import { Card as M } from "../../content/card/card.es.js";
|
|
11
|
-
import { CardContent as
|
|
12
|
-
const
|
|
12
|
+
import { CardContent as q } from "../../content/card/card-content/card-content.es.js";
|
|
13
|
+
const z = E({
|
|
13
14
|
activeTrail: /* @__PURE__ */ new Set()
|
|
14
|
-
}),
|
|
15
|
-
const { id:
|
|
15
|
+
}), u = (e) => P(e) && e.type === O, x = (e) => k.toArray(e).filter(u).map((a) => {
|
|
16
|
+
const { id: i, separator: s, slot: l, children: r } = a.props, t = k.toArray(r), n = t.filter(u), c = t.filter((d) => !u(d));
|
|
16
17
|
return {
|
|
17
|
-
id:
|
|
18
|
-
separator:
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
id: i,
|
|
19
|
+
separator: s,
|
|
20
|
+
slot: l,
|
|
21
|
+
content: /* @__PURE__ */ o(B, { children: c }),
|
|
22
|
+
children: n.length ? x(r) : void 0
|
|
21
23
|
};
|
|
22
|
-
}),
|
|
23
|
-
const
|
|
24
|
-
if (!
|
|
25
|
-
const
|
|
26
|
-
for (const t of
|
|
27
|
-
const
|
|
28
|
-
if (t.id ===
|
|
29
|
-
return
|
|
24
|
+
}), D = (e, a) => {
|
|
25
|
+
const i = /* @__PURE__ */ new Set();
|
|
26
|
+
if (!a) return i;
|
|
27
|
+
const s = (l, r) => {
|
|
28
|
+
for (const t of l) {
|
|
29
|
+
const n = t.id ? [...r, t.id] : r;
|
|
30
|
+
if (t.id === a || t.children && s(t.children, n))
|
|
31
|
+
return n.forEach((c) => i.add(c)), !0;
|
|
30
32
|
}
|
|
31
33
|
return !1;
|
|
32
34
|
};
|
|
33
|
-
return
|
|
35
|
+
return s(e, []), i;
|
|
34
36
|
};
|
|
35
|
-
function
|
|
36
|
-
const { getLabel:
|
|
37
|
-
children:
|
|
38
|
-
heading:
|
|
39
|
-
headingLevel:
|
|
40
|
-
ariaLabel:
|
|
41
|
-
activeId:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
37
|
+
function b(e) {
|
|
38
|
+
const { getLabel: a } = F(), { getCurrentBreakpointProps: i } = H(e.defaultServerBreakpoint), {
|
|
39
|
+
children: s,
|
|
40
|
+
heading: l,
|
|
41
|
+
headingLevel: r = "h3",
|
|
42
|
+
ariaLabel: t,
|
|
43
|
+
activeId: n,
|
|
44
|
+
defaultOpen: c = !0,
|
|
45
|
+
numbered: d = !1,
|
|
46
|
+
sticky: h = !0,
|
|
47
|
+
variant: C = "default",
|
|
48
|
+
bordered: A = !1,
|
|
49
|
+
className: L
|
|
50
|
+
} = i(e), I = l === void 0 ? a("table-of-contents.title") : l, f = p(() => x(s), [s]), v = p(() => D(f, n), [f, n]), w = p(
|
|
51
|
+
() => ({ activeId: n, numbered: d, headingLevel: r, ariaLabel: t, activeTrail: v, defaultOpen: c }),
|
|
52
|
+
[n, d, r, t, v, c]
|
|
53
|
+
), T = /* @__PURE__ */ o(
|
|
51
54
|
"div",
|
|
52
55
|
{
|
|
53
|
-
className:
|
|
54
|
-
[
|
|
56
|
+
className: N(m["tedi-table-of-contents"], {
|
|
57
|
+
[m["tedi-table-of-contents--transparent"]]: C === "transparent",
|
|
58
|
+
[m["tedi-table-of-contents--bordered"]]: A
|
|
55
59
|
}),
|
|
56
|
-
|
|
57
|
-
children: /* @__PURE__ */ r(F, { nodes: d, heading: L })
|
|
60
|
+
children: /* @__PURE__ */ o(j, { nodes: f, heading: I })
|
|
58
61
|
}
|
|
59
|
-
),
|
|
60
|
-
return /* @__PURE__ */
|
|
62
|
+
), g = N({ [m["tedi-table-of-contents--sticky"]]: h }, L), y = C === "transparent" ? /* @__PURE__ */ o("div", { className: g, children: T }) : /* @__PURE__ */ o(M, { className: g, children: /* @__PURE__ */ o(q, { padding: 0, children: T }) });
|
|
63
|
+
return /* @__PURE__ */ o(z.Provider, { value: w, children: h ? /* @__PURE__ */ o(S, { position: "sticky", top: 1.5, bottom: 1.5, children: y }) : y });
|
|
61
64
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
b.displayName = "TableOfContents";
|
|
66
|
+
b.Item = O;
|
|
67
|
+
b.Collapsible = V;
|
|
65
68
|
export {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
b as TableOfContents,
|
|
70
|
+
z as TableOfContentsContext,
|
|
71
|
+
D as buildActiveTrail,
|
|
72
|
+
x as childrenToNodes
|
|
70
73
|
};
|
package/src/tedi/components/navigation/table-of-contents/table-of-contents.module.scss.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={"tedi-table-of-contents":"tedi-table-of-contents-ce55e86d","tedi-table-of-contents--transparent":"tedi-table-of-contents--transparent-067ea2c2","tedi-table-of-contents__list":"tedi-table-of-contents__list-94025876","tedi-table-of-contents--sticky":"tedi-table-of-contents--sticky-1ee87047","tedi-table-of-contents__heading":"tedi-table-of-contents__heading-c6b7a6df","tedi-table-of-contents__group":"tedi-table-of-contents__group-590e4963","tedi-table-of-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={"tedi-table-of-contents":"tedi-table-of-contents-ce55e86d","tedi-table-of-contents--bordered":"tedi-table-of-contents--bordered-90b16d0b","tedi-table-of-contents--transparent":"tedi-table-of-contents--transparent-067ea2c2","tedi-table-of-contents__list":"tedi-table-of-contents__list-94025876","tedi-table-of-contents--sticky":"tedi-table-of-contents--sticky-1ee87047","tedi-table-of-contents__heading":"tedi-table-of-contents__heading-c6b7a6df","tedi-table-of-contents__group":"tedi-table-of-contents__group-590e4963","tedi-table-of-contents__item":"tedi-table-of-contents__item-29f072b5","tedi-table-of-contents__row":"tedi-table-of-contents__row-fb686650","tedi-table-of-contents__row--level-2":"tedi-table-of-contents__row--level-2-4fec675b","tedi-table-of-contents__number":"tedi-table-of-contents__number-693b03b7","tedi-table-of-contents__content":"tedi-table-of-contents__content-8a05ad59","tedi-table-of-contents__slot":"tedi-table-of-contents__slot-53aefc57","tedi-table-of-contents__item--selected":"tedi-table-of-contents__item--selected-632958d1","tedi-table-of-contents__separator":"tedi-table-of-contents__separator-b824eeee","tedi-table-of-contents__bar":"tedi-table-of-contents__bar-f4daef0b","tedi-table-of-contents__bar--static":"tedi-table-of-contents__bar--static-f919cf73","tedi-table-of-contents__bar--hidden":"tedi-table-of-contents__bar--hidden-53dd04a2","tedi-table-of-contents__bar-title":"tedi-table-of-contents__bar-title-b82ab4ed","tedi-table-of-contents__sheet":"tedi-table-of-contents__sheet-16e41b54","tedi-table-of-contents__sheet-header":"tedi-table-of-contents__sheet-header-ec904c54"};exports.default=t;
|