@salt-ds/core 1.62.0 → 1.63.0
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/CHANGELOG.md +18 -0
- package/css/salt-core.css +160 -1
- package/dist-cjs/index.js +8 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/tree/Tree.css.js +6 -0
- package/dist-cjs/tree/Tree.css.js.map +1 -0
- package/dist-cjs/tree/Tree.js +308 -0
- package/dist-cjs/tree/Tree.js.map +1 -0
- package/dist-cjs/tree/TreeContext.js +37 -0
- package/dist-cjs/tree/TreeContext.js.map +1 -0
- package/dist-cjs/tree/TreeNode.css.js +6 -0
- package/dist-cjs/tree/TreeNode.css.js.map +1 -0
- package/dist-cjs/tree/TreeNode.js +109 -0
- package/dist-cjs/tree/TreeNode.js.map +1 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +6 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js.map +1 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.js +67 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.js.map +1 -0
- package/dist-cjs/tree/TreeNodeLabel.css.js +6 -0
- package/dist-cjs/tree/TreeNodeLabel.css.js.map +1 -0
- package/dist-cjs/tree/TreeNodeLabel.js +30 -0
- package/dist-cjs/tree/TreeNodeLabel.js.map +1 -0
- package/dist-cjs/tree/TreeNodeTrigger.css.js +6 -0
- package/dist-cjs/tree/TreeNodeTrigger.css.js.map +1 -0
- package/dist-cjs/tree/TreeNodeTrigger.js +161 -0
- package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -0
- package/dist-cjs/tree/treeModel.js +61 -0
- package/dist-cjs/tree/treeModel.js.map +1 -0
- package/dist-cjs/tree/useTree.js +343 -0
- package/dist-cjs/tree/useTree.js.map +1 -0
- package/dist-es/index.js +4 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/tree/Tree.css.js +4 -0
- package/dist-es/tree/Tree.css.js.map +1 -0
- package/dist-es/tree/Tree.js +306 -0
- package/dist-es/tree/Tree.js.map +1 -0
- package/dist-es/tree/TreeContext.js +32 -0
- package/dist-es/tree/TreeContext.js.map +1 -0
- package/dist-es/tree/TreeNode.css.js +4 -0
- package/dist-es/tree/TreeNode.css.js.map +1 -0
- package/dist-es/tree/TreeNode.js +107 -0
- package/dist-es/tree/TreeNode.js.map +1 -0
- package/dist-es/tree/TreeNodeExpansionIcon.css.js +4 -0
- package/dist-es/tree/TreeNodeExpansionIcon.css.js.map +1 -0
- package/dist-es/tree/TreeNodeExpansionIcon.js +65 -0
- package/dist-es/tree/TreeNodeExpansionIcon.js.map +1 -0
- package/dist-es/tree/TreeNodeLabel.css.js +4 -0
- package/dist-es/tree/TreeNodeLabel.css.js.map +1 -0
- package/dist-es/tree/TreeNodeLabel.js +28 -0
- package/dist-es/tree/TreeNodeLabel.js.map +1 -0
- package/dist-es/tree/TreeNodeTrigger.css.js +4 -0
- package/dist-es/tree/TreeNodeTrigger.css.js.map +1 -0
- package/dist-es/tree/TreeNodeTrigger.js +159 -0
- package/dist-es/tree/TreeNodeTrigger.js.map +1 -0
- package/dist-es/tree/treeModel.js +57 -0
- package/dist-es/tree/treeModel.js.map +1 -0
- package/dist-es/tree/useTree.js +341 -0
- package/dist-es/tree/useTree.js.map +1 -0
- package/dist-types/index.d.ts +1 -0
- package/dist-types/tree/Tree.d.ts +36 -0
- package/dist-types/tree/TreeContext.d.ts +77 -0
- package/dist-types/tree/TreeNode.d.ts +25 -0
- package/dist-types/tree/TreeNodeExpansionIcon.d.ts +4 -0
- package/dist-types/tree/TreeNodeLabel.d.ts +4 -0
- package/dist-types/tree/TreeNodeTrigger.d.ts +8 -0
- package/dist-types/tree/index.d.ts +4 -0
- package/dist-types/tree/treeModel.d.ts +24 -0
- package/dist-types/tree/useTree.d.ts +68 -0
- package/package.json +1 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
8
|
+
require('clsx');
|
|
9
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
10
|
+
var useForkRef = require('../utils/useForkRef.js');
|
|
11
|
+
var useId = require('../utils/useId.js');
|
|
12
|
+
require('../salt-provider/SaltProvider.js');
|
|
13
|
+
require('../viewport/ViewportProvider.js');
|
|
14
|
+
var TreeContext = require('./TreeContext.js');
|
|
15
|
+
var TreeNode$1 = require('./TreeNode.css.js');
|
|
16
|
+
var TreeNodeLabel = require('./TreeNodeLabel.js');
|
|
17
|
+
var TreeNodeTrigger = require('./TreeNodeTrigger.js');
|
|
18
|
+
var treeModel = require('./treeModel.js');
|
|
19
|
+
|
|
20
|
+
const withBaseName = makePrefixer.makePrefixer("saltTreeNode");
|
|
21
|
+
function separateChildren(children) {
|
|
22
|
+
const contentChildren = [];
|
|
23
|
+
const nodeChildren = [];
|
|
24
|
+
for (const child of treeModel.flattenTreeNodeChildren(children)) {
|
|
25
|
+
if (treeModel.isTreeNodeElement(child)) {
|
|
26
|
+
nodeChildren.push(child);
|
|
27
|
+
} else {
|
|
28
|
+
contentChildren.push(child);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { contentChildren, nodeChildren };
|
|
32
|
+
}
|
|
33
|
+
const TreeNode = React.forwardRef(
|
|
34
|
+
function TreeNode2(props, ref) {
|
|
35
|
+
const {
|
|
36
|
+
value,
|
|
37
|
+
label,
|
|
38
|
+
icon: Icon,
|
|
39
|
+
disabled: disabledProp,
|
|
40
|
+
children
|
|
41
|
+
} = props;
|
|
42
|
+
const targetWindow = window.useWindow();
|
|
43
|
+
styles.useComponentCssInjection({
|
|
44
|
+
testId: "salt-tree-node",
|
|
45
|
+
css: TreeNode$1,
|
|
46
|
+
window: targetWindow
|
|
47
|
+
});
|
|
48
|
+
const id = useId.useIdMemo();
|
|
49
|
+
const {
|
|
50
|
+
expandedState,
|
|
51
|
+
selectedSet,
|
|
52
|
+
disabled: treeDisabled,
|
|
53
|
+
disabledIdsSet,
|
|
54
|
+
indeterminateState
|
|
55
|
+
} = TreeContext.useTreeContext();
|
|
56
|
+
const parentContext = TreeContext.useTreeNodeContext();
|
|
57
|
+
const level = ((parentContext == null ? void 0 : parentContext.level) ?? 0) + 1;
|
|
58
|
+
const disabled = treeDisabled || (parentContext == null ? void 0 : parentContext.disabled) || disabledProp || disabledIdsSet.has(value);
|
|
59
|
+
const expanded = expandedState.has(value);
|
|
60
|
+
const selected = selectedSet.has(value);
|
|
61
|
+
const indeterminate = indeterminateState.has(value);
|
|
62
|
+
const usesLabelProp = label !== void 0;
|
|
63
|
+
const { contentChildren, nodeChildren } = React.useMemo(
|
|
64
|
+
() => usesLabelProp ? {
|
|
65
|
+
contentChildren: [],
|
|
66
|
+
nodeChildren: treeModel.flattenTreeNodeChildren(children)
|
|
67
|
+
} : separateChildren(children),
|
|
68
|
+
[children, usesLabelProp]
|
|
69
|
+
);
|
|
70
|
+
const hasChildren = nodeChildren.some(treeModel.isTreeNodeElement);
|
|
71
|
+
const nodeRef = React.useRef(null);
|
|
72
|
+
const setNodeRef = useForkRef.useForkRef(nodeRef, ref);
|
|
73
|
+
const nodeContext = React.useMemo(
|
|
74
|
+
() => ({
|
|
75
|
+
value,
|
|
76
|
+
level,
|
|
77
|
+
hasChildren,
|
|
78
|
+
expanded,
|
|
79
|
+
disabled,
|
|
80
|
+
id,
|
|
81
|
+
nodeRef,
|
|
82
|
+
setNodeRef,
|
|
83
|
+
selected,
|
|
84
|
+
indeterminate,
|
|
85
|
+
nodeChildren
|
|
86
|
+
}),
|
|
87
|
+
[
|
|
88
|
+
value,
|
|
89
|
+
level,
|
|
90
|
+
hasChildren,
|
|
91
|
+
expanded,
|
|
92
|
+
disabled,
|
|
93
|
+
id,
|
|
94
|
+
setNodeRef,
|
|
95
|
+
selected,
|
|
96
|
+
indeterminate,
|
|
97
|
+
nodeChildren
|
|
98
|
+
]
|
|
99
|
+
);
|
|
100
|
+
const defaultContent = usesLabelProp ? /* @__PURE__ */ jsxRuntime.jsxs(TreeNodeTrigger.TreeNodeTrigger, { children: [
|
|
101
|
+
Icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: withBaseName("icon"), children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": true }) }) : null,
|
|
102
|
+
/* @__PURE__ */ jsxRuntime.jsx(TreeNodeLabel.TreeNodeLabel, { children: label })
|
|
103
|
+
] }) : null;
|
|
104
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TreeContext.TreeNodeProvider, { value: nodeContext, children: usesLabelProp ? defaultContent : contentChildren });
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
exports.TreeNode = TreeNode;
|
|
109
|
+
//# sourceMappingURL=TreeNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNode.js","sources":["../src/tree/TreeNode.tsx"],"sourcesContent":["import type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n type ComponentType,\n forwardRef,\n type ReactNode,\n useMemo,\n useRef,\n} from \"react\";\nimport { makePrefixer, useForkRef, useIdMemo } from \"../utils\";\nimport {\n TreeNodeProvider,\n useTreeContext,\n useTreeNodeContext,\n} from \"./TreeContext\";\nimport treeNodeCss from \"./TreeNode.css\";\nimport { TreeNodeLabel } from \"./TreeNodeLabel\";\nimport { TreeNodeTrigger } from \"./TreeNodeTrigger\";\nimport { flattenTreeNodeChildren, isTreeNodeElement } from \"./treeModel\";\n\nexport interface TreeNodeProps {\n /**\n * Unique value representing this node within the tree\n */\n value: string;\n /**\n * Label for the node. When provided, TreeNode automatically renders a TreeNodeTrigger.\n */\n label?: ReactNode;\n /**\n * Optional icon to display before the label\n */\n icon?: ComponentType<IconProps>;\n /**\n * Whether the node is disabled.\n */\n disabled?: boolean;\n /**\n * Child nodes or content.\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltTreeNode\");\n\n// Need to take another look at this because its slightly brittle - alternative could be:\n// TreeNode having a 'content' prop that takes <TreeNodeTrigger> etc. and then `children` is reserved for other <TreeNode>'s\n// or a 'render' prop if we want to pass any state down. Simplifies it massively because then its clear children is for sub trees.\nfunction separateChildren(children: ReactNode): {\n contentChildren: ReactNode[];\n nodeChildren: ReactNode[];\n} {\n const contentChildren: ReactNode[] = [];\n const nodeChildren: ReactNode[] = [];\n\n for (const child of flattenTreeNodeChildren(children)) {\n if (isTreeNodeElement(child)) {\n nodeChildren.push(child);\n } else {\n contentChildren.push(child);\n }\n }\n\n return { contentChildren, nodeChildren };\n}\n\nexport const TreeNode = forwardRef<HTMLLIElement, TreeNodeProps>(\n function TreeNode(props, ref) {\n const {\n value,\n label,\n icon: Icon,\n disabled: disabledProp,\n children,\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node\",\n css: treeNodeCss,\n window: targetWindow,\n });\n\n const id = useIdMemo();\n\n const {\n expandedState,\n selectedSet,\n disabled: treeDisabled,\n disabledIdsSet,\n indeterminateState,\n } = useTreeContext();\n\n const parentContext = useTreeNodeContext();\n const level = (parentContext?.level ?? 0) + 1;\n\n const disabled =\n treeDisabled ||\n parentContext?.disabled ||\n disabledProp ||\n disabledIdsSet.has(value);\n const expanded = expandedState.has(value);\n const selected = selectedSet.has(value);\n const indeterminate = indeterminateState.has(value);\n\n const usesLabelProp = label !== undefined;\n const { contentChildren, nodeChildren } = useMemo(\n () =>\n usesLabelProp\n ? {\n contentChildren: [],\n nodeChildren: flattenTreeNodeChildren(children),\n }\n : separateChildren(children),\n [children, usesLabelProp],\n );\n\n const hasChildren = nodeChildren.some(isTreeNodeElement);\n\n const nodeRef = useRef<HTMLLIElement>(null);\n const setNodeRef = useForkRef(nodeRef, ref);\n\n const nodeContext = useMemo(\n () => ({\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n nodeRef,\n setNodeRef,\n selected,\n indeterminate,\n nodeChildren,\n }),\n [\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n setNodeRef,\n selected,\n indeterminate,\n nodeChildren,\n ],\n );\n\n const defaultContent = usesLabelProp ? (\n <TreeNodeTrigger>\n {Icon ? (\n <span className={withBaseName(\"icon\")}>\n <Icon aria-hidden />\n </span>\n ) : null}\n <TreeNodeLabel>{label}</TreeNodeLabel>\n </TreeNodeTrigger>\n ) : null;\n\n return (\n <TreeNodeProvider value={nodeContext}>\n {usesLabelProp ? defaultContent : contentChildren}\n </TreeNodeProvider>\n );\n },\n);\n"],"names":["makePrefixer","flattenTreeNodeChildren","isTreeNodeElement","forwardRef","TreeNode","useWindow","useComponentCssInjection","treeNodeCss","useIdMemo","useTreeContext","useTreeNodeContext","useMemo","useRef","useForkRef","jsxs","TreeNodeTrigger","jsx","TreeNodeLabel","TreeNodeProvider"],"mappings":";;;;;;;;;;;;;;;;;;;AA4CA,MAAM,YAAA,GAAeA,0BAAa,cAAc,CAAA;AAKhD,SAAS,iBAAiB,QAAA,EAGxB;AACA,EAAA,MAAM,kBAA+B,EAAC;AACtC,EAAA,MAAM,eAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,KAAA,IAASC,iCAAA,CAAwB,QAAQ,CAAA,EAAG;AACrD,IAAA,IAAIC,2BAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,iBAAiB,YAAA,EAAa;AACzC;AAEO,MAAM,QAAA,GAAWC,gBAAA;AAAA,EACtB,SAASC,SAAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU,YAAA;AAAA,MACV;AAAA,KACF,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,gBAAA;AAAA,MACR,GAAA,EAAKC,UAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,KAAKC,eAAA,EAAU;AAErB,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,cAAA;AAAA,MACA;AAAA,QACEC,0BAAA,EAAe;AAEnB,IAAA,MAAM,gBAAgBC,8BAAA,EAAmB;AACzC,IAAA,MAAM,KAAA,GAAA,CAAA,CAAS,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,KAAA,KAAS,CAAA,IAAK,CAAA;AAE5C,IAAA,MAAM,WACJ,YAAA,KACA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,aACf,YAAA,IACA,cAAA,CAAe,IAAI,KAAK,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAElD,IAAA,MAAM,gBAAgB,KAAA,KAAU,MAAA;AAChC,IAAA,MAAM,EAAE,eAAA,EAAiB,YAAA,EAAa,GAAIC,aAAA;AAAA,MACxC,MACE,aAAA,GACI;AAAA,QACE,iBAAiB,EAAC;AAAA,QAClB,YAAA,EAAcV,kCAAwB,QAAQ;AAAA,OAChD,GACA,iBAAiB,QAAQ,CAAA;AAAA,MAC/B,CAAC,UAAU,aAAa;AAAA,KAC1B;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAKC,2BAAiB,CAAA;AAEvD,IAAA,MAAM,OAAA,GAAUU,aAAsB,IAAI,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAaC,qBAAA,CAAW,OAAA,EAAS,GAAG,CAAA;AAE1C,IAAA,MAAM,WAAA,GAAcF,aAAA;AAAA,MAClB,OAAO;AAAA,QACL,KAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA;AAAA,QACE,KAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,cAAA,GAAiB,aAAA,mBACrBG,eAAA,CAACC,+BAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,IAAA,mBACCC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,MAAM,CAAA,EAClC,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EACpB,CAAA,GACE,IAAA;AAAA,sBACJA,cAAA,CAACC,+BAAe,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACxB,CAAA,GACE,IAAA;AAEJ,IAAA,sCACGC,4BAAA,EAAA,EAAiB,KAAA,EAAO,WAAA,EACtB,QAAA,EAAA,aAAA,GAAgB,iBAAiB,eAAA,EACpC,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltTreeNodeExpansionIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--saltTreeNodeTrigger-iconSize);\n min-width: var(--saltTreeNodeTrigger-iconSize);\n height: var(--saltTreeNodeTrigger-iconSize);\n flex-shrink: 0;\n position: relative;\n}\n\n.saltTreeNodeExpansionIcon-icon {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeExpansionIcon::before {\n content: \"\";\n display: block;\n position: absolute;\n width: var(--salt-size-base);\n height: var(--salt-size-base);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=TreeNodeExpansionIcon.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeExpansionIcon.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var SemanticIconProvider = require('../semantic-icon-provider/SemanticIconProvider.js');
|
|
9
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
10
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
11
|
+
require('../utils/useId.js');
|
|
12
|
+
require('../salt-provider/SaltProvider.js');
|
|
13
|
+
require('../viewport/ViewportProvider.js');
|
|
14
|
+
var TreeContext = require('./TreeContext.js');
|
|
15
|
+
var TreeNodeExpansionIcon$1 = require('./TreeNodeExpansionIcon.css.js');
|
|
16
|
+
|
|
17
|
+
const withBaseName = makePrefixer.makePrefixer("saltTreeNodeExpansionIcon");
|
|
18
|
+
const TreeNodeExpansionIcon = React.forwardRef(function TreeNodeExpansionIcon2(props, ref) {
|
|
19
|
+
const { className, onClick, ...rest } = props;
|
|
20
|
+
const targetWindow = window.useWindow();
|
|
21
|
+
styles.useComponentCssInjection({
|
|
22
|
+
testId: "salt-tree-node-expansion-icon",
|
|
23
|
+
css: TreeNodeExpansionIcon$1,
|
|
24
|
+
window: targetWindow
|
|
25
|
+
});
|
|
26
|
+
const nodeContext = TreeContext.useTreeNodeContext();
|
|
27
|
+
if (!nodeContext) {
|
|
28
|
+
throw new Error("TreeNodeExpansionIcon must be used within a TreeNode");
|
|
29
|
+
}
|
|
30
|
+
const { value, hasChildren, expanded, disabled } = nodeContext;
|
|
31
|
+
const { toggleExpanded } = TreeContext.useTreeContext();
|
|
32
|
+
const { ExpandGroupIcon, CollapseGroupIcon } = SemanticIconProvider.useIcon();
|
|
33
|
+
const handleClick = (event) => {
|
|
34
|
+
onClick == null ? void 0 : onClick(event);
|
|
35
|
+
if (disabled || !hasChildren) return;
|
|
36
|
+
toggleExpanded(event, value);
|
|
37
|
+
};
|
|
38
|
+
if (!hasChildren) {
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
40
|
+
"span",
|
|
41
|
+
{
|
|
42
|
+
ref,
|
|
43
|
+
className: clsx.clsx(withBaseName(), withBaseName("placeholder"), className),
|
|
44
|
+
"aria-hidden": true,
|
|
45
|
+
...rest
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
const Icon = expanded ? CollapseGroupIcon : ExpandGroupIcon;
|
|
50
|
+
return (
|
|
51
|
+
// biome-ignore lint/a11y/useKeyWithClickEvents: keyboard handled at tree level, same as W3C
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
"span",
|
|
54
|
+
{
|
|
55
|
+
ref,
|
|
56
|
+
className: clsx.clsx(withBaseName(), className),
|
|
57
|
+
onClick: handleClick,
|
|
58
|
+
"aria-hidden": true,
|
|
59
|
+
...rest,
|
|
60
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: withBaseName("icon") })
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
exports.TreeNodeExpansionIcon = TreeNodeExpansionIcon;
|
|
67
|
+
//# sourceMappingURL=TreeNodeExpansionIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeExpansionIcon.js","sources":["../src/tree/TreeNodeExpansionIcon.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MouseEvent,\n} from \"react\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer } from \"../utils\";\nimport { useTreeContext, useTreeNodeContext } from \"./TreeContext\";\nimport treeNodeExpansionIconCss from \"./TreeNodeExpansionIcon.css\";\n\nexport interface TreeNodeExpansionIconProps\n extends ComponentPropsWithoutRef<\"span\"> {}\n\nconst withBaseName = makePrefixer(\"saltTreeNodeExpansionIcon\");\n\nexport const TreeNodeExpansionIcon = forwardRef<\n HTMLSpanElement,\n TreeNodeExpansionIconProps\n>(function TreeNodeExpansionIcon(props, ref) {\n const { className, onClick, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node-expansion-icon\",\n css: treeNodeExpansionIconCss,\n window: targetWindow,\n });\n\n const nodeContext = useTreeNodeContext();\n if (!nodeContext) {\n throw new Error(\"TreeNodeExpansionIcon must be used within a TreeNode\");\n }\n\n const { value, hasChildren, expanded, disabled } = nodeContext;\n const { toggleExpanded } = useTreeContext();\n const { ExpandGroupIcon, CollapseGroupIcon } = useIcon();\n\n const handleClick = (event: MouseEvent<HTMLSpanElement>) => {\n onClick?.(event);\n if (disabled || !hasChildren) return;\n toggleExpanded(event, value);\n };\n\n if (!hasChildren) {\n return (\n <span\n ref={ref}\n className={clsx(withBaseName(), withBaseName(\"placeholder\"), className)}\n aria-hidden\n {...rest}\n />\n );\n }\n\n const Icon = expanded ? CollapseGroupIcon : ExpandGroupIcon;\n\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard handled at tree level, same as W3C\n <span\n ref={ref}\n className={clsx(withBaseName(), className)}\n onClick={handleClick}\n aria-hidden\n {...rest}\n >\n <Icon className={withBaseName(\"icon\")} />\n </span>\n );\n});\n"],"names":["makePrefixer","forwardRef","TreeNodeExpansionIcon","useWindow","useComponentCssInjection","treeNodeExpansionIconCss","useTreeNodeContext","useTreeContext","useIcon","jsx","clsx"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAM,YAAA,GAAeA,0BAAa,2BAA2B,CAAA;AAEtD,MAAM,qBAAA,GAAwBC,gBAAA,CAGnC,SAASC,sBAAAA,CAAsB,OAAO,GAAA,EAAK;AAC3C,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,GAAG,MAAK,GAAI,KAAA;AAExC,EAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,EAAAC,+BAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,+BAAA;AAAA,IACR,GAAA,EAAKC,uBAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,cAAcC,8BAAA,EAAmB;AACvC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,UAAS,GAAI,WAAA;AACnD,EAAA,MAAM,EAAE,cAAA,EAAe,GAAIC,0BAAA,EAAe;AAC1C,EAAA,MAAM,EAAE,eAAA,EAAiB,iBAAA,EAAkB,GAAIC,4BAAA,EAAQ;AAEvD,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAuC;AAC1D,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,IAAA,IAAI,QAAA,IAAY,CAAC,WAAA,EAAa;AAC9B,IAAA,cAAA,CAAe,OAAO,KAAK,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,uBACEC,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAWC,SAAA,CAAK,YAAA,IAAgB,YAAA,CAAa,aAAa,GAAG,SAAS,CAAA;AAAA,QACtE,aAAA,EAAW,IAAA;AAAA,QACV,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,GAAO,WAAW,iBAAA,GAAoB,eAAA;AAE5C,EAAA;AAAA;AAAA,oBAEED,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,OAAA,EAAS,WAAA;AAAA,QACT,aAAA,EAAW,IAAA;AAAA,QACV,GAAG,IAAA;AAAA,QAEJ,QAAA,kBAAAD,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,MAAM,CAAA,EAAG;AAAA;AAAA;AACzC;AAEJ,CAAC;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltTreeNodeLabel {\n flex: 1;\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n letter-spacing: var(--salt-text-letterSpacing);\n word-break: break-word;\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=TreeNodeLabel.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeLabel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
9
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
10
|
+
require('../utils/useId.js');
|
|
11
|
+
require('../salt-provider/SaltProvider.js');
|
|
12
|
+
require('../viewport/ViewportProvider.js');
|
|
13
|
+
var TreeNodeLabel$1 = require('./TreeNodeLabel.css.js');
|
|
14
|
+
|
|
15
|
+
const withBaseName = makePrefixer.makePrefixer("saltTreeNodeLabel");
|
|
16
|
+
const TreeNodeLabel = React.forwardRef(
|
|
17
|
+
function TreeNodeLabel2(props, ref) {
|
|
18
|
+
const { children, className, ...rest } = props;
|
|
19
|
+
const targetWindow = window.useWindow();
|
|
20
|
+
styles.useComponentCssInjection({
|
|
21
|
+
testId: "salt-tree-node-label",
|
|
22
|
+
css: TreeNodeLabel$1,
|
|
23
|
+
window: targetWindow
|
|
24
|
+
});
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { ref, className: clsx.clsx(withBaseName(), className), ...rest, children });
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
exports.TreeNodeLabel = TreeNodeLabel;
|
|
30
|
+
//# sourceMappingURL=TreeNodeLabel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeLabel.js","sources":["../src/tree/TreeNodeLabel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport treeNodeLabelCss from \"./TreeNodeLabel.css\";\n\nexport interface TreeNodeLabelProps extends ComponentPropsWithoutRef<\"span\"> {}\n\nconst withBaseName = makePrefixer(\"saltTreeNodeLabel\");\n\nexport const TreeNodeLabel = forwardRef<HTMLSpanElement, TreeNodeLabelProps>(\n function TreeNodeLabel(props, ref) {\n const { children, className, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node-label\",\n css: treeNodeLabelCss,\n window: targetWindow,\n });\n\n return (\n <span ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {children}\n </span>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TreeNodeLabel","useWindow","useComponentCssInjection","treeNodeLabelCss","jsx","clsx"],"mappings":";;;;;;;;;;;;;;AASA,MAAM,YAAA,GAAeA,0BAAa,mBAAmB,CAAA;AAE9C,MAAM,aAAA,GAAgBC,gBAAA;AAAA,EAC3B,SAASC,cAAAA,CAAc,KAAA,EAAO,GAAA,EAAK;AACjC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAEzC,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,eAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACEC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC7D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltTreeNodeTrigger {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--salt-spacing-100);\n width: 100%;\n\n padding-top: calc(var(--salt-spacing-75) + var(--salt-spacing-50));\n padding-bottom: calc(var(--salt-spacing-75) + var(--salt-spacing-50));\n padding-right: var(--salt-spacing-100);\n /* Keep a fixed spacing-100 outer left padding for all nodes, then add one\n indent step per additional level. Each indent step = (icon column width +\n inter-item gap).\n Level-1 nodes get no extra indent; level-2 gets 1 step, level-3 gets 2, etc.\n */\n --saltTreeNodeTrigger-iconSize: max(var(--salt-size-icon), 12px);\n --saltTreeNodeTrigger-indentStep: calc(var(--saltTreeNodeTrigger-iconSize) + var(--salt-spacing-100));\n --saltTreeNodeTrigger-iconOffsetY: calc((var(--salt-text-lineHeight) - var(--saltTreeNodeTrigger-iconSize)) / 2);\n --saltTreeNodeTrigger-checkboxOffsetY: calc((var(--salt-text-lineHeight) - var(--salt-size-selectable)) / 2);\n padding-left: calc(var(--salt-spacing-100) + (var(--saltTreeNodeTrigger-indentStep) * (var(--saltTreeNode-level, 1) - 1)));\n background: var(--salt-selectable-background);\n color: var(--salt-content-primary-foreground);\n}\n\n/* Account for selectable and icon token size differences */\n.saltTree-multiselect .saltTreeNodeTrigger {\n --saltTreeNodeTrigger-indentStep: calc(((var(--saltTreeNodeTrigger-iconSize) + var(--salt-size-selectable)) / 2) + var(--salt-spacing-100));\n}\n\n.saltTreeNodeTrigger:hover {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTreeNode:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTreeNode-selected > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-selected);\n box-shadow:\n 0 calc(var(--salt-size-fixed-100) * -1) 0 0 var(--salt-selectable-borderColor-selected),\n 0 var(--salt-size-fixed-100) 0 0 var(--salt-selectable-borderColor-selected);\n position: relative;\n z-index: var(--salt-zIndex-default);\n}\n\n.saltTreeNode-selected:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-selected.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-selected);\n}\n\n.saltTreeNode-disabled > .saltTreeNodeTrigger,\n.saltTreeNode-disabled:hover > .saltTreeNodeTrigger {\n opacity: 0.4;\n cursor: var(--salt-cursor-disabled);\n\n background: var(--salt-selectable-background);\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeTrigger > .saltTreeNode-checkbox {\n margin-top: var(--saltTreeNodeTrigger-checkboxOffsetY);\n margin-bottom: 0;\n}\n\n.saltTreeNodeTrigger > .saltTreeNodeExpansionIcon,\n.saltTreeNodeTrigger > .saltTreeNode-icon {\n margin-top: var(--saltTreeNodeTrigger-iconOffsetY);\n}\n\n.saltTreeNodeTrigger > .saltIcon {\n margin-top: var(--saltTreeNodeTrigger-iconOffsetY);\n flex-shrink: 0;\n color: var(--salt-content-primary-foreground);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=TreeNodeTrigger.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeTrigger.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
require('../checkbox/Checkbox.js');
|
|
9
|
+
require('../checkbox/CheckboxGroup.js');
|
|
10
|
+
var CheckboxIcon = require('../checkbox/CheckboxIcon.js');
|
|
11
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
12
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
13
|
+
var useForkRef = require('../utils/useForkRef.js');
|
|
14
|
+
require('../utils/useId.js');
|
|
15
|
+
require('../salt-provider/SaltProvider.js');
|
|
16
|
+
require('../viewport/ViewportProvider.js');
|
|
17
|
+
var TreeContext = require('./TreeContext.js');
|
|
18
|
+
var TreeNodeExpansionIcon = require('./TreeNodeExpansionIcon.js');
|
|
19
|
+
var TreeNodeTrigger$1 = require('./TreeNodeTrigger.css.js');
|
|
20
|
+
|
|
21
|
+
const withBaseName = makePrefixer.makePrefixer("saltTreeNodeTrigger");
|
|
22
|
+
const withNodeBaseName = makePrefixer.makePrefixer("saltTreeNode");
|
|
23
|
+
const TreeNodeTrigger = React.forwardRef(function TreeNodeTrigger2(props, ref) {
|
|
24
|
+
const {
|
|
25
|
+
className,
|
|
26
|
+
children,
|
|
27
|
+
style,
|
|
28
|
+
onClick,
|
|
29
|
+
onFocus,
|
|
30
|
+
onBlur,
|
|
31
|
+
onMouseDown,
|
|
32
|
+
onKeyDown,
|
|
33
|
+
...rest
|
|
34
|
+
} = props;
|
|
35
|
+
const targetWindow = window.useWindow();
|
|
36
|
+
styles.useComponentCssInjection({
|
|
37
|
+
testId: "salt-tree-node-trigger",
|
|
38
|
+
css: TreeNodeTrigger$1,
|
|
39
|
+
window: targetWindow
|
|
40
|
+
});
|
|
41
|
+
const nodeContext = TreeContext.useTreeNodeContext();
|
|
42
|
+
if (!nodeContext) {
|
|
43
|
+
throw new Error("TreeNodeTrigger must be used within a TreeNode");
|
|
44
|
+
}
|
|
45
|
+
const {
|
|
46
|
+
value,
|
|
47
|
+
level,
|
|
48
|
+
hasChildren,
|
|
49
|
+
expanded,
|
|
50
|
+
disabled,
|
|
51
|
+
id,
|
|
52
|
+
nodeRef,
|
|
53
|
+
setNodeRef,
|
|
54
|
+
selected,
|
|
55
|
+
indeterminate,
|
|
56
|
+
nodeChildren
|
|
57
|
+
} = nodeContext;
|
|
58
|
+
const {
|
|
59
|
+
multiselect,
|
|
60
|
+
activeNode,
|
|
61
|
+
setActiveNode,
|
|
62
|
+
select,
|
|
63
|
+
tabbableNodeId,
|
|
64
|
+
registerElement
|
|
65
|
+
} = TreeContext.useTreeContext();
|
|
66
|
+
const triggerContentRef = useForkRef.useForkRef(React.useRef(null), ref);
|
|
67
|
+
const wasMouseDownRef = React.useRef(false);
|
|
68
|
+
const [focusVisible, setFocusVisible] = React.useState(false);
|
|
69
|
+
const isActive = activeNode === value;
|
|
70
|
+
const isTabbable = tabbableNodeId === value;
|
|
71
|
+
React.useEffect(() => {
|
|
72
|
+
if (nodeRef.current) {
|
|
73
|
+
return registerElement(value, nodeRef.current);
|
|
74
|
+
}
|
|
75
|
+
}, [value, registerElement, nodeRef]);
|
|
76
|
+
const handleClick = (event) => {
|
|
77
|
+
onClick == null ? void 0 : onClick(event);
|
|
78
|
+
if (disabled) return;
|
|
79
|
+
const target = event.target;
|
|
80
|
+
if (target.closest(".saltTreeNodeExpansionIcon")) return;
|
|
81
|
+
const nestedTreeItem = target.closest('[role="treeitem"]');
|
|
82
|
+
if (nestedTreeItem && nestedTreeItem !== nodeRef.current) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
setActiveNode(value);
|
|
86
|
+
select(event, value);
|
|
87
|
+
};
|
|
88
|
+
const handleFocus = (event) => {
|
|
89
|
+
if (event.target !== event.currentTarget) return;
|
|
90
|
+
onFocus == null ? void 0 : onFocus(event);
|
|
91
|
+
if (!wasMouseDownRef.current) {
|
|
92
|
+
setFocusVisible(true);
|
|
93
|
+
}
|
|
94
|
+
wasMouseDownRef.current = false;
|
|
95
|
+
setActiveNode(value);
|
|
96
|
+
};
|
|
97
|
+
const handleBlur = (event) => {
|
|
98
|
+
if (event.target !== event.currentTarget) return;
|
|
99
|
+
onBlur == null ? void 0 : onBlur(event);
|
|
100
|
+
setFocusVisible(false);
|
|
101
|
+
};
|
|
102
|
+
const handleMouseDown = (event) => {
|
|
103
|
+
wasMouseDownRef.current = true;
|
|
104
|
+
onMouseDown == null ? void 0 : onMouseDown(event);
|
|
105
|
+
};
|
|
106
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
107
|
+
"li",
|
|
108
|
+
{
|
|
109
|
+
ref: setNodeRef,
|
|
110
|
+
id,
|
|
111
|
+
role: "treeitem",
|
|
112
|
+
"aria-expanded": hasChildren ? expanded : void 0,
|
|
113
|
+
"aria-selected": multiselect ? void 0 : selected,
|
|
114
|
+
"aria-checked": multiselect ? indeterminate ? "mixed" : selected : void 0,
|
|
115
|
+
"aria-level": level,
|
|
116
|
+
"aria-disabled": disabled || void 0,
|
|
117
|
+
tabIndex: isTabbable ? 0 : -1,
|
|
118
|
+
className: clsx.clsx(
|
|
119
|
+
withNodeBaseName(),
|
|
120
|
+
{
|
|
121
|
+
[withNodeBaseName("expanded")]: expanded,
|
|
122
|
+
[withNodeBaseName("selected")]: selected && !multiselect,
|
|
123
|
+
[withNodeBaseName("active")]: isActive,
|
|
124
|
+
[withNodeBaseName("disabled")]: disabled,
|
|
125
|
+
[withNodeBaseName("hasChildren")]: hasChildren,
|
|
126
|
+
[withNodeBaseName("focusVisible")]: focusVisible
|
|
127
|
+
},
|
|
128
|
+
className
|
|
129
|
+
),
|
|
130
|
+
style: {
|
|
131
|
+
"--saltTreeNode-level": level,
|
|
132
|
+
...style
|
|
133
|
+
},
|
|
134
|
+
onClick: handleClick,
|
|
135
|
+
onFocus: handleFocus,
|
|
136
|
+
onBlur: handleBlur,
|
|
137
|
+
onMouseDown: handleMouseDown,
|
|
138
|
+
onKeyDown,
|
|
139
|
+
...rest,
|
|
140
|
+
children: [
|
|
141
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { ref: triggerContentRef, className: withBaseName(), children: [
|
|
142
|
+
/* @__PURE__ */ jsxRuntime.jsx(TreeNodeExpansionIcon.TreeNodeExpansionIcon, {}),
|
|
143
|
+
multiselect && /* @__PURE__ */ jsxRuntime.jsx(
|
|
144
|
+
CheckboxIcon.CheckboxIcon,
|
|
145
|
+
{
|
|
146
|
+
checked: selected,
|
|
147
|
+
indeterminate,
|
|
148
|
+
disabled,
|
|
149
|
+
className: withNodeBaseName("checkbox")
|
|
150
|
+
}
|
|
151
|
+
),
|
|
152
|
+
children
|
|
153
|
+
] }),
|
|
154
|
+
hasChildren && expanded && /* @__PURE__ */ jsxRuntime.jsx("ul", { role: "group", className: withNodeBaseName("group"), children: nodeChildren })
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
exports.TreeNodeTrigger = TreeNodeTrigger;
|
|
161
|
+
//# sourceMappingURL=TreeNodeTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeTrigger.js","sources":["../src/tree/TreeNodeTrigger.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n forwardRef,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { CheckboxIcon } from \"../checkbox\";\nimport { makePrefixer, useForkRef } from \"../utils\";\nimport { useTreeContext, useTreeNodeContext } from \"./TreeContext\";\nimport { TreeNodeExpansionIcon } from \"./TreeNodeExpansionIcon\";\nimport treeNodeTriggerCss from \"./TreeNodeTrigger.css\";\n\nexport interface TreeNodeTriggerProps extends ComponentPropsWithoutRef<\"li\"> {}\n\nconst withBaseName = makePrefixer(\"saltTreeNodeTrigger\");\nconst withNodeBaseName = makePrefixer(\"saltTreeNode\");\n\n/**\n * The forwarded ref points to the inner trigger content span (for tooltip positioning),\n * while the <li> handles focus, ARIA, and event handling.\n */\nexport const TreeNodeTrigger = forwardRef<\n HTMLSpanElement,\n TreeNodeTriggerProps\n>(function TreeNodeTrigger(props, ref) {\n const {\n className,\n children,\n style,\n onClick,\n onFocus,\n onBlur,\n onMouseDown,\n onKeyDown,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node-trigger\",\n css: treeNodeTriggerCss,\n window: targetWindow,\n });\n\n const nodeContext = useTreeNodeContext();\n if (!nodeContext) {\n throw new Error(\"TreeNodeTrigger must be used within a TreeNode\");\n }\n\n const {\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n nodeRef,\n setNodeRef,\n selected,\n indeterminate,\n nodeChildren,\n } = nodeContext;\n\n const {\n multiselect,\n activeNode,\n setActiveNode,\n select,\n tabbableNodeId,\n registerElement,\n } = useTreeContext();\n\n const triggerContentRef = useForkRef(useRef<HTMLSpanElement>(null), ref);\n const wasMouseDownRef = useRef(false);\n const [focusVisible, setFocusVisible] = useState(false);\n\n const isActive = activeNode === value;\n\n const isTabbable = tabbableNodeId === value;\n\n useEffect(() => {\n if (nodeRef.current) {\n return registerElement(value, nodeRef.current);\n }\n }, [value, registerElement, nodeRef]);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n onClick?.(event);\n if (disabled) return;\n const target = event.target as HTMLElement;\n if (target.closest(\".saltTreeNodeExpansionIcon\")) return;\n const nestedTreeItem = target.closest('[role=\"treeitem\"]');\n if (nestedTreeItem && nestedTreeItem !== nodeRef.current) {\n return;\n }\n setActiveNode(value);\n select(event, value);\n };\n\n const handleFocus = (event: FocusEvent<HTMLLIElement>) => {\n if (event.target !== event.currentTarget) return;\n onFocus?.(event);\n if (!wasMouseDownRef.current) {\n setFocusVisible(true);\n }\n wasMouseDownRef.current = false;\n setActiveNode(value);\n };\n\n const handleBlur = (event: FocusEvent<HTMLLIElement>) => {\n if (event.target !== event.currentTarget) return;\n onBlur?.(event);\n setFocusVisible(false);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLLIElement>) => {\n wasMouseDownRef.current = true;\n onMouseDown?.(event);\n };\n\n return (\n <li\n ref={setNodeRef}\n id={id}\n role=\"treeitem\"\n aria-expanded={hasChildren ? expanded : undefined}\n aria-selected={multiselect ? undefined : selected}\n aria-checked={\n multiselect ? (indeterminate ? \"mixed\" : selected) : undefined\n }\n aria-level={level}\n aria-disabled={disabled || undefined}\n tabIndex={isTabbable ? 0 : -1}\n className={clsx(\n withNodeBaseName(),\n {\n [withNodeBaseName(\"expanded\")]: expanded,\n [withNodeBaseName(\"selected\")]: selected && !multiselect,\n [withNodeBaseName(\"active\")]: isActive,\n [withNodeBaseName(\"disabled\")]: disabled,\n [withNodeBaseName(\"hasChildren\")]: hasChildren,\n [withNodeBaseName(\"focusVisible\")]: focusVisible,\n },\n className,\n )}\n style={\n {\n \"--saltTreeNode-level\": level,\n ...style,\n } as CSSProperties\n }\n onClick={handleClick}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseDown={handleMouseDown}\n onKeyDown={onKeyDown}\n {...rest}\n >\n <span ref={triggerContentRef} className={withBaseName()}>\n <TreeNodeExpansionIcon />\n {multiselect && (\n <CheckboxIcon\n checked={selected}\n indeterminate={indeterminate}\n disabled={disabled}\n className={withNodeBaseName(\"checkbox\")}\n />\n )}\n {children}\n </span>\n\n {hasChildren && expanded && (\n <ul role=\"group\" className={withNodeBaseName(\"group\")}>\n {nodeChildren}\n </ul>\n )}\n </li>\n );\n});\n"],"names":["makePrefixer","forwardRef","TreeNodeTrigger","useWindow","useComponentCssInjection","treeNodeTriggerCss","useTreeNodeContext","useTreeContext","useForkRef","useRef","useState","useEffect","jsxs","clsx","jsx","TreeNodeExpansionIcon","CheckboxIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
function isFragmentElement(child) {
|
|
6
|
+
return React.isValidElement(child) && child.type === React.Fragment;
|
|
7
|
+
}
|
|
8
|
+
function isTreeNodeElement(child) {
|
|
9
|
+
return React.isValidElement(child) && typeof child.props.value === "string";
|
|
10
|
+
}
|
|
11
|
+
function flattenTreeNodeChildren(children) {
|
|
12
|
+
const flattenedChildren = [];
|
|
13
|
+
React.Children.forEach(children, (child) => {
|
|
14
|
+
if (isFragmentElement(child)) {
|
|
15
|
+
flattenedChildren.push(...flattenTreeNodeChildren(child.props.children));
|
|
16
|
+
} else if (child !== null && child !== void 0 && typeof child !== "boolean") {
|
|
17
|
+
flattenedChildren.push(child);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
return flattenedChildren;
|
|
21
|
+
}
|
|
22
|
+
function getTreeNodeElements(children) {
|
|
23
|
+
return flattenTreeNodeChildren(children).filter(isTreeNodeElement);
|
|
24
|
+
}
|
|
25
|
+
function buildTreeModel(children) {
|
|
26
|
+
const nodes = /* @__PURE__ */ new Map();
|
|
27
|
+
const rootValues = [];
|
|
28
|
+
const childrenOf = /* @__PURE__ */ new Map();
|
|
29
|
+
function traverse(reactChildren, parentValue, parentDisabled = false) {
|
|
30
|
+
const treeNodeChildren = getTreeNodeElements(reactChildren);
|
|
31
|
+
const siblingValues = [];
|
|
32
|
+
for (const child of treeNodeChildren) {
|
|
33
|
+
const value = child.props.value;
|
|
34
|
+
const childTreeNodes = getTreeNodeElements(child.props.children);
|
|
35
|
+
const hasChildren = childTreeNodes.length > 0;
|
|
36
|
+
const disabled = parentDisabled || Boolean(child.props.disabled);
|
|
37
|
+
nodes.set(value, {
|
|
38
|
+
value,
|
|
39
|
+
parentValue,
|
|
40
|
+
hasChildren,
|
|
41
|
+
disabled
|
|
42
|
+
});
|
|
43
|
+
siblingValues.push(value);
|
|
44
|
+
if (hasChildren) {
|
|
45
|
+
traverse(child.props.children, value, disabled);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (parentValue !== void 0) {
|
|
49
|
+
childrenOf.set(parentValue, siblingValues);
|
|
50
|
+
} else {
|
|
51
|
+
rootValues.push(...siblingValues);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
traverse(children);
|
|
55
|
+
return { nodes, rootValues, childrenOf };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.buildTreeModel = buildTreeModel;
|
|
59
|
+
exports.flattenTreeNodeChildren = flattenTreeNodeChildren;
|
|
60
|
+
exports.isTreeNodeElement = isTreeNodeElement;
|
|
61
|
+
//# sourceMappingURL=treeModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treeModel.js","sources":["../src/tree/treeModel.ts"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nexport interface TreeNodeMeta {\n value: string;\n parentValue: string | undefined;\n hasChildren: boolean;\n disabled: boolean;\n}\n\nexport interface TreeModel {\n /** All nodes indexed by value */\n nodes: Map<string, TreeNodeMeta>;\n /** Ordered list of root node values */\n rootValues: string[];\n /** Maps parent value to ordered list of child values */\n childrenOf: Map<string, string[]>;\n}\n\ninterface TreeNodeElementProps {\n value: string;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nfunction isFragmentElement(\n child: ReactNode,\n): child is ReactElement<{ children?: ReactNode }> {\n return (\n isValidElement<{ children?: ReactNode }>(child) && child.type === Fragment\n );\n}\n\nexport function isTreeNodeElement(\n child: ReactNode,\n): child is ReactElement<TreeNodeElementProps> {\n return (\n isValidElement<TreeNodeElementProps>(child) &&\n typeof child.props.value === \"string\"\n );\n}\n\nexport function flattenTreeNodeChildren(children: ReactNode): ReactNode[] {\n const flattenedChildren: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isFragmentElement(child)) {\n flattenedChildren.push(...flattenTreeNodeChildren(child.props.children));\n } else if (\n child !== null &&\n child !== undefined &&\n typeof child !== \"boolean\"\n ) {\n flattenedChildren.push(child);\n }\n });\n\n return flattenedChildren;\n}\n\nfunction getTreeNodeElements(\n children: ReactNode,\n): ReactElement<TreeNodeElementProps>[] {\n return flattenTreeNodeChildren(children).filter(isTreeNodeElement);\n}\n\nexport function buildTreeModel(children: ReactNode): TreeModel {\n const nodes = new Map<string, TreeNodeMeta>();\n const rootValues: string[] = [];\n const childrenOf = new Map<string, string[]>();\n\n function traverse(\n reactChildren: ReactNode,\n parentValue?: string,\n parentDisabled = false,\n ): void {\n const treeNodeChildren = getTreeNodeElements(reactChildren);\n const siblingValues: string[] = [];\n\n for (const child of treeNodeChildren) {\n const value = child.props.value;\n const childTreeNodes = getTreeNodeElements(child.props.children);\n const hasChildren = childTreeNodes.length > 0;\n const disabled = parentDisabled || Boolean(child.props.disabled);\n\n nodes.set(value, {\n value,\n parentValue,\n hasChildren,\n disabled,\n });\n\n siblingValues.push(value);\n\n if (hasChildren) {\n traverse(child.props.children, value, disabled);\n }\n }\n\n if (parentValue !== undefined) {\n childrenOf.set(parentValue, siblingValues);\n } else {\n rootValues.push(...siblingValues);\n }\n }\n\n traverse(children);\n\n return { nodes, rootValues, childrenOf };\n}\n"],"names":["isValidElement","Fragment","Children"],"mappings":";;;;AA8BA,SAAS,kBACP,KAAA,EACiD;AACjD,EAAA,OACEA,oBAAA,CAAyC,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,KAASC,cAAA;AAEtE;AAEO,SAAS,kBACd,KAAA,EAC6C;AAC7C,EAAA,OACED,qBAAqC,KAAK,CAAA,IAC1C,OAAO,KAAA,CAAM,MAAM,KAAA,KAAU,QAAA;AAEjC;AAEO,SAAS,wBAAwB,QAAA,EAAkC;AACxE,EAAA,MAAM,oBAAiC,EAAC;AAExC,EAAAE,cAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAA,KAAU;AACpC,IAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,MAAA,iBAAA,CAAkB,KAAK,GAAG,uBAAA,CAAwB,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IACzE,WACE,KAAA,KAAU,IAAA,IACV,UAAU,MAAA,IACV,OAAO,UAAU,SAAA,EACjB;AACA,MAAA,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,iBAAA;AACT;AAEA,SAAS,oBACP,QAAA,EACsC;AACtC,EAAA,OAAO,uBAAA,CAAwB,QAAQ,CAAA,CAAE,MAAA,CAAO,iBAAiB,CAAA;AACnE;AAEO,SAAS,eAAe,QAAA,EAAgC;AAC7D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA0B;AAC5C,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAE7C,EAAA,SAAS,QAAA,CACP,aAAA,EACA,WAAA,EACA,cAAA,GAAiB,KAAA,EACX;AACN,IAAA,MAAM,gBAAA,GAAmB,oBAAoB,aAAa,CAAA;AAC1D,IAAA,MAAM,gBAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA;AAC1B,MAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAC/D,MAAA,MAAM,WAAA,GAAc,eAAe,MAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,cAAA,IAAkB,OAAA,CAAQ,KAAA,CAAM,MAAM,QAAQ,CAAA;AAE/D,MAAA,KAAA,CAAM,IAAI,KAAA,EAAO;AAAA,QACf,KAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAExB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,UAAA,CAAW,GAAA,CAAI,aAAa,aAAa,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,QAAQ,CAAA;AAEjB,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAA,EAAW;AACzC;;;;;;"}
|